summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobody <nobody@localhost>2005-01-07 20:07:35 +0000
committernobody <nobody@localhost>2005-01-07 20:07:35 +0000
commit7398ea64f438575d8adb089380af81822919b858 (patch)
tree6bae1d621efb81d6ad7b7c6bf75b925ad0f75d20
parentbfed84f2afdb77aaebaa017d8151226c0c300cf6 (diff)
parent8b1a70647d76ee3cab4c0ba129ccf62717c43875 (diff)
This commit was manufactured by cvs2svn to create tag 'REL1_4beta4'.1.4.0beta4
-rw-r--r--RELEASE-NOTES231
-rw-r--r--UPGRADE135
-rw-r--r--config/index.php60
-rw-r--r--config/installer.php276
-rw-r--r--docs/design.doc8
-rw-r--r--extensions/Syslog.php136
-rw-r--r--includes/Article.php38
-rw-r--r--includes/CategoryPage.php456
-rw-r--r--includes/ChangesList.php31
-rw-r--r--includes/Database.php89
-rw-r--r--includes/DatabasePostgreSQL.php2
-rwxr-xr-xincludes/DateFormatter.php32
-rw-r--r--includes/DefaultSettings.php67
-rw-r--r--includes/DifferenceEngine.php15
-rw-r--r--includes/EditPage.php40
-rw-r--r--includes/Feed.php38
-rw-r--r--includes/GlobalFunctions.php64
-rw-r--r--includes/HistoryBlob.php10
-rw-r--r--includes/Image.php130
-rw-r--r--includes/ImageGallery.php66
-rw-r--r--includes/ImagePage.php86
-rw-r--r--includes/LoadBalancer.php22
-rw-r--r--includes/LogPage.php4
-rw-r--r--includes/MagicWord.php2
-rwxr-xr-xincludes/MessageCache.php22
-rw-r--r--includes/OutputPage.php5
-rw-r--r--includes/Parser.php32
-rw-r--r--includes/ParserCache.php15
-rw-r--r--includes/QueryPage.php4
-rw-r--r--includes/RawPage.php2
-rw-r--r--includes/RecentChange.php2
-rw-r--r--includes/SearchEngine.php3
-rw-r--r--includes/SearchMySQL4.php2
-rw-r--r--includes/Setup.php68
-rw-r--r--includes/Skin.php53
-rw-r--r--includes/SkinTemplate.php50
-rw-r--r--includes/SpecialAllmessages.php11
-rw-r--r--includes/SpecialBrokenRedirects.php2
-rw-r--r--includes/SpecialContributions.php16
-rw-r--r--includes/SpecialDoubleRedirects.php2
-rw-r--r--includes/SpecialListadmins.php50
-rw-r--r--includes/SpecialListusers.php67
-rw-r--r--includes/SpecialLog.php4
-rw-r--r--includes/SpecialMakesysop.php34
-rw-r--r--includes/SpecialNewimages.php150
-rw-r--r--includes/SpecialPage.php19
-rw-r--r--includes/SpecialPreferences.php32
-rw-r--r--includes/SpecialRecentchanges.php221
-rw-r--r--includes/SpecialRecentchangeslinked.php24
-rw-r--r--includes/SpecialSearch.php6
-rwxr-xr-xincludes/SpecialUncategorizedcategories.php36
-rwxr-xr-xincludes/SpecialUncategorizedpages.php5
-rw-r--r--includes/SpecialUpload.php60
-rw-r--r--includes/Title.php23
-rw-r--r--includes/User.php177
-rw-r--r--includes/ZhClient.php133
-rw-r--r--includes/ZhConversion.php1209
-rw-r--r--includes/normal/README21
-rw-r--r--includes/normal/UtfNormalGenerate.php5
-rw-r--r--includes/templates/Userlogin.php8
-rw-r--r--includes/zhtable/Makefile13
-rw-r--r--includes/zhtable/simp2trad.manual194
-rw-r--r--includes/zhtable/toCN.manual17
-rw-r--r--includes/zhtable/toHK.manual5
-rw-r--r--includes/zhtable/toTW.manual17
-rw-r--r--includes/zhtable/trad2simp.manual2
-rw-r--r--index.php10
-rw-r--r--install-utils.inc4
-rw-r--r--irc/rcdumper.php44
-rw-r--r--languages/Language.php240
-rw-r--r--languages/LanguageAf.php24
-rw-r--r--languages/LanguageBg.php4
-rw-r--r--languages/LanguageBn.php24
-rw-r--r--languages/LanguageCa.php28
-rw-r--r--languages/LanguageCs.php24
-rw-r--r--languages/LanguageCy.php34
-rw-r--r--languages/LanguageDa.php38
-rw-r--r--languages/LanguageDe.php34
-rw-r--r--languages/LanguageEs.php34
-rw-r--r--languages/LanguageEt.php24
-rw-r--r--languages/LanguageFa.php32
-rw-r--r--languages/LanguageFi.php22
-rw-r--r--languages/LanguageFo.php6
-rw-r--r--languages/LanguageFr.php6
-rw-r--r--languages/LanguageFy.php35
-rwxr-xr-xlanguages/LanguageGa.php42
-rw-r--r--languages/LanguageHe.php24
-rw-r--r--languages/LanguageHu.php24
-rw-r--r--languages/LanguageIa.php22
-rw-r--r--languages/LanguageIs.php4
-rw-r--r--languages/LanguageIt.php80
-rw-r--r--languages/LanguageJa.php12
-rw-r--r--languages/LanguageKo.php22
-rw-r--r--languages/LanguageLatin1.php30
-rw-r--r--languages/LanguageLi.php77
-rw-r--r--languages/LanguageLt.php8
-rw-r--r--languages/LanguageMs.php22
-rw-r--r--languages/LanguageNl.php32
-rw-r--r--languages/LanguageNo.php34
-rw-r--r--languages/LanguageOc.php36
-rw-r--r--languages/LanguagePl.php34
-rw-r--r--languages/LanguagePs.php22
-rw-r--r--languages/LanguagePt.php28
-rw-r--r--languages/LanguageRo.php38
-rw-r--r--languages/LanguageRu.php28
-rw-r--r--languages/LanguageSc.php42
-rw-r--r--languages/LanguageSk.php22
-rw-r--r--languages/LanguageSl.php33
-rw-r--r--languages/LanguageSq.php39
-rw-r--r--languages/LanguageSr.php28
-rw-r--r--languages/LanguageSv.php22
-rw-r--r--languages/LanguageTa.php28
-rw-r--r--languages/LanguageTh.php32
-rw-r--r--languages/LanguageTt.php4
-rwxr-xr-xlanguages/LanguageUk.php28
-rw-r--r--languages/LanguageWa.php32
-rw-r--r--languages/LanguageZh.php415
-rw-r--r--languages/LanguageZh_cn.php93
-rw-r--r--languages/LanguageZh_tw.php84
-rw-r--r--languages/Names.php9
-rwxr-xr-xmaintenance/InitialiseMessages.inc57
-rw-r--r--maintenance/archives/importTests.php275
-rw-r--r--maintenance/archives/importUseModWiki.php486
-rw-r--r--maintenance/archives/moveCustomMessages.inc4
-rw-r--r--maintenance/archives/patch-group-sysopfix.sql7
-rw-r--r--maintenance/archives/patch-rename-user_groups-and_rights.sql9
-rw-r--r--maintenance/archives/patch-rename-user_rights.sql5
-rw-r--r--maintenance/archives/patch-userlevels-defaultgroups.sql13
-rw-r--r--maintenance/archives/patch-userlevels-rights.sql5
-rw-r--r--maintenance/archives/patch-userlevels.sql20
-rw-r--r--maintenance/changeuser.sql16
-rw-r--r--maintenance/cleanupDupes.php36
-rw-r--r--maintenance/clear_interwiki_cache.php11
-rw-r--r--maintenance/clear_pcache_stats.php22
-rw-r--r--maintenance/commandLine.inc2
-rw-r--r--maintenance/compressOld.inc22
-rw-r--r--maintenance/compressOld.php16
-rw-r--r--maintenance/convertUtf8.php203
-rw-r--r--maintenance/dumpRev.php8
-rw-r--r--maintenance/importUseModWiki.php3
-rw-r--r--maintenance/initialdata.sql18
-rw-r--r--maintenance/interwiki.sql2
-rw-r--r--maintenance/parserTests.php1
-rw-r--r--maintenance/parserTests.txt19
-rw-r--r--maintenance/pcache_stats.php14
-rw-r--r--maintenance/recount.sql4
-rw-r--r--maintenance/tables.sql71
-rw-r--r--maintenance/update.php6
-rw-r--r--maintenance/updaters.inc40
-rw-r--r--maintenance/users.sql96
-rw-r--r--maintenance/wikipedia-interwiki.sql2
-rw-r--r--maintenance/wiktionary-interwiki.sql2
-rw-r--r--skins/CologneBlue.php23
-rw-r--r--skins/MonoBook.php11
-rw-r--r--skins/MySkin.php3
-rw-r--r--skins/Nostalgia.php3
-rw-r--r--skins/Standard.php8
-rw-r--r--skins/amethyst/main.css43
-rwxr-xr-xskins/chick/main.css43
-rw-r--r--skins/common/cologneblue.css14
-rw-r--r--skins/common/common.css42
-rw-r--r--skins/common/commonPrint.css30
-rw-r--r--skins/common/images/fileicon-ogg.pngbin0 -> 7191 bytes
-rw-r--r--skins/common/images/fileicon-ogg.xcfbin0 -> 40236 bytes
-rw-r--r--skins/common/images/fileicon.pngbin0 -> 6587 bytes
-rw-r--r--skins/common/images/fileicon.xcfbin0 -> 39441 bytes
-rw-r--r--skins/common/images/redirect.pngbin1117 -> 413 bytes
-rw-r--r--skins/disabled/Amethyst.php3
-rw-r--r--skins/disabled/Chick.php3
-rw-r--r--skins/disabled/MonoBookTal.php3
-rw-r--r--skins/disabled/WikimediaWiki.php3
-rw-r--r--skins/monobook/main.css48
-rw-r--r--soap/client.php45
-rw-r--r--soap/index.php362
-rw-r--r--soap/nusoap.php5574
-rw-r--r--tests/.htaccess1
-rw-r--r--texvc.phtml165
177 files changed, 4820 insertions, 10158 deletions
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index a674ad86cbcc..073676ffa0b7 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -4,36 +4,199 @@ 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.4 BETA ==
-
-[Not everything is 100% working in beta yet, the installer needs fixes still.]
-
-Major changes from 1.3.x:
-* (?) Support for table prefixes for better sharing with other web apps
-* (?) PostgreSQL support
-* Optional article validation voting features
-* 'Recentchanges Patrol' to mark new edits that haven't yet been viewed
-* Support for faster C++ diff module (WikiDiff extension)
-* More scary link caching modes
-* Old manually maintained log pages replaced with searchable Special:Log
+== MediaWiki 1.4 BETA 4 ==
+
+Users of earlier betas, take note that there is a security fix for
+uploads in this release.
+
+''''' Thinking of using MySQL 4.1? Please read this first! '''''
+''''' Your PHP installation probably uses the OLD protocol '''''
+''''' http://dev.mysql.com/doc/mysql/en/Old_client.html '''''
+
+This is a beta release; while most things are working, there are some
+known problems and probably unknown problems. Don't run a public site
+on this beta unless you're willing to help with investigating and
+fixing any problems you encounter.
+
+CARELESS USE OF THIS CODE MAY RENDER YOU STERILE, GROW WEEDS IN YOUR
+YARD, AND FEED YOUR CAT TO A SEWER ALLIGATOR. DON'T SAY YOU WEREN'T
+WARNED, CAUSE WE WARNED YOU.
+
+If upgrading from an older release, see the file UPGRADING.
+
+=== New features ===
+
+* 'Recentchanges Patrol' to mark new edits that haven't yet been viewed.
+* New, searchable deletion/upload/protection logs
+* Image gallery generation (Special:Newimages and <gallery> tag)
+* SVG rasterization support (requires external support)
+* Users can select from the available localizations to override the
+ default user interface language.
+* Traditional/Simplified Chinese conversion support
+
+=== Installation and compatibility ===
+
+* The default MonoBook theme now works with PHP 5.0
+* Installation on systems with PHP's safe mode or other oddities
+ should work more reliably, as MonoBook no longer needs to
+ create a compiled template file for the wiki to run.
+* A table prefix may be specified, to avoid conflicts with other
+ web applications forced to share a database.
+* More thorough UTF-8 input validation; fixes non-ASCII uploaded
+ filenames from Safari.
+* Command-line database upgrade script.
+
+=== Customizability ===
+
+* Default user options can now be overridden in LocalSettings.
* Skins system more modular: templates and CSS are now in /skins/
-* New user preference for limitting the image size for images on image description
- pages
-* Error pages no more offer edit / talk / watch links (bug #502)
-* Allow user to preview article on first edit (bug #530)
-* New dark background skin named Amethyst (thanks Sorwena and Sorkhiri)
-* [[RFC 1234]] will now make an internal link (bug #479)
-* PhpTal skins shown bogus 'What links here' etc on special pages (bug #511)
-* Experimental code to manage user and group rights (Special:Userlevels)
-* UI language switching
-* Adding filter and username exact search match for Special:Listusers (bug #770)
-* Special:Listadmins outdated, use Special:Listusers instead (bug #857)
-* Traditional/Simplified Chinese conversion
-* New tag "<gallery>" to generate a table of image thumbnails
-* Installer die if it can not write LocalSettings.php (bug #733)
-* Various special pages no more show the rss/atom feed links (bug #705)
-* Support for external authentication plug-ins
-* ... and more!
+ New skins can be dropped into this directory and used immediately.
+* More extension hooks have been added.
+* Authentication plugin hook.
+* More internal code documentation, generated with phpdoc:
+ http://www.mediawiki.org/docs/html/
+
+=== Optimization ===
+
+* For many operations, MediaWiki 1.4 should run faster and use
+ less memory than MediaWiki 1.3. Page rendering is up to twice
+ as fast. (Use a PHP accelerator such as Turck MMCache for best
+ results with any PHP application, though!)
+* The parser cache no longer requires memcached, and is enabled
+ by default. This avoids a lot of re-rendering of pages that
+ have been shown recently, greatly speeding longer page views.
+* Support for compiled PHP modules to speed up page diff and
+ Unicode validation/normalization. (Requires ability to compile
+ and load PHP extensions).
+
+=== What isn't ready yet ===
+
+* A new user/groups permissions scheme has been held back to 1.5.
+* An experimental SOAP interface will be made available as an extension
+* PostgreSQL support is largely working, but search and installer
+ support are not complete. These are being actively worked on
+ and should come in later betas.
+* E-mail notification of watched page changes and verification of
+ user-submitted e-mail addresses is not yet included. If updates
+ are available, this may make it into later betas.
+* Log pages are not automatically imported into the new log table
+ at upgrade time. A script to import old text log entries is
+ incomplete, but may be available by the time 1.4 finishes.
+* UI messages may be broken in Latin-1 mode in this release due to some
+ minor breakage in the language selection module.
+
+=== Misc bugs fixed in beta 1 ===
+
+* (bug 95) Templates no longer limited to 5 inclusions per page
+* New user preference for limiting the image size for images on image description
+ pages
+* (bug 530) Allow user to preview article on first edit
+* (bug 479) [[RFC 1234]] will now make an internal link
+* (bug 511) PhpTal skins shown bogus 'What links here' etc on special pages
+* (bug 770) Adding filter and username exact search match for Special:Listusers
+* (bug 733) Installer die if it can not write LocalSettings.php
+* (bug 705) Various special pages no more show the rss/atom feed links
+* (bug 114) use category backlinks in Special:Recentchangeslinked
+
+=== Beta 2 fixes ===
+
+* (bug 987) Reverted bogus fix for bug 502
+* (bug 992) Fix enhanced recent changes in PHP5
+* (bug 1009) Fix Special:Makesysop when using table prefixes
+* (bug 1010) fix broken Commons image link on Classic & Cologne Blue
+* (bug 985) Fix auto-summary for section edits
+* (bug 995) Close <a> tag
+* (bug 1004) renamed norsk language links (twice)
+* Login works again when using an old-style default skin
+* Fix for load balancing mode, notify if using old settings format
+* (bug 1014) Missing image size option on old accounts handled gracefully
+* (bug 1027) Fix page moves with table prefix
+* (bug 1018) Some pages fail with stub threshold enabled
+* (bug 1024) Fix link to high-res image version on Image: pages
+* (bug 1016) Fix handling of lines omitting Image: in a <gallery> tag
+* security fix for image galleries
+* (bug 1039) Avoid error message in certain message cache failure modes
+* Fix string escaping with PostgreSQL
+* (bug 1015) [partial] -- use comment formatter on image gallery text
+* Allow customization of all UI languages
+* use $wgForceUIMsgAsContentMsg to make regular UI messages act as content
+* new user option for zh users to disable language conversion
+* Defer message cache initialization, shaving a few ms off file cache hits
+* Fixed Special:Allmessages when using table prefixes
+* (bug 996) Fix $wgWhitelistRead to work again
+* (bug 1028) fix page move over redirect to not fail on the unique index
+
+=== Beta 3 fixes ===
+
+* Hide RC patrol markers when patrol is disabled or not allowed to patrol.
+* Fix language selection for upgraded accounts
+* (bug 1076) navigation links in QueryPage should be translated by wgContLang.
+* (bug 922) bogus DOS line endings in LanguageEl.php
+* Fix index usage in contribs
+* Caching and load limiting options for Recentchanges RSS/Atom feed
+* (bug 1074) Add stock icons for non-image files in gallery/Newimages
+* Add width and height attributes on thumbs in gallery/Newimages
+* Enhance upload extension blacklist to protect against vulnerable
+ Apache configurations
+
+=== Beta 4 fixes ===
+
+* (bug 1090) Fix sitesupport links in CB/classic skins
+* Gracefully ignore non-legal titles in a <gallery>
+* Fix message page caching behavior when $wgCapitalLinks is turned off
+ after installation and the wiki is subsequently upgraded
+* Database error messages include the database server name/address
+* Paging support for large categories
+* Fix image page scaling when thumbnail generation is disabled
+* Select the content language in prefs when bogus interface language is set
+* Fix interwiki links in edit comments
+* Fix crash on banned user visit
+* Avoid PHP warning messages when thumbnail not generated
+* (bug 1157) List unblocks correctly in Special:Log
+* Fix fatal errors in LanguageLi.php
+* Undo overly bright, difficult to read colors in Cologne Blue
+* (bug 1162) fix five-tilde date inserter
+* Add raw signatures option for those who simply must have cute sigs
+* (bug 1164) Let wikitext be used in Loginprompt and Loginend messages
+* Add the dreaded <span> to the HTML whitelist
+* (bug 1170) Fix Russian linktrail
+* (bug 1168) Missing text on the bureaucrat log
+* (bug 1180) Fix Makesysop on shared-user-table sites
+* (bug 1178) Fix previous diff link when using 'oldid=0'
+* (bug 1173) Stop blocked accounts from reverting/deleting images
+* Keep generated stylesheets cache-separated for each user
+* (bug 1175) Fix "preview on first edit" mode
+* Fix revert bug caused by bug 1175 fix
+* Fix CSS classes on minor, new, unpatrolled markers in enhanced RC
+* Set MySQL 4 boolean search back to 'and' mode by default
+* (bug 1193) Fix move-only page protection mode
+* Fix zhtable Makefile to include the traditional manual table
+* Add memcache timeout for the zh conversion tables
+* Allow user customization of the zh conversion tables through
+ Mediawiki:zhconversiontable
+* Add zh-min-man (back) to language names list
+* Ported $wgCopyrightIcon setting from REL1_3A
+* (bug 1218) Show the original image on image pages if the thumbnail would be
+ bigger than the original image
+* (bug 1213) i18n of Special:Log labels
+* (bug 1013) Fix jbo, minnan in language names list
+* Added magic word MAG_NOTITLECONVERT to indicate that the title of the page
+ do not need to be converted. Useful in zh:
+* (bug 1224) Use proper date messages for date reformatter
+* (bug 1241) Don't show 'cont.' for first entry of the category list
+* (bug 1240) Special:Preferences was broken in Slovenian locale when
+ $wgUseDynamicDates is enabled
+* Added magic word MAG_NOCONTENTCONVERT to supress the conversion of the
+ content of an article. Useful in zh:
+* write-lock for updating the zh conversion tables in memcache
+* recursively parse subpages of MediaWiki:Zhconversiontable
+* (bug 1144) Fix export for fy language
+* make removal of an entry from zhconversiontable work
+* (bug 752) Don't insert newline in link title for url with %0a
+* Fix missing search box contents in MonoBook skin
+* Add option to forward search directly to an external URL (eg google)
+* Correctly highlight the fallback language variant when the selected
+ variant is disabled. Used in zh: only for now.
=== Caveats ===
@@ -43,10 +206,6 @@ set $wgMimeType = "application/xhtml+xml"; to test for remaining problem
cases, but this is not recommended on live sites. (This must be set for
MathML to display properly in Mozilla.)
-The new 'MonoBook' skin is not compatible with PHP 5 due to bugs in the
-underlying PHPTAL library. It will be automatically disabled when running
-on PHP5; the older look and feel will be used instead.
-
For notes on 1.3.x and older releases, see HISTORY.
@@ -67,6 +226,12 @@ wikitech-l list:
http://mail.wikipedia.org/mailman/listinfo/mediawiki-l
+A low-traffic announcements-only list is also available:
+ http://mail.wikipedia.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 ===
diff --git a/UPGRADE b/UPGRADE
new file mode 100644
index 000000000000..230ca3eba289
--- /dev/null
+++ b/UPGRADE
@@ -0,0 +1,135 @@
+== The basic theory ==
+
+Basically, to upgrade a wiki you:
+* Back up your data! (See Backups! below)
+* Extract the new archive. If you can do this in a clean directory that's
+ great, but it should work to extract over the old files too. This may
+ be easier if you have images etc in place and don't want to move them
+ around, but remember to back up first!
+* Run the installer to upgrade the database schema.
+
+=== Web installer ===
+
+You can use the web-based installer wizard if you first remove the
+LocalSettings.php (and AdminSettings.php, if any) files; be sure to
+give the installer the same information as you did on the original
+install (language/encoding, database name, password, etc). This will
+also generate a fresh LocalSettings.php, which you may need to customize.
+
+You may change some settings during the install, but be very careful!
+Changing the encoding in particular will generally leave you with a
+lot of corrupt pages, particularly if your wiki is not in English.
+
+=== Command-line upgrade ===
+
+Additionally, as of 1.4.0 you can run an in-place upgrade script from
+the command line, keeping your existing LocalSettings.php. This requires
+that you create an AdminSettings.php giving an appropriate database user
+and password with privileges to modify the database structure.
+
+Once the new files are in place, go into the maintenance subdirectory and
+run the script:
+
+ php update.php
+
+See caveats below on upgrading from 1.3.x or earlier.
+
+
+== Backups! ==
+
+To upgrade an existing MediaWiki installation, first BACK UP YOUR WIKI!
+If something goes wrong, you want to be able to start again.
+
+Your image files, configuration, etc can simply be copied or archived as
+you would any other files. (Make sure that the contents of your
+LocalSettings.php are not accidentally make public, as this contains
+a database password.)
+
+To back up the database, use the tools provided by your service provider
+(if applicable) or the standard mysqldump program.
+
+For general help on mysqldump:
+http://dev.mysql.com/doc/mysql/en/mysqldump.html
+
+WARNING: If using MySQL 4.1.x, mysqldump's charset conversion may in
+some cases damage data in your wiki. If necessary, set the charset
+option to 'latin1' to avoid the conversion. Fore more info see:
+http://mail.wikipedia.org/pipermail/wikitech-l/2004-November/026359.html
+
+
+== Caveats ==
+
+=== Upgrading from 1.4beta1 ===
+
+There are no database changes from beta1; just update the files.
+
+
+=== Upgrading from 1.3.x ===
+
+This should generally go smoothly.
+
+If you keep your LocalSettings.php, you may need to change the style paths
+to match the newly rearranged skin modules. Change these lines:
+ $wgStylePath = "$wgScriptPath/stylesheets";
+ $wgStyleDirectory = "$IP/stylesheets";
+ $wgLogo = "$wgStylePath/images/wiki.png";
+
+to this:
+ $wgStylePath = "$wgScriptPath/skins";
+ $wgStyleDirectory = "$IP/skins";
+ $wgLogo = "$wgStylePath/common/images/wiki.png";
+
+
+Note that the 1.3 beta releases included a potential vulnerability if PHP
+is configured with register_globals on and the includes directory is
+served to the web. For general safety, turn register_globals *off* if you
+don't _really_ need it for another package.
+
+If your hosting provider turns it on and you can't turn it off yourself,
+send them a kind note explaining that it can expose their servers and their
+customers to attacks.
+
+
+=== Upgrading from 1.2.x ===
+
+If you've been using the MediaWiki: namespace for custom page templates,
+note that things are a little different. The Template: namespace has been
+added which is more powerful -- templates can include parameters for
+instance.
+
+Any MediaWiki: entries that are not used by the software will be automatically
+moved to Template: entries at upgrade time. Be sure to go through and check
+that everything is working properly.
+
+Also, be sure to pick the correct character encoding -- some languages were
+only available in Latin-1 on 1.2.x and are now available for Unicode as well.
+If you want to upgrade an existing wiki from Latin-1 to Unicode you'll have
+to dump the database to SQL, run it through iconv or another conversion tool,
+and restore it. Sorry.
+
+
+=== Upgrading from 1.1.x or earlier ===
+
+This is less thoroughly tested, but should work.
+
+You need to specify the *admin* database username and password to the
+installer in order for it to successfully upgrade the database structure.
+You may wish to manually change the GRANTs later.
+
+If you have a very old database (earlier than organized MediaWiki releases
+in late August 2003) you may need to manually run some of the update SQL
+scripts in maintenance/archives before the installer is able to pick up
+with remaining updates.
+
+
+=== Upgrading from UseModWiki or old "phase 2" Wikipedia code ===
+
+There is a semi-maintained UseModWiki to MediaWiki conversion script at
+maintenance/importUseModWiki.php; it may require tweaking and customization
+to work for you.
+
+Install a new MediaWiki first, then use the conversion script which will
+output SQL statements; direct these to a file and then run that into your
+database.
+
+You will have to rebuild the links tables etc after importing.
diff --git a/config/index.php b/config/index.php
index 67e878911127..8cf8c6b52295 100644
--- a/config/index.php
+++ b/config/index.php
@@ -321,6 +321,7 @@ print "<li>Script URI path: <tt>" . htmlspecialchars( $conf->ScriptPath ) . "</t
$conf->DBuser = importPost( "DBuser", "wikiuser" );
$conf->DBpassword = importPost( "DBpassword" );
$conf->DBpassword2 = importPost( "DBpassword2" );
+ $conf->DBprefix = importPost( "DBprefix" );
$conf->RootPW = importPost( "RootPW" );
$conf->LanguageCode = importPost( "LanguageCode", "en" );
$conf->SysopName = importPost( "SysopName", "WikiSysop" );
@@ -342,6 +343,9 @@ if( $conf->DBpassword == "" ) {
if( $conf->DBpassword != $conf->DBpassword2 ) {
$errs["DBpassword2"] = "Passwords don't match!";
}
+if( !preg_match( '/^[A-Za-z_0-9]*$/', $conf->DBprefix ) ) {
+ $errs["DBprefix"] = "Invalid table prefix";
+}
if( $conf->SysopPass == "" ) {
$errs["SysopPass"] = "Must not be blank";
@@ -394,6 +398,7 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
eval($local);
$wgDBadminuser = "root";
$wgDBadminpassword = $conf->RootPW;
+ $wgDBprefix = $conf->DBprefix;
$wgCommandLineMode = true;
$wgUseDatabaseMessages = false; /* FIXME: For database failure */
require_once( "includes/Setup.php" );
@@ -510,12 +515,14 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
print "<li>Creating tables...";
dbsource( "../maintenance/tables.sql", $wgDatabase );
dbsource( "../maintenance/interwiki.sql", $wgDatabase );
- dbsource( "../maintenance/archives/patch-userlevels-defaultgroups.sql", $wgDatabase );
print " done.</li>\n";
print "<li>Initializing data...";
- $wgDatabase->query( "INSERT INTO site_stats (ss_row_id,ss_total_views," .
- "ss_total_edits,ss_good_articles) VALUES (1,0,0,0)" );
+ $wgDatabase->insert( 'site_stats',
+ array( 'ss_row_id' => 1,
+ 'ss_total_views' => 0,
+ 'ss_total_edits' => 0,
+ 'ss_good_articles' => 0 ) );
# setting up the db user
if( $conf->Root ) {
print "<li>Granting user permissions...</li>\n";
@@ -539,32 +546,19 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
print "<li>Skipped sysop account creation, no name given.</li>\n";
}
- print "<li>Initialising log pages...";
- $logs = array(
- "uploadlogpage" => "uploadlogpagetext",
- "dellogpage" => "dellogpagetext",
- "protectlogpage" => "protectlogtext",
- "blocklogpage" => "blocklogtext"
- );
- $metaNamespace = Namespace::getWikipedia();
+ $titleobj = Title::newFromText( wfMsgNoDB( "mainpage" ) );
$now = wfTimestampNow();
$won = wfInvertTimestamp( $now );
- foreach( $logs as $page => $text ) {
- $logTitle = $wgDatabase->strencode( $wgLang->ucfirst( str_replace( " ", "_", wfMsgNoDB( $page ) ) ) );
- $logText = $wgDatabase->strencode( wfMsgNoDB( $text ) );
- $wgDatabase->query( "INSERT INTO cur (cur_namespace,cur_title,cur_text," .
- "cur_restrictions,cur_timestamp,inverse_timestamp,cur_touched) " .
- "VALUES ($metaNamespace,'$logTitle','$logText','sysop','$now','$won','$now')" );
- }
- print "</li>\n";
-
- $titleobj = Title::newFromText( wfMsgNoDB( "mainpage" ) );
- $title = $titleobj->getDBkey();
- $sql = "INSERT INTO cur (cur_namespace,cur_title,cur_text,cur_timestamp,inverse_timestamp,cur_touched,cur_user,cur_user_text) " .
- "VALUES (0,'$title','" .
- wfStrencode( wfMsg( "mainpagetext" ) . "\n\n" . wfMsg( "mainpagedocfooter" ) ) .
- "','$now','$won','$now',0,'MediaWiki default')";
- $wgDatabase->query( $sql, $fname );
+ $wgDatabase->insert( 'cur',
+ array( 'cur_namespace' => $titleobj->getNamespace(),
+ 'cur_title' => $titleobj->getDBkey(),
+ 'cur_text' => wfMsg( 'mainpagetext' ) . "\n\n" .
+ wfMsg( 'mainpagedocfooter' ),
+ 'cur_timestamp' => $now,
+ 'inverse_timestamp' => $won,
+ 'cur_touched' => $now,
+ 'cur_user' => 0,
+ 'cur_user_text' => 'MediaWiki default' ) );
print "<li><pre>";
initialiseMessages();
@@ -767,6 +761,16 @@ if( count( $errs ) ) {
you can specify new accounts/databases to be created.
</dt>
+ <dd><?php
+ aField( $conf, "DBprefix", "Database table prefix" );
+ ?></dd>
+ <dt>
+ <p>If you need to share one database between multiple wikis, or
+ MediaWiki and another web application, you may choose to
+ add a prefix to all the table names to avoid conflicts.</p>
+
+ <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
+ </dt>
<dd>
<?php
@@ -914,6 +918,7 @@ if ( \$wgCommandLineMode ) {
\$wgDBname = \"{$slconf['DBname']}\";
\$wgDBuser = \"{$slconf['DBuser']}\";
\$wgDBpassword = \"{$slconf['DBpassword']}\";
+\$wgDBprefix = \"{$slconf['DBprefix']}\";
## To allow SQL queries through the wiki's Special:Askaql page,
## uncomment the next lines. THIS IS VERY INSECURE. If you want
@@ -925,6 +930,7 @@ if ( \$wgCommandLineMode ) {
# \$wgDBsqluser = \"sqluser\";
# \$wgDBsqlpassword = \"sqlpass\";
+# If you're on MySQL 3.x, this next line must be FALSE:
\$wgDBmysql4 = \$wgEnablePersistentLC = {$conf->DBmysql4};
## Shared memory settings
diff --git a/config/installer.php b/config/installer.php
deleted file mode 100644
index 237c7a3f21eb..000000000000
--- a/config/installer.php
+++ /dev/null
@@ -1,276 +0,0 @@
-<?php
-
-# MediaWiki web-based config/installation
-# Copyright (C) 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.,
-# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-
-/**
- * This is to be the fancy new installer package for MediaWiki,
- * which will work with table prefixes, both MySQL and PostgreSQL, and
- * ideally such wacky things as text-based install as well as web.
- *
- * It's not done yet.
- *
- * @todo finish...
- * @package MediaWiki
- * @subpackage Installer
- */
-
-$IP = ".."; # Just to suppress notices, not for anything useful
-define( "MEDIAWIKI", true );
-define( "MEDIAWIKI_INSTALL", true );
-require_once( "../includes/Defines.php" );
-require_once( "../includes/DefaultSettings.php" );
-require_once( "../includes/MagicWord.php" );
-require_once( "../includes/Namespace.php" );
-require_once( "../install-utils.inc" );
-require_once( "../maintenance/updaters.inc" );
-require_once( "../maintenance/convertLinks.inc" );
-require_once( "../maintenance/archives/moveCustomMessages.inc" );
-
-class InstallInterface {
- function message( $text ) {
- echo $text . "\n";
- }
-
- function warning( $text ) {
- echo "** $text **\n";
- }
-
- function formatLink( $url, $text = '' ) {
- if( $text ) {
- return "$text ($url)";
- } else {
- return $url;
- }
- }
-
- function showHeader() {
- global $wgVersion;
- echo "MediaWiki $wgVersion installation\n\n";
- }
-}
-
-class Installer {
- var $settings = array();
-
- function Installer( &$interface ) {
- $this->ui =& $interface;
- }
-
- function runInstall() {
- $this->ui->showHeader();
- $this->preInstallChecks();
- }
-
- function override( $var, $value ) {
- $this->settings[$var] = $value;
- }
-
- function preInstallChecks() {
- $checks = array(
- 'checkConfigured',
- 'checkInstalled',
- 'checkWritable',
- 'checkPHP',
- 'checkGlobals',
- 'checkSafeMode',
- 'checkSAPI',
- 'checkMemory',
- 'checkZlib',
- 'checkImageMagick',
- 'checkGD'
- );
- foreach( $checks as $check ) {
- if( !$this->$check() ) {
- $this->ui->warning( "Installation aborted." );
- return false;
- }
- }
- }
-
- function checkConfigured() {
- if( file_exists( "../LocalSettings.php" ) || file_exists( "../AdminSettings.php" ) ) {
- $this->ui->warning( "Already configured." );
- return false;
- }
- return true;
- }
-
- function checkInstalled() {
- if( file_exists( "./LocalSettings.php" ) || file_exists( "./AdminSettings.php" ) ) {
- $this->ui->warning( "Already configured; move LocalSettings.php from this directory to the parent dir and take the wiki for a spin." );
- return false;
- }
- return true;
- }
-
- function checkWritable() {
- if( !is_writable( "." ) ) {
- $this->ui->warning( "<h2>Can't write config file, aborting</h2>
-
- <p>In order to configure the wiki you have to make the <tt>config</tt> subdirectory
- writable by the web server. Once configuration is done you'll move the created
- <tt>LocalSettings.php</tt> to the parent directory, and for added safety you can
- then remove the <tt>config</tt> subdirectory entirely.</p>
-
- <p>To make the directory writable on a Unix/Linux system:</p>
-
- <pre>
- cd <i>/path/to/wiki</i>
- chmod a+w config
- </pre>" );
-
- return false;
- }
- return true;
- }
-
- function checkPHP() {
- $ver = phpversion();
- if( version_compare( $ver, "4.1.2", "lt" ) ) {
- $this->ui->warning( "Your version of PHP ($ver) is too old and will probably not work. We try to support 4.1.2 and above, but a current 4.3 or 5.0 release is preferred." );
- return false;
- }
- $this->ui->message( "PHP version $ver, ok" );
- if( version_compare( $ver, "gte", "5.0" ) ) {
- $this->ui->warning( "A PHP5-compatible version of the PHPTAL template system is not yet bundled. To get the regular default page layout, you will need to manually install a development snapshot. (The wiki will function normally using an older layout if you do not.)" );
- }
- return true;
- }
-
- function checkGlobals() {
- if( ini_get( 'register_globals' ) ) {
- $this->ui->warning( "PHP's " .
- $this->ui->formatLink( "http://php.net/register_globals", "register_globals" ) .
- "option is enabled." .
- "MediaWiki will work correctly, but this setting
- increases your exposure to potential security vulnerabilities in PHP-based
- software running on your server. <b>You should disable it if you are able.</b>" );
- }
- return true;
- }
-
- function checkSafeMode() {
- if( ini_get( 'safe_mode' ) ) {
- $this->ui->warning( "PHP's
- <a href='http://www.php.net/features.safe-mode'>safe mode</a> is active!</b>
- You will likely have problems caused by this. You may need to make the
- 'images' subdirectory writable or specify a TMP environment variable pointing to
- a writable temporary directory owned by you, since safe mode breaks the system
- temporary directory." );
- $this->ui->message( "...due to safe mode restrictions, uploads will use flat directory mode if enabled." );
- $this->override( 'wgHashedUploadDirectory', true );
- } else {
- $this->ui->message( "PHP is not running in safe mode (this is good!)" );
- $this->ui->message( "...uploads will use hashed directory tree mode if enabled." );
- }
- return true;
- }
-
- function checkSAPI() {
- $sapi = php_sapi_name();
- $this->ui->message( "PHP server API is $sapi..." );
- switch( $sapi ) {
- case "apache":
- case "apache2handler":
- $this->ui->message( "...ok, using pretty URLs (<tt>index.php/Page_Title</tt>)" );
- break;
- case "cgi":
- case "cgi-fcgi":
- case "apache2filter":
- $this->ui->message( "using ugly URLs (<tt>index.php?title=Page_Title</tt>)" );
- $this->override( 'prettyURLs', false );
- # FIXME
- break;
- default:
- $this->ui->message( "unknown; using pretty URLs (<tt>index.php/Page_Title</tt>), if you have trouble change this in <tt>LocalSettings.php</tt>" );
- }
- return true;
- }
-
- function checkMemory() {
- $memlimit = ini_get( "memory_limit" );
- if( empty( $memlimit ) ) {
- $this->ui->message( "PHP is configured with no <tt>memory_limit</tt>." );
- return true;
- } else {
- $this->ui->message( "PHP's <tt>memory_limit</tt> is $memlimit... " );
- $n = IntVal( $memlimit );
- if( preg_match( '/^([0-9]+)[Mm]$/', trim( $memlimit ), $m ) ) {
- $n = IntVal( $m[1] * (1024*1024) );
- }
- if( $n < 20*1024*1024 ) {
- if( false === ini_set( "memory_limit", "20M" ) ) {
- $this->ui->warning( "...failed to raise the limit to 20M; you may have problems" );
- } else {
- $this->ui->message( "...raising limit to 20M" );
- $this->override( 'raiseMemory', true );
- }
- }
- return true;
- }
- }
-
- function checkZlib() {
- $zlib = function_exists( "gzencode" );
- if( $zlib ) {
- $this->ui->message( "Have zlib support; enabling output compression." );
- # This is a runtime thing, we're just letting the user know about it?
- } else {
- $this->ui->message( "No zlib support." );
- }
- return true;
- }
-
- function checkImageMagick() {
- $imcheck = array( "/usr/bin", "/usr/local/bin", "/sw/bin", "/opt/local/bin" );
- foreach( $imcheck as $dir ) {
- $im = "$dir/convert";
- if( file_exists( $im ) ) {
- $this->ui->message( "Found ImageMagick: <tt>$im</tt>; image thumbnailing will be enabled if you enable uploads." );
- $this->override( "wgImageMagick", $im );
- $this->override( "wgUseImageResize", true );
- break;
- }
- }
- return true;
- }
-
- function checkGD() {
- $gd = function_exists( "imagejpeg" );
- if( $gd ) {
- $this->ui->message( "Found GD graphics library built-in, image thumbnailing will be enabled if you enable uploads" );
- $this->override( "wgUseImageResize", true );
- } else {
- if( !isset( $this->settings['wgUseImageResize'] ) ) {
- $this->warning( "Couldn't find GD library or ImageMagick; image thumbnailing disabled." );
- }
- }
- return true;
- }
-
-
-}
-
-$ui =& new InstallInterface();
-$i =& new Installer( $ui );
-$i->runInstall();
-
-?> \ No newline at end of file
diff --git a/docs/design.doc b/docs/design.doc
index af1ee3054abb..8adff443f08f 100644
--- a/docs/design.doc
+++ b/docs/design.doc
@@ -118,9 +118,11 @@ Naming/coding conventions:
values wpName ("p" for "POST").
- Be kind to your release manager and don't use CVS keywords (Id,
- Revision, etc.) to mark file versions; they make merging code between
- different branches a pain for older versions (<1.12.x) of CVS, and
- are kind of sketchy for versions after that.
+ Revision, etc.) to mark file versions. They make merging code
+ between different branches a pain for CVS, and are kind of sketchy
+ for versions after that. (Yes, you can use the '-kk' flag so that
+ merges ignore keywords, but that messes up binary files. See
+ https://www.cvshome.org/docs/manual/cvs-1.11.18/cvs_5.html#SEC64).
\ No newline at end of file
diff --git a/extensions/Syslog.php b/extensions/Syslog.php
deleted file mode 100644
index d499bb955079..000000000000
--- a/extensions/Syslog.php
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-/* Syslog.php -- an extension to log events to the system logger
- * Copyright 2004 Evan Prodromou <evan@wikitravel.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
- *
- * @author Evan Prodromou <evan@wikitravel.org>
- * @package MediaWiki
- * @subpackage Extensions
- */
-
-if (defined('MEDIAWIKI')) {
-
- # Setup globals
-
- if (!isset($wgSyslogIdentity)) {
- $wgSyslogIdentity = $wgDBname;
- }
- if (!isset($wgSyslogFacility)) {
- $wgSyslogFacility = LOG_USER;
- }
-
- # Hook for article protection
-
- function syslogArticleProtect(&$article, &$user, $protect, &$reason, &$moveonly) {
- $title = $article->mTitle;
- syslog(LOG_NOTICE, "User '" . $user->getName() . "' " .
- (($protect) ? "protected" : "unprotected") . " article '" .
- $title->getPrefixedText() .
- "' for '" . $reason . "' " . (($moveonly) ? "(moves only)" : "") );
- return true;
- }
-
- # Hook for article deletion
-
- function syslogArticleDelete(&$article, &$user, &$reason) {
- $title = $article->mTitle;
- syslog(LOG_NOTICE, "User '" . $user->getName() . "' deleted '" .
- $title->getPrefixedText() .
- "' for '" . $reason . "' ");
- return true;
- }
-
- # Hook for article save
-
- function syslogArticleSave(&$article, &$user, &$text, $summary,
- $isminor, $iswatch, $section)
- {
- $title = $article->mTitle;
- syslog(LOG_NOTICE, "User '" . $user->getName() . "' saved '" .
- $title->getPrefixedText() .
- "' with comment '" . $summary . "' ");
- return true;
- }
-
- # Hook for IP & user blocks
-
- function syslogBlockIp(&$block, &$user) {
- syslog(LOG_NOTICE, "User '" . $user->getName() .
- "' blocked '" . (($block->mUser) ? $block->mUser : $block->mAddress) .
- "' for '" . $block->mReason . "' until '" . $block->mExpiry . "'");
- return true;
- }
-
- function syslogEmailUser(&$to, &$from, &$subject, &$text) {
- syslog(LOG_INFO, "Email sent from '$from' to '$to' with subject '$subject'");
- }
-
- # Hook for unwatch
-
- function syslogUnwatch(&$user, &$article) {
- syslog(LOG_INFO, "User '" . $user->getName() . "' stopped watching '" .
- $article->mTitle->getPrefixedText() . "'");
- }
-
- # Hook for login
-
- function syslogUserLogin(&$user) {
- syslog(LOG_INFO, "User '" . $user->getName() . "' logged in");
- return true;
- }
-
- # Hook for logout
-
- function syslogUserLogout(&$user) {
- syslog(LOG_INFO, "User '" . $user->getName() . "' logged out");
- return true;
- }
-
- # Hook for watch
-
- function syslogWatch(&$user, &$article) {
- syslog(LOG_INFO, "User '" . $user->getName() . "' started watching '" .
- $article->mTitle->getPrefixedText() . "'");
- }
-
- # Setup -- called once environment is configured
-
- function setupSyslog() {
-
- global $wgSyslogIdentity, $wgSyslogFacility, $_syslogId;
- global $wgHooks;
-
- openlog($wgSyslogIdentity, LOG_ODELAY | LOG_PID, $wgSyslogFacility);
-
- $wgHooks['UserLoginComplete'][] = 'syslogUserLogin';
- $wgHooks['UserLogout'][] = 'syslogUserLogout';
- $wgHooks['BlockIpComplete'][] = 'syslogBlockIp';
- $wgHooks['ArticleProtectComplete'][] = 'syslogArticleProtect';
- $wgHooks['ArticleDeleteComplete'][] = 'syslogArticleDelete';
- $wgHooks['ArticleSaveComplete'][] = 'syslogArticleSave';
- $wgHooks['EmailUserComplete'][] = 'syslogEmailUser';
- $wgHooks['WatchArticleComplete'][] = 'syslogWatch';
- $wgHooks['UnwatchArticleComplete'][] = 'syslogUnwatch';
-
- return true;
- }
-
- # Add to global list of extensions
-
- $wgExtensionFunctions[] = setupSyslog;
-}
-
-?> \ No newline at end of file
diff --git a/includes/Article.php b/includes/Article.php
index 0ad959cac938..52c08ae12660 100644
--- a/includes/Article.php
+++ b/includes/Article.php
@@ -43,6 +43,9 @@ class Article {
$this->clear();
}
+ function getTitle() {
+ return $this->mTitle;
+ }
/**
* Clear the object
* @private
@@ -1200,7 +1203,9 @@ class Article {
RecentChange::markPatrolled( $rcid );
$wgOut->setPagetitle( wfMsg( 'markedaspatrolled' ) );
$wgOut->addWikiText( wfMsg( 'markedaspatrolledtext' ) );
- $wgOut->returnToMain( true, $this->mTitle->getPrefixedText() );
+
+ $rcTitle = Title::makeTitle( NS_SPECIAL, 'Recentchanges' );
+ $wgOut->returnToMain( false, $rcTitle->getPrefixedText() );
}
else
{
@@ -1454,6 +1459,25 @@ class Article {
return;
}
+ $dbr =& $this->getDB();
+ $ns = $this->mTitle->getNamespace();
+ $title = $this->mTitle->getDBkey();
+
+ # Temporary hack:
+ # Fail if any of the old rows have old_flags=object
+ $row = $dbr->selectRow( 'old',
+ array( 'old_flags' ),
+ array(
+ 'old_namespace' => $ns,
+ 'old_title' => $title,
+ "old_flags LIKE '%object%'",
+ ), $fname, $this->getSelectOptions()
+ );
+ if ( $row ) {
+ $wgOut->fatalError( wfMsg( 'block_compress_delete' ) );
+ return;
+ }
+
if ( $confirm ) {
$this->doDelete( $reason );
return;
@@ -1462,9 +1486,6 @@ class Article {
# determine whether this page has earlier revisions
# and insert a warning if it does
# we select the text because it might be useful below
- $dbr =& $this->getDB();
- $ns = $this->mTitle->getNamespace();
- $title = $this->mTitle->getDBkey();
$old = $dbr->selectRow( 'old',
array( 'old_text', 'old_flags' ),
array(
@@ -1604,8 +1625,8 @@ class Article {
$wgOut->setRobotpolicy( 'noindex,nofollow' );
$sk = $wgUser->getSkin();
- $loglink = $sk->makeKnownLink( $wgContLang->getNsText( NS_PROJECT ) .
- ':' . wfMsgForContent( 'dellogpage' ),
+ $loglink = $sk->makeKnownLink( $wgContLang->getNsText( NS_SPECIAL ) .
+ ':log/delete',
wfMsg( 'deletionlog' ) );
$text = wfMsg( 'deletedtext', $deleted, $loglink );
@@ -1956,11 +1977,6 @@ class Article {
$called = true;
if($this->isFileCacheable()) {
$touched = $this->mTouched;
- if( $this->mTitle->getPrefixedDBkey() == wfMsg( 'mainpage' ) ) {
- # Expire the main page quicker
- $expire = wfUnix2Timestamp( time() - 3600 );
- $touched = max( $expire, $touched );
- }
$cache = new CacheManager( $this->mTitle );
if($cache->isFileCacheGood( $touched )) {
global $wgOut;
diff --git a/includes/CategoryPage.php b/includes/CategoryPage.php
index 42dae594c5f1..74b6229fd935 100644
--- a/includes/CategoryPage.php
+++ b/includes/CategoryPage.php
@@ -5,8 +5,11 @@
*
* @package MediaWiki
*/
+
+if( !defined( 'MEDIAWIKI' ) )
+ die();
-if ( $wgCategoryMagicGallery )
+if( $wgCategoryMagicGallery )
require_once('ImageGallery.php');
/**
@@ -41,272 +44,275 @@ class CategoryPage extends Article {
# off.
function closeShowCategory() {
- global $wgOut;
- $msg = wfMsg('usenewcategorypage');
- if ( '0' == @$msg[0] )
- {
- $wgOut->addHTML( $this->oldCategoryMagic() );
- } else {
- $wgOut->addHTML( $this->newCategoryMagic() );
- }
+ global $wgOut, $wgRequest;
+ $pageConditions = array();
+ $from = $wgRequest->getVal( 'from' );
+ $until = $wgRequest->getVal( 'until' );
+ $wgOut->addHTML( $this->doCategoryMagic( $from, $until ) );
}
- # This method generates the list of subcategories and pages for a category
- function oldCategoryMagic () {
- global $wgContLang, $wgUser ;
- $fname = 'CategoryPage::oldCategoryMagic';
-
-
- $sk =& $wgUser->getSkin() ;
-
- $articles = array() ;
- $children = array() ;
- $r = '';
- $id = $this->mTitle->getArticleID() ;
-
- # FIXME: add limits
- $dbr =& wfGetDB( DB_SLAVE );
- $cur = $dbr->tableName( 'cur' );
- $categorylinks = $dbr->tableName( 'categorylinks' );
-
- $t = $dbr->strencode( $this->mTitle->getDBKey() );
- $sql = "SELECT DISTINCT cur_title,cur_namespace FROM $cur,$categorylinks " .
- "WHERE cl_to='$t' AND cl_from=cur_id AND cur_is_redirect=0 ORDER BY cl_sortkey" ;
- $res = $dbr->query( $sql, $fname ) ;
- # For all pages that link to this category
- while ( $x = $dbr->fetchObject ( $res ) )
- {
- $t = $wgContLang->getNsText ( $x->cur_namespace ) ;
- if ( $t != '' ) $t .= ':' ;
- $t .= $x->cur_title ;
-
- if ( $x->cur_namespace == NS_CATEGORY ) {
- array_push ( $children , $sk->makeLink ( $t ) ) ; # Subcategory
- } else {
- array_push ( $articles , $sk->makeLink ( $t ) ) ; # Page in this category
- }
- }
- $dbr->freeResult ( $res ) ;
-
- # Showing subcategories
- if ( count ( $children ) > 0 ) {
- $r .= '<h2>'.wfMsg('subcategories')."</h2>\n" ;
- $r .= implode ( ', ' , $children ) ;
- }
-
- # Showing pages in this category
- if ( count ( $articles ) > 0 ) {
- $ti = $this->mTitle->getText() ;
- $h = wfMsg( 'category_header', $ti );
- $r .= "<h2>$h</h2>\n" ;
- $r .= implode ( ', ' , $articles ) ;
- }
-
- return $r ;
- }
-
- function newCategoryMagic () {
+ /**
+ * Format the category data list.
+ *
+ * @param string $from -- return only sort keys from this item on
+ * @param string $until -- don't return keys after this point.
+ * @return string HTML output
+ * @access private
+ */
+ function doCategoryMagic( $from = '', $until = '' ) {
global $wgContLang,$wgUser, $wgCategoryMagicGallery;
+ $fname = 'CategoryPage::doCategoryMagic';
+ wfProfileIn( $fname );
- $sk =& $wgUser->getSkin();
-
- $r = "<br style=\"clear:both;\"/>\n";
-
- $articles = array() ;
+ $articles = array();
$articles_start_char = array();
- $children = array() ;
+ $children = array();
$children_start_char = array();
- $data = array () ;
- $id = $this->mTitle->getArticleID() ;
-
- if ( $wgCategoryMagicGallery ) {
+ $data = array();
+ if( $wgCategoryMagicGallery ) {
$ig = new ImageGallery();
}
- # FIXME: add limits
$dbr =& wfGetDB( DB_SLAVE );
- $cur = $dbr->tableName( 'cur' );
- $categorylinks = $dbr->tableName( 'categorylinks' );
-
- $t = $dbr->strencode( $this->mTitle->getDBKey() );
- $sql = "SELECT DISTINCT cur_title,cur_namespace,cl_sortkey FROM " .
- "$cur,$categorylinks WHERE cl_to='$t' AND cl_from=cur_id AND cur_is_redirect=0 ORDER BY cl_sortkey" ;
- $res = $dbr->query ( $sql ) ;
- while ( $x = $dbr->fetchObject ( $res ) )
- {
- $t = $ns = $wgContLang->getNsText ( $x->cur_namespace ) ;
- if ( $t != '' ) $t .= ':' ;
- $t .= $x->cur_title ;
- $ctitle = str_replace( '_',' ',$x->cur_title );
-
- if ( $x->cur_namespace == NS_CATEGORY ) {
- array_push ( $children, $sk->makeKnownLink ( $t, $ctitle ) ) ; # Subcategory
-
+ if( $from != '' ) {
+ $pageCondition = 'cl_sortkey >= ' . $dbr->addQuotes( $from );
+ $flip = false;
+ } elseif( $until != '' ) {
+ $pageCondition = 'cl_sortkey < ' . $dbr->addQuotes( $until );
+ $flip = true;
+ } else {
+ $pageCondition = '1';
+ $flip = false;
+ }
+ $limit = 200;
+ $res = $dbr->select(
+ array( 'cur', 'categorylinks' ),
+ array( 'cur_title', 'cur_namespace', 'cl_sortkey' ),
+ array( $pageCondition,
+ 'cl_from = cur_id',
+ 'cl_to' => $this->mTitle->getDBKey(),
+ 'cur_is_redirect' => 0),
+ #+ $pageCondition,
+ $fname,
+ array( 'ORDER BY' => $flip ? 'cl_sortkey DESC' : 'cl_sortkey',
+ 'LIMIT' => $limit + 1 ) );
+
+ $sk =& $wgUser->getSkin();
+ $r = "<br style=\"clear:both;\"/>\n";
+ $count = 0;
+ $nextPage = null;
+ while( $x = $dbr->fetchObject ( $res ) ) {
+ if( ++$count > $limit ) {
+ // We've reached the one extra which shows that there are
+ // additional pages to be had. Stop here...
+ $nextPage = $x->cl_sortkey;
+ break;
+ }
+
+ $title = Title::makeTitle( $x->cur_namespace, $x->cur_title );
+
+ if( $title->getNamespace() == NS_CATEGORY ) {
+ // Subcategory; strip the 'Category' namespace from the link text.
+ array_push( $children, $sk->makeKnownLinkObj( $title, $title->getText() ) );
+
// 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...
- if ( ($ns.':'.$ctitle) == $x->cl_sortkey ) {
- array_push ( $children_start_char, $wgContLang->firstChar( $x->cur_title ) );
+ if( $title->getPrefixedText() == $x->cl_sortkey ) {
+ array_push( $children_start_char, $wgContLang->firstChar( $x->cur_title ) );
+ } else {
+ array_push( $children_start_char, $wgContLang->firstChar( $x->cl_sortkey ) ) ;
+ }
+ } elseif( $wgCategoryMagicGallery && $title->getNamespace() == NS_IMAGE ) {
+ // Show thumbnails of categorized images, in a separate chunk
+ if( $flip ) {
+ $ig->insert( Image::newFromTitle( $title ) );
} else {
- array_push ( $children_start_char, $wgContLang->firstChar( $x->cl_sortkey ) ) ;
+ $ig->add( Image::newFromTitle( $title ) );
}
- } elseif ( $wgCategoryMagicGallery && $x->cur_namespace == NS_IMAGE ) {
- $ig->add( new Image( $x->cur_title ) );
} else {
- array_push ( $articles , $sk->makeKnownLink ( $t ) ) ; # Page in this category
- array_push ( $articles_start_char, $wgContLang->firstChar( $x->cl_sortkey ) ) ;
+ // Page in this category
+ array_push( $articles, $sk->makeKnownLinkObj( $title ) ) ;
+ array_push( $articles_start_char, $wgContLang->firstChar( $x->cl_sortkey ) ) ;
}
}
- $dbr->freeResult ( $res ) ;
-
- $ti = $this->mTitle->getText() ;
+ $dbr->freeResult( $res );
+ if( $flip ) {
+ $children = array_reverse( $children );
+ $children_start_char = array_reverse( $children_start_char );
+ $articles = array_reverse( $articles );
+ $articles_start_char = array_reverse( $articles_start_char );
+ }
+
+ if( $until != '' ) {
+ $r .= $this->pagingLinks( $this->mTitle, $nextPage, $until, $limit );
+ } elseif( $nextPage != '' || $from != '' ) {
+ $r .= $this->pagingLinks( $this->mTitle, $from, $nextPage, $limit );
+ }
+
# Don't show subcategories section if there are none.
- if ( count ( $children ) > 0 )
- {
+ if( count( $children ) > 0 ) {
# Showing subcategories
$r .= '<h2>' . wfMsg( 'subcategories' ) . "</h2>\n";
+ $r .= $this->formatCount( $children, 'subcategorycount' );
+ $r .= $this->formatList( $children, $children_start_char );
+ }
- $numchild = count( $children );
- if($numchild == 1) {
- $r .= wfMsg( 'subcategorycount1', $wgContLang->formatNum( 1 ) );
- } else {
- $r .= wfMsg( 'subcategorycount' , $wgContLang->formatNum( $numchild ) );
- }
- unset($numchild);
-
- if ( count ( $children ) > 6 ) {
-
- // divide list into three equal chunks
- $chunk = (int) (count ( $children ) / 3);
-
- // get and display header
- $r .= '<table width="100%"><tr valign="top">';
-
- $startChunk = 0;
- $endChunk = $chunk;
-
- // loop through the chunks
- for($startChunk = 0, $endChunk = $chunk, $chunkIndex = 0;
- $chunkIndex < 3;
- $chunkIndex++, $startChunk = $endChunk, $endChunk += $chunk + 1)
- {
-
- $r .= '<td><ul>';
- // output all subcategories to category
- for ($index = $startChunk ;
- $index < $endChunk && $index < count($children);
- $index++ )
- {
- // check for change of starting letter or begging of chunk
- if ( ($index == $startChunk)
- || ($children_start_char[$index] != $children_start_char[$index - 1]) )
- {
- $r .= "</ul><h3>{$children_start_char[$index]}</h3>\n<ul>";
- }
-
- $r .= "<li>{$children[$index]}</li>";
- }
- $r .= '</ul></td>';
-
-
- }
- $r .= '</tr></table>';
- } else {
- // for short lists of subcategories to category.
-
- $r .= "<h3>{$children_start_char[0]}</h3>\n";
- $r .= '<ul><li>'.$children[0].'</li>';
- for ($index = 1; $index < count($children); $index++ )
- {
- if ($children_start_char[$index] != $children_start_char[$index - 1])
- {
- $r .= "</ul><h3>{$children_start_char[$index]}</h3>\n<ul>";
- }
- $r .= "<li>{$children[$index]}</li>";
- }
- $r .= '</ul>';
- }
- } # END of if ( count($children) > 0 )
-
+ # Showing articles in this category
+ $ti = htmlspecialchars( $this->mTitle->getText() );
$r .= '<h2>' . wfMsg( 'category_header', $ti ) . "</h2>\n";
+ $r .= $this->formatCount( $articles, 'categoryarticlecount' );
+ $r .= $this->formatList( $articles, $articles_start_char );
- $numart = count( $articles );
- if($numart == 1) {
- $r .= wfMsg( 'categoryarticlecount1', $wgContLang->formatNum( 1 ) );
- } else {
- $r .= wfMsg( 'categoryarticlecount' , $wgContLang->formatNum( $numart ) );
+ if( $wgCategoryMagicGallery && ! $ig->isEmpty() ) {
+ $r.= $ig->toHTML();
}
- unset($numart);
- # Showing articles in this category
- if ( count ( $articles ) > 6) {
- $ti = $this->mTitle->getText() ;
-
- // divide list into three equal chunks
- $chunk = (int) (count ( $articles ) / 3);
+ wfProfileOut( $fname );
+ return $r;
+ }
- // get and display header
- $r .= '<table width="100%"><tr valign="top">';
+ /**
+ * @param array $articles
+ * @param string $message
+ * @return string
+ * @access private
+ */
+ function formatCount( $articles, $message ) {
+ global $wgContLang;
+ $numart = count( $articles );
+ if( $numart == 1 ) {
+ # Slightly different message to avoid silly plural
+ $message .= '1';
+ }
+ return wfMsg( $message, $wgContLang->formatNum( $numart ) );
+ }
+ /**
+ * Format a list of articles chunked by letter, either as a
+ * bullet list or a columnar format, depending on the length.
+ *
+ * @param array $articles
+ * @param array $articles_start_char
+ * @param int $cutoff
+ * @return string
+ * @access private
+ */
+ function formatList( $articles, $articles_start_char, $cutoff = 6 ) {
+ if ( count ( $articles ) > $cutoff ) {
+ return $this->columnList( $articles, $articles_start_char );
+ } elseif ( count($articles) > 0) {
+ // for short lists of articles in categories.
+ return $this->shortList( $articles, $articles_start_char );
+ }
+ return '';
+ }
+
+ /**
+ * Format a list of articles chunked by letter in a three-column
+ * list, ordered vertically.
+ *
+ * @param array $articles
+ * @param array $articles_start_char
+ * @return string
+ * @access private
+ */
+ function columnList( $articles, $articles_start_char ) {
+ // divide list into three equal chunks
+ $chunk = (int) (count ( $articles ) / 3);
+
+ // get and display header
+ $r = '<table width="100%"><tr valign="top">';
+
+ $prev_start_char = 'none';
+
+ // loop through the chunks
+ for($startChunk = 0, $endChunk = $chunk, $chunkIndex = 0;
+ $chunkIndex < 3;
+ $chunkIndex++, $startChunk = $endChunk, $endChunk += $chunk + 1)
+ {
- $prev_start_char = "";
+ $r .= '<td><ul>';
- // loop through the chunks
- for($startChunk = 0, $endChunk = $chunk, $chunkIndex = 0;
- $chunkIndex < 3;
- $chunkIndex++, $startChunk = $endChunk, $endChunk += $chunk + 1)
+ // output all articles in category
+ for ($index = $startChunk ;
+ $index < $endChunk && $index < count($articles);
+ $index++ )
{
+ // check for change of starting letter or begining of chunk
+ if ( ($index == $startChunk) ||
+ ($articles_start_char[$index] != $articles_start_char[$index - 1]) )
- $r .= '<td><ul>';
-
- // output all articles in category
- for ($index = $startChunk ;
- $index < $endChunk && $index < count($articles);
- $index++ )
{
- // check for change of starting letter or begging of chunk
- if ( ($index == $startChunk) ||
- ($articles_start_char[$index] != $articles_start_char[$index - 1]) )
-
- {
- $cont_msg = "";
- if($articles_start_char[$index] == $prev_start_char)
- $cont_msg = wfMsg('listingcontinuesabbrev');
- $r .= "</ul><h3>{$articles_start_char[$index]}$cont_msg</h3>\n<ul>";
- $prev_start_char = $articles_start_char[$index];
- }
-
- $r .= "<li>{$articles[$index]}</li>";
+ $cont_msg = "";
+ if ( $articles_start_char[$index] == $prev_start_char )
+ $cont_msg = wfMsg('listingcontinuesabbrev');
+ $r .= "</ul><h3>{$articles_start_char[$index]}$cont_msg</h3>\n<ul>";
+ $prev_start_char = $articles_start_char[$index];
}
- $r .= '</ul></td>';
-
+ $r .= "<li>{$articles[$index]}</li>";
}
- $r .= '</tr></table>';
- } elseif ( count($articles) > 0) {
- // for short lists of articles in categories.
- $ti = $this->mTitle->getText() ;
+ $r .= '</ul></td>';
- $r .= '<h3>'.$articles_start_char[0]."</h3>\n";
- $r .= '<ul><li>'.$articles[0].'</li>';
- for ($index = 1; $index < count($articles); $index++ )
- {
- if ($articles_start_char[$index] != $articles_start_char[$index - 1])
- {
- $r .= "</ul><h3>{$articles_start_char[$index]}</h3>\n<ul>";
- }
- $r .= "<li>{$articles[$index]}</li>";
- }
- $r .= '</ul>';
}
+ $r .= '</tr></table>';
+ return $r;
+ }
+
+ /**
+ * Format a list of articles chunked by letter in a bullet list.
+ * @param array $articles
+ * @param array $articles_start_char
+ * @return string
+ * @access private
+ */
+ function shortList( $articles, $articles_start_char ) {
+ $r = '<h3>'.$articles_start_char[0]."</h3>\n";
+ $r .= '<ul><li>'.$articles[0].'</li>';
+ for ($index = 1; $index < count($articles); $index++ )
+ {
+ if ($articles_start_char[$index] != $articles_start_char[$index - 1])
+ {
+ $r .= "</ul><h3>{$articles_start_char[$index]}</h3>\n<ul>";
+ }
- if ( $wgCategoryMagicGallery && ! $ig->isEmpty() ) {
- $r.= $ig->toHTML();
+ $r .= "<li>{$articles[$index]}</li>";
}
-
- return $r ;
+ $r .= '</ul>';
+ return $r;
+ }
+
+ /**
+ * @param Title $title
+ * @param string $first
+ * @param string $last
+ * @param int $limit
+ * @param array $query - additional query options to pass
+ * @return string
+ * @access private
+ */
+ function pagingLinks( $title, $first, $last, $limit, $query = array() ) {
+ global $wgUser, $wgLang;
+ $sk =& $wgUser->getSkin();
+ $limitText = $wgLang->formatNum( $limit );
+
+ $prevLink = htmlspecialchars( wfMsg( 'prevn', $limitText ) );
+ if( $first != '' ) {
+ $prevLink = $sk->makeLinkObj( $title, $prevLink,
+ wfArrayToCGI( $query + array( 'until' => $first ) ) );
+ }
+ $nextLink = htmlspecialchars( wfMsg( 'nextn', $limitText ) );
+ if( $last != '' ) {
+ $nextLink = $sk->makeLinkObj( $title, $nextLink,
+ wfArrayToCGI( $query + array( 'from' => $last ) ) );
+ }
+
+ return "($prevLink) ($nextLink)";
}
}
+
+
?>
diff --git a/includes/ChangesList.php b/includes/ChangesList.php
index 0986209bb2d2..07644bade93d 100644
--- a/includes/ChangesList.php
+++ b/includes/ChangesList.php
@@ -54,17 +54,17 @@ class ChangesList {
$N = wfMsg( 'newpageletter' );
if ( $rc_type == RC_NEW ) {
- $r .= $N ;
+ $r .= '<span class="newpage">' . htmlspecialchars( $N ) . '</span>';
} else {
$r .= '&nbsp;' ;
}
if ( $rc_minor ) {
- $r .= $M ;
+ $r .= '<span class="minor">' . htmlspecialchars( $M ) . '</span>';
} else {
$r .= '&nbsp;' ;
}
if ( $rcObj->unpatrolled ) {
- $r .= '!';
+ $r .= '<span class="unpatrolled">!</span>';
} else {
$r .= '&nbsp;';
}
@@ -154,11 +154,14 @@ class ChangesList {
# Main line
# M/N
$r .= '<tt>' ;
- if ( $isnew ) $r .= $N ;
- else $r .= '&nbsp;' ;
- $r .= '&nbsp;' ; # Minor
+ if ( $isnew ) {
+ $r .= '<span class="newpage">' . htmlspecialchars( $N ) . '</span>';
+ } else {
+ $r .= '&nbsp;';
+ }
+ $r .= '&nbsp;'; # Minor
if ( $unpatrolled ) {
- $r .= "!";
+ $r .= '<span class="unpatrolled">!</span>';
} else {
$r .= "&nbsp;";
}
@@ -198,19 +201,19 @@ class ChangesList {
$r .= '<img src="'.$wgStylePath.'/common/images/Arr_.png" width="12" height="12" />';
$r .= '<tt>&nbsp; &nbsp; &nbsp; &nbsp;' ;
if ( $rc_new ) {
- $r .= $N ;
+ $r .= '<span class="newpage">' . htmlspecialchars( $N ) . '</span>';
} else {
$r .= '&nbsp;' ;
}
if ( $rc_minor ) {
- $r .= $M ;
+ $r .= '<span class="minoredit">' . htmlspecialchars( $M ) . '</span>';
} else {
$r .= '&nbsp;' ;
}
if ( $rcObj->unpatrolled ) {
- $r .= "!";
+ $r .= '<span class="unpatrolled">!</span>';
} else {
$r .= "&nbsp;";
}
@@ -350,9 +353,9 @@ class ChangesList {
$s .= ') . . ';
# M, N and ! (minor, new and unpatrolled)
- if ( $rc_minor ) { $s .= ' <span class="minor">'.$message["minoreditletter"].'</span>'; }
- if ( $rc_type == RC_NEW ) { $s .= '<span class="newpage">'.$message["newpageletter"].'</span>'; }
- if ( !$rc_patrolled ) { $s .= ' <span class="unpatrolled">!</span>'; }
+ if ( $rc_minor ) { $s .= ' <span class="minor">'.htmlspecialchars( $message["minoreditletter"] ).'</span>'; }
+ if ( $rc_type == RC_NEW ) { $s .= '<span class="newpage">'.htmlspecialchars( $message["newpageletter"] ).'</span>'; }
+ if ( $unpatrolled ) { $s .= ' <span class="unpatrolled">!</span>'; }
# Article link
# If it's a new article, there is no diff link, but if it hasn't been
@@ -397,7 +400,7 @@ class ChangesList {
$blockLink='';
if ( ( 0 == $rc_user ) && $wgUser->isAllowed('block') ) {
$blockLinkPage = Title::makeTitle( NS_SPECIAL, 'Blockip' );
- $blockLink = $this->skin->makeKnownLink( $blockLinkPage,
+ $blockLink = $this->skin->makeKnownLinkObj( $blockLinkPage,
$message['blocklink'], 'ip='.$rc_user_text );
}
diff --git a/includes/Database.php b/includes/Database.php
index 1dc6c1ae8199..8bfc8580995d 100644
--- a/includes/Database.php
+++ b/includes/Database.php
@@ -532,7 +532,13 @@ class Database {
* Get a description of the last error
* See mysql_error() for more details
*/
- function lastError() { return mysql_error(); }
+ function lastError() {
+ $error = mysql_error();
+ if( $error ) {
+ $error .= ' (' . $this->mServer . ')';
+ }
+ return $error;
+ }
/**
* Get the number of rows affected by the last write query
@@ -620,7 +626,7 @@ class Database {
*/
function select( $table, $vars, $conds='', $fname = 'Database::select', $options = array() )
{
- if ( is_array( $vars ) ) {
+ if( is_array( $vars ) ) {
$vars = implode( ',', $vars );
}
if( is_array( $table ) ) {
@@ -633,7 +639,7 @@ class Database {
list( $useIndex, $tailOpts ) = $this->makeSelectOptions( $options );
- if ( $conds !== false && $conds != '' ) {
+ if( !empty( $conds ) ) {
if ( is_array( $conds ) ) {
$conds = $this->makeList( $conds, LIST_AND );
}
@@ -946,16 +952,18 @@ class Database {
*/
function tableName( $name ) {
global $wgSharedDB;
- if ( $this->mTablePrefix !== '' ) {
- if ( strpos( '.', $name ) === false ) {
- $name = $this->mTablePrefix . $name;
+
+ # Skip quoted literals
+ if ( $name{0} != '`' ) {
+ if ( $this->mTablePrefix !== '' && strpos( '.', $name ) === false ) {
+ $name = "{$this->mTablePrefix}$name";
+ }
+ if ( isset( $wgSharedDB ) && 'user' == $name ) {
+ $name = "`$wgSharedDB`.`$name`";
+ } else {
+ # Standard quoting
+ $name = "`$name`";
}
- }
- if ( isset( $wgSharedDB ) && 'user' == $name ) {
- $name = $wgSharedDB . '.' . $name;
- }
- if( $name == 'group' ) {
- $name = '`' . $name . '`';
}
return $name;
}
@@ -1236,9 +1244,17 @@ class Database {
* @param integer $timeout the maximum number of seconds to wait for synchronisation
*/
function masterPosWait( $file, $pos, $timeout ) {
+ $fname = 'Database::masterPosWait';
+ wfProfileIn( $fname );
+
+
+ # Commit any open transactions
+ $this->immediateCommit();
+
+ # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
$encFile = $this->strencode( $file );
$sql = "SELECT MASTER_POS_WAIT('$encFile', $pos, $timeout)";
- $res = $this->query( $sql, 'Database::masterPosWait' );
+ $res = $this->doQuery( $sql );
if ( $res && $row = $this->fetchRow( $res ) ) {
$this->freeResult( $res );
return $row[0];
@@ -1430,7 +1446,41 @@ class ResultWrapper {
*/
function wfEmergencyAbort( &$conn, $error ) {
global $wgTitle, $wgUseFileCache, $title, $wgInputEncoding, $wgSiteNotice, $wgOutputEncoding;
+ global $wgSitename, $wgServer;
+ # I give up, Brion is right. Getting the message cache to work when there is no DB is tricky.
+ # Hard coding strings instead.
+
+ $noconnect = 'Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server. <br />
+$1';
+ $mainpage = 'Main Page';
+ $searchdisabled = <<<EOT
+<p style="margin: 1.5em 2em 1em">$wgSitename search is disabled for performance reasons. You can search via Google in the meantime.
+<span style="font-size: 89%; display: block; margin-left: .2em">Note that their indexes of $wgSitename content may be out of date.</span></p>',
+EOT;
+
+ $googlesearch = "
+<!-- SiteSearch Google -->
+<FORM method=GET action=\"http://www.google.com/search\">
+<TABLE bgcolor=\"#FFFFFF\"><tr><td>
+<A HREF=\"http://www.google.com/\">
+<IMG SRC=\"http://www.google.com/logos/Logo_40wht.gif\"
+border=\"0\" ALT=\"Google\"></A>
+</td>
+<td>
+<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
+<INPUT type=submit name=btnG VALUE=\"Google Search\">
+<font size=-1>
+<input type=hidden name=domains value=\"$wgServer\"><br /><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"$wgServer\" checked> $wgServer <br />
+<input type='hidden' name='ie' value='$2'>
+<input type='hidden' name='oe' value='$2'>
+</font>
+</td></tr></TABLE>
+</FORM>
+<!-- SiteSearch Google -->";
+ $cachederror = "The following is a cached copy of the requested page, and may not be up to date. ";
+
+
if( !headers_sent() ) {
header( 'HTTP/1.0 500 Internal Server Error' );
header( 'Content-type: text/html; charset='.$wgOutputEncoding );
@@ -1439,7 +1489,9 @@ function wfEmergencyAbort( &$conn, $error ) {
header( 'Pragma: nocache' );
}
$msg = $wgSiteNotice;
- if($msg == '') $msg = wfMsgNoDB( 'noconnect', $error );
+ if($msg == '') {
+ $msg = str_replace( '$1', $error, $noconnect );
+ }
$text = $msg;
if($wgUseFileCache) {
@@ -1450,18 +1502,19 @@ function wfEmergencyAbort( &$conn, $error ) {
$t = Title::newFromURL( $title );
} elseif (@/**/$_REQUEST['search']) {
$search = $_REQUEST['search'];
- echo wfMsgNoDB( 'searchdisabled' );
- echo wfMsgNoDB( 'googlesearch', htmlspecialchars( $search ), $wgInputEncoding );
+ echo $searchdisabled;
+ echo str_replace( array( '$1', '$2' ), array( htmlspecialchars( $search ),
+ $wgInputEncoding ), $googlesearch );
wfErrorExit();
} else {
- $t = Title::newFromText( wfMsgNoDBForContent( 'mainpage' ) );
+ $t = Title::newFromText( $mainpage );
}
}
$cache = new CacheManager( $t );
if( $cache->isFileCached() ) {
$msg = '<p style="color: red"><b>'.$msg."<br />\n" .
- wfMsgNoDB( 'cachederror' ) . "</b></p>\n";
+ $cachederror . "</b></p>\n";
$tag = '<div id="article">';
$text = str_replace(
diff --git a/includes/DatabasePostgreSQL.php b/includes/DatabasePostgreSQL.php
index 21dc994eb660..a42ae7bde12a 100644
--- a/includes/DatabasePostgreSQL.php
+++ b/includes/DatabasePostgreSQL.php
@@ -259,7 +259,7 @@ class DatabasePgsql extends Database {
}
function strencode( $s ) {
- return addslashes( $s );
+ return pg_escape_string( $s );
}
/**
diff --git a/includes/DateFormatter.php b/includes/DateFormatter.php
index e2d4c124dd30..6fe1dd0fb078 100755
--- a/includes/DateFormatter.php
+++ b/includes/DateFormatter.php
@@ -47,11 +47,14 @@ class DateFormatter
* @todo document
*/
function DateFormatter() {
- global $wgMonthNamesEn, $wgInputEncoding;
+ global $wgContLang, $wgInputEncoding;
$this->monthNames = $this->getMonthRegex();
for ( $i=1; $i<=12; $i++ ) {
- $this->xMonths[strtolower( $wgMonthNamesEn[$i-1] )] = $i;
+ $this->xMonths[strtolower( $wgContLang->getMonthName( $i ) )] = $i;
+ }
+ for ( $i=1; $i<=12; $i++ ) {
+ $this->xMonths[strtolower( $wgContLang->getMonthAbbreviation( $i ) )] = $i;
}
# Attempt at UTF-8 support, untested at the moment
@@ -137,7 +140,6 @@ class DateFormatter
* @param $matches
*/
function replace( $matches ) {
- global $wgMonthNamesEn;
# Extract information from $matches
$bits = array();
$key = $this->keys[$this->mSource];
@@ -157,14 +159,14 @@ class DateFormatter
$char = $format{$p};
switch ( $char ) {
case 'd': # ISO day of month
- if ( is_null($bits['d']) ) {
+ if ( !isset($bits['d']) ) {
$text .= sprintf( '%02d', $bits['j'] );
} else {
$text .= $bits['d'];
}
break;
case 'm': # ISO month
- if ( is_null($bits['m']) ) {
+ if ( !isset($bits['m']) ) {
$m = $this->makeIsoMonth( $bits['F'] );
if ( !$m || $m == '00' ) {
$fail = true;
@@ -176,33 +178,34 @@ class DateFormatter
}
break;
case 'y': # ISO year
- if ( is_null( $bits['y'] ) ) {
+ if ( !isset( $bits['y'] ) ) {
$text .= $this->makeIsoYear( $bits['Y'] );
} else {
$text .= $bits['y'];
}
break;
case 'j': # ordinary day of month
- if ( is_null($bits['j']) ) {
+ if ( !isset($bits['j']) ) {
$text .= IntVal( $bits['d'] );
} else {
$text .= $bits['j'];
}
break;
case 'F': # long month
- if ( is_null( $bits['F'] ) ) {
+ if ( !isset( $bits['F'] ) ) {
$m = IntVal($bits['m']);
if ( $m > 12 || $m < 1 ) {
$fail = true;
} else {
- $text .= $wgMonthNamesEn[$m-1];
+ global $wgContLang;
+ $text .= $wgContLang->getMonthName( $m );
}
} else {
$text .= ucfirst( $bits['F'] );
}
break;
case 'Y': # ordinary (optional BC) year
- if ( is_null( $bits['Y'] ) ) {
+ if ( !isset( $bits['Y'] ) ) {
$text .= $this->makeNormalYear( $bits['y'] );
} else {
$text .= $bits['Y'];
@@ -222,8 +225,13 @@ class DateFormatter
* @todo document
*/
function getMonthRegex() {
- global $wgMonthNamesEn;
- return implode( '|', $wgMonthNamesEn );
+ global $wgContLang;
+ $names = array();
+ for( $i = 1; $i <= 12; $i++ ) {
+ $names[] = $wgContLang->getMonthName( $i );
+ $names[] = $wgContLang->getMonthAbbreviation( $i );
+ }
+ return implode( '|', $names );
}
/**
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index c4eb85c462f8..9e377c104f6d 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -19,7 +19,7 @@ if( defined( 'MEDIAWIKI' ) ) {
* MediaWiki version number
* @global string $wgVersion
*/
-$wgVersion = '1.4-beta0';
+$wgVersion = '1.4beta4';
/**
* Name of the site.
@@ -352,9 +352,11 @@ $wgPartialMessageCache = false;
# supports this function, to convert between Traditional and Simplified
# Chinese. This flag is meant to isolate the (untested) conversion
# code, so that if it breaks, only zh will be affected
-$wgDisableLangConversion = true;
+$wgDisableLangConversion = false;
# Whether to use zhdaemon to perform Chinese text processing
+# zhdaemon is under developement, so normally you don't want to
+# use it unless for testing
$wgUseZhdaemon = false;
$wgZhdaemonHost="localhost";
$wgZhdaemonPort=2004;
@@ -651,6 +653,9 @@ $wgRightsUrl = NULL;
$wgRightsText = NULL;
$wgRightsIcon = NULL;
+# Set this to some HTML to override the rights icon with an arbitrary logo
+$wgCopyrightIcon = NULL;
+
# Set this to true if you want detailed copyright information forms on Upload.
$wgUseCopyrightUpload = false;
@@ -773,6 +778,20 @@ $wgUseExternalDiffEngine = false;
# Use RC Patrolling to check for vandalism
$wgUseRCPatrol = true;
+# Set maximum number of results to return in syndication feeds
+# (RSS, Atom) for eg Recentchanges, Newpages.
+$wgFeedLimit = 50;
+
+# _Minimum_ timeout for cached Recentchanges feed, in seconds.
+# A cached version will continue to be served out even if changes
+# are made, until this many seconds runs out since the last render.
+$wgFeedCacheTimeout = 60;
+
+# When generating Recentchanges RSS/Atom feed, diffs will not be
+# generated for pages larger than this size.
+$wgFeedDiffCutoff = 32768;
+
+
# Additional namespaces. If the namespaces defined in Language.php and Namespace.php are insufficient,
# you can create new ones here, for example, to import Help files in other languages.
# PLEASE NOTE: Once you delete a namespace, the pages in that namespace will no longer be accessible.
@@ -842,14 +861,26 @@ $wgBrowserBlackList = array(
# $wgLocaltimezone = 'PST8PDT';
# $wgLocaltimezone = 'Europe/Sweden';
# $wgLocaltimezone = 'CET';
+$wgLocaltimezone = null;
+
+/*
+When translating messages with wfMsg(), it is not always clear what should
+be considered UI messages and what shoud be content messages.
+
+For example, for regular wikipedia site like en, there should be only one
+'mainpage', therefore when getting the link of 'mainpage', we should
+treate it as content of the site and call wfMsgForContent(), while for
+rendering the text of the link, we call wfMsg(). The code in default
+behaves this way. However, sites like common do offer different versions
+of 'mainpage' and the like for different languages. This array provides a
+way to override the default behavior. For example, to allow language specific
+mainpage and community portal, set
+
+$wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' );
-# User level management
-# The number is the database id of a group you want users to be attached by
-# default. A better interface should be coded [av]
-$wgAnonGroupId = 1;
-$wgLoggedInGroupId = 2;
+*/
+$wgForceUIMsgAsContentMsg = array();
-$wgWhitelistRead = array ( ':Accueil', ':Main_Page');
/**
* Authentication plugin.
@@ -868,6 +899,26 @@ $wgAuth = null;
$wgHooks = array();
+
+/**
+ * Disable internal search so that extensions can implement it.
+ */
+
+$wgDisableInternalSearch = false;
+
+/**
+ * Set this to a URL to forward search requests to some external location.
+ * If the URL includes '$1', this will be replaced with the URL-encoded
+ * search term.
+ *
+ * For example, to forward to Google you'd have something like:
+ * $wgSearchForwardUrl = 'http://www.google.com/search?q=$1' .
+ * '&domains=http://example.com' .
+ * '&sitesearch=http://example.com' .
+ * '&ie=utf-8&oe=utf-8';
+ */
+$wgSearchForwardUrl = null;
+
} else {
die();
}
diff --git a/includes/DifferenceEngine.php b/includes/DifferenceEngine.php
index a4793f7703f3..3bff11c8ada4 100644
--- a/includes/DifferenceEngine.php
+++ b/includes/DifferenceEngine.php
@@ -215,7 +215,7 @@ class DifferenceEngine {
}
function getDiff( $otext, $ntext, $otitle, $ntitle ) {
- global $wgUseExternalDiffEngine;
+ global $wgUseExternalDiffEngine, $wgContLang;
$out = "
<table border='0' width='98%' cellpadding='0' cellspacing='4' class='diff'>
<tr>
@@ -224,6 +224,9 @@ class DifferenceEngine {
</tr>
";
+ $otext = $wgContLang->segmentForDiff($otext);
+ $ntext = $wgContLang->segmentForDiff($ntext);
+ $difftext='';
if ( $wgUseExternalDiffEngine ) {
# For historical reasons, external diff engine expects
# input text to be HTML-escaped already
@@ -232,15 +235,16 @@ class DifferenceEngine {
if( !function_exists( 'wikidiff_do_diff' ) ) {
dl('php_wikidiff.so');
}
- $out .= wikidiff_do_diff( $otext, $ntext, 2 );
+ $difftext = wikidiff_do_diff( $otext, $ntext, 2 );
} else {
$ota = explode( "\n", str_replace( "\r\n", "\n", $otext ) );
$nta = explode( "\n", str_replace( "\r\n", "\n", $ntext ) );
$diffs =& new Diff( $ota, $nta );
$formatter =& new TableDiffFormatter();
- $out .= $formatter->format( $diffs );
+ $difftext = $formatter->format( $diffs );
}
- $out .= "</table>\n";
+ $difftext = $wgContLang->unsegmentForDiff($difftext);
+ $out .= $difftext."</table>\n";
return $out;
}
@@ -294,7 +298,7 @@ class DifferenceEngine {
}
if ( 0 == $this->mOldid ) {
$s = $dbr->selectRow( 'old',
- array( 'old_namespace','old_title','old_timestamp','old_text', 'old_flags','old_user_text','old_comment' ),
+ array( 'old_id', 'old_namespace','old_title','old_timestamp','old_text', 'old_flags','old_user_text','old_comment' ),
array( /* WHERE */
'old_namespace' => $this->mNewPage->getNamespace(),
'old_title' => $this->mNewPage->getDBkey()
@@ -304,6 +308,7 @@ class DifferenceEngine {
wfDebug( 'Unable to load ' . $this->mNewPage->getPrefixedDBkey() . " from old\n" );
return false;
}
+ $this->mOldid = IntVal( $s->old_id );
} else {
$s = $dbr->selectRow( 'old',
array( 'old_namespace','old_title','old_timestamp','old_text','old_flags','old_user_text','old_comment'),
diff --git a/includes/EditPage.php b/includes/EditPage.php
index e7ccb3415fad..aa6a094a9ca7 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -66,10 +66,14 @@ class EditPage {
}
if ( $this->save ) {
$this->editForm( 'save' );
- } else if ( $this->preview or $wgUser->getOption('previewonfirst')) {
+ } else if ( $this->preview ) {
$this->editForm( 'preview' );
} else { # First time through
- $this->editForm( 'initial' );
+ if( $wgUser->getOption('previewonfirst') ) {
+ $this->editForm( 'preview', true );
+ } else {
+ $this->editForm( 'initial', true );
+ }
}
}
@@ -119,8 +123,9 @@ class EditPage {
* the newly-edited page.
*
* @param string $formtype Type of form either : save, initial or preview
+ * @param bool $firsttime True to load form data from db
*/
- function editForm( $formtype ) {
+ function editForm( $formtype, $firsttime = false ) {
global $wgOut, $wgUser;
global $wgLang, $wgContLang, $wgParser, $wgTitle;
global $wgAllowAnonymousMinor;
@@ -149,7 +154,7 @@ class EditPage {
if ( 'save' == $formtype ) {
# Check for spam
if ( $wgSpamRegex && preg_match( $wgSpamRegex, $this->textbox1, $matches ) ) {
- $this->spamPage ( $matches );
+ $this->spamPage ( $matches[0] );
return;
}
if ( $wgFilterCallback && $wgFilterCallback( $this->mTitle, $this->textbox1, $this->section ) ) {
@@ -245,14 +250,14 @@ class EditPage {
}
}
- if (wfRunHooks('ArticleSave', $this, $wgUser, $text, $this->summary,
+ if (wfRunHooks('ArticleSave', $this->mArticle, $wgUser, $text, $this->summary,
$this->minoredit, $this->watchthis, $sectionanchor))
{
# update the article here
if($this->mArticle->updateArticle( $text, $this->summary, $this->minoredit,
$this->watchthis, '', $sectionanchor ))
{
- wfRunHooks('ArticleSaveComplete', $this, $wgUser, $text, $this->summary,
+ wfRunHooks('ArticleSaveComplete', $this->mArticle, $wgUser, $text, $this->summary,
$this->minoredit, $this->watchthis, $sectionanchor);
return;
}
@@ -264,7 +269,7 @@ class EditPage {
# First time through: get contents, set time for conflict
# checking, etc.
- if ( 'initial' == $formtype ) {
+ if ( 'initial' == $formtype || $firsttime ) {
$this->edittime = $this->mArticle->getTimestamp();
$this->textbox1 = $this->mArticle->getContent( true );
$this->summary = '';
@@ -292,11 +297,11 @@ class EditPage {
$s = wfMsg('editingsection', $this->mTitle->getPrefixedText() );
}
if(!$this->preview) {
- $sectitle=preg_match("/^=+(.*?)=+/mi",
- $this->textbox1,
- $matches);
- if( !empty( $matches[1] ) ) {
- $this->summary = "/* ". trim($matches[1])." */ ";
+ preg_match( "/^(=+)(.+)\\1/mi",
+ $this->textbox1,
+ $matches );
+ if( !empty( $matches[2] ) ) {
+ $this->summary = "/* ". trim($matches[2])." */ ";
}
}
} else {
@@ -424,11 +429,6 @@ class EditPage {
$parserOutput = $wgParser->parse( $previewtext , $wgTitle, $parserOptions );
$wgOut->addHTML( $parserOutput->mText );
} else {
- # if user want to see preview when he edit an article
- if( $wgUser->getOption('previewonfirst') and ($this->textbox1 == '')) {
- $this->textbox1 = $this->mArticle->getContent(true);
- }
-
$parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $this->textbox1 ) ."\n\n",
$wgTitle, $parserOptions );
@@ -563,7 +563,7 @@ htmlspecialchars( $wgContLang->recodeForEdit( $this->textbox1 ) ) .
/**
* @todo document
*/
- function spamPage ( $matches = array() )
+ function spamPage ( $match = false )
{
global $wgOut;
$wgOut->setPageTitle( wfMsg( 'spamprotectiontitle' ) );
@@ -571,8 +571,8 @@ htmlspecialchars( $wgContLang->recodeForEdit( $this->textbox1 ) ) .
$wgOut->setArticleRelated( false );
$wgOut->addWikiText( wfMsg( 'spamprotectiontext' ) );
- if ( isset ( $matches[0] ) ) {
- $wgOut->addWikiText( wfMsg( 'spamprotectionmatch', "<nowiki>{$matches[0]}</nowiki>" ) );
+ if ( $match ) {
+ $wgOut->addWikiText( wfMsg( 'spamprotectionmatch', "<nowiki>{$match}</nowiki>" ) );
}
$wgOut->returnToMain( false );
}
diff --git a/includes/Feed.php b/includes/Feed.php
index 8d4188fac4ff..c3cd3711a29f 100644
--- a/includes/Feed.php
+++ b/includes/Feed.php
@@ -134,20 +134,48 @@ class ChannelFeed extends FeedItem {
/**#@-*/
/**
- * @todo document
- * @param string $mimetype (optional) type of output
+ * Setup and send HTTP headers. Don't send any content;
+ * content might end up being cached and re-sent with
+ * these same headers later.
+ *
+ * This should be called from the outHeader() method,
+ * but can also be called separately.
+ *
+ * @access public
*/
- function outXmlHeader( $mimetype='application/xml' ) {
- global $wgServer, $wgStylePath, $wgOut;
+ function httpHeaders() {
+ global $wgOut;
# We take over from $wgOut, excepting its cache header info
$wgOut->disable();
+ $mimetype = $this->contentType();
header( "Content-type: $mimetype; charset=UTF-8" );
$wgOut->sendCacheControl();
+ }
+
+ /**
+ * Return an internet media type to be sent in the headers.
+ *
+ * @return string
+ * @access private
+ */
+ function contentType() {
+ return 'application/xml';
+ }
+
+ /**
+ * Output the initial XML headers with a stylesheet for legibility
+ * if someone finds it in a browser.
+ * @access private
+ */
+ function outXmlHeader() {
+ global $wgServer, $wgStylePath;
+
+ $this->httpHeaders();
print '<' . '?xml version="1.0" encoding="utf-8"?' . ">\n";
print '<' . '?xml-stylesheet type="text/css" href="' .
- htmlspecialchars( "$wgServer$wgStylePath/feed.css" ) . '"?' . ">\n";
+ htmlspecialchars( "$wgServer$wgStylePath/common/feed.css" ) . '"?' . ">\n";
}
}
diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php
index 943fe152abd3..89f4ddb0a340 100644
--- a/includes/GlobalFunctions.php
+++ b/includes/GlobalFunctions.php
@@ -342,9 +342,14 @@ function wfMsg( $key ) {
* Get a message from anywhere, for the content
*/
function wfMsgForContent( $key ) {
+ global $wgForceUIMsgAsContentMsg;
$args = func_get_args();
array_shift( $args );
- return wfMsgReal( $key, $args, true, true );
+ $forcontent = true;
+ if( is_array( $wgForceUIMsgAsContentMsg ) &&
+ in_array( $key, $wgForceUIMsgAsContentMsg ) )
+ $forcontent = false;
+ return wfMsgReal( $key, $args, true, $forcontent );
}
/**
@@ -360,9 +365,14 @@ function wfMsgNoDB( $key ) {
* Get a message from the language file, for the content
*/
function wfMsgNoDBForContent( $key ) {
+ global $wgForceUIMsgAsContentMsg;
$args = func_get_args();
array_shift( $args );
- return wfMsgReal( $key, $args, false, true );
+ $forcontent = true;
+ if( is_array( $wgForceUIMsgAsContentMsg ) &&
+ in_array( $key, $wgForceUIMsgAsContentMsg ) )
+ $forcontent = false;
+ return wfMsgReal( $key, $args, false, $forcontent );
}
@@ -378,48 +388,22 @@ function wfMsgReal( $key, $args, $useDB, $forContent=false ) {
$fname = 'wfMsgReal';
wfProfileIn( $fname );
- if( $forContent ) {
- /**
- * Message is needed for page content, and needs
- * to be consistent with the site's configured
- * language. It might be part of a page title,
- * or a link, or text that will go into the
- * parser cache and be served back to other
- * visitors.
- */
- $cache = &$wgMessageCache;
- $lang = &$wgContLang;
- } else {
- /**
- * Message is for display purposes only.
- * The user may have selected a conversion-based
- * language variant or a separate user interface
- * language; if so use that.
- */
- if ( is_object( $wgContLang ) ) {
- if( in_array( $wgLanguageCode, $wgContLang->getVariants() ) ) {
- $cache = &$wgMessageCache;
- $lang = &$wgLang;
- } else {
- $cache = false;
- $lang = &$wgLang;
- }
+ if( is_object( $wgMessageCache ) ) {
+ $message = $wgMessageCache->get( $key, $useDB, $forContent );
+ }
+ else {
+ if( $forContent ) {
+ $lang = &$wgContLang;
} else {
- $cache = false;
- $lang = false;
+ $lang = &$wgLang;
}
- }
-
- if( is_object( $cache ) ) {
- $message = $cache->get( $key, $useDB, $forContent );
- } else {
- if ( !is_object( $lang ) ) {
- $lang = new Language;
- }
-
wfSuppressWarnings();
- $message = $lang->getMessage( $key );
+ if( is_object( $lang ) ) {
+ $message = $lang->getMessage( $key );
+ } else {
+ $message = '';
+ }
wfRestoreWarnings();
if(!$message)
$message = Language::getMessage($key);
diff --git a/includes/HistoryBlob.php b/includes/HistoryBlob.php
index ebc47145d458..3a6e9bb7d196 100644
--- a/includes/HistoryBlob.php
+++ b/includes/HistoryBlob.php
@@ -122,7 +122,8 @@ class ConcatenatedGzipHistoryBlob extends HistoryBlob
if ( count( $this->mItems ) == 0 ) {
return true;
}
- if ( $this->mFast ) {
+ /*
+ if ( !$this->mFast ) {
$this->uncompress();
$record = serialize( $this->mItems );
$size = strlen( $record );
@@ -136,6 +137,13 @@ class ConcatenatedGzipHistoryBlob extends HistoryBlob
}
} else {
return count( $this->mItems ) <= 10;
+ }*/
+
+ # Jamesday's idea: prevent excessive apache memory usage on decompression
+ if ( strlen( serialize( $this->mItems ) ) > $factorThreshold * 1024 ) {
+ return false;
+ } else {
+ return true;
}
}
}
diff --git a/includes/Image.php b/includes/Image.php
index 2209c4a05396..5bcd726c3db3 100644
--- a/includes/Image.php
+++ b/includes/Image.php
@@ -344,6 +344,22 @@ class Image
* @access public
*/
function createThumb( $width, $height=-1 ) {
+ $thumb = $this->getThumbnail( $width, $height );
+ if( is_null( $thumb ) ) return '';
+ return $thumb->getUrl();
+ }
+
+ /**
+ * As createThumb, but returns a ThumbnailImage object. This can
+ * provide access to the actual file, the real size of the thumb,
+ * and can produce a convenient <img> tag for you.
+ *
+ * @param integer $width maximum width of the generated thumbnail
+ * @param integer $height maximum height of the image (optional)
+ * @return ThumbnailImage
+ * @access public
+ */
+ function &getThumbnail( $width, $height=-1 ) {
if ( $height == -1 ) {
return $this->renderThumb( $width );
}
@@ -358,7 +374,28 @@ class Image
$thumbwidth = $thumbwidth * $height / $thumbheight;
$thumbheight = $height;
}
- return $this->renderThumb( $thumbwidth );
+ $thumb = $this->renderThumb( $thumbwidth );
+ if( is_null( $thumb ) ) {
+ $thumb = $this->iconThumb();
+ }
+ return $thumb;
+ }
+
+ /**
+ * @return ThumbnailImage
+ */
+ function iconThumb() {
+ global $wgStylePath, $wgStyleDirectory;
+
+ $try = array( 'fileicon-' . $this->extension . '.png', 'fileicon.png' );
+ foreach( $try as $icon ) {
+ $path = '/common/images/' . $icon;
+ $filepath = $wgStyleDirectory . $path;
+ if( file_exists( $filepath ) ) {
+ return new ThumbnailImage( $filepath, $wgStylePath . $path );
+ }
+ }
+ return null;
}
/**
@@ -367,8 +404,10 @@ class Image
* image's width. Let the browser do the scaling in this case.
* The thumbnail is stored on disk and is only computed if the thumbnail
* file does not exist OR if it is older than the image.
- * Returns the URL.
+ * Returns an object which can return the pathname, URL, and physical
+ * pixel size of the thumbnail -- or null on failure.
*
+ * @return ThumbnailImage
* @access private
*/
function /* private */ renderThumb( $width ) {
@@ -385,18 +424,18 @@ class Image
if ( ! $this->exists() )
{
# If there is no image, there will be no thumbnail
- return '';
+ return null;
}
# Sanity check $width
if( $width <= 0 ) {
# BZZZT
- return '';
+ return null;
}
if( $width > $this->width && !$this->mustRender() ) {
# Don't make an image bigger than the source
- return $this->getViewURL();
+ return new ThumbnailImage( $this->getImagePath(), $this->getViewURL() );
}
if ( (! file_exists( $thumbPath ) ) || ( filemtime($thumbPath) < filemtime($this->imagePath) ) ) {
@@ -483,17 +522,16 @@ class Image
}
imagedestroy( $dst_image );
imagedestroy( $src_image );
-
-
}
#
# Check for zero-sized thumbnails. Those can be generated when
# no disk space is available or some other error occurs
#
- $thumbstat = stat( $thumbPath );
- if( $thumbstat['size'] == 0 )
- {
- unlink( $thumbPath );
+ if( file_exists( $thumbPath ) ) {
+ $thumbstat = stat( $thumbPath );
+ if( $thumbstat['size'] == 0 ) {
+ unlink( $thumbPath );
+ }
}
# Purge squid
@@ -506,7 +544,7 @@ class Image
wfPurgeSquidServers($urlArr);
}
}
- return $thumbUrl;
+ return new ThumbnailImage( $thumbPath, $thumbUrl );
} // END OF function createThumb
/**
@@ -836,4 +874,72 @@ function getSVGsize( $filename ) {
"width=\"$width\" height=\"$height\"" );
}
+
+/**
+ * Wrapper class for thumbnail images
+ */
+class ThumbnailImage {
+ /**
+ * @param string $path Filesystem path to the thumb
+ * @param string $url URL path to the thumb
+ * @access private
+ */
+ function ThumbnailImage( $path, $url ) {
+ $this->url = $url;
+ $this->path = $path;
+ $size = @getimagesize( $this->path );
+ if( $size ) {
+ $this->width = $size[0];
+ $this->height = $size[1];
+ } else {
+ $this->width = 0;
+ $this->height = 0;
+ }
+ }
+
+ function getUrl() {
+ return $this->url;
+ }
+
+ /**
+ * Return HTML <img ... /> tag for the thumbnail, will include
+ * width and height attributes and a blank alt text (as required).
+ *
+ * You can set or override additional attributes by passing an
+ * associative array of name => data pairs. The data will be escaped
+ * for HTML output, so should be in plaintext.
+ *
+ * @param array $attribs
+ * @return string
+ * @access public
+ */
+ function toHtml( $attribs = array() ) {
+ $attribs['src'] = $this->url;
+ $attribs['width'] = $this->width;
+ $attribs['height'] = $this->height;
+ if( !isset( $attribs['alt'] ) ) $attribs['alt'] = '';
+
+ $html = '<img ';
+ foreach( $attribs as $name => $data ) {
+ $html .= $name . '="' . htmlspecialchars( $data ) . '" ';
+ }
+ $html .= '/>';
+ return $html;
+ }
+
+ /**
+ * Return the size of the thumbnail file, in bytes
+ * @access public
+ */
+ function getSize()
+ {
+ $st = stat( $this->path );
+ if( $st ) {
+ return $st['size'];
+ } else {
+ return false; }
+ }
+
+}
+
?>
diff --git a/includes/ImageGallery.php b/includes/ImageGallery.php
index 7a8c6e01aa6a..9e141c02ff6e 100644
--- a/includes/ImageGallery.php
+++ b/includes/ImageGallery.php
@@ -33,13 +33,24 @@ class ImageGallery
* Add an image to the gallery.
*
* @param Image $image Image object that is added to the gallery
- * @param string $text Additional text to be shown. The name and size of the image are always shown.
+ * @param string $html Additional HTML text to be shown. The name and size of the image are always shown.
*/
- function add( $image, $text='' ) {
- $this->mImages[] = array( &$image, $text );
+ function add( $image, $html='' ) {
+ $this->mImages[] = array( &$image, $html );
}
/**
+ * Add an image at the beginning of the gallery.
+ *
+ * @param Image $image Image object that is added to the gallery
+ * @param string $html Additional HTML text to be shown. The name and size of the image are always shown.
+ */
+ function insert( $image, $html='' ) {
+ array_unshift( $this->mImages, array( &$image, $html ) );
+ }
+
+
+ /**
* isEmpty() returns false iff the gallery doesn't contain any images
*/
function isEmpty() {
@@ -81,7 +92,7 @@ class ImageGallery
$sk = $wgUser->getSkin();
- $s = '<table style="border:solid 1px #DDDDDD; cellspacing:0; cellpadding:0; margin:1em;">';
+ $s = '<table class="gallery" cellspacing="0" cellpadding="0">';
$i = 0;
foreach ( $this->mImages as $pair ) {
$img =& $pair[0];
@@ -90,27 +101,52 @@ class ImageGallery
$name = $img->getName();
$nt = $img->getTitle();
+ // Not an image. Just print the name and skip.
+ if ( $nt->getNamespace() != NS_IMAGE ) {
+ $s .= '<td><div class="gallerybox" style="height: 152px;">' .
+ htmlspecialchars( $nt->getText() ) . '</div></td>' . (($i%4==3) ? "</tr>\n" : '');
+ $i++;
+
+ continue;
+ }
+
//TODO
//$ul = $sk->makeLink( $wgContLang->getNsText( Namespace::getUser() ) . ":{$ut}", $ut );
- $nb = $this->mShowBytes ?
- wfMsg( "nbytes", $wgLang->formatNum( $img->getSize() ) ) . '<br />' :
+ if( $this->mShowBytes ) {
+ if( $img->exists() ) {
+ $nb = wfMsg( 'nbytes', $wgLang->formatNum( $img->getSize() ) );
+ } else {
+ $nb = wfMsg( 'filemissing' );
+ }
+ $nb = htmlspecialchars( $nb ) . '<br />';
+ } else {
+ $nb = '';
+ }
+
'' ;
$textlink = $this->mShowFilename ?
- $sk->makeKnownLinkObj( $nt, Language::truncate( $nt->getText(), 20, '...' ) ) . '<br />' :
+ $sk->makeKnownLinkObj( $nt, htmlspecialchars( $wgLang->truncate( $nt->getText(), 20, '...' ) ) ) . '<br />' :
'' ;
$s .= ($i%4==0) ? '<tr>' : '';
- $s .= '<td valign="top" width="150px" style="background-color:#F0F0F0;">' .
- '<table width="100%" height="150px">'.
- '<tr><td align="center" valign="center" style="background-color:#F8F8F8;border:solid 1px #888888;">' .
- $sk->makeKnownLinkObj( $nt, '<img src="'.$img->createThumb(120,120).'" alt="">' ) . '</td></tr></table> ' .
- $textlink . $text . $nb;
-
- $s .= '</td>' . (($i%4==3) ? '</tr>' : '');
-
+ $thumb = $img->getThumbnail( 120, 120 );
+ $vpad = floor( ( 150 - $thumb->height ) /2 ) - 2;
+ $s .= '<td><div class="gallerybox">' .
+ '<div class="thumb" style="padding: ' . $vpad . 'px 0;">'.
+ $sk->makeKnownLinkObj( $nt, $thumb->toHtml() ) . '</div>';
+ if($text <> '') {
+ $s .= '<div class="gallerytext">' .
+ $textlink . $text . $nb .
+ '</div>';
+ }
+ $s .= "</div></td>\n";
+ $s .= ($i%4==3) ? '</tr>' : '';
$i++;
}
+ if( $i %4 != 0 ) {
+ $s .= "</tr>\n";
+ }
$s .= '</table>';
return $s;
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
index dc7c67fbf09f..ac6d74ce033c 100644
--- a/includes/ImagePage.php
+++ b/includes/ImagePage.php
@@ -6,6 +6,9 @@
/**
*
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
require_once( 'Image.php' );
/**
@@ -39,14 +42,21 @@ class ImagePage extends Article {
{
global $wgOut, $wgUser, $wgImageLimits, $wgRequest, $wgUseImageResize;
$this->img = Image::newFromTitle( $this->mTitle );
- $url = $this->img->getViewURL();
+ $full_url = $this->img->getViewURL();
$anchoropen = '';
$anchorclose = '';
- if ( $wgUseImageResize && $wgUser->getOption( 'imagesize' ) != '' ) {
- $max = $wgImageLimits[ intval( $wgUser->getOption( 'imagesize' ) ) ];
- $maxWidth = $max[0];
- $maxHeight = $max[1];
+
+ if( $wgUser->getOption( 'imagesize' ) == '' ) {
+ $sizeSel = User::getDefaultOption( 'imagesize' );
+ } else {
+ $sizeSel = IntVal( $wgUser->getOption( 'imagesize' ) );
}
+ if( !isset( $wgImageLimits[$sizeSel] ) ) {
+ $sizeSel = User::getDefaultOption( 'imagesize' );
+ }
+ $max = $wgImageLimits[$sizeSel];
+ $maxWidth = $max[0];
+ $maxHeight = $max[1];
if ( $this->img->exists() ) {
@@ -58,27 +68,42 @@ class ImagePage extends Article {
$width = $this->img->getWidth();
$height = $this->img->getHeight();
$msg = wfMsg('showbigimage', $width, $height, intval( $this->img->getSize()/1024 ) );
- if ( $width > $maxWidth && $wgUseImageResize ) {
- $anchoropen = "<a href=\"{$url}\">";
- $anchorclose = "<br>{$msg}</a>";
-
- $url = $this->img->createThumb( $maxWidth );
+ if ( $width > $maxWidth ) {
$height = floor( $height * $maxWidth / $width );
$width = $maxWidth;
}
- if ( $height > $maxHeight && $wgUseImageResize ) {
- $anchoropen = "<a href=\"{$url}\">";
- $anchorclose = "<br>{$msg}</a>";
-
+ if ( $height > $maxHeight ) {
$width = floor( $width * $maxHeight / $height );
$height = $maxHeight;
- $url = $this->img->createThumb( $width );
}
- $s = "<div class=\"fullImageLink\">" . $anchoropen .
+ if ( $width != $this->img->getWidth() || $height != $this->img->getHeight() ) {
+ if( $wgUseImageResize ) {
+ $thumbnail = $this->img->getThumbnail( $width );
+ if ( ( ! $this->img->mustRender() )
+ && ( $thumbnail->getSize() > $this->img->getSize() ) ) {
+ # the thumbnail is bigger thatn the original image.
+ # show the original image instead of the thumb.
+ $url = $full_url;
+ $width = $this->img->getWidth();
+ $height = $this->img->getHeight();
+ } else {
+ $url = $thumbnail->getUrl();
+ }
+ } else {
+ # No resize ability? Show the full image, but scale
+ # it down in the browser so it fits on the page.
+ $url = $full_url;
+ }
+ $anchoropen = "<a href=\"{$full_url}\">";
+ $anchorclose = "<br />{$msg}</a>";
+ } else {
+ $url = $full_url;
+ }
+ $s = '<div class="fullImageLink">' . $anchoropen .
"<img border=\"0\" src=\"{$url}\" width=\"{$width}\" height=\"{$height}\" alt=\"" .
- htmlspecialchars( $wgRequest->getVal( 'image' ) )."\" />" . $anchorclose . "</div>";
+ htmlspecialchars( $wgRequest->getVal( 'image' ) ).'" />' . $anchorclose . '</div>';
} else {
- $s = "<div class=\"fullMedia\">".$sk->makeMediaLink($this->img->getName(),"")."</div>";
+ $s = "<div class=\"fullMedia\">" . $sk->makeMediaLink( $this->img->getName(),'' ) . '</div>';
}
$wgOut->addHTML( $s );
if($this->img->fromSharedDirectory) {
@@ -132,7 +157,8 @@ class ImagePage extends Article {
$imagelinks = $dbr->tableName( 'imagelinks' );
$sql = "SELECT cur_namespace,cur_title FROM $imagelinks,$cur WHERE il_to=" .
- $dbr->addQuotes( $this->mTitle->getDBkey() ) . " AND il_from=cur_id";
+ $dbr->addQuotes( $this->mTitle->getDBkey() ) . " AND il_from=cur_id"
+ . " LIMIT 500"; # quickie emergency brake
$res = $dbr->query( $sql, DB_SLAVE, "Article::imageLinks" );
if ( 0 == $dbr->numRows( $res ) ) {
@@ -164,6 +190,9 @@ class ImagePage extends Article {
$wgOut->sysopRequired();
return;
}
+ if ( $wgUser->isBlocked() ) {
+ return $this->blockedIPpage();
+ }
if ( wfReadOnly() ) {
$wgOut->readOnlyPage();
return;
@@ -273,9 +302,8 @@ class ImagePage extends Article {
$wgOut->setRobotpolicy( 'noindex,nofollow' );
$sk = $wgUser->getSkin();
- $loglink = $sk->makeKnownLink( $wgContLang->getNsText(
- Namespace::getWikipedia() ) .
- ':' . wfMsg( 'dellogpage' ), wfMsg( 'deletionlog' ) );
+ $loglink = $sk->makeKnownLink( $wgContLang->getNsText( NS_SPECIAL ) .
+ ':Log/delete', wfMsg( 'deletionlog' ) );
$text = wfMsg( 'deletedtext', $deleted, $loglink );
@@ -310,7 +338,7 @@ class ImagePage extends Article {
function revert()
{
- global $wgOut, $wgRequest;
+ global $wgOut, $wgRequest, $wgUser;
global $wgUseSquid, $wgInternalServer, $wgDeferredUpdateList;
$oldimage = $wgRequest->getText( 'oldimage' );
@@ -331,6 +359,9 @@ class ImagePage extends Article {
$wgOut->sysopRequired();
return;
}
+ if ( $wgUser->isBlocked() ) {
+ return $this->blockedIPpage();
+ }
$name = substr( $oldimage, 15 );
$dest = wfImageDir( $name );
@@ -369,6 +400,14 @@ class ImagePage extends Article {
$wgOut->addHTML( wfMsg( 'imagereverted' ) );
$wgOut->returnToMain( false );
}
+
+ function blockedIPpage() {
+ # yucky hack
+ require_once( 'EditPage.php' );
+ $edit = new EditPage( $this->mTitle );
+ $edit->blockedIPpage();
+ return;
+ }
}
class ImageHistoryList {
@@ -442,7 +481,6 @@ class ImageHistoryList {
$s .= "</li>\n";
return $s;
}
-
}
diff --git a/includes/LoadBalancer.php b/includes/LoadBalancer.php
index 9813c2af42fe..7ea09fcab646 100644
--- a/includes/LoadBalancer.php
+++ b/includes/LoadBalancer.php
@@ -191,7 +191,7 @@ class LoadBalancer {
}
if ( !$retVal && $this->isOpen( $index ) ) {
- $conn =& $this->mConnections( $index );
+ $conn =& $this->mConnections[$index];
wfDebug( "Waiting for slave #$index to catch up...\n" );
$result = $conn->masterPosWait( $this->mWaitForFile, $this->mWaitForPos, MASTER_WAIT_TIMEOUT );
@@ -303,15 +303,19 @@ class LoadBalancer {
* @private
*/
function reallyOpenConnection( &$server ) {
- extract( $server );
- # Get class for this database type
- $class = 'Database' . ucfirst( $type );
- if ( !class_exists( $class ) ) {
- require_once( "$class.php" );
- }
+ if( !is_array( $server ) ) {
+ wfDebugDieBacktrace( 'You must update your load-balancing configuration. See DefaultSettings.php entry for $wgDBservers.' );
+ }
+
+ extract( $server );
+ # Get class for this database type
+ $class = 'Database' . ucfirst( $type );
+ if ( !class_exists( $class ) ) {
+ require_once( "$class.php" );
+ }
- # Create object
- return new $class( $host, $user, $password, $dbname, 1, $flags );
+ # Create object
+ return new $class( $host, $user, $password, $dbname, 1, $flags );
}
function reportConnectionError( &$conn )
diff --git a/includes/LogPage.php b/includes/LogPage.php
index f1fc55a736f0..fbe245a19ce9 100644
--- a/includes/LogPage.php
+++ b/includes/LogPage.php
@@ -127,7 +127,7 @@ class LogPage {
'' => 'alllogstext',
'block' => 'blocklogtext',
'protect' => 'protectlogtext',
- 'rights' => '',
+ 'rights' => 'rightslogtext',
'delete' => 'dellogpagetext',
'upload' => 'uploadlogpagetext'
);
@@ -140,7 +140,7 @@ class LogPage {
function actionText( $type, $action, $titleLink = NULL ) {
static $actions = array(
'block/block' => 'blocklogentry',
- 'block/unblock' => 'blocklogentry',
+ 'block/unblock' => 'unblocklogentry',
'protect/protect' => 'protectedarticle',
'protect/unprotect' => 'unprotectedarticle',
'rights/rights' => 'bureaucratlogentry',
diff --git a/includes/MagicWord.php b/includes/MagicWord.php
index a8fd0eb472d6..6c88b38953de 100644
--- a/includes/MagicWord.php
+++ b/includes/MagicWord.php
@@ -45,6 +45,8 @@ define('MAG_PAGENAMEE', 31);
define('MAG_NAMESPACE', 32);
define('MAG_TOC', 33);
define('MAG_GRAMMAR', 34);
+define('MAG_NOTITLECONVERT', 35);
+define('MAG_NOCONTENTCONVERT', 36);
$wgVariableIDs = array(
MAG_CURRENTMONTH,
diff --git a/includes/MessageCache.php b/includes/MessageCache.php
index 8f0fd46327a8..de234328976f 100755
--- a/includes/MessageCache.php
+++ b/includes/MessageCache.php
@@ -23,6 +23,7 @@ class MessageCache
var $mMemcKey, $mKeys, $mParserOptions, $mParser;
var $mExtensionMessages;
var $mInitialised = false;
+ var $mDeferred = true;
function initialise( &$memCached, $useDB, $expiry, $memcPrefix) {
$fname = 'MessageCache::initialise';
@@ -44,7 +45,12 @@ class MessageCache
$this->mParser = new Parser;
wfProfileOut( $fname.'-parser' );
- $this->load();
+ # When we first get asked for a message,
+ # then we'll fill up the cache. If we
+ # can return a cache hit, this saves
+ # some extra milliseconds
+ $this->mDeferred = true;
+
wfProfileOut( $fname );
}
@@ -113,6 +119,7 @@ class MessageCache
}
}
wfProfileOut( $fname );
+ $this->mDeferred = false;
return $success;
}
@@ -152,7 +159,8 @@ class MessageCache
if ( !$this->mKeys ) {
$this->mKeys = array();
foreach ( $wgAllMessagesEn as $key => $value ) {
- array_push( $this->mKeys, $wgContLang->ucfirst( $key ) );
+ $title = $wgContLang->ucfirst( $key );
+ array_push( $this->mKeys, $title );
}
}
return $this->mKeys;
@@ -206,7 +214,7 @@ class MessageCache
$this->mMemc->delete( $lockKey );
}
- function get( $key, $useDB, $forcontent=true ) {
+ function get( $key, $useDB, $forcontent=true, $isfullkey=false ) {
global $wgContLanguageCode;
if( $forcontent ) {
global $wgContLang;
@@ -221,16 +229,20 @@ class MessageCache
if( !$this->mInitialised ) {
return "&lt;$key&gt;";
}
+ # If cache initialization was deferred, start it now.
+ if( $this->mDeferred ) {
+ $this->load();
+ }
$message = false;
if( !$this->mDisable && $useDB ) {
$title = $lang->ucfirst( $key );
- if( $langcode != $wgContLanguageCode ) {
+ if(!$isfullkey && ($langcode != $wgContLanguageCode) ) {
$title .= '/' . $langcode;
}
# Try the cache
- if( $this->mUseCache && $this->mCache && array_key_exists( $title, $this->mCache ) ) {
+ if( $this->mUseCache && is_array( $this->mCache ) && array_key_exists( $title, $this->mCache ) ) {
$message = $this->mCache[$title];
}
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index 31eb28d1e7d0..259755760353 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -91,7 +91,8 @@ class OutputPage {
wfDebug( "CACHE DISABLED\n", false );
return;
}
- if( preg_match( '/MSIE ([1-4]|5\.0)/', $_SERVER["HTTP_USER_AGENT"] ) ) {
+ if( isset( $_SERVER["HTTP_USER_AGENT"] ) &&
+ preg_match( '/MSIE ([1-4]|5\.0)/', $_SERVER["HTTP_USER_AGENT"] ) ) {
# IE 5.0 has probs with our caching
wfDebug( "-- bad client, not caching\n", false );
return;
@@ -525,8 +526,6 @@ class OutputPage {
$this->setHTMLTitle( wfMsg( 'errorpagetitle' ) );
$this->setRobotpolicy( 'noindex,nofollow' );
$this->setArticleRelated( false );
- $this->suppressQuickbar();
-
$this->enableClientCache( false );
$this->mRedirect = '';
diff --git a/includes/Parser.php b/includes/Parser.php
index 2c7027959cf7..098eeed65336 100644
--- a/includes/Parser.php
+++ b/includes/Parser.php
@@ -959,7 +959,9 @@ class Parser
wfProfileIn( $fname );
$sk =& $this->mOptions->getSkin();
- $linktrail = wfMsgForContent('linktrail');
+ global $wgContLang;
+ $linktrail = $wgContLang->linkTrail();
+
$bits = preg_split( EXT_LINK_BRACKETED, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
$s = $this->replaceFreeExternalLinks( array_shift( $bits ) );
@@ -1013,7 +1015,7 @@ class Parser
} else {
# Expand the URL for printable version
if ( ! $sk->suppressUrlExpansion() ) {
- $paren = "<span class='urlexpansion'> (<i>" . htmlspecialchars ( $encUrl ) . "</i>)</span>";
+ $paren = "<span class='urlexpansion'>&nbsp;(<i>" . htmlspecialchars ( $encUrl ) . "</i>)</span>";
} else {
$paren = '';
}
@@ -2191,14 +2193,14 @@ class Parser
'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'
+ 'ruby', 'rt' , 'rb' , 'rp', 'p', 'span'
);
$htmlsingle = array(
'br', 'hr', 'li', 'dt', 'dd'
);
$htmlnest = array( # Tags that can be nested--??
'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul',
- 'dl', 'font', 'big', 'small', 'sub', 'sup'
+ 'dl', 'font', 'big', 'small', 'sub', 'sup', 'span'
);
$tabletags = array( # Can only appear inside table
'td', 'th', 'tr'
@@ -2807,9 +2809,14 @@ class Parser
putenv( 'TZ='.$oldtzs );
}
- $text = preg_replace( '/~~~~~~/', $d, $text );
- $text = preg_replace( '/~~~~/', '[[' . $wgContLang->getNsText( NS_USER ) . ":$n|$k]] $d", $text );
- $text = preg_replace( '/~~~/', '[[' . $wgContLang->getNsText( NS_USER ) . ":$n|$k]]", $text );
+ if( $user->getOption( 'fancysig' ) ) {
+ $sigText = $k;
+ } else {
+ $sigText = '[[' . $wgContLang->getNsText( NS_USER ) . ":$n|$k]]";
+ }
+ $text = preg_replace( '/~~~~~/', $d, $text );
+ $text = preg_replace( '/~~~~/', "$sigText $d", $text );
+ $text = preg_replace( '/~~~/', $sigText, $text );
# Context links: [[|name]] and [[name (context)|]]
#
@@ -3078,12 +3085,21 @@ class Parser
continue;
}
$nt = Title::newFromURL( $matches[1] );
+ if( is_null( $nt ) ) {
+ # Bogus title. Ignore these so we don't bomb out later.
+ continue;
+ }
if ( isset( $matches[3] ) ) {
$label = $matches[3];
} else {
$label = '';
}
- $ig->add( Image::newFromTitle( $nt ), $label );
+
+ # FIXME: Use the full wiki parser and add its links
+ # to the page's links.
+ $html = $this->mOptions->mSkin->formatComment( $label );
+
+ $ig->add( Image::newFromTitle( $nt ), $html );
$wgLinkCache->addImageLinkObj( $nt );
}
return $ig->toHTML();
diff --git a/includes/ParserCache.php b/includes/ParserCache.php
index 00ed00305853..4447869b31fd 100644
--- a/includes/ParserCache.php
+++ b/includes/ParserCache.php
@@ -35,6 +35,7 @@ class ParserCache {
$hash = $user->getPageRenderingHash();
$pageid = intval( $article->getID() );
$key = $this->getKey( $article, $user );
+
wfDebug( "Trying parser cache $key\n" );
$value = $this->mMemc->get( $key );
if ( is_object( $value ) ) {
@@ -45,15 +46,21 @@ class ParserCache {
$touched = $article->mTouched;
if ( !$canCache || $value->expired( $touched ) ) {
if ( !$canCache ) {
+ $this->incrStats( "pcache_miss_invalid" );
wfDebug( "Invalid cached redirect, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" );
} else {
+ $this->incrStats( "pcache_miss_expired" );
wfDebug( "Key expired, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" );
}
$this->mMemc->delete( $key );
$value = false;
+
+ } else {
+ $this->incrStats( "pcache_hit" );
}
} else {
wfDebug( "Parser cache miss.\n" );
+ $this->incrStats( "pcache_miss_absent" );
$value = false;
}
@@ -75,6 +82,14 @@ class ParserCache {
}
$this->mMemc->set( $key, $parserOutput, $expire );
}
+
+ function incrStats( $key ) {
+ global $wgDBname, $wgMemc;
+ $key = "$wgDBname:stats:$key";
+ if ( is_null( $wgMemc->incr( $key ) ) ) {
+ $wgMemc->add( $key, 1 );
+ }
+ }
}
diff --git a/includes/QueryPage.php b/includes/QueryPage.php
index 349540cb6f80..4f03679f167a 100644
--- a/includes/QueryPage.php
+++ b/includes/QueryPage.php
@@ -99,7 +99,7 @@ class QueryPage {
* @param $limit database query limit
*/
function doQuery( $offset, $limit ) {
- global $wgUser, $wgOut, $wgLang, $wgRequest;
+ global $wgUser, $wgOut, $wgLang, $wgContLang, $wgRequest;
global $wgMiserMode;
$sname = $this->getName();
@@ -177,7 +177,7 @@ class QueryPage {
# often disable 'next' link when we reach the end
if($num < $limit) { $atend = true; } else { $atend = false; }
- $sl = wfViewPrevNext( $offset, $limit , $wgLang->specialPage( $sname ), "" ,$atend );
+ $sl = wfViewPrevNext( $offset, $limit , $wgContLang->specialPage( $sname ), "" ,$atend );
$wgOut->addHTML( "<br />{$sl}</p>\n" );
$s = "<ol start='" . ( $offset + 1 ) . "' class='special'>";
diff --git a/includes/RawPage.php b/includes/RawPage.php
index aa22d2b007aa..7657ad41026e 100644
--- a/includes/RawPage.php
+++ b/includes/RawPage.php
@@ -73,6 +73,8 @@ class RawPage {
header( "Content-type: ".$this->mContentType.'; charset='.$this->mCharset );
# allow the client to cache this for 24 hours
header( 'Cache-Control: s-maxage='.$this->mSmaxage.', max-age='.$this->mMaxage );
+ # Make sure each logged-in user gets his/her own stylesheet
+ header( 'Vary: Cookie' );
if($this->mGen) {
$sk = $wgUser->getSkin();
$sk->initPage($wgOut);
diff --git a/includes/RecentChange.php b/includes/RecentChange.php
index 7b96bbd5f758..248cb2fa2231 100644
--- a/includes/RecentChange.php
+++ b/includes/RecentChange.php
@@ -76,7 +76,7 @@ class RecentChange
$this->mExtra = $extra;
}
- function getTitle()
+ function &getTitle()
{
if ( $this->mTitle === false ) {
$this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
diff --git a/includes/SearchEngine.php b/includes/SearchEngine.php
index 58b8cf29abdd..b7eae7b32a01 100644
--- a/includes/SearchEngine.php
+++ b/includes/SearchEngine.php
@@ -47,6 +47,9 @@ class SearchEngine {
function getNearMatch( $term ) {
# Exact match? No need to look further.
$title = Title::newFromText( $term );
+ if (is_null($title))
+ return null;
+
if ( $title->getNamespace() == NS_SPECIAL || 0 != $title->getArticleID() ) {
return $title;
}
diff --git a/includes/SearchMySQL4.php b/includes/SearchMySQL4.php
index 0144576bdbd4..84673d367df7 100644
--- a/includes/SearchMySQL4.php
+++ b/includes/SearchMySQL4.php
@@ -26,7 +26,7 @@
require_once( 'SearchEngine.php' );
class SearchMySQL4 extends SearchEngine {
- var $strictMatching = false;
+ var $strictMatching = true;
function SearchMySQL4( &$db ) {
$this->db =& $db;
diff --git a/includes/Setup.php b/includes/Setup.php
index 1f351c316a7b..49032beb1b80 100644
--- a/includes/Setup.php
+++ b/includes/Setup.php
@@ -239,29 +239,33 @@ if( $wgCommandLineMode ) {
wfProfileOut( $fname.'-User' );
wfProfileIn( $fname.'-language2' );
-function setupLangObj(&$langclass, $langcode) {
+function setupLangObj($langclass) {
global $wgUseLatin1, $IP;
-
if( ! class_exists( $langclass ) ) {
# Default to English/UTF-8
+ $baseclass = 'LanguageUtf8';
require_once( "$IP/languages/LanguageUtf8.php" );
- $langclass = 'LanguageUtf8';
+ $lc = strtolower(substr($langclass, 8));
+ $snip = "
+ class $langclass extends $baseclass {
+ function getVariants() {
+ return array(\"$lc\");
+ }
+
+ }";
+
+ eval($snip);
}
$lang = new $langclass();
- if ( !is_object($lang) ) {
- print "No language class ($wgLang)\N";
- }
- if( $wgUseLatin1 ) {
- # For non-UTF-8 latin-1 downconversion
- require_once( "$IP/languages/LanguageLatin1.php" );
- $xxx = new LanguageLatin1( $lang );
- unset( $lang );
- $lang = $xxx;
- }
- return $lang;
+ if( ! $wgUseLatin1 )
+ return $lang;
+
+ require_once( $IP . '/languages/LanguageLatin1.php' );
+ $latin1 = new LanguageLatin1( $lang );
+ return $latin1;
}
# $wgLanguageCode may be changed later to fit with user preference.
@@ -270,8 +274,7 @@ function setupLangObj(&$langclass, $langcode) {
$wgContLanguageCode = $wgLanguageCode;
$wgContLangClass = 'Language' . str_replace( '-', '_', ucfirst( $wgContLanguageCode ) );
-$wgContLang = setupLangObj( $wgContLangClass, $wgContLangClass );
-$n = get_class($wgContLang);
+$wgContLang = setupLangObj( $wgContLangClass );
// set default user option from content language
if( !$wgUser->mDataLoaded ) {
@@ -280,17 +283,23 @@ if( !$wgUser->mDataLoaded ) {
// wgLanguageCode now specifically means the UI language
$wgLanguageCode = $wgUser->getOption('language');
+if( empty( $wgLanguageCode ) ) {
+ # Quick hack for upgrades where this will be blank,
+ # and it's not handled right. Set to default.
+ $wgLanguageCode = $wgContLanguageCode;
+}
$wgLangClass = 'Language'. str_replace( '-', '_', ucfirst( $wgLanguageCode ) );
if( $wgLangClass == $wgContLangClass ) {
$wgLang = &$wgContLang;
} else {
- require_once("$IP/languages/$wgLangClass.php");
- $wgLang = setupLangObj( $wgLangClass, $wgLanguageCode );
+ wfSuppressWarnings();
+ include_once("$IP/languages/$wgLangClass.php");
+ wfRestoreWarnings();
+ $wgLang = setupLangObj( $wgLangClass );
}
-
wfProfileOut( $fname.'-language' );
wfProfileIn( $fname.'-MessageCache' );
@@ -356,9 +365,28 @@ $wgMsgParserOptions = ParserOptions::newFromUser($wgUser);
wfSeedRandom();
# Placeholders in case of DB error
-$wgTitle = Title::newFromText( wfMsgForContent( 'badtitle' ) );
+$wgTitle = Title::makeTitle( NS_SPECIAL, 'Error' );
$wgArticle = new Article($wgTitle);
+# Site notice
+
+$notice = wfMsg( 'sitenotice' );
+if($notice == '&lt;sitenotice&gt;') $notice = '';
+# Allow individual wikis to turn it off
+if ( $notice == '-' ) {
+ $wgSiteNotice = '';
+} else {
+ # if($wgSiteNotice) $notice .= $wgSiteNotice;
+ if ($notice == '') {
+ $notice = $wgSiteNotice;
+ }
+ if($notice != '-' && $notice != '') {
+ $specialparser = new Parser();
+ $parserOutput = $specialparser->parse( $notice, $wgTitle, $wgOut->mParserOptions, false );
+ $wgSiteNotice = $parserOutput->getText();
+ }
+}
+
wfProfileOut( $fname.'-misc2' );
wfProfileIn( $fname.'-extensions' );
diff --git a/includes/Skin.php b/includes/Skin.php
index 186a883d3688..09c8e2aa161d 100644
--- a/includes/Skin.php
+++ b/includes/Skin.php
@@ -83,7 +83,8 @@ class Skin {
/**#@-*/
function Skin() {
- $this->linktrail = wfMsgForContent('linktrail');
+ global $wgContLang;
+ $this->linktrail = $wgContLang->linkTrail();
# Cache option lookups done very frequently
$options = array( 'highlightbroken', 'hover' );
@@ -305,7 +306,7 @@ class Skin {
$same = ($link == $text);
$link = urldecode( $link );
$link = $wgContLang->checkTitleEncoding( $link );
- $link = str_replace( '_', ' ', $link );
+ $link = preg_replace( '/[\\x00-\\x1f_]/', ' ', $link );
$link = htmlspecialchars( $link );
$r = ($class != '') ? " class='$class'" : " class='external'";
@@ -534,9 +535,12 @@ class Skin {
if ( $wgOut->isArticleRelated() ) {
if ( $wgTitle->getNamespace() == Namespace::getImage() ) {
$name = $wgTitle->getDBkey();
- $link = htmlspecialchars( Image::wfImageUrl( $name ) );
- $style = $this->getInternalLinkAttributes( $link, $name );
- $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>";
+ $image = new Image( $wgTitle->getDBkey() );
+ if( $image->exists() ) {
+ $link = htmlspecialchars( $image->getURL() );
+ $style = $this->getInternalLinkAttributes( $link, $name );
+ $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>";
+ }
}
# This will show the "Approve" link if $wgUseApproval=true;
if ( isset ( $wgUseApproval ) && $wgUseApproval )
@@ -749,6 +753,20 @@ class Skin {
# Many people don't like this dropdown box
#$s .= $sep . $this->specialPagesList();
+ /* show links to different language variants */
+ global $wgDisableLangConversion, $wgContLang, $wgTitle;
+ $variants = $wgContLang->getVariants();
+ if( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) {
+ foreach( $variants as $code ) {
+ $varname = $wgContLang->getVariantname( $code );
+ if( $varname == 'disable' )
+ continue;
+ $s .= ' | <a href="' . $wgTitle->getLocalUrl( 'variant=' . $code ) . '">' . $varname . '</a>';
+ }
+ }
+
+
+
return $s;
}
@@ -846,17 +864,19 @@ class Skin {
}
function getCopyrightIcon() {
- global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgRightsIcon;
+ global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgRightsIcon, $wgCopyrightIcon;
$out = '';
- if( $wgRightsIcon ) {
+ if ( isset( $wgCopyrightIcon ) && $wgCopyrightIcon ) {
+ $out = $wgCopyrightIcon;
+ } else if ( $wgRightsIcon ) {
$icon = htmlspecialchars( $wgRightsIcon );
- if( $wgRightsUrl ) {
+ if ( $wgRightsUrl ) {
$url = htmlspecialchars( $wgRightsUrl );
$out .= '<a href="'.$url.'">';
}
$text = htmlspecialchars( $wgRightsText );
$out .= "<img src=\"$icon\" alt='$text' />";
- if( $wgRightsUrl ) {
+ if ( $wgRightsUrl ) {
$out .= '</a>';
}
}
@@ -1349,12 +1369,16 @@ class Skin {
$trail = $m[2];
}
}
- # Assume $this->postParseLinkColour(). This prevents
- # interwiki links from being parsed as external links.
- global $wgInterwikiLinkHolders;
$t = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>";
- $nr = array_push($wgInterwikiLinkHolders, $t);
- $retVal = '<!--IWLINK '. ($nr-1) ."-->{$trail}";
+ if( $this->postParseLinkColour ) {
+ # There's no existence check, but this will prevent
+ # interwiki links from being parsed as external links.
+ global $wgInterwikiLinkHolders;
+ $nr = array_push($wgInterwikiLinkHolders, $t);
+ $retVal = '<!--IWLINK '. ($nr-1) ."-->{$trail}";
+ } else {
+ return $t;
+ }
} elseif ( 0 == $ns && "" == $dbkey ) {
# A self-link with a fragment; skip existence check.
$retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix );
@@ -1402,7 +1426,6 @@ class Skin {
if ( $s->cur_is_redirect OR $s->cur_namespace != 0 ) {
$size = $threshold*2 ; # Really big
}
- $dbr->freeResult( $res );
} else {
$size = $threshold*2 ; # Really big
}
diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php
index 4082c67587d8..f8a3fad0025d 100644
--- a/includes/SkinTemplate.php
+++ b/includes/SkinTemplate.php
@@ -228,6 +228,7 @@ class SkinTemplate extends Skin {
$tpl->set( "helppage", wfMsg('helppage'));
*/
$tpl->set( 'searchaction', $this->escapeSearchLink() );
+ $tpl->set( 'search', trim( $wgRequest->getVal( 'search' ) ) );
$tpl->setRef( 'stylepath', $wgStylePath );
$tpl->setRef( 'logopath', $wgLogo );
$tpl->setRef( "lang", $wgContLanguageCode );
@@ -448,17 +449,18 @@ class SkinTemplate extends Skin {
* @access private
*/
function buildContentActionUrls () {
+ global $wgContLang;
$fname = 'SkinTemplate::buildContentActionUrls';
wfProfileIn( $fname );
- global $wgTitle, $wgUser, $wgOut, $wgRequest, $wgUseValidation;
+ global $wgTitle, $wgUser, $wgRequest, $wgUseValidation;
$action = $wgRequest->getText( 'action' );
$section = $wgRequest->getText( 'section' );
$oldid = $wgRequest->getVal( 'oldid' );
$diff = $wgRequest->getVal( 'diff' );
$content_actions = array();
- if( $this->iscontent and !$wgOut->isQuickbarSuppressed() ) {
+ if( $this->iscontent ) {
$nskey = $this->getNameSpaceKey();
$is_active = !Namespace::isTalk( $wgTitle->getNamespace()) ;
@@ -578,7 +580,7 @@ class SkinTemplate extends Skin {
}
}
wfProfileOut( "$fname-live" );
-
+
if ( $wgUser->getID() != 0 and $action != 'submit' ) {
if( !$wgTitle->userIsWatching()) {
$content_actions['watch'] = array(
@@ -605,6 +607,7 @@ class SkinTemplate extends Skin {
'href' => $wgTitle->getLocalUrl( 'action=validate'.$article_time)
);
}
+
} else {
/* show special page tab */
@@ -615,6 +618,34 @@ class SkinTemplate extends Skin {
);
}
+ /* show links to different language variants */
+ global $wgDisableLangConversion;
+ $variants = $wgContLang->getVariants();
+ if( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) {
+ $highlight = $wgContLang->getPreferredVariant();
+ if( $wgContLang->getVariantname($highlight) == 'disable' ) {
+ $highlight = $wgContLang->getVariantFallback($highlight);
+ if( $highlight && $wgContLang->getVariantname($highlight) == 'false' )
+ $highlight = false;
+ }
+ $actstr = '';
+ if( $action )
+ $actstr = 'action=' . $action . '&';
+ $vcount=0;
+ foreach( $variants as $code ) {
+ $varname = $wgContLang->getVariantname( $code );
+ if( $varname == 'disable' )
+ continue;
+ $selected = ( $code == $highlight )? 'selected' : false;
+ $content_actions['varlang-' . $vcount] = array(
+ 'class' => $selected,
+ 'text' => $varname,
+ 'href' => $wgTitle->getLocalUrl( $actstr . 'variant=' . $code )
+ );
+ $vcount ++;
+ }
+ }
+
wfProfileOut( $fname );
return $content_actions;
}
@@ -939,6 +970,19 @@ class QuickTemplate {
}
/**
+ * An ugly, ugly hack.
+ * @access private
+ */
+ function msgWiki( $str ) {
+ global $wgParser, $wgTitle, $wgOut, $wgUseTidy;
+
+ $text = $this->translator->translate( $str );
+ $parserOutput = $wgParser->parse( $text, $wgTitle,
+ $wgOut->mParserOptions, true );
+ echo $parserOutput->getText();
+ }
+
+ /**
* @access private
*/
function haveData( $str ) {
diff --git a/includes/SpecialAllmessages.php b/includes/SpecialAllmessages.php
index 1fe5408d3f04..38c827ae6058 100644
--- a/includes/SpecialAllmessages.php
+++ b/includes/SpecialAllmessages.php
@@ -13,12 +13,6 @@ function wfSpecialAllmessages() {
global $wgLanguageCode, $wgContLanguageCode, $wgContLang;
global $wgUseDatabaseMessages;
- if($wgLanguageCode != $wgContLanguageCode &&
- !in_array($wgLanguageCode, $wgContLang->getVariants())) {
- $err = wfMsg('allmessagesnotsupportedUI', $wgLanguageCode);
- $wgOut->addHTML( $err );
- return;
- }
if(!$wgUseDatabaseMessages) {
$wgOut->addHTML(wfMsg('allmessagesnotsupportedDB'));
return;
@@ -118,9 +112,10 @@ function makeHTMLText( $messages ) {
NS_MEDIAWIKI => array(),
NS_MEDIAWIKI_TALK => array()
);
- $sql = "SELECT cur_namespace,cur_title FROM cur WHERE cur_namespace IN (" . NS_MEDIAWIKI . ", " . NS_MEDIAWIKI_TALK . ")";
$dbr =& wfGetDB( DB_SLAVE );
- $res = $dbr->query( $sql );
+ $res = $dbr->select( 'cur',
+ array( 'cur_namespace', 'cur_title' ),
+ "cur_namespace IN (" . NS_MEDIAWIKI . ", " . NS_MEDIAWIKI_TALK . ")" );
while( $s = $dbr->fetchObject( $res ) ) {
$pageExists[$s->cur_namespace][$s->cur_title] = true;
}
diff --git a/includes/SpecialBrokenRedirects.php b/includes/SpecialBrokenRedirects.php
index a42415405e03..d94d405bc9f1 100644
--- a/includes/SpecialBrokenRedirects.php
+++ b/includes/SpecialBrokenRedirects.php
@@ -18,7 +18,7 @@ require_once('QueryPage.php');
class BrokenRedirectsPage extends PageQueryPage {
function getName() {
- return 'brokenredirects';
+ return 'BrokenRedirects';
}
function isExpensive( ) { return true; }
diff --git a/includes/SpecialContributions.php b/includes/SpecialContributions.php
index 008853280ac7..cf4b3bc562fc 100644
--- a/includes/SpecialContributions.php
+++ b/includes/SpecialContributions.php
@@ -90,14 +90,14 @@ function wfSpecialContributions( $par = '' ) {
$omq .= " AND old_namespace = {$namespace}";
}
- # We may have to force the index, as some options will cause
- # MySQL to incorrectly pick eg the namespace index.
- list( $useIndex, $tailOpts ) = $dbr->makeSelectOptions( array(
- 'USE INDEX' => 'usertext_timestamp',
- 'LIMIT' => $querylimit ) );
-
extract( $dbr->tableNames( 'old', 'cur' ) );
if ( $userCond == '' ) {
+ # We may have to force the index, as some options will cause
+ # MySQL to incorrectly pick eg the namespace index.
+ list( $useIndex, $tailOpts ) = $dbr->makeSelectOptions( array(
+ 'USE INDEX' => 'usertext_timestamp',
+ 'LIMIT' => $querylimit ) );
+
$sql = "SELECT cur_namespace,cur_title,cur_timestamp,cur_comment,cur_minor_edit,cur_is_new,cur_user_text FROM $cur $useIndex " .
"WHERE cur_user_text='" . $dbr->strencode( $nt->getText() ) . "' {$cmq} " .
"ORDER BY inverse_timestamp $tailOpts";
@@ -108,6 +108,10 @@ function wfSpecialContributions( $par = '' ) {
"ORDER BY inverse_timestamp $tailOpts";
$res2 = $dbr->query( $sql, $fname );
} else {
+ list( $useIndex, $tailOpts ) = $dbr->makeSelectOptions( array(
+ 'USE INDEX' => 'user_timestamp',
+ 'LIMIT' => $querylimit ) );
+
$sql = "SELECT cur_namespace,cur_title,cur_timestamp,cur_comment,cur_minor_edit,cur_is_new,cur_user_text FROM $cur $useIndex " .
"WHERE cur_user {$userCond} {$cmq} ORDER BY inverse_timestamp $tailOpts";
$res1 = $dbr->query( $sql, $fname );
diff --git a/includes/SpecialDoubleRedirects.php b/includes/SpecialDoubleRedirects.php
index 1f21a3f232ff..41091ceb50d3 100644
--- a/includes/SpecialDoubleRedirects.php
+++ b/includes/SpecialDoubleRedirects.php
@@ -18,7 +18,7 @@ require_once('QueryPage.php');
class DoubleRedirectsPage extends PageQueryPage {
function getName() {
- return 'doubleredirects';
+ return 'DoubleRedirects';
}
function isExpensive( ) { return true; }
diff --git a/includes/SpecialListadmins.php b/includes/SpecialListadmins.php
index 63e9e5fc660d..fba15ed7b741 100644
--- a/includes/SpecialListadmins.php
+++ b/includes/SpecialListadmins.php
@@ -1,23 +1,51 @@
<?php
/**
- * This old a redirect to Special:Listusers that now implement a filter
- * by user groups. The listadmins special page is now deprecated but kept
- * for backward compatibility.
- *
+ *
* @package MediaWiki
* @subpackage SpecialPage
- * @deprecated
*/
/**
- * Just redirect to Special:Listusers.
- * Kept for backward compatibility.
+ *
*/
-function wfSpecialListadmins() {
- global $wgOut;
- $t = Title::makeTitle( NS_SPECIAL, "Listusers" );
- $wgOut->redirect ($t->getFullURL());
+require_once("QueryPage.php");
+
+/**
+ * This class is used to get a list of users flagged with "sysop" right.
+ *
+ * @package MediaWiki
+ * @subpackage SpecialPage
+ */
+class ListAdminsPage extends PageQueryPage {
+
+ function getName() {
+ return 'Listadmins';
+ }
+
+ function sortDescending() {
+ return false;
+ }
+
+ function getSQL() {
+ $dbr =& wfGetDB( DB_SLAVE );
+ $user = $dbr->tableName( 'user' );
+ $user_rights = $dbr->tableName( 'user_rights' );
+ $userspace = Namespace::getUser();
+ return "SELECT ur_rights as type,{$userspace} as namespace,".
+ "user_name as title, user_name as value ".
+ "FROM {$user} ,{$user_rights} WHERE user_id=ur_user AND ur_rights LIKE '%sysop%'";
+ }
}
+/**
+ * constructor
+ */
+function wfSpecialListadmins() {
+ list( $limit, $offset ) = wfCheckLimits();
+
+ $sla = new ListAdminsPage();
+
+ return $sla->doQuery( $offset, $limit );
+}
?>
diff --git a/includes/SpecialListusers.php b/includes/SpecialListusers.php
index a44901b390fc..6f2e3617822f 100644
--- a/includes/SpecialListusers.php
+++ b/includes/SpecialListusers.php
@@ -38,87 +38,20 @@ require_once("QueryPage.php");
* @subpackage SpecialPage
*/
class ListUsersPage extends QueryPage {
- var $requestedGroup = '';
var $requestedUser = '';
function getName() {
return "Listusers";
}
function isSyndicated() { return false; }
-
- /**
- * Show a drop down list to select a group as well as a user name
- * search box.
- * @TODO: localize
- */
- function getPageHeader( ) {
- global $wgScript;
-
- // Various variables used for the form
- $action = htmlspecialchars( $wgScript );
- $title = Title::makeTitle( NS_SPECIAL, 'Listusers' );
- $special = htmlspecialchars( $title->getPrefixedDBkey() );
-
- // form header
- $out = '<form method="get" action="'.$action.'">' .
- '<input type="hidden" name="title" value="'.$special.'" />' .
- 'Group: <select name="group">' .
-
- // get all group names and id
- $dbr = & wfGetDB( DB_SLAVE );
- $group = $dbr->tableName( 'group' );
- $sql = "SELECT group_id, group_name FROM $group;";
- $result = $dbr->query($sql);
-
- // we want a default empty group
- $out.= '<option value=""></option>';
-
- // build the dropdown list menu using datas from the database
- while($agroup = $dbr->fetchObject( $result )) {
- $selected = ($agroup->group_id == $this->requestedGroup) ? " selected " : "" ;
- $out.= '<option value="'.$agroup->group_id.'" '.$selected.'>'.$agroup->group_name.'</option>';
- }
- $out .= '</select> ';
-
- $out .= 'User: <input type="text" name="username" /> ';
-
- // OK button, end of form.
- $out .= '<input type="submit" /></form>';
- // congratulations the form is now build
- return $out;
- }
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- /* system showing possible actions for users
$user = $dbr->tableName( 'user' );
$user_rights = $dbr->tableName( 'user_rights' );
$userspace = Namespace::getUser();
return "SELECT ur_rights as type, $userspace as namespace, user_name as title, " .
"user_name as value FROM $user LEFT JOIN $user_rights ON user_id = ur_user";
- */
- /** Show groups instead */
- $user = $dbr->tableName( 'user' );
- $group = $dbr->tableName( 'group' );
- $user_groups = $dbr->tableName( 'user_groups' );
-
- $userspace = Namespace::getUser();
- $sql = "SELECT group_name as type, $userspace AS namespace, user_name AS title, user_name as value " .
- "FROM $user LEFT JOIN $user_groups ON user_id =ug_user " .
- "LEFT JOIN $group ON ug_group = group_id ";
-
- if($this->requestedGroup != '') {
- $sql .= "WHERE group_id= '$this->requestedGroup' ";
- if($this->requestedUser != '') {
- $sql .= "AND user_name = '$this->requestedUser' ";
- }
- } else {
- if($this->requestedUser !='') {
- $sql .= "WHERE user_name = '$this->requestedUser' ";
- }
- }
-
- return $sql;
}
function sortDescending() {
diff --git a/includes/SpecialLog.php b/includes/SpecialLog.php
index e3c0b5a68da6..5d9f2aa88081 100644
--- a/includes/SpecialLog.php
+++ b/includes/SpecialLog.php
@@ -318,7 +318,7 @@ class LogViewer {
*/
function getUserInput() {
$user = htmlspecialchars( $this->reader->queryUser() );
- return "User: <input type='text' name='user' size='12' value=\"$user\" />\n";
+ return wfMsg('specialloguserlabel') . "<input type='text' name='user' size='12' value=\"$user\" />\n";
}
/**
@@ -327,7 +327,7 @@ class LogViewer {
*/
function getTitleInput() {
$title = htmlspecialchars( $this->reader->queryTitle() );
- return "Title: <input type='text' name='page' size='20' value=\"$title\" />\n";
+ return wfMsg('speciallogtitlelabel') . "<input type='text' name='page' size='20' value=\"$title\" />\n";
}
/**
diff --git a/includes/SpecialMakesysop.php b/includes/SpecialMakesysop.php
index 57eb11ba307f..0ac3599cc3bb 100644
--- a/includes/SpecialMakesysop.php
+++ b/includes/SpecialMakesysop.php
@@ -6,9 +6,6 @@
* @deprecated
*/
-wfDebugDieBacktrace('Use SpecialUserlevels instead !!'); // [av]
-
-
/**
*
*/
@@ -96,13 +93,7 @@ class MakesysopForm {
);
$makeburo = wfMsg( "setbureaucratflag" );
- $wgOut->addHTML(
- "<tr>
- <td>&nbsp;</td><td align=left>
- <input type=checkbox name=\"wpSetBureaucrat\" value=1>$makeburo
- </td>
- </tr>"
- );
+
if ( $wgUser->isDeveloper() ) {
$rights = wfMsg( "rights" );
@@ -120,6 +111,14 @@ class MakesysopForm {
</td>
</tr>"
);
+ } else {
+ $wgOut->addHTML(
+ "<tr>
+ <td>&nbsp;</td><td align=left>
+ <input type=checkbox name=\"wpSetBureaucrat\" value=1>$makeburo
+ </td>
+ </tr>"
+ );
}
if ( $wgUser->isDeveloper() ) {
@@ -139,7 +138,7 @@ class MakesysopForm {
function doSubmit() {
global $wgOut, $wgUser, $wgLang;
- global $wgDBname, $wgMemc, $wgLocalDatabases;
+ global $wgDBname, $wgMemc, $wgLocalDatabases, $wgSharedDB;
$fname = 'MakesysopForm::doSubmit';
@@ -147,13 +146,16 @@ class MakesysopForm {
$parts = explode( '@', $this->mUser );
$user_rights = $dbw->tableName( 'user_rights' );
$usertable = $dbw->tableName( 'user' );
+
if( count( $parts ) == 2 && $wgUser->isDeveloper() && strpos( '.', $user_rights ) === false ){
$username = $dbw->strencode( $parts[0] );
if ( array_key_exists( $parts[1], $wgLocalDatabases ) ) {
$dbName = $wgLocalDatabases[$parts[1]];
- $user_rights = $dbName . '.' . $user_rights;
- $usertable = $usertable . '.' . $usertable;
+ $user_rights = "`$dbName`.$user_rights";
+ if ( !$wgSharedDB ) {
+ $usertable = "`$dbName`.$usertable";
+ }
} else {
$this->showFail();
return;
@@ -164,10 +166,10 @@ class MakesysopForm {
}
if ( $username{0} == "#" ) {
$id = intval( substr( $username, 1 ) );
- $sql = "SELECT ur_user,ur_rights FROM $user_rights WHERE ur_user=$id FOR UPDATE";
+ $sql = "SELECT user_id, ur_rights FROM $usertable LEFT OUTER JOIN $user_rights ON user_id=ur_user WHERE user_id=$id FOR UPDATE";
} else {
$encName = $dbw->strencode( $username );
- $sql = "SELECT ur_user, ur_rights FROM $usertable LEFT JOIN $user_rights ON user_id=ur_user WHERE user_name = '{$username}' FOR UPDATE";
+ $sql = "SELECT user_id, ur_rights FROM $usertable LEFT OUTER JOIN $user_rights ON user_id=ur_user WHERE user_name='{$encName}' FOR UPDATE";
}
$prev = $dbw->ignoreErrors( TRUE );
@@ -180,7 +182,7 @@ class MakesysopForm {
}
$row = $dbw->fetchObject( $res );
- $id = intval( $row->ur_user );
+ $id = intval( $row->user_id );
$rightsNotation = array();
if ( $wgUser->isDeveloper() ) {
diff --git a/includes/SpecialNewimages.php b/includes/SpecialNewimages.php
index 91865509aba3..9d55f0bebe54 100644
--- a/includes/SpecialNewimages.php
+++ b/includes/SpecialNewimages.php
@@ -13,85 +13,133 @@ require_once( 'ImageGallery.php' );
function wfSpecialNewimages() {
global $wgUser, $wgOut, $wgLang, $wgContLang, $wgRequest;
- $sort = $wgRequest->getVal( 'sort' );
$wpIlMatch = $wgRequest->getText( 'wpIlMatch' );
$dbr =& wfGetDB( DB_SLAVE );
- $image = $dbr->tableName( 'image' );
- $sql = "SELECT img_size,img_name,img_user,img_user_text," .
- "img_description,img_timestamp FROM $image";
-
- $bydate = wfMsg( 'bydate' );
+ $sk = $wgUser->getSkin();
+ /** If we were clever, we'd use this to cache. */
+ $latestTimestamp = wfTimestamp( TS_MW, $dbr->selectField(
+ 'image', 'img_timestamp',
+ '', 'wfSpecialNewimages',
+ array( 'ORDER BY' => 'img_timestamp DESC',
+ 'LIMIT' => 1 ) ) );
+
+ /** Hardcode this for now. */
+ $limit = 48;
+
+ $where = array();
if ( !empty( $wpIlMatch ) ) {
$nt = Title::newFromUrl( $wpIlMatch );
if($nt ) {
$m = $dbr->strencode( strtolower( $nt->getDBkey() ) );
$m = str_replace( '%', "\\%", $m );
$m = str_replace( '_', "\\_", $m );
- $sql .= " WHERE LCASE(img_name) LIKE '%{$m}%'";
+ $where[] = "LCASE(img_name) LIKE '%{$m}%'";
}
+ }
+
+ $invertSort = false;
+ if( $until = $wgRequest->getVal( 'until' ) ) {
+ $where[] = 'img_timestamp < ' . $dbr->timestamp( $until );
+ }
+ if( $from = $wgRequest->getVal( 'from' ) ) {
+ $where[] = 'img_timestamp >= ' . $dbr->timestamp( $from );
+ $invertSort = true;
}
- $sort = 'bydate';
- $sql .= ' ORDER BY img_timestamp DESC';
- $st = $bydate;
- list( $limit, $offset ) = wfCheckLimits( 50 );
- if ( 0 == $limit ) {
- $lt = wfMsg( 'all' );
- } else {
- $lt = $wgLang->formatNum( "${limit}" );
- $sql .= " LIMIT {$limit}";
+ $res = $dbr->select( 'image',
+ array( 'img_size', 'img_name', 'img_user', 'img_user_text',
+ 'img_description', 'img_timestamp' ),
+ $where,
+ 'wfSpecialNewimages',
+ array( 'LIMIT' => $limit + 1,
+ 'ORDER BY' => 'img_timestamp' . ( $invertSort ? '' : ' DESC' ) )
+ );
+
+ /**
+ * We have to flip things around to get the last N after a certain date
+ */
+ $images = array();
+ while ( $s = $dbr->fetchObject( $res ) ) {
+ if( $invertSort ) {
+ array_unshift( $images, $s );
+ } else {
+ array_push( $images, $s );
+ }
}
- $wgOut->addHTML( "<p>" . wfMsg( "imglegend" ) . "</p>\n" );
+ $dbr->freeResult( $res );
+
+ $gallery = new ImageGallery();
+ $firstTimestamp = null;
+ $lastTimestamp = null;
+ $shownImages = 0;
+ foreach( $images as $s ) {
+ if( ++$shownImages > $limit ) {
+ # One extra just to test for whether to show a page link;
+ # don't actually show it.
+ break;
+ }
+
+ $name = $s->img_name;
+ $ut = $s->img_user_text;
+
+ $nt = Title::newFromText( $name, NS_IMAGE );
+ $img = Image::newFromTitle( $nt );
+ $ul = $sk->makeLink( $wgContLang->getNsText( Namespace::getUser() ) . ":{$ut}", $ut );
+ $gallery->add( $img, $ul.'<br /><i>'.$wgLang->timeanddate( $s->img_timestamp, true ).'</i><br />' );
+
+ $timestamp = wfTImestamp( TS_MW, $s->img_timestamp );
+ if( empty( $firstTimestamp ) ) {
+ $firstTimestamp = $timestamp;
+ }
+ $lastTimestamp = $timestamp;
+ }
+
+ $bydate = wfMsg( 'bydate' );
+ $lt = $wgLang->formatNum( min( $shownImages, $limit ) );
$text = wfMsg( "imagelisttext",
- "<strong>{$lt}</strong>", "<strong>{$st}</strong>" );
+ "<strong>{$lt}</strong>", "<strong>{$bydate}</strong>" );
$wgOut->addHTML( "<p>{$text}\n</p>" );
- $sk = $wgUser->getSkin();
$cap = wfMsg( 'ilshowmatch' );
$sub = wfMsg( 'ilsubmit' );
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Imagelist' );
- $action = $titleObj->escapeLocalURL( "sort={$sort}&limit={$limit}" );
+ $titleObj = Title::makeTitle( NS_SPECIAL, 'Newimages' );
+ $action = $titleObj->escapeLocalURL( "limit={$limit}" );
$wgOut->addHTML( "<form id=\"imagesearch\" method=\"post\" action=\"" .
"{$action}\">" .
"{$cap}: <input type='text' size='8' name=\"wpIlMatch\" value=\"" .
htmlspecialchars( $wpIlMatch ) . "\" /> " .
"<input type='submit' name=\"wpIlSubmit\" value=\"{$sub}\" /></form>" );
- $nums = array( 50, 100, 250, 500 );
- $here = $wgContLang->specialPage( 'Imagelist' );
+ $here = $wgContLang->specialPage( 'Newimages' );
- $fill = '';
- $first = true;
- foreach ( $nums as $num ) {
- if ( ! $first ) { $fill .= ' | '; }
- $first = false;
-
- $fill .= $sk->makeKnownLink( $here, $wgLang->formatNum( $num ),
- "sort=bydate&limit={$num}&wpIlMatch=" . urlencode( $wpIlMatch ) );
+ /**
+ * Paging controls...
+ */
+ $now = wfTimestamp( TS_MW );
+ $date = $wgLang->timeanddate( $now );
+ $dateLink = $sk->makeKnownLinkObj( $titleObj, wfMsg( 'rclistfrom', $date ), 'from=' . $now );
+
+ $prevLink = wfMsg( 'prevn', $wgLang->formatNum( $limit ) );
+ if( $firstTimestamp && $firstTimestamp != $latestTimestamp ) {
+ $prevLink = $sk->makeKnownLinkObj( $titleObj, $prevLink, 'from=' . $firstTimestamp );
}
- $text = wfMsg( 'showlast', $fill, $bydate );
- $wgOut->addHTML( $text."</p>\n" );
-
- $i=0;
- $res = $dbr->query( $sql, 'wfSpecialImagelist' );
-
- $gallery = new ImageGallery();
-
- while ( $s = $dbr->fetchObject( $res ) ) {
- $name = $s->img_name;
- $ut = $s->img_user_text;
-
- $nt = Title::newFromText( $name, NS_IMAGE );
- $img = Image::newFromTitle( $nt );
- $ul = $sk->makeLink( $wgContLang->getNsText( Namespace::getUser() ) . ":{$ut}", $ut );
-
- $gallery->add( $img, $ul.'<br /><i>'.$wgLang->timeanddate( $s->img_timestamp, true ).'</i><br />' );
- $i++;
+
+ $nextLink = wfMsg( 'nextn', $wgLang->formatNum( $limit ) );
+ if( $shownImages > $limit && $lastTimestamp ) {
+ $nextLink = $sk->makeKnownLinkObj( $titleObj, $nextLink, 'until=' . $lastTimestamp );
+ }
+
+ $prevnext = '<p>' . wfMsg( 'viewprevnext', $prevLink, $nextLink, $dateLink ) . '</p>';
+ $wgOut->addHTML( $prevnext );
+
+ if( count( $images ) ) {
+ $wgOut->addHTML( $gallery->toHTML() );
+ $wgOut->addHTML( $prevnext );
+ } else {
+ $wgOut->addWikiText( wfMsg( 'noimages' ) );
}
- $wgOut->addHTML( $gallery->toHTML() );
- $dbr->freeResult( $res );
}
?>
diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php
index 9b9c51efd0ef..e17546a5c069 100644
--- a/includes/SpecialPage.php
+++ b/includes/SpecialPage.php
@@ -41,6 +41,7 @@ $wgSpecialPages = array(
'Randompage' => new SpecialPage( 'Randompage' ),
'Lonelypages' => new SpecialPage( 'Lonelypages' ),
'Uncategorizedpages'=> new SpecialPage( 'Uncategorizedpages' ),
+ 'Uncategorizedcategories'=> new SpecialPage( 'Uncategorizedcategories' ),
'Unusedimages' => new SpecialPage( 'Unusedimages' )
);
@@ -54,6 +55,11 @@ if ( $wgUseData ) {
$wgSpecialPages['Data'] = new SpecialPage( 'Data' );
}
+global $wgDisableInternalSearch;
+if ( !$wgDisableInternalSearch ) {
+ $wgSpecialPages['Search'] = new UnlistedSpecialPage( 'Search' );
+}
+
$wgSpecialPages = array_merge($wgSpecialPages, array (
'Wantedpages' => new SpecialPage( 'Wantedpages' ),
'Shortpages' => new SpecialPage( 'Shortpages' ),
@@ -78,20 +84,17 @@ $wgSpecialPages = array_merge($wgSpecialPages, array (
'Export' => new SpecialPage( 'Export' ),
'Version' => new SpecialPage( 'Version' ),
'Allmessages' => new SpecialPage( 'Allmessages' ),
- 'Search' => new UnlistedSpecialPage( 'Search' ),
'Log' => new SpecialPage( 'Log' ),
'Blockip' => new SpecialPage( 'Blockip', 'block' ),
'Asksql' => new SpecialPage( 'Asksql', 'asksql' ),
'Undelete' => new SpecialPage( 'Undelete', 'delete' ),
- // Makesysop is obsolete, replaced by Special:Userlevels [av]
- # 'Makesysop' => new SpecialPage( 'Makesysop', 'userrights' ),
+ 'Makesysop' => new SpecialPage( 'Makesysop', 'userrights' ),
# Special:Import is half-written
# "Import" => new SpecialPage( "Import", "sysop" ),
'Lockdb' => new SpecialPage( 'Lockdb', 'siteadmin' ),
'Unlockdb' => new SpecialPage( 'Unlockdb', 'siteadmin' ),
- 'Sitesettings' => new SpecialPage( 'Sitesettings', 'siteadmin' ),
- 'Userlevels' => new SpecialPage( 'Userlevels', 'userrights' ),
+# 'Sitesettings' => new SpecialPage( 'Sitesettings', 'siteadmin' ),
));
/**
@@ -263,11 +266,7 @@ class SpecialPage
if ( $this->mRestriction == "" ) {
return true;
} else {
- if ( in_array( $this->mRestriction, $user->getRights() ) ) {
- return true;
- } else {
- return false;
- }
+ return $user->isAllowed( $this->mRestriction );
}
}
diff --git a/includes/SpecialPreferences.php b/includes/SpecialPreferences.php
index 6d9e60219a7d..f0cfef292ad9 100644
--- a/includes/SpecialPreferences.php
+++ b/includes/SpecialPreferences.php
@@ -5,6 +5,9 @@
* @subpackage SpecialPage
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/* to get a list of languages in setting user's language preference */
require_once('languages/Names.php');
@@ -230,7 +233,12 @@ class PreferencesForm {
$this->mOldpass = $this->mNewpass = $this->mRetypePass = '';
$this->mUserEmail = $wgUser->getEmail();
$this->mRealName = ($wgAllowRealName) ? $wgUser->getRealName() : '';
- $this->mUserLanguage = $wgUser->getOption( 'language');
+ $this->mUserLanguage = $wgUser->getOption( 'language' );
+ if( empty( $this->mUserLanguage ) ) {
+ # Quick hack for conversions, where this value is blank
+ global $wgContLanguageCode;
+ $this->mUserLanguage = $wgContLanguageCode;
+ }
$this->mUserVariant = $wgUser->getOption( 'variant');
if ( 1 == $wgUser->getOption( 'disablemail' ) ) { $this->mEmailFlag = 1; }
else { $this->mEmailFlag = 0; }
@@ -320,7 +328,7 @@ class PreferencesForm {
global $wgUser, $wgOut, $wgLang, $wgContLang, $wgUseDynamicDates, $wgValidSkinNames;
global $wgAllowRealName, $wgImageLimits;
global $wgLanguageNames, $wgDisableLangConversion;
-
+ global $wgContLanguageCode;
$wgOut->setPageTitle( wfMsg( 'preferences' ) );
$wgOut->setArticleRelated( false );
$wgOut->setRobotpolicy( 'noindex,nofollow' );
@@ -406,16 +414,28 @@ class PreferencesForm {
}
}
+ $fancysig = $this->getToggle( 'fancysig' );
$wgOut->addHTML("
<div><label>$ynn: <input type='text' name=\"wpNick\" value=\"{$this->mNick}\" size='12' /></label></div>
+ <div>$fancysig<br /></div>
<div><label>$yl: <select name=\"wpUserLanguage\">\n");
+ /**
+ * If a bogus value is set, default to the content language.
+ * Otherwise, no default is selected and the user ends up
+ * with an Afrikaans interface since it's first in the list.
+ */
+ if( isset( $wgLanguageNames[$this->mUserLanguage] ) ) {
+ $selectedLang = $this->mUserLanguage;
+ } else {
+ $selectedLang = $wgContLanguageCode;
+ }
foreach($wgLanguageNames as $code => $name) {
global $IP;
/* only add languages that have a file */
$langfile="$IP/languages/Language".str_replace('-', '_', ucfirst($code)).".php";
- if(file_exists($langfile)) {
- $sel = ($code == $this->mUserLanguage)? 'selected="selected"' : '';
+ if(file_exists($langfile) || $code == $wgContLanguageCode) {
+ $sel = ($code == $selectedLang)? 'selected="selected"' : '';
$wgOut->addHtml("\t<option value=\"$code\" $sel>$code - $name</option>\n");
}
}
@@ -424,7 +444,6 @@ class PreferencesForm {
/* see if there are multiple language variants to choose from*/
if(!$wgDisableLangConversion) {
$variants = $wgContLang->getVariants();
- $size=sizeof($variants);
$variantArray=array();
foreach($variants as $v) {
@@ -433,7 +452,6 @@ class PreferencesForm {
$variantArray[$v] = $name;
}
}
- $size=sizeof($variantArray);
if(sizeof($variantArray) > 1) {
$wgOut->addHtml("
@@ -442,6 +460,7 @@ class PreferencesForm {
$sel = ($code==$this->mUserVariant)? 'selected="selected"' : '';
$wgOut->addHtml("\t<option value=\"$code\" $sel>$code - $name</option>\n");
}
+ $wgOut->addHtml("</select></label></div>\n");
}
}
# Fields for changing password
@@ -584,6 +603,7 @@ class PreferencesForm {
# Various checkbox options
#
$wgOut->addHTML("<fieldset><legend>".wfMsg('prefs-misc')."</legend>");
+
foreach ( $togs as $tname ) {
if( !array_key_exists( $tname, $this->mUsedToggles ) ) {
$wgOut->addHTML( $this->getToggle( $tname ) );
diff --git a/includes/SpecialRecentchanges.php b/includes/SpecialRecentchanges.php
index 4d7ad65667c4..19bb00c43616 100644
--- a/includes/SpecialRecentchanges.php
+++ b/includes/SpecialRecentchanges.php
@@ -28,22 +28,34 @@ function wfSpecialRecentchanges( $par ) {
$days = $wgRequest->getInt( 'days', $defaultDays );
$hideminor = $wgRequest->getBool( 'hideminor', $wgUser->getOption( 'hideminor' ) ) ? 1 : 0;
- $from = $wgRequest->getText( 'from' );
- $hidebots = $wgRequest->getBool( 'hidebots', true ) ? 1 : 0;
- $hideliu = $wgRequest->getBool( 'hideliu', false ) ? 1 : 0;
- $hidepatrolled = $wgRequest->getBool( 'hidepatrolled', false ) ? 1 : 0;
-
list( $limit, $offset ) = wfCheckLimits( 100, 'rclimit' );
-
- # Get query parameters from path
- if( $par ) {
- $bits = preg_split( '/\s*,\s*/', trim( $par ) );
- if( in_array( 'hidebots', $bits ) ) $hidebots = 1;
- if( in_array( 'bots', $bits ) ) $hidebots = 0;
- if( in_array( 'hideminor', $bits ) ) $hideminor = 1;
- if( in_array( 'minor', $bits ) ) $hideminor = 0;
- if( in_array( 'hideliu', $bits) ) $hideliu = 1;
- if( in_array( 'hidepatrolled', $bits) ) $hidepatrolled = 1;
+
+ # As a feed, use limited settings only
+ if( $feedFormat ) {
+ $from = null;
+ $hidebots = 1;
+ $hideliu = 0;
+ $hidepatrolled = 0;
+ global $wgFeedLimit;
+ if( $limit > $wgFeedLimit ) {
+ $limit = $wgFeedLimit;
+ }
+ } else {
+ $from = $wgRequest->getText( 'from' );
+ $hidebots = $wgRequest->getBool( 'hidebots', true ) ? 1 : 0;
+ $hideliu = $wgRequest->getBool( 'hideliu', false ) ? 1 : 0;
+ $hidepatrolled = $wgRequest->getBool( 'hidepatrolled', false ) ? 1 : 0;
+
+ # Get query parameters from path
+ if( $par ) {
+ $bits = preg_split( '/\s*,\s*/', trim( $par ) );
+ if( in_array( 'hidebots', $bits ) ) $hidebots = 1;
+ if( in_array( 'bots', $bits ) ) $hidebots = 0;
+ if( in_array( 'hideminor', $bits ) ) $hideminor = 1;
+ if( in_array( 'minor', $bits ) ) $hideminor = 0;
+ if( in_array( 'hideliu', $bits) ) $hideliu = 1;
+ if( in_array( 'hidepatrolled', $bits) ) $hidepatrolled = 1;
+ }
}
@@ -57,8 +69,8 @@ function wfSpecialRecentchanges( $par ) {
# Get last modified date, for client caching
# Don't use this if we are using the patrol feature, patrol changes don't update the timestamp
- if ( !$wgUseRCPatrol ) {
- $lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, $fname );
+ $lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, $fname );
+ if ( $feedFormat || !$wgUseRCPatrol ) {
if( $lastmod && $wgOut->checkLastModified( $lastmod ) ){
# Client cache fresh and headers sent, nothing more to do.
return;
@@ -66,7 +78,7 @@ function wfSpecialRecentchanges( $par ) {
}
# Output header
- $rctext = wfMsg( "recentchangestext" );
+ $rctext = wfMsgForContent( "recentchangestext" );
$wgOut->addWikiText( $rctext );
@@ -132,44 +144,10 @@ function wfSpecialRecentchanges( $par ) {
$wgOut->addHTML( $note."\n" );
- if( isset($wgFeedClasses[$feedFormat]) ) {
- $feed = new $wgFeedClasses[$feedFormat](
- $wgSitename . ' - ' . wfMsg( 'recentchanges' ) . ' [' . $wgContLanguageCode . ']',
- htmlspecialchars( wfMsg( 'recentchangestext' ) ),
- $wgTitle->getFullUrl() );
- $feed->outHeader();
-
- # Merge adjacent edits by one user
- $sorted = array();
- $n = 0;
- foreach( $rows as $obj ) {
- if( $n > 0 &&
- $obj->rc_namespace >= 0 &&
- $obj->rc_cur_id == $sorted[$n-1]->rc_cur_id &&
- $obj->rc_user_text == $sorted[$n-1]->rc_user_text ) {
- $sorted[$n-1]->rc_last_oldid = $obj->rc_last_oldid;
- } else {
- $sorted[$n] = $obj;
- $n++;
- }
- $first = false;
- }
-
- foreach( $sorted as $obj ) {
- $title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );
- $talkpage = $title->getTalkPage();
- $item = new FeedItem(
- $title->getPrefixedText(),
- rcFormatDiff( $obj ),
- $title->getFullURL(),
- $obj->rc_timestamp,
- $obj->rc_user_text,
- $talkpage->getFullURL()
- );
- $feed->outItem( $item );
- }
- $feed->outFooter();
+ if( $feedFormat ) {
+ rcOutputFeed( $rows, $feedFormat, $limit, $hideminor, $lastmod );
} else {
+ # Web output...
$wgOut->setSyndicated( true );
$list =& new ChangesList( $sk );
$s = $list->beginRecentChangesList();
@@ -192,6 +170,103 @@ function wfSpecialRecentchanges( $par ) {
}
}
+function rcOutputFeed( $rows, $feedFormat, $limit, $hideminor, $lastmod ) {
+ global $messageMemc, $wgDBname, $wgFeedCacheTimeout;
+ global $wgFeedClasses, $wgTitle, $wgSitename, $wgContLanguageCode;
+
+ if( !isset( $wgFeedClasses[$feedFormat] ) ) {
+ wfHttpError( 500, "Internal Server Error", "Unsupported feed type." );
+ return false;
+ }
+
+ $timekey = "$wgDBname:rcfeed:timestamp";
+ $key = "$wgDBname:rcfeed:$feedFormat:limit:$limit:minor:$hideminor";
+
+ $feedTitle = $wgSitename . ' - ' . wfMsgForContent( 'recentchanges' ) .
+ ' [' . $wgContLanguageCode . ']';
+ $feed = new $wgFeedClasses[$feedFormat](
+ $feedTitle,
+ htmlspecialchars( wfMsgForContent( 'recentchangestext' ) ),
+ $wgTitle->getFullUrl() );
+
+ /**
+ * Bumping around loading up diffs can be pretty slow, so where
+ * possible we want to cache the feed output so the next visitor
+ * gets it quick too.
+ */
+ $cachedFeed = false;
+ if( $feedLastmod = $messageMemc->get( $timekey ) ) {
+ /**
+ * 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
+ * from being too bad on a super-frequently edited wiki.
+ */
+ if( time() - wfTimestamp( TS_UNIX, $feedLastmod )
+ < $wgFeedCacheTimeout
+ || wfTimestamp( TS_UNIX, $feedLastmod )
+ > wfTimestamp( TS_UNIX, $lastmod ) ) {
+ wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
+ $cachedFeed = $messageMemc->get( $key );
+ } else {
+ wfDebug( "RC: cached feed timestamp check failed ($feedLastmod; $lastmod)\n" );
+ }
+ }
+ if( is_string( $cachedFeed ) ) {
+ wfDebug( "RC: Outputting cached feed\n" );
+ $feed->httpHeaders();
+ echo $cachedFeed;
+ } else {
+ wfDebug( "RC: rendering new feed and caching it\n" );
+ ob_start();
+ rcDoOutputFeed( $rows, $feed );
+ $cachedFeed = ob_get_contents();
+ ob_end_flush();
+
+ $expire = 3600 * 24; # One day
+ $messageMemc->set( $key, $cachedFeed );
+ $messageMemc->set( $timekey, wfTimestamp( TS_MW ), $expire );
+ }
+ return true;
+}
+
+function rcDoOutputFeed( $rows, &$feed ) {
+ global $wgSitename, $wgFeedClasses, $wgContLanguageCode;
+
+ $feed->outHeader();
+
+ # Merge adjacent edits by one user
+ $sorted = array();
+ $n = 0;
+ foreach( $rows as $obj ) {
+ if( $n > 0 &&
+ $obj->rc_namespace >= 0 &&
+ $obj->rc_cur_id == $sorted[$n-1]->rc_cur_id &&
+ $obj->rc_user_text == $sorted[$n-1]->rc_user_text ) {
+ $sorted[$n-1]->rc_last_oldid = $obj->rc_last_oldid;
+ } else {
+ $sorted[$n] = $obj;
+ $n++;
+ }
+ $first = false;
+ }
+
+ foreach( $sorted as $obj ) {
+ $title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );
+ $talkpage = $title->getTalkPage();
+ $item = new FeedItem(
+ $title->getPrefixedText(),
+ rcFormatDiff( $obj ),
+ $title->getFullURL(),
+ $obj->rc_timestamp,
+ $obj->rc_user_text,
+ $talkpage->getFullURL()
+ );
+ $feed->outItem( $item );
+ }
+ $feed->outFooter();
+}
+
/**
*
*/
@@ -217,7 +292,7 @@ function rcDaysLink( $lim, $d, $page='Recentchanges', $more='' ) {
}
/**
- *
+ * Used also by Recentchangeslinked
*/
function rcDayLimitLinks( $days, $limit, $page='Recentchanges', $more='', $doall = false, $minorLink = '',
$botLink = '', $liuLink = '', $patrLink = '' ) {
@@ -239,19 +314,8 @@ function rcDayLimitLinks( $days, $limit, $page='Recentchanges', $more='', $doall
}
/**
- * Obsolete? Isn't called from anywhere and $mlink isn't defined
+ * Format a diff for the newsfeed
*/
-function rcLimitLinks( $page='Recentchanges', $more='', $doall = false ) {
- if ($more != '') $more .= '&';
- $cl = rcCountLink( 50, 0, $page, $more ) . ' | ' .
- rcCountLink( 100, 0, $page, $more ) . ' | ' .
- rcCountLink( 250, 0, $page, $more ) . ' | ' .
- rcCountLink( 500, 0, $page, $more ) .
- ( $doall ? ( ' | ' . rcCountLink( 0, $days, $page, $more ) ) : '' );
- $note = wfMsg( 'rclinks', $cl, '', $mlink );
- return $note;
-}
-
function rcFormatDiff( $row ) {
$fname = 'rcFormatDiff';
wfProfileIn( $fname );
@@ -283,9 +347,24 @@ function rcFormatDiff( $row ) {
array( 'old_flags', 'old_text' ),
array( 'old_id' => $row->rc_last_oldid ) );
$oldtext = Article::getRevisionText( $oldrow );
- $diffText = DifferenceEngine::getDiff( $oldtext, $newtext,
- wfMsg( 'revisionasof', $wgContLang->timeanddate( $row->rc_timestamp ) ),
- wfMsg( 'currentrev' ) );
+
+ global $wgFeedDiffCutoff;
+ if( strlen( $newtext ) > $wgFeedDiffCutoff ||
+ strlen( $oldtext ) > $wgFeedDiffCutoff ) {
+ $titleObj = Title::makeTitle( $row->rc_namespace, $row->rc_title );
+ $diffLink = $titleObj->escapeFullUrl(
+ 'diff=' . $row->rc_this_oldid .
+ '&oldid=' . $row->rc_last_oldid );
+ $diffText = '<a href="' .
+ $diffLink .
+ '">' .
+ htmlspecialchars( wfMsgForContent( 'difference' ) ) .
+ '</a>';
+ } else {
+ $diffText = DifferenceEngine::getDiff( $oldtext, $newtext,
+ wfMsg( 'revisionasof', $wgContLang->timeanddate( $row->rc_timestamp ) ),
+ wfMsg( 'currentrev' ) );
+ }
wfProfileOut( "$fname-dodiff" );
} else {
$diffText = '<p><b>' . wfMsg( 'newpage' ) . '</b></p>' .
diff --git a/includes/SpecialRecentchangeslinked.php b/includes/SpecialRecentchangeslinked.php
index 6a86012d8c9d..90299237c1e5 100644
--- a/includes/SpecialRecentchangeslinked.php
+++ b/includes/SpecialRecentchangeslinked.php
@@ -65,13 +65,23 @@ function wfSpecialRecentchangeslinked( $par = NULL ) {
$cmq = 'AND cur_minor_edit=0';
} else { $cmq = ''; }
- extract( $dbr->tableNames( 'cur', 'links' ) );
-
- $sql = "SELECT cur_id,cur_namespace,cur_title,cur_user,cur_comment," .
- "cur_user_text,cur_timestamp,cur_minor_edit,cur_is_new FROM $links, $cur " .
- "WHERE cur_timestamp > '{$cutoff}' {$cmq} AND l_to=cur_id AND l_from=$id " .
- "GROUP BY cur_id,cur_namespace,cur_title,cur_user,cur_comment,cur_user_text," .
- "cur_timestamp,cur_minor_edit,cur_is_new,inverse_timestamp ORDER BY inverse_timestamp LIMIT {$limit}";
+ // If target is a Category, use categorylinks and invert from and to
+ if ( $nt->getNamespace() == NS_CATEGORY ) {
+ extract( $dbr->tableNames( 'cur', 'categorylinks' ) );
+ $catkey = $dbr->addQuotes( $nt->getDBKey() );
+ $sql = "SELECT cur_id,cur_namespace,cur_title,cur_user,cur_comment," .
+ "cur_user_text,cur_timestamp,cur_minor_edit,cur_is_new FROM $categorylinks, $cur " .
+ "WHERE cur_timestamp > '{$cutoff}' {$cmq} AND cl_from=cur_id AND cl_to=$catkey " .
+ "GROUP BY cur_id,cur_namespace,cur_title,cur_user,cur_comment,cur_user_text," .
+ "cur_timestamp,cur_minor_edit,cur_is_new,inverse_timestamp ORDER BY inverse_timestamp LIMIT {$limit}";
+ } else {
+ extract( $dbr->tableNames( 'cur', 'links' ) );
+ $sql = "SELECT cur_id,cur_namespace,cur_title,cur_user,cur_comment," .
+ "cur_user_text,cur_timestamp,cur_minor_edit,cur_is_new FROM $links, $cur " .
+ "WHERE cur_timestamp > '{$cutoff}' {$cmq} AND l_to=cur_id AND l_from=$id " .
+ "GROUP BY cur_id,cur_namespace,cur_title,cur_user,cur_comment,cur_user_text," .
+ "cur_timestamp,cur_minor_edit,cur_is_new,inverse_timestamp ORDER BY inverse_timestamp LIMIT {$limit}";
+ }
$res = $dbr->query( $sql, $fname );
$wgOut->addHTML("&lt; ".$sk->makeKnownLinkObj($nt, "", "redirect=no" )."<br />\n");
diff --git a/includes/SpecialSearch.php b/includes/SpecialSearch.php
index 95ca38055aef..eabe756397f4 100644
--- a/includes/SpecialSearch.php
+++ b/includes/SpecialSearch.php
@@ -132,6 +132,12 @@ class SpecialSearch {
global $wgDisableTextSearch;
if ( $wgDisableTextSearch ) {
+ global $wgForwardSearchUrl;
+ if( $wgForwardSearchUrl ) {
+ $url = str_replace( '$1', urlencode( $term ), $wgForwardSearchUrl );
+ $wgOut->redirect( $url );
+ return;
+ }
global $wgInputEncoding;
$wgOut->addHTML( wfMsg( 'searchdisabled' ) );
$wgOut->addHTML( wfMsg( 'googlesearch',
diff --git a/includes/SpecialUncategorizedcategories.php b/includes/SpecialUncategorizedcategories.php
new file mode 100755
index 000000000000..af24c824b0df
--- /dev/null
+++ b/includes/SpecialUncategorizedcategories.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ *
+ * @package MediaWiki
+ * @subpackage SpecialPage
+ */
+
+/**
+ *
+ */
+require_once( "SpecialUncategorizedpages.php" );
+
+/**
+ *
+ * @package MediaWiki
+ * @subpackage SpecialPage
+ */
+class UncategorizedCategoriesPage extends UncategorizedPagesPage {
+ function getName() {
+ return "Uncategorizedcategories";
+ }
+}
+
+/**
+ * constructor
+ */
+function wfSpecialUncategorizedcategories() {
+ list( $limit, $offset ) = wfCheckLimits();
+
+ $lpp = new UncategorizedCategoriesPage();
+ $lpp->requestedNamespace = NS_CATEGORY;
+
+ return $lpp->doQuery( $offset, $limit );
+}
+
+?>
diff --git a/includes/SpecialUncategorizedpages.php b/includes/SpecialUncategorizedpages.php
index 2d56ce9df6c5..b8d2cd9bc62d 100755
--- a/includes/SpecialUncategorizedpages.php
+++ b/includes/SpecialUncategorizedpages.php
@@ -16,7 +16,8 @@ require_once( "QueryPage.php" );
* @subpackage SpecialPage
*/
class UncategorizedPagesPage extends PageQueryPage {
-
+ var $requestedNamespace = 0;
+
function getName() {
return "Uncategorizedpages";
}
@@ -36,7 +37,7 @@ class UncategorizedPagesPage extends PageQueryPage {
return "SELECT 'Uncategorizedpages' as type, cur_namespace AS namespace, cur_title AS title, cur_title AS value " .
"FROM $cur LEFT JOIN $categorylinks ON cur_id=cl_from ".
- "WHERE cl_from IS NULL AND cur_namespace=0 AND cur_is_redirect=0";
+ "WHERE cl_from IS NULL AND cur_namespace=$this->requestedNamespace AND cur_is_redirect=0";
}
}
diff --git a/includes/SpecialUpload.php b/includes/SpecialUpload.php
index 1e3d40c76de1..5497b50a2f17 100644
--- a/includes/SpecialUpload.php
+++ b/includes/SpecialUpload.php
@@ -156,14 +156,18 @@ class UploadForm {
# Chop off any directories in the given filename
$basename = basename( $this->mOname );
- if( preg_match( '/^(.*)\.([^.]*)$/', $basename, $matches ) ) {
- $partname = $matches[1];
- $ext = $matches[2];
+ /**
+ * We'll want to blacklist against *any* 'extension', and use
+ * only the final one for the whitelist.
+ */
+ list( $partname, $ext ) = $this->splitExtensions( $basename );
+ if( count( $ext ) ) {
+ $finalExt = $ext[count( $ext ) - 1];
} else {
- $partname = $basename;
- $ext = '';
+ $finalExt = '';
}
-
+ $fullExt = implode( '.', $ext );
+
if ( strlen( $partname ) < 3 ) {
$this->mainUploadForm( wfMsg( 'minlength' ) );
return;
@@ -192,9 +196,10 @@ class UploadForm {
/* Don't allow users to override the blacklist */
global $wgStrictFileExtensions;
global $wgFileExtensions, $wgFileBlacklist;
- if( $this->checkFileExtension( $ext, $wgFileBlacklist ) ||
- ($wgStrictFileExtensions && !$this->checkFileExtension( $ext, $wgFileExtensions ) ) ) {
- return $this->uploadError( wfMsg( 'badfiletype', htmlspecialchars( $ext ) ) );
+ if( $this->checkFileExtensionList( $ext, $wgFileBlacklist ) ||
+ ($wgStrictFileExtensions &&
+ !$this->checkFileExtension( $finalExt, $wgFileExtensions ) ) ) {
+ return $this->uploadError( wfMsg( 'badfiletype', htmlspecialchars( $fullExt ) ) );
}
/**
@@ -202,7 +207,7 @@ class UploadForm {
* type but it's corrupt or data of the wrong type, we should
* probably not accept it.
*/
- if( !$this->verify( $this->mUploadTempName, $ext ) ) {
+ if( !$this->verify( $this->mUploadTempName, $finalExt ) ) {
return $this->uploadError( wfMsg( 'uploadcorrupt' ) );
}
@@ -217,8 +222,8 @@ class UploadForm {
global $wgCheckFileExtensions;
if ( $wgCheckFileExtensions ) {
- if ( ! $this->checkFileExtension( $ext, $wgFileExtensions ) ) {
- $warning .= '<li>'.wfMsg( 'badfiletype', htmlspecialchars( $ext ) ).'</li>';
+ if ( ! $this->checkFileExtension( $finalExt, $wgFileExtensions ) ) {
+ $warning .= '<li>'.wfMsg( 'badfiletype', htmlspecialchars( $fullExt ) ).'</li>';
}
}
@@ -535,6 +540,20 @@ class UploadForm {
/* -------------------------------------------------------------- */
/**
+ * Split a file into a base name and all dot-delimited 'extensions'
+ * on the end. Some web server configurations will fall back to
+ * earlier pseudo-'extensions' to determine type and execute
+ * scripts, so the blacklist needs to check them all.
+ *
+ * @return array
+ */
+ function splitExtensions( $filename ) {
+ $bits = explode( '.', $filename );
+ $basename = array_shift( $bits );
+ return array( $basename, $bits );
+ }
+
+ /**
* Perform case-insensitive match against a list of file extensions.
* Returns true if the extension is in the list.
*
@@ -547,6 +566,23 @@ class UploadForm {
}
/**
+ * Perform case-insensitive match against a list of file extensions.
+ * Returns true if any of the extensions are in the list.
+ *
+ * @param array $ext
+ * @param array $list
+ * @return bool
+ */
+ function checkFileExtensionList( $ext, $list ) {
+ foreach( $ext as $e ) {
+ if( in_array( strtolower( $e ), $list ) ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Returns false if the file is of a known type but can't be recognized,
* indicating a corrupt file.
* Returns true otherwise; unknown file types are not checked if given
diff --git a/includes/Title.php b/includes/Title.php
index 43f8e78cee4c..c531a38fc3e7 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -837,7 +837,7 @@ class Title {
/** If anon users can create an account,
they need to reach the login page first! */
if( $wgUser->isAllowed( 'createaccount' )
- && $this->mId == NS_SPECIAL
+ && $this->getNamespace() == NS_SPECIAL
&& $this->getText() == 'Userlogin' ) {
return true;
}
@@ -1339,7 +1339,9 @@ class Title {
return 'badarticleerror';
}
- if ( $auth && ( !$this->userCanEdit() || !$nt->userCanEdit() ) ) {
+ if ( $auth && (
+ !$this->userCanEdit() || !$nt->userCanEdit() ||
+ !$this->userCanMove() || !$nt->userCanMove() ) ) {
return 'protectedpage';
}
@@ -1359,7 +1361,8 @@ class Title {
# Fixing category links (those without piped 'alternate' names) to be sorted under the new title
$dbw =& wfGetDB( DB_MASTER );
- $sql = "UPDATE categorylinks SET cl_sortkey=" . $dbw->addQuotes( $nt->getPrefixedText() ) .
+ $categorylinks = $dbw->tableName( 'categorylinks' );
+ $sql = "UPDATE $categorylinks SET cl_sortkey=" . $dbw->addQuotes( $nt->getPrefixedText() ) .
" WHERE cl_from=" . $dbw->addQuotes( $this->getArticleID() ) .
" AND cl_sortkey=" . $dbw->addQuotes( $this->getPrefixedText() );
$dbw->query( $sql, 'SpecialMovepage::doSubmit' );
@@ -1404,6 +1407,12 @@ class Title {
$dbw =& wfGetDB( DB_MASTER );
$links = $dbw->tableName( 'links' );
+ # Delete the old redirect. We don't save it to history since
+ # by definition if we've got here it's rather uninteresting.
+ # We have to remove it so that the next step doesn't trigger
+ # a conflict on the unique namespace+title index...
+ $dbw->delete( 'cur', array( 'cur_id' => $newid ), $fname );
+
# Change the name of the target page:
$dbw->update( 'cur',
/* SET */ array(
@@ -1416,12 +1425,11 @@ class Title {
);
$wgLinkCache->clearLink( $nt->getPrefixedDBkey() );
- # Repurpose the old redirect. We don't save it to history since
- # by definition if we've got here it's rather uninteresting.
-
+ # Recreate the redirect, this time in the other direction.
$redirectText = $wgMwRedir->getSynonym( 0 ) . ' [[' . $nt->getPrefixedText() . "]]\n";
- $dbw->update( 'cur',
+ $dbw->insert( 'cur',
/* SET */ array(
+ 'cur_id' => $newid,
'cur_touched' => $dbw->timestamp($now),
'cur_timestamp' => $dbw->timestamp($now),
'inverse_timestamp' => $won,
@@ -1437,7 +1445,6 @@ class Title {
'cur_is_redirect' => 1,
'cur_is_new' => 1
),
- /* WHERE */ array( 'cur_id' => $newid ),
$fname
);
diff --git a/includes/User.php b/includes/User.php
index d9aa940dde6e..3aca322b09b2 100644
--- a/includes/User.php
+++ b/includes/User.php
@@ -9,7 +9,6 @@
*
*/
require_once( 'WatchedItem.php' );
-require_once( 'Group.php' );
# Number of characters in user_token field
define( 'USER_TOKEN_LENGTH', 32 );
@@ -31,9 +30,6 @@ class User {
var $mToken;
var $mRealName;
var $mHash;
- /** Array of group id the user belong to */
- var $mGroups;
- /**#@-*/
/** Construct using User:loadDefaults() */
function User() {
@@ -152,7 +148,6 @@ class User {
$this->mRealName = $this->mEmail = '';
$this->mPassword = $this->mNewpassword = '';
$this->mRights = array();
- $this->mGroups = array();
// Getting user defaults only if we have an available language
if( isset( $wgContLang ) ) {
@@ -177,9 +172,18 @@ class User {
* a language object.
*/
function loadDefaultFromLanguage(){
- $fname = 'User::loadDefaultFromLanguage';
- wfProfileIn( $fname );
-
+ $this->mOptions = User::getDefaultOptions();
+ }
+
+ /**
+ * Combine the language default options with any site-specific options
+ * and add the default language variants.
+ *
+ * @return array
+ * @static
+ * @access private
+ */
+ function getDefaultOptions() {
/**
* Site defaults will override the global/language defaults
*/
@@ -193,9 +197,24 @@ class User {
$defOpt['variant'] = $variant;
$defOpt['language'] = $variant;
- $this->mOptions = $defOpt;
-
- wfProfileOut();
+ return $defOpt;
+ }
+
+ /**
+ * Get a given default option value.
+ *
+ * @param string $opt
+ * @return string
+ * @static
+ * @access public
+ */
+ function getDefaultOption( $opt ) {
+ $defOpts = User::getDefaultOptions();
+ if( isset( $defOpts[$opt] ) ) {
+ return $defOpts[$opt];
+ } else {
+ return '';
+ }
}
/**
@@ -345,7 +364,7 @@ class User {
* Load a user from the database
*/
function loadFromDatabase() {
- global $wgCommandLineMode, $wgAnonGroupId, $wgLoggedInGroupId;
+ global $wgCommandLineMode;
$fname = "User::loadFromDatabase";
if ( $this->mDataLoaded || $wgCommandLineMode ) {
return;
@@ -356,14 +375,7 @@ class User {
/** Anonymous user */
if(!$this->mId) {
- /** Get rights */
- $anong = Group::newFromId($wgAnonGroupId);
- if (!$anong)
- wfDebugDieBacktrace("Please update your database schema "
- ."and populate initial group data from "
- ."maintenance/archives patches");
- $anong->loadFromDatabase();
- $this->mRights = explode(',', $anong->getRights());
+ $this->mRights = array();
$this->mDataLoaded = true;
return;
} # the following stuff is for non-anonymous users only
@@ -382,29 +394,18 @@ class User {
$this->decodeOptions( $s->user_options );
$this->mTouched = wfTimestamp(TS_MW,$s->user_touched);
$this->mToken = $s->user_token;
-
- // Get groups id
- $res = $dbr->select( 'user_groups', array( 'ug_group' ), array( 'ug_user' => $this->mId ) );
-
- while($group = $dbr->fetchRow($res)) {
- $this->mGroups[] = $group[0];
- }
-
- // add the default group for logged in user
- $this->mGroups[] = $wgLoggedInGroupId;
-
- $this->mRights = array();
- // now we merge groups rights to get this user rights
- foreach($this->mGroups as $aGroupId) {
- $g = Group::newFromId($aGroupId);
- $g->loadFromDatabase();
- $this->mRights = array_merge($this->mRights, explode(',', $g->getRights()));
- }
-
- // array merge duplicate rights which are part of several groups
- $this->mRights = array_unique($this->mRights);
- $dbr->freeResult($res);
+ /* FIXME */
+ $res = $dbr->select('user_rights',
+ array( 'ur_rights' ),
+ array( 'ur_user' => $this->mId ) );
+ $s = $dbr->fetchObject( $res );
+ if( $s ) {
+ $this->mRights = explode( ',', $s->ur_rights );
+ } else {
+ $this->mRights = array();
+ }
+ $dbr->freeResult( $res );
}
$this->mDataLoaded = true;
@@ -586,52 +587,28 @@ class User {
$this->invalidateCache();
}
- function getGroups() {
- $this->loadFromDatabase();
- return $this->mGroups;
- }
-
- function setGroups($groups) {
- $this->loadFromDatabase();
- $this->mGroups = $groups;
- $this->invalidateCache();
- }
-
/**
* Check if a user is sysop
- * Die with backtrace. Use User:isAllowed() instead.
- * @deprecated
*/
function isSysop() {
- /**
$this->loadFromDatabase();
if ( 0 == $this->mId ) { return false; }
return in_array( 'sysop', $this->mRights );
- */
- wfDebugDieBacktrace("User::isSysop() is deprecated. Use User::isAllowed() instead");
}
- /** @deprecated */
function isDeveloper() {
- /**
$this->loadFromDatabase();
if ( 0 == $this->mId ) { return false; }
return in_array( 'developer', $this->mRights );
- */
- wfDebugDieBacktrace("User::isDeveloper() is deprecated. Use User::isAllowed() instead");
}
- /** @deprecated */
function isBureaucrat() {
- /**
$this->loadFromDatabase();
if ( 0 == $this->mId ) { return false; }
return in_array( 'bureaucrat', $this->mRights );
- */
- wfDebugDieBacktrace("User::isBureaucrat() is deprecated. Use User::isAllowed() instead");
}
/**
@@ -654,7 +631,36 @@ class User {
*/
function isAllowed($action='') {
$this->loadFromDatabase();
- return in_array( $action , $this->mRights );
+ if( in_array( $action , $this->mRights ) ) {
+ return true;
+ }
+
+ global $wgWhitelistRead;
+ $groupRights = array(
+ 'asksql' => 'nobody',
+ 'siteadmin' => 'developer',
+ 'userrights' => 'bureaucrat',
+ 'patrol' => 'sysop',
+ 'protect' => 'sysop',
+ 'delete' => 'sysop',
+ 'rollback' => 'sysop',
+ 'block' => 'sysop',
+ 'editinterface' => 'sysop',
+ 'move' => 'user',
+ 'read' => empty( $wgWhitelistRead ) ? '*' : 'user',
+ 'createaccount' => '*' );
+
+ if( array_key_exists( $action, $groupRights ) ) {
+ $group = $groupRights[$action];
+ if( $group == 'user' ) {
+ return ($this->getId() != 0 );
+ } elseif( $group == '*' ) {
+ return true;
+ } else {
+ return in_array( $group, $this->mRights );
+ }
+ }
+ return false;
}
/**
@@ -838,20 +844,6 @@ class User {
$dbw->set( 'user_rights', 'ur_rights', implode( ',', $this->mRights ),
'ur_user='. $this->mId, $fname );
$wgMemc->delete( "$wgDBname:user:id:$this->mId" );
-
- // delete old groups
- $dbw->delete( 'user_groups', array( 'ug_user' => $this->mId), $fname);
-
- // save new ones
- foreach ($this->mGroups as $group) {
- $dbw->replace( 'user_groups',
- array(array('ug_user','ug_group')),
- array(
- 'ug_user' => $this->mId,
- 'ug_group' => $group
- ), $fname
- );
- }
}
/**
@@ -931,15 +923,6 @@ class User {
'ur_rights' => implode( ',', $this->mRights )
), $fname
);
-
- foreach ($this->mGroups as $group) {
- $dbw->insert( 'user_groups',
- array(
- 'ug_user' => $this->mId,
- 'ug_group' => $group
- ), $fname
- );
- }
}
function spreadBlock() {
@@ -988,7 +971,7 @@ class User {
}
function getPageRenderingHash() {
- global $wgContLang;
+ global $wgContLang;
if( $this->mHash ){
return $this->mHash;
}
@@ -1005,11 +988,9 @@ class User {
$confstr .= '!' . $this->getOption( 'date' );
$confstr .= '!' . $this->getOption( 'numberheadings' );
$confstr .= '!' . $this->getOption( 'language' );
- // add in language variant option if there are multiple variants
- // supported by the language object
- if(sizeof($wgContLang->getVariants())>1) {
- $confstr .= '!' . $this->getOption( 'variant' );
- }
+ // add in language specific options, if any
+ $extra = $wgContLang->getExtraHashOptions();
+ $confstr .= $extra;
$this->mHash = $confstr;
return $confstr ;
@@ -1081,10 +1062,10 @@ class User {
} elseif ( function_exists( 'iconv' ) ) {
# Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
# Check for this with iconv
-/* $cp1252hash = $this->encryptPassword( iconv( 'UTF-8', 'WINDOWS-1252', $password ) );
+ $cp1252hash = $this->encryptPassword( iconv( 'UTF-8', 'WINDOWS-1252', $password ) );
if ( 0 == strcmp( $cp1252hash, $this->mPassword ) ) {
return true;
- }*/
+ }
}
return false;
}
diff --git a/includes/ZhClient.php b/includes/ZhClient.php
index 13b195eda95b..4f1524f62125 100644
--- a/includes/ZhClient.php
+++ b/includes/ZhClient.php
@@ -144,137 +144,4 @@ class ZhClient {
}
}
-
-class ZhClientFake {
- function ZhClientFake() {
- global $wgMemc, $wgDBname;
- $this->zh2TW = $wgMemc->get($key1 = "$wgDBname:zhConvert:tw");
- $this->zh2CN = $wgMemc->get($key2 = "$wgDBname:zhConvert:cn");
- $this->zh2SG = $wgMemc->get($key3 = "$wgDBname:zhConvert:sg");
- $this->zh2HK = $wgMemc->get($key4 = "$wgDBname:zhConvert:hk");
- if(empty($this->zh2TW) || empty($this->zh2CN) || empty($this->zh2SG) || empty($this->zh2HK)) {
- require("includes/ZhConversion.php");
- $this->zh2TW = $zh2TW;
- $this->zh2CN = $zh2CN;
- $this->zh2HK = $zh2HK;
- $this->zh2SG = $zh2SG;
- $wgMemc->set($key1, $this->zh2TW);
- $wgMemc->set($key2, $this->zh2CN);
- $wgMemc->set($key3, $this->zh2SG);
- $wgMemc->set($key4, $this->zh2HK);
- }
- }
-
- function isconnected() {
- return true;
- }
-
- /**
- * Convert to zh-tw
- *
- * @access private
- */
- function zh2tw($text) {
- return strtr($text, $this->zh2TW);
- }
-
- /**
- * Convert to zh-cn
- *
- * @access private
- */
- function zh2cn($text) {
- return strtr($text, $this->zh2CN);
- }
-
- /**
- * Convert to zh-sg
- *
- * @access private
- */
- function zh2sg($text) {
- return strtr(strtr($text, $this->zh2CN), $this->zh2SG);
- }
-
- /**
- * Convert to zh-hk
- *
- * @access private
- */
- function zh2hk($text) {
- return strtr(strtr($text, $this->zh2TW), $this->zh2HK);
- }
-
- /**
- * Convert the input to a different language variant
- *
- * @param string $text input text
- * @param string $tolang language variant
- * @return string the converted text
- * @access public
- */
- function convert($text, $tolang) {
- $t = '';
- switch($tolang) {
- case 'zh-cn':
- $t = $this->zh2cn($text);
- break;
- case 'zh-tw':
- $t = $this->zh2tw($text);
- break;
- case 'zh-sg':
- $t = $this->zh2sg($text);
- break;
- case 'zh-hk':
- $t = $this->zh2hk($text);
- break;
- default:
- $t = $text;
- }
- return $t;
- }
-
- function convertToAllVariants($text) {
- $ret = array();
- $ret['zh-cn'] = $this->zh2cn($text);
- $ret['zh-tw'] = $this->zh2tw($text);
- $ret['zh-sg'] = $this->zh2sg($text);
- $ret['zh-hk'] = $this->zh2hk($text);
- return $ret;
- }
-
- /**
- * Perform "fake" word segmentation, i.e. treating each character as a word
- *
- * @param string $text input text
- * @return string segmented text
- * @access public
- */
- function segment($text) {
- /* adapted from LanguageZh_cn::stripForSearch()
- here we will first separate the single characters,
- and let the caller conver it to hex
- */
- if( function_exists( 'mb_strtolower' ) ) {
- return preg_replace(
- "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "' ' .\"$1\"",
- mb_strtolower( $text ) );
- } else {
- global $wikiLowerChars;
- return preg_replace(
- "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "' ' . strtr( \"\$1\", \$wikiLowerChars )",
- $text );
- }
- }
-
- /**
- * Close the fake connection
- *
- * @access public
- */
- function close() { }
-}
-
?> \ No newline at end of file
diff --git a/includes/ZhConversion.php b/includes/ZhConversion.php
index dd0cd42cdb42..2a1f335059f9 100644
--- a/includes/ZhConversion.php
+++ b/includes/ZhConversion.php
@@ -9,7 +9,8 @@
*/
$zh2TW=array(
-"ç”»"=>"ç•«",
+"馀"=>"余",
+"åª"=>"åª",
"æ¿"=>"æ¿",
"表"=>"表",
"æ‰"=>"æ‰",
@@ -23,82 +24,133 @@ $zh2TW=array(
"åŽ"=>"後",
"胡"=>"胡",
"回"=>"回",
+"里"=>"里",
+"术"=>"術",
+"å¹²"=>"ä¹¾",
+"沈"=>"沈",
+"å°"=>"臺",
+"ç”»"=>"ç•«",
+"划"=>"劃",
+"厂"=>"廠",
"伙"=>"夥",
-"姜"=>"薑",
-"借"=>"借",
+"姜"=>"姜",
"å…‹"=>"å…‹",
"å›°"=>"å›°",
"漓"=>"漓",
-"里"=>"里",
+"团"=>"團",
+"é¡»"=>"é ˆ",
+"è„"=>"臟",
+"é’Ÿ"=>"é˜",
+"è¯"=>"è—¥",
+"åŒ"=>"åŒ",
+"å¿—"=>"å¿—",
+"æ¯"=>"æ¯",
+"å²³"=>"å²³",
+"布"=>"布",
+"当"=>"當",
+"åŠ"=>"å¼”",
+"仇"=>"仇",
+"借"=>"借",
"帘"=>"簾",
"霉"=>"霉",
-"é¢"=>"é¢",
"蔑"=>"蔑",
-"åƒ"=>"åƒ",
-"秋"=>"秋",
+"采"=>"採",
+"é’µ"=>"ç¼½",
+"锈"=>"銹",
+"é”"=>"銳",
"æ¾"=>"æ¾",
-"å’¸"=>"å’¸",
"å‘"=>"å‘",
"余"=>"餘",
"éƒ"=>"鬱",
"御"=>"御",
"愿"=>"願",
-"云"=>"雲",
-"芸"=>"芸",
-"沄"=>"沄",
"致"=>"致",
"制"=>"制",
-"朱"=>"朱",
"筑"=>"築",
"准"=>"準",
-"厂"=>"廠",
"广"=>"廣",
-"辟"=>"闢",
-"别"=>"別",
"åœ"=>"åœ",
-"沈"=>"沈",
"冲"=>"沖",
"ç§"=>"種",
"虫"=>"蟲",
"æ‹…"=>"æ“”",
-"党"=>"黨",
+"柜"=>"櫃",
"斗"=>"鬥",
"å„¿"=>"å…’",
-"å¹²"=>"ä¹¾",
-"è°·"=>"è°·",
-"柜"=>"櫃",
-"åˆ"=>"åˆ",
-"划"=>"劃",
+"å¤"=>"復",
+"汇"=>"匯",
"å"=>"壞",
-"几"=>"幾",
-"ç³»"=>"ç³»",
-"家"=>"家",
-"价"=>"價",
"æ®"=>"æ“š",
-"å·"=>"æ²",
"适"=>"é©",
+"价"=>"價",
"蜡"=>"蠟",
"腊"=>"臘",
"了"=>"了",
-"ç´¯"=>"ç´¯",
-"么"=>"麽",
-"è’™"=>"è’™",
"万"=>"è¬",
"å®"=>"寧",
"朴"=>"樸",
"苹"=>"蘋",
-"仆"=>"僕",
"曲"=>"曲",
-"确"=>"確",
-"èˆ"=>"èˆ",
"胜"=>"å‹",
-"术"=>"術",
-"å°"=>"å°",
-"体"=>"體",
"涂"=>"塗",
"å¶"=>"葉",
-"å"=>"å",
+"å"=>"ç±²",
"æ—‹"=>"æ—‹",
+"纤"=>"纖",
+"è‹"=>"蘇",
+"墙"=>"牆",
+"æž"=>"極",
+"竖"=>"豎",
+"绣"=>"繡",
+"鳄"=>"鱷",
+"体"=>"體",
+"党"=>"黨",
+"颓"=>"頹",
+"产"=>"產",
+"颜"=>"é¡",
+"说"=>"說",
+"阅"=>"閱",
+"线"=>"線",
+"为"=>"為",
+"伪"=>"å½",
+"沩"=>"溈",
+"妫"=>"媯",
+"众"=>"眾",
+"钩"=>"鉤",
+"鸡"=>"雞",
+"壳"=>"殼",
+"悫"=>"愨",
+"é…"=>"醞",
+"蕴"=>"蘊",
+"谣"=>"謠",
+"骂"=>"罵",
+"厕"=>"å»",
+"绿"=>"綠",
+"ç»"=>"絕",
+"é•Œ"=>"é«",
+"奖"=>"çŽ",
+"å¯"=>"å•Ÿ",
+"é¢"=>"é¢",
+"å’¸"=>"å’¸",
+"云"=>"雲",
+"芸"=>"芸",
+"沄"=>"沄",
+"朱"=>"朱",
+"辟"=>"闢",
+"别"=>"別",
+"å¹²"=>"ä¹¾",
+"è°·"=>"è°·",
+"åˆ"=>"åˆ",
+"几"=>"幾",
+"ç³»"=>"ç³»",
+"家"=>"家",
+"å·"=>"æ²",
+"ç´¯"=>"ç´¯",
+"么"=>"麽",
+"è’™"=>"è’™",
+"仆"=>"僕",
+"确"=>"確",
+"èˆ"=>"èˆ",
"ä½£"=>"å‚­",
"与"=>"與",
"折"=>"折",
@@ -106,8 +158,10 @@ $zh2TW=array(
"ç—‡"=>"ç—‡",
"æ¶"=>"惡",
"å‘"=>"發",
-"å¤"=>"復",
-"汇"=>"匯",
+"奸"=>"奸",
+"游"=>"游",
+"于"=>"于",
+"夸"=>"夸",
"获"=>"ç²",
"饥"=>"飢",
"尽"=>"盡",
@@ -115,77 +169,31 @@ $zh2TW=array(
"å¤"=>"æ»·",
"弥"=>"彌",
"ç­¾"=>"ç°½",
-"纤"=>"纖",
-"è‹"=>"蘇",
"å›"=>"壇",
-"团"=>"團",
-"é¡»"=>"é ˆ",
-"è„"=>"臟",
-"åª"=>"åª",
-"é’Ÿ"=>"é˜",
-"è¯"=>"è—¥",
-"åŒ"=>"åŒ",
-"å¿—"=>"å¿—",
-"æ¯"=>"æ¯",
-"å²³"=>"å²³",
-"布"=>"布",
-"当"=>"當",
-"åŠ"=>"å¼”",
-"仇"=>"仇",
-"蕴"=>"蘊",
-"线"=>"線",
-"为"=>"為",
-"产"=>"產",
-"众"=>"眾",
-"伪"=>"å½",
"凫"=>"鳧",
-"厕"=>"å»",
-"å¯"=>"å•Ÿ",
-"墙"=>"牆",
-"壳"=>"殼",
-"奖"=>"çŽ",
-"妫"=>"媯",
"并"=>"並",
"录"=>"錄",
-"悫"=>"愨",
-"æž"=>"極",
-"沩"=>"溈",
"瘘"=>"瘺",
"ç¡·"=>"é¹¼",
-"竖"=>"豎",
-"ç»"=>"絕",
-"绣"=>"繡",
"绦"=>"絛",
"ç»±"=>"ç·”",
"绷"=>"綳",
-"绿"=>"綠",
"ç¼°"=>"éŸ",
"苧"=>"苎",
"莼"=>"蒓",
-"说"=>"說",
-"谣"=>"謠",
"è°«"=>"è­¾",
"赃"=>"贓",
"èµ"=>"齎",
"èµ"=>"è´—",
-"é…"=>"醞",
-"采"=>"採",
-"钩"=>"鉤",
-"é’µ"=>"ç¼½",
-"锈"=>"銹",
-"é”"=>"銳",
"锨"=>"æ´",
-"é•Œ"=>"é«",
"é•¢"=>"é’",
-"阅"=>"閱",
-"颓"=>"頹",
-"颜"=>"é¡",
-"骂"=>"罵",
"鲇"=>"鯰",
"鲞"=>"鯗",
-"鳄"=>"鱷",
-"鸡"=>"雞",
"鹚"=>"鶿",
+"æš—"=>"æš—",
+"ä¿®"=>"ä¿®",
+"凭"=>"凭",
+"注"=>"注",
"䌶"=>"䊷",
"䜥"=>"𧩙",
"专"=>"專",
@@ -211,7 +219,6 @@ $zh2TW=array(
"ä¹°"=>"è²·",
"乱"=>"亂",
"争"=>"爭",
-"于"=>"於",
"äº"=>"虧",
"亚"=>"亞",
"亩"=>"ç•",
@@ -289,7 +296,6 @@ $zh2TW=array(
"凑"=>"湊",
"凛"=>"凜",
"凤"=>"鳳",
-"凭"=>"憑",
"凯"=>"凱",
"击"=>"擊",
"凿"=>"鑿",
@@ -456,14 +462,12 @@ $zh2TW=array(
"备"=>"備",
"够"=>"夠",
"头"=>"頭",
-"夸"=>"誇",
"夹"=>"夾",
"夺"=>"奪",
"å¥"=>"奩",
"奂"=>"å¥",
"奋"=>"奮",
"奥"=>"奧",
-"奸"=>"姦",
"妆"=>"å¦",
"妇"=>"婦",
"妈"=>"媽",
@@ -849,7 +853,6 @@ $zh2TW=array(
"沧"=>"滄",
"沪"=>"滬",
"泞"=>"濘",
-"注"=>"註",
"泪"=>"淚",
"泶"=>"澩",
"泷"=>"瀧",
@@ -2590,52 +2593,63 @@ $zh2TW=array(
"龛"=>"龕",
"龟"=>"龜",
-"BIG-" => "BIG-",
-".PRG" => ".PRG",
"一伙" => "一伙",
"一并" => "一併",
"一准" => "一准",
"一划" => "一划",
+"一å°" => "一å°",
"一地里" => "一地裡",
"一干" => "一干",
"一树百获" => "一樹百穫",
-"一å°" => "一臺",
"一冲" => "一è¡",
"一åª" => "一隻",
"一å‘åƒé’§" => "一髮åƒéˆž",
"一出" => "一齣",
"七åª" => "七隻",
"三元里" => "三元裡",
+"三å°" => "三å°",
"三国志" => "三國誌",
"三å¤" => "三複",
"三åª" => "三隻",
+"上å°" => "上å°",
"上åŠ" => "上åŠ",
-"上å°" => "上臺",
-"下ä¸äº†å°" => "下ä¸äº†è‡º",
-"下å°" => "下臺",
+"下ä¸äº†å°" => "下ä¸äº†å°",
+"下å°" => "下å°",
+"下馀" => "下餘",
"下é¢" => "下麵",
+"ä¸ä¸‹äºŽ" => "ä¸ä¸‹æ–¼",
"ä¸å‡†" => "ä¸å‡†",
"ä¸åŠ" => "ä¸åŠ",
+"ä¸åŒäºŽ" => "ä¸åŒæ–¼",
+"ä¸å±‘于" => "ä¸å±‘æ–¼",
"ä¸å¹²" => "ä¸å¹¹",
"ä¸èˆ" => "ä¸æ¨",
"ä¸çŸ¥æ‰€äº‘" => "ä¸çŸ¥æ‰€äº‘",
+"ä¸ç»äºŽè€³" => "ä¸çµ•æ–¼è€³",
+"ä¸è‡´äºŽ" => "ä¸è‡´æ–¼",
+"ä¸è‰¯äºŽè¡Œ" => "ä¸è‰¯æ–¼è¡Œ",
"ä¸è¯†å°ä¸¾" => "ä¸è­˜æª¯èˆ‰",
+"ä¸é€ŠäºŽ" => "ä¸éœæ–¼",
"ä¸é”ˆé’¢" => "ä¸é½é‹¼",
"丑剧" => "丑劇",
"丑旦" => "丑旦",
"丑角" => "丑角",
"世界æ¯" => "世界盃",
"并存ç€" => "並存著",
+"并于" => "並於",
+"中å°åŒ»ä¸“" => "中å°é†«å°ˆ",
"中岳" => "中嶽",
-"中å°è·¯" => "中臺路",
-"中å°åŒ»ä¸“" => "中臺醫專",
"丰å—" => "丰å—",
"丰å°" => "丰å°",
"丰姿" => "丰姿",
"丰神俊朗" => "丰神俊朗",
"丰采" => "丰采",
"丰韵" => "丰韻",
+"主席å°" => "主席å°",
"主干" => "主幹",
+"主控å°" => "主控å°",
+"主播å°" => "主播å°",
+"之于" => "之於",
"ä¹ä¸–之雠" => "ä¹ä¸–之讎",
"ä¹åª" => "ä¹éš»",
"å¹²ä¸" => "乾絲",
@@ -2645,6 +2659,8 @@ $zh2TW=array(
"云云" => "云云",
"云何" => "云何",
"云尔" => "云爾",
+"互于" => "互於",
+"五å°" => "五å°",
"五岳" => "五嶽",
"五斗柜" => "五斗櫃",
"五斗橱" => "五斗櫥",
@@ -2653,8 +2669,14 @@ $zh2TW=array(
"五行生克" => "五行生剋",
"五åª" => "五隻",
"五出" => "五齣",
+"井å°" => "井å°",
"井里" => "井裡",
+"亚于" => "亞於",
"交å·" => "交å·",
+"交于" => "交於",
+"交游" => "交éŠ",
+"亦于" => "亦於",
+"亭å°" => "亭å°",
"人云亦云" => "人云亦云",
"人物志" => "人物誌",
"什锦é¢" => "什錦麵",
@@ -2662,7 +2684,11 @@ $zh2TW=array(
"仆倒" => "仆倒",
"仇雠" => "仇讎",
"介系è¯" => "介係詞",
+"介于" => "介於",
"介系è¯" => "介繫詞",
+"以致于" => "以致於",
+"任凭" => "任憑",
+"任教于" => "任教於",
"仿制" => "仿製",
"伙伕" => "伙伕",
"伙伴" => "伙伴",
@@ -2671,6 +2697,8 @@ $zh2TW=array(
"伙房" => "伙房",
"伙计" => "伙計",
"伙食" => "伙食",
+"伴游" => "ä¼´éŠ",
+"但凭" => "但憑",
"布下" => "佈下",
"布告" => "佈告",
"布哨" => "佈哨",
@@ -2688,9 +2716,12 @@ $zh2TW=array(
"布防" => "佈防",
"布阵" => "佈陣",
"布雷" => "佈雷",
+"ä½äºŽ" => "ä½æ–¼",
+"低于" => "低於",
"体育锻éŠ" => "体育é›éŠ",
"何干" => "何干",
"作准" => "作准",
+"作奸犯科" => "作姦犯科",
"佣人" => "佣人",
"佣工" => "佣工",
"佣金" => "佣金",
@@ -2709,30 +2740,42 @@ $zh2TW=array(
"并科" => "併科",
"并购" => "併購",
"并进" => "併進",
+"æ¥å°" => "來å°",
+"æ¥è‡ªäºŽ" => "來自於",
"æ¥å¤" => "來複",
"供制" => "供製",
+"ä¾å‡­" => "ä¾æ†‘",
+"ä¾é™„于" => "ä¾é™„æ–¼",
"侵并" => "侵併",
+"便于" => "便於",
"便辟" => "便辟",
"系数" => "係數",
"系为" => "係為",
"ä¿é™©æŸœ" => "ä¿éšªæŸœ",
-"ä¿¡å·å°" => "信號臺",
+"ä¿¡å·å°" => "信號å°",
"ä¿®å¤" => "修複",
"修胡刀" => "ä¿®é¬åˆ€",
"俯冲" => "俯è¡",
"个里" => "個裡",
+"倒å°" => "倒å°",
"倒绷孩儿" => "倒繃孩兒",
"借ç€" => "借著",
+"倦游" => "倦éŠ",
"åƒä»†" => "åƒä»†",
+"å‡åŠ›äºŽäºº" => "å‡åŠ›æ–¼äºº",
"å‡å‘" => "å‡é«®",
+"å于" => "åæ–¼",
"åœåˆ¶" => "åœè£½",
+"侦å¬å°" => "åµè½å°",
"å·é¸¡ä¸ç€" => "å·é›žä¸è‘—",
+"备注" => "備註",
"家伙" => "傢伙",
"家俱" => "傢俱",
"家具" => "傢具",
"传布" => "傳佈",
-"债å°é«˜ç­‘" => "債臺高築",
+"债å°é«˜ç­‘" => "債å°é«˜ç¯‰",
"傻里傻气" => "傻裡傻氣",
+"倾å‘于" => "傾å‘æ–¼",
"倾å¤" => "傾複",
"倾å¤" => "傾覆",
"僱佣" => "僱佣",
@@ -2749,15 +2792,22 @@ $zh2TW=array(
"尽管" => "儘管",
"尽速" => "儘速",
"å°½é‡" => "儘é‡",
+"优于" => "優於",
+"优游" => "優éŠ",
"å…准" => "å…准",
-"å…„å°" => "兄臺",
"充饥" => "充饑",
+"先于" => "先於",
"光采" => "光采",
"克里" => "克裡",
"å…‹å¤" => "克複",
+"å…于" => "å…æ–¼",
"入伙" => "入伙",
"内制" => "內製",
+"å…¨å°" => "å…¨å°",
+"全凭" => "全憑",
+"两å°" => "å…©å°",
"两åª" => "å…©éš»",
+"å…«å°" => "å…«å°",
"八字胡" => "å…«å­—é¬",
"å…«åª" => "å…«éš»",
"公布" => "公佈",
@@ -2765,12 +2815,16 @@ $zh2TW=array(
"公斗" => "公斗",
"公历" => "公曆",
"公里" => "公裡",
+"公诸于世" => "公諸於世",
"å…­è°·" => "å…­ç©€",
"å…­åª" => "å…­éš»",
"六出" => "六齣",
"兼并" => "兼併",
+"兼并" => "兼并",
"册å·" => "冊å·",
+"å†äºŽ" => "å†æ–¼",
"冤雠" => "冤讎",
+"冶游" => "冶éŠ",
"准予" => "准予",
"准å‡" => "准å‡",
"准定" => "准定",
@@ -2784,8 +2838,12 @@ $zh2TW=array(
"几案" => "几案",
"几筵" => "几筵",
"几ä¸" => "几絲",
+"凡于" => "凡於",
"凹洞里" => "凹洞裡",
"出å¾" => "出å¾",
+"出于" => "出於",
+"出自于" => "出自於",
+"出游" => "出éŠ",
"函å¤" => "函覆",
"刀削é¢" => "刀削麵",
"åˆæ–—" => "åˆæ–—",
@@ -2817,12 +2875,15 @@ $zh2TW=array(
"划进" => "划進",
"划过" => "划éŽ",
"åˆå¾" => "åˆå¾",
+"别于" => "別於",
"别致" => "別緻",
"别ç€" => "別著",
"别åª" => "別隻",
+"利于" => "利於",
"利比里亚" => "利比裡亞",
"刮ç€" => "刮著",
"刮胡刀" => "刮é¬åˆ€",
+"刻于" => "刻於",
"剃å‘" => "剃髮",
"剃须" => "剃鬚",
"削å‘" => "削髮",
@@ -2836,7 +2897,7 @@ $zh2TW=array(
"克薄" => "剋薄",
"å‰ä»†åŽä»°" => "å‰ä»†å¾Œä»°",
"å‰ä»†åŽç»§" => "å‰ä»†å¾Œç¹¼",
-"å‰å°" => "å‰è‡º",
+"å‰å°" => "å‰å°",
"å‰è½¦ä¹‹å¤" => "å‰è»Šä¹‹è¦†",
"刚æ‰" => "剛纔",
"剥制" => "å‰è£½",
@@ -2844,19 +2905,28 @@ $zh2TW=array(
"割èˆ" => "割æ¨",
"创获" => "創穫",
"创制" => "創製",
+"力争上游" => "力爭上éŠ",
+"加害于" => "加害於",
+"加于" => "加於",
"加里å®" => "加裡寧",
+"加注" => "加註",
+"助于" => "助於",
+"勇于" => "勇於",
+"胜于" => "å‹æ–¼",
"劳力士表" => "勞力士錶",
+"勿施于人" => "勿施於人",
"包准" => "包准",
"包谷" => "包穀",
"åŒç³»" => "åŒç¹«",
+"化妆å°" => "化å¦å°",
"北岳" => "北嶽",
"北斗" => "北斗",
"北回" => "北迴",
"匡å¤" => "匡複",
"匪干" => "匪幹",
"åå·" => "åå·",
+"åå°" => "åå°",
"åå¹²" => "åå¹²",
-"åå°" => "å臺",
"ååª" => "åéš»",
"å出" => "åé½£",
"åƒç™¾åª" => "åƒç™¾éš»",
@@ -2867,11 +2937,12 @@ $zh2TW=array(
"åƒåª" => "åƒéš»",
"å‡æ–—å°æ°‘" => "å‡æ–—å°æ°‘",
"åŠåª" => "åŠéš»",
+"å—å°" => "å—å°",
"å—å²³" => "å—嶽",
"å—å¾" => "å—å¾",
"å—æ–—" => "å—æ–—",
-"å—å°" => "å—臺",
"å—回" => "å—è¿´",
+"å—游" => "å—éŠ",
"å¡é‡Œ" => "å¡è£¡",
"å°åˆ¶" => "å°è£½",
"å·å…¥" => "å·å…¥",
@@ -2897,6 +2968,7 @@ $zh2TW=array(
"å·å‘" => "å·é«®",
"å·é¡»" => "å·é¬š",
"厚朴" => "厚朴",
+"原于" => "原於",
"å‚与" => "åƒä¸Ž",
"å‚与者" => "åƒä¸Žè€…",
"å‚åˆ" => "åƒåˆ",
@@ -2909,25 +2981,111 @@ $zh2TW=array(
"å‚观团" => "åƒè§€åœ˜",
"å‚观团体" => "åƒè§€åœ˜é«”",
"å‚阅" => "åƒé–±",
+"åŠäºŽ" => "åŠæ–¼",
+"å‹å°" => "å‹å°",
+"å于" => "åæ–¼",
"å冲" => "åè¡",
"åå¤" => "å複",
"åå¤" => "å覆",
+"å–信于" => "å–ä¿¡æ–¼",
"å–èˆ" => "å–æ¨",
+"å–æ于" => "å–ææ–¼",
+"å–决于" => "å–決於",
+"å–法于" => "å–法於",
+"å—制于" => "å—制於",
+"å—阻于" => "å—阻於",
"å£é‡Œ" => "å£è£¡",
+"å£è¯´æ— å‡­" => "å£èªªç„¡æ†‘",
"å¤æŸ¯å’¸" => "å¤æŸ¯é¹¹",
+"å¦äºŽ" => "å¦æ–¼",
"åªå‡†" => "åªå‡†",
+"åªå‡­" => "åªæ†‘",
"åªå†²" => "åªè¡",
"å®å½“" => "å®å™¹",
"å¯æ€œè™«" => "å¯æ†è™«",
+"å¯äºŽ" => "å¯æ–¼",
"å¯ç´§å¯æ¾" => "å¯ç·Šå¯é¬†",
+"å°ä¸Š" => "å°ä¸Š",
+"å°ä¸‹" => "å°ä¸‹",
+"å°ä¸­" => "å°ä¸­",
+"å°å…‰" => "å°å…‰",
+"å°å‰" => "å°å‰",
+"å°åŒ—" => "å°åŒ—",
+"å°å—" => "å°å—",
+"å°å‘½" => "å°å‘½",
+"å°å•†" => "å°å•†",
+"å°å¯" => "å°å•Ÿ",
+"å°åœ°" => "å°åœ°",
+"å°åŸº" => "å°åŸº",
+"å°å¡‘" => "å°å¡‘",
+"å°å¤§" => "å°å¤§",
+"å°å­" => "å°å­",
+"å°å®‰" => "å°å®‰",
+"å°å°º" => "å°å°º",
+"å°å·ž" => "å°å·ž",
+"å°å¸ƒ" => "å°å¸ƒ",
+"å°å¸" => "å°å¹£",
+"å°å¼" => "å°å¼",
+"å°åŽ" => "å°å¾Œ",
+"å°æ‹‰ç»´å¤«" => "å°æ‹‰ç¶­å¤«",
+"å°æ–¤" => "å°æ–¤",
+"å°æ–°é“¶è¡Œ" => "å°æ–°éŠ€è¡Œ",
+"å°ä¸œ" => "å°æ±",
+"å°æŸ±" => "å°æŸ±",
+"å°æœºè·¯" => "å°æ©Ÿè·¯",
+"å°æ­¥" => "å°æ­¥",
+"å°æ±½" => "å°æ±½",
+"å°æ³¥" => "å°æ³¥",
+"å°æµ·" => "å°æµ·",
+"å°æ¾Ž" => "å°æ¾Ž",
+"å°æ¹¾" => "å°ç£",
+"å°ç…§" => "å°ç…§",
+"å°ç¯" => "å°ç‡ˆ",
+"å°ç‹¬" => "å°ç¨",
+"å°çŽ»" => "å°çŽ»",
+"å°çƒ" => "å°çƒ",
+"å°ç”«" => "å°ç”«",
+"å°çœ" => "å°çœ",
+"å°ç«¯" => "å°ç«¯",
+"å°ç³–" => "å°ç³–",
+"å°è‚¥" => "å°è‚¥",
+"å°èƒž" => "å°èƒž",
+"å°èˆª" => "å°èˆª",
+"å°èœ" => "å°èœ",
+"å°è£”" => "å°è£”",
+"å°è£…" => "å°è£",
"å°åˆ¶" => "å°è£½",
-"å¸ä»¤å°" => "å¸ä»¤è‡º",
+"å°è¥¿" => "å°è¥¿",
+"å°è§†" => "å°è¦–",
+"å°è§ˆ" => "å°è¦½",
+"å°è¯" => "å°è©ž",
+"å°è¯­" => "å°èªž",
+"å°èµ„" => "å°è³‡",
+"å°è½¦" => "å°è»Š",
+"å°è¾…" => "å°è¼”",
+"å°é‡‘" => "å°é‡‘",
+"å°é“¶" => "å°éŠ€",
+"å°è¡”" => "å°éŠœ",
+"å°é“" => "å°é‹",
+"å°é“" => "å°éµ",
+"å°é‰´" => "å°é‘’",
+"å°é˜¶" => "å°éšŽ",
+"å°ç”µ" => "å°é›»",
+"å°é£Ž" => "å°é¢¨",
+"å°é©¾" => "å°é§•",
+"å°å‡¤" => "å°é³³",
+"å¸ä»¤å°" => "å¸ä»¤å°",
+"åå" => "åå",
+"åæ°”" => "åæ°£",
"åƒç€ä¸å°½" => "åƒè‘—ä¸ç›¡",
"åƒé‡Œæ‰’外" => "åƒè£¡æ‰’外",
"åƒé‡Œçˆ¬å¤–" => "åƒè£¡çˆ¬å¤–",
"å„åŠ" => "å„åŠ",
+"å„凭" => "å„憑",
"åˆä¼™" => "åˆä¼™",
"åˆå¹¶" => "åˆä½µ",
+"åˆå¹¶" => "åˆå¹¶",
+"åˆäºŽ" => "åˆæ–¼",
"åˆç€" => "åˆè‘—",
"åˆç€è€…" => "åˆè‘—者",
"åŠä¸Š" => "åŠä¸Š",
@@ -2970,33 +3128,44 @@ $zh2TW=array(
"åŠé”€" => "åŠéŠ·",
"åŠé’Ÿ" => "åŠé˜",
"åŒä¼™" => "åŒä¼™",
+"å闻于世" => "åèžæ–¼ä¸–",
"å表" => "å錶",
-"後冠" => "åŽå† ",
-"後北街" => "åŽåŒ—è¡—",
-"後土" => "åŽåœŸ",
-"後妃" => "åŽå¦ƒ",
-"後安路" => "åŽå®‰è·¯",
-"後平路" => "åŽå¹³è·¯",
-"後座" => "åŽåº§",
-"後稷" => "åŽç¨·",
-"後羿" => "åŽç¾¿",
-"後街" => "åŽè¡—",
-"後里" => "åŽé‡Œ",
+"åŽå† " => "åŽå† ",
+"åŽåŒ—è¡—" => "åŽåŒ—è¡—",
+"åŽåœŸ" => "åŽåœŸ",
+"åŽå¦ƒ" => "åŽå¦ƒ",
+"åŽå®‰è·¯" => "åŽå®‰è·¯",
+"åŽå¹³è·¯" => "åŽå¹³è·¯",
+"åŽåº§" => "åŽåº§",
+"åŽç¨·" => "åŽç¨·",
+"åŽç¾¿" => "åŽç¾¿",
+"åŽè¡—" => "åŽè¡—",
+"åŽé‡Œ" => "åŽé‡Œ",
"å‘ç€" => "å‘è‘—",
+"å于" => "åæ–¼",
"åžå¹¶" => "åžä½µ",
+"åŸæ¸¸" => "åŸéŠ",
"å¹å‘" => "å¹é«®",
-"å•å¾Œ" => "å‘‚åŽ",
+"å•åŽ" => "å‘‚åŽ",
"呆里呆气" => "呆裡呆氣",
"呈准" => "呈准",
"周而å¤å§‹" => "周而複始",
-"呼å" => "呼籲",
+"周游" => "周éŠ",
+"呼å" => "呼å",
+"和奸" => "和姦",
"å’Œé¢" => "和麵",
"哪里" => "哪裡",
"å“­è„" => "å“­é«’",
+"唱游" => "å”±éŠ",
"é—®å·" => "å•å·",
+"问政于民" => "å•æ”¿æ–¼æ°‘",
+"é—®é“于盲" => "å•é“於盲",
+"善于" => "善於",
"å–采" => "å–采",
"乔岳" => "喬嶽",
"å•å¹²" => "單干",
+"å•å‡­" => "單憑",
+"å•äºŽ" => "單於",
"å•åª" => "單隻",
"嘴里" => "嘴è£",
"嘴里" => "嘴裡",
@@ -3013,121 +3182,189 @@ $zh2TW=array(
"严å¤" => "嚴複",
"囉è‹" => "囉囌",
"å››èˆäº”å…¥" => "å››æ¨äº”å…¥",
+"å››å·å°" => "四號å°",
"å››åª" => "四隻",
"四出" => "四齣",
+"回å°" => "回å°",
"回历新年" => "回曆新年",
"回ä¸" => "回絲",
"回ç€" => "回著",
"回å¤" => "回覆",
+"回游" => "回éŠ",
"回采" => "回采",
+"困于" => "困於",
+"固于" => "固於",
+"囿于一时" => "囿於一時",
+"囿于一隅" => "囿於一隅",
+"囿于æˆè§" => "囿於æˆè¦‹",
"圈å­é‡Œ" => "圈å­è£¡",
"圈里" => "圈裡",
"国历" => "國曆",
"国雠" => "國讎",
"园里" => "園裡",
-"圆å°" => "圓臺",
+"园游会" => "園éŠæœƒ",
+"圆å°" => "圓å°",
"图里" => "圖裡",
"土里" => "土裡",
"土制" => "土製",
+"在å°" => "在å°",
+"在于" => "在於",
"地志" => "地誌",
-"åå°" => "å臺",
"å‘里" => "å‘裡",
+"垂直于" => "垂直於",
"åž‚å‘" => "åž‚é«®",
-"åž®å°" => "垮臺",
-"埃åŠè±”後" => "埃åŠè±”åŽ",
+"åž®å°" => "åž®å°",
+"埃åŠè±”åŽ" => "埃åŠè±”åŽ",
"埃è£å†²" => "埃榮è¡",
"埋布" => "埋佈",
"城里" => "城裡",
"基干" => "基幹",
+"基于" => "基於",
"报å¤" => "報複",
-"å¡Œå°" => "塌臺",
-"å¡”å°" => "塔臺",
+"å¡Œå°" => "å¡Œå°",
+"å¡”å°" => "å¡”å°",
"涂ç€" => "å¡—è‘—",
"墓志" => "墓誌",
"墨斗" => "墨斗",
+"墨沈未干" => "墨瀋未乾",
"墨索里尼" => "墨索裡尼",
"垦å¤" => "墾複",
+"å›å°" => "壇å°",
"压å·" => "壓å·",
"垄断价格" => "壟斷價格",
"垄断资产" => "壟斷資產",
"垄断集团" => "壟斷集團",
+"壮游" => "壯éŠ",
"壶里" => "壺裡",
"寿é¢" => "壽麵",
"å¤å¤©é‡Œ" => "å¤å¤©è£¡",
"å¤åŽ†" => "å¤æ›†",
"外制" => "外製",
+"多å°" => "多å°",
+"多于" => "多於",
"多冲" => "多è¡",
"多采多姿" => "多采多姿",
"多么" => "多麼",
"夜光表" => "夜光錶",
"夜里" => "夜裡",
+"夜游" => "夜éŠ",
"梦里" => "夢裡",
+"梦游" => "夢éŠ",
"大伙" => "大伙",
"大å·" => "大å·",
"大干" => "大干",
"大干" => "大幹",
+"大于" => "大於",
+"大夸" => "大誇",
"大辟" => "大辟",
"大åª" => "大隻",
-"天後" => "天åŽ",
+"天å°" => "天å°",
+"天åŽ" => "天åŽ",
"天干" => "天干",
-"天文å°" => "天文臺",
+"天文å°" => "天文å°",
"天翻地å¤" => "天翻地覆",
-"太後" => "太åŽ",
+"太åŽ" => "太åŽ",
+"失信于人" => "失信於人",
+"失于" => "失於",
"å¥æŠ˜" => "å¥æ‘º",
+"å¥äºŽ" => "å¥æ–¼",
"女丑" => "女丑",
"女佣" => "女佣",
"好家夥" => "好傢夥",
-"好æˆè¿žå°" => "好戲連臺",
+"好凭" => "好憑",
+"好æˆè¿žå°" => "好戲連å°",
"好困" => "好ç",
+"如于" => "如於",
"如饥似渴" => "如饑似渴",
-"妆å°" => "å¦è‡º",
-"姜太公" => "姜太公",
-"姜å­ç‰™" => "姜å­ç‰™",
+"始于" => "始於",
+"委罪于人" => "委罪於人",
"姜ä¸" => "姜絲",
+"奸夫" => "姦夫",
+"奸妇" => "姦婦",
+"奸宄" => "姦宄",
+"奸情" => "姦情",
+"奸æ€" => "姦殺",
+"奸污" => "姦汙",
+"奸污" => "姦污",
+"奸淫" => "姦淫",
+"奸猾" => "姦猾",
+"奸细" => "姦細",
+"奸邪" => "姦邪",
+"å«äºŽ" => "å«æ–¼",
+"å«ç¥¸äºŽäºº" => "å«ç¦æ–¼äºº",
+"娴于" => "嫻於",
+"嬉游" => "嬉éŠ",
"字汇" => "字彙",
"字里行间" => "字裡行間",
"存折" => "存摺",
-"孟姜女" => "孟姜女",
+"存于" => "存於",
"宇宙志" => "宇宙誌",
-"宋皇å°é“" => "宋皇臺é“",
+"安于" => "安於",
+"安沈é“è·¯" => "安瀋éµè·¯",
"定准" => "定准",
+"定于" => "定於",
"定制" => "定製",
+"定都于" => "定都於",
+"宜于" => "宜於",
"宣布" => "宣佈",
+"宦游" => "宦éŠ",
"宫里" => "宮裡",
+"宴游" => "å®´éŠ",
"家伙" => "家伙",
"家里" => "家è£",
"家里" => "家裡",
+"寄于" => "寄於",
"密布" => "密佈",
"密致" => "密緻",
"寇雠" => "寇讎",
-"富å°è¡—" => "富臺街",
+"富于" => "富於",
+"寓兵于农" => "寓兵於農",
+"寓情于景" => "寓情於景",
+"寓教于ä¹" => "寓教於樂",
+"寓于" => "寓於",
"寓ç¦äºŽå¾" => "寓ç¦æ–¼å¾",
+"寓ç¦äºŽå¾" => "寓ç¦æ–¼å¾µ",
"实干" => "實幹",
+"写字å°" => "寫字å°",
"写字å°" => "寫字檯",
-"写字å°" => "寫字臺",
"宽æ¾" => "寬鬆",
"å®å·" => "寶å·",
"å®é‡Œå®æ°”" => "寶裡寶氣",
-"å°å¾Œ" => "å°åŽ",
+"å°åŽ" => "å°åŽ",
"å°é¢é‡Œ" => "å°é¢è£¡",
"å°„å¹²" => "å°„å¹²",
+"将于" => "將於",
+"专美于å‰" => "專美於å‰",
+"专注" => "專註",
+"对å°" => "å°å°",
+"对于" => "å°æ–¼",
"对表" => "å°éŒ¶",
+"导游" => "å°ŽéŠ",
"å°ä¸‘" => "å°ä¸‘",
"å°ä¼™" => "å°ä¼™",
+"å°äºŽ" => "å°æ–¼",
"å°åª" => "å°éš»",
"å°‘åŠ" => "å°‘åŠ",
+"少于" => "少於",
+"就凭" => "就憑",
+"就于" => "就於",
"就里" => "就裡",
+"就读于" => "就讀於",
"尺布斗粟" => "尺布斗粟",
"尼克æ¾" => "尼克鬆",
"尼采" => "尼采",
"å°¿æ–—" => "å°¿æ–—",
"局里" => "局裡",
+"居于" => "居於",
"居里" => "居裡",
+"屈æœäºŽ" => "屈æœæ–¼",
"屋å­é‡Œ" => "屋å­è£¡",
"屋里" => "屋裡",
"展布" => "展佈",
"展å·" => "展å·",
"屡仆屡起" => "屢仆屢起",
+"属æ„于" => "屬æ„æ–¼",
+"属于" => "屬於",
"屯里" => "屯裡",
"山岳" => "山嶽",
"山斗" => "山斗",
@@ -3138,7 +3375,11 @@ $zh2TW=array(
"岳岳" => "嶽嶽",
"å·…å¤" => "巔覆",
"巡回" => "巡迴",
+"巡游" => "å·¡éŠ",
+"工作å°" => "工作å°",
+"工于" => "工於",
"巧干" => "巧幹",
+"已于" => "已於",
"巴尔干" => "巴爾幹",
"巴里" => "巴裡",
"巷里" => "巷裡",
@@ -3180,9 +3421,14 @@ $zh2TW=array(
"干连" => "干連",
"干云蔽日" => "干雲蔽日",
"干预" => "å¹²é ",
-"å¹³å°" => "平臺",
+"å¹³å°" => "å¹³å°",
+"平衡å°" => "平衡å°",
"年历" => "年曆",
"年里" => "年裡",
+"并力" => "并力",
+"并åž" => "并åž",
+"并日而食" => "并日而食",
+"并行" => "并行",
"干上" => "幹上",
"干下去" => "幹下去",
"å¹²ä¸äº†" => "å¹¹ä¸äº†",
@@ -3219,17 +3465,24 @@ $zh2TW=array(
"å¹²é“" => "å¹¹é“",
"干部" => "幹部",
"干么" => "幹麼",
+"几å°" => "å¹¾å°",
+"几于" => "幾於",
"几ä¸" => "幾絲",
"几åª" => "幾隻",
"几出" => "幾齣",
"底里" => "底裡",
"店里" => "店裡",
+"府å°" => "府å°",
"康采æ©" => "康采æ©",
+"庙å°" => "廟å°",
"庙里" => "廟裡",
-"建å°" => "建臺",
+"广播å°" => "廣播å°",
+"建å°" => "建å°",
+"建都于" => "建都於",
"弄è„" => "弄髒",
"å¼”å·" => "å¼”å·",
"弘历" => "弘曆",
+"强奸" => "強姦",
"强干弱æž" => "強幹弱æž",
"别扭" => "彆扭",
"别拗" => "彆拗",
@@ -3249,7 +3502,10 @@ $zh2TW=array(
"汇辑" => "彙輯",
"汇集" => "彙集",
"å½¢å•å½±åª" => "形單影隻",
-"影後" => "å½±åŽ",
+"形于" => "形於",
+"å½±åŽ" => "å½±åŽ",
+"役于外物" => "役於外物",
+"å¾€æ¥äºŽ" => "往來於",
"往里" => "往裡",
"å¾€å¤" => "往複",
"å¾ä¼" => "å¾ä¼",
@@ -3268,70 +3524,121 @@ $zh2TW=array(
"å¾è¡£" => "å¾è¡£",
"å¾è®¨" => "å¾è¨Ž",
"å¾é€”" => "å¾é€”",
-"åŽå°" => "後臺",
+"åŽå°" => "後å°",
+"åŽäºŽ" => "後於",
+"得于" => "得於",
+"徜徉于" => "徜徉於",
+"从事于" => "從事於",
"从里到外" => "從裡到外",
"从里å‘外" => "從裡å‘外",
+"御å²å°" => "御å²å°",
"å¤é› " => "復讎",
"å¤è¾Ÿ" => "復辟",
"德干高原" => "德干高原",
"心愿" => "心愿",
"心里" => "心è£",
"心里" => "心裡",
+"志于" => "志於",
+"忙于" => "忙於",
"忙里" => "忙裡",
+"忠于" => "忠於",
"å¿«å¹²" => "å¿«å¹¹",
"快冲" => "å¿«è¡",
"怎么" => "怎麼",
"怎么ç€" => "怎麼著",
+"急于" => "急於",
"急冲而下" => "急è¡è€Œä¸‹",
"怪里怪气" => "怪裡怪氣",
+"怯于" => "怯於",
"æ©å‡†" => "æ©å‡†",
+"æ¯äº¤ç»æ¸¸" => "æ¯äº¤çµ•éŠ",
+"悠游" => "æ‚ éŠ",
+"情报å°" => "情報å°",
"情有所钟" => "情有所é¾",
"情有独钟" => "情有ç¨é¾",
"æ„é¢" => "æ„麵",
+"感于" => "感於",
+"愧于" => "愧於",
"慌里慌张" => "慌裡慌張",
+"惯于" => "慣於",
"慰借" => "慰藉",
"忧éƒ" => "憂éƒ",
+"凭仗" => "憑仗",
+"凭你" => "憑你",
+"凭ä¾" => "憑ä¾",
+"凭信" => "憑信",
+"凭借" => "憑借",
"凭åŠ" => "憑åŠ",
+"凭å•" => "憑單",
+"凭弔" => "憑弔",
+"凭æƒ" => "憑æƒ",
+"凭æ®" => "憑據",
+"凭æ " => "憑欄",
+"凭眺" => "憑眺",
+"凭票" => "憑票",
+"凭空" => "憑空",
+"凭良心" => "憑良心",
+"凭ç€" => "憑著",
"凭借" => "憑藉",
"凭借ç€" => "憑藉著",
+"凭虚御风" => "憑虛御風",
+"凭証" => "憑証",
+"凭è¯" => "憑證",
+"凭é " => "憑é ",
+"凭高" => "憑高",
"蒙懂" => "懞懂",
+"懒于" => "懶於",
"怀里" => "懷裡",
"怀表" => "懷錶",
"悬åŠ" => "懸åŠ",
"悬心åŠèƒ†" => "懸心åŠè†½",
-"æˆå°" => "戲臺",
+"惧于" => "懼於",
+"或于" => "或於",
+"æˆå°" => "戲å°",
"戴表" => "戴錶",
"戽斗" => "戽斗",
"房里" => "房裡",
"手ä¸é‡Šå·" => "手ä¸é‡‹å·",
"手å·" => "手å·",
"手折" => "手摺",
+"手术å°" => "手術å°",
"手里" => "手è£",
"手里" => "手裡",
"手表" => "手錶",
"手æ¾" => "手鬆",
"æ‰å¹²" => "æ‰å¹¹",
"æ‰é«˜å…«æ–—" => "æ‰é«˜å…«æ–—",
+"打å°å°" => "打å°å°",
"打谷" => "打穀",
"扞御" => "扞禦",
"批准" => "批准",
"批å¤" => "批複",
"批å¤" => "批覆",
+"批注" => "批註",
"承制" => "承製",
+"抓奸" => "抓姦",
"抗御" => "抗禦",
"折冲" => "折è¡",
"披å¤" => "披覆",
"披å‘" => "披髮",
"抱朴" => "抱朴",
+"抵å°" => "抵å°",
"抵御" => "抵禦",
"拆伙" => "拆伙",
-"拆å°" => "拆臺",
+"拆å°" => "拆å°",
"拈须" => "拈鬚",
"拉纤" => "拉縴",
"拉é¢" => "拉麵",
"æ‹–åŠ" => "æ‹–åŠ",
"拗别" => "拗彆",
+"拘泥于" => "拘泥於",
+"拙于" => "拙於",
"æ‹®æ®" => "æ‹®æ®",
+"拳击å°" => "拳擊å°",
+"å沈" => "拾瀋",
+"指挥å°" => "指æ®å°",
+"挑å°" => "挑å°",
+"æ‰å¥¸" => "æ‰å§¦",
"æ御" => "æ禦",
"èˆä¸å¾—" => "æ¨ä¸å¾—",
"èˆå‡º" => "æ¨å‡º",
@@ -3359,9 +3666,12 @@ $zh2TW=array(
"挂帘" => "掛帘",
"挂é¢" => "掛麵",
"接ç€è¯´" => "接著說",
+"控制å°" => "控制å°",
"掩å·" => "掩å·",
"æ心åŠèƒ†" => "æ心åŠè†½",
"æ’图å·" => "æ’圖å·",
+"æ’足于" => "æ’足於",
+"æ¢å°" => "æ›å°",
"æ¢åŠ" => "æ›åŠ",
"æ¢åª" => "æ›éš»",
"æ¢å‘" => "æ›é«®",
@@ -3382,29 +3692,41 @@ $zh2TW=array(
"撒布" => "撒佈",
"撚须" => "撚鬚",
"æ’žçƒå°" => "æ’žçƒæª¯",
-"æ“‚å°" => "擂臺",
+"æ“‚å°" => "æ“‚å°",
+"擅于" => "擅於",
+"æ“作å°" => "æ“作å°",
+"æ“纵å°" => "æ“縱å°",
"æ‹…ä»”é¢" => "擔仔麵",
"æ‹…æ‹…é¢" => "擔擔麵",
"æ‹…ç€" => "擔著",
"æ‹…è´Ÿç€" => "擔負著",
"æ®äº‘" => "據云",
+"挤身于" => "擠身於",
"æ“¢å‘难数" => "擢髮難數",
"拟准" => "擬准",
+"拟于" => "擬於",
"摆布" => "擺佈",
+"摄于" => "æ”æ–¼",
"摄制" => "æ”製",
"支干" => "支幹",
"收获" => "收穫",
+"改于" => "改於",
"改制" => "改製",
"攻克" => "攻剋",
"放æ¾" => "放鬆",
"故布疑阵" => "故佈疑陣",
+"故于" => "故於",
+"败于垂æˆ" => "敗於垂æˆ",
"å™è¯´ç€" => "敘說著",
+"敢于" => "敢於",
"散伙" => "散伙",
"散布" => "散佈",
"æ•£å‘" => "散髮",
+"æ•´å°" => "æ•´å°",
"æ•´åª" => "æ•´éš»",
"整出" => "整齣",
"敌忾åŒé› " => "敵愾åŒè®Ž",
+"文凭" => "文憑",
"文借" => "文藉",
"文采" => "文采",
"斗亚兰路" => "斗亞蘭路",
@@ -3429,20 +3751,42 @@ $zh2TW=array(
"斤斗" => "斤斗",
"斯里兰å¡" => "斯裡蘭å¡",
"新历" => "新曆",
-"断头å°" => "斷頭臺",
+"断头å°" => "æ–·é ­å°",
"æ–­å‘文身" => "斷髮文身",
"æ–¹æ‰" => "方纔",
"方志" => "方誌",
+"于七" => "於七",
+"于事无补" => "於事無補",
+"于今" => "於今",
+"于左" => "於左",
+"于幼åŽ" => "於幼è¯",
+"于心何å¿" => "於心何å¿",
+"于æ€" => "æ–¼æ€",
+"于æˆ" => "於戲",
+"于斯" => "於斯",
+"于于" => "於於",
+"于是" => "於是",
+"于此" => "於此",
+"于法无æ®" => "於法無據",
+"于焉" => "於焉",
+"于田" => "於田",
+"于飞" => "於飛",
"æ–½èˆ" => "æ–½æ¨",
+"æ—注" => "æ—註",
+"旅游" => "æ—…éŠ",
"旋绕ç€" => "旋繞著",
"旋回" => "旋迴",
"æ—里" => "æ—裡",
"日历" => "日曆",
"日志" => "日誌",
"日进斗金" => "日進斗金",
+"早于" => "早於",
+"明å°å®¶å•†" => "明å°å®¶å•†",
+"明于" => "明於",
"明了" => "明瞭",
"明窗净几" => "明窗淨几",
"明里" => "明裡",
+"易于" => "易於",
"星斗" => "星斗",
"星历" => "星曆",
"星移斗æ¢" => "星移斗æ›",
@@ -3451,23 +3795,38 @@ $zh2TW=array(
"星辰表" => "星辰錶",
"春å‡é‡Œ" => "春å‡è£¡",
"春天里" => "春天裡",
+"春游" => "春éŠ",
+"昧于" => "昧於",
"景致" => "景緻",
"暗地里" => "暗地裡",
"暗沟里" => "æš—æºè£¡",
"暗里" => "暗裡",
+"畅游" => "暢éŠ",
+"暂于" => "暫於",
"暴敛横å¾" => "æš´æ–‚æ©«å¾",
+"暴虎凭河" => "暴虎憑河",
"历数" => "曆數",
"历书" => "曆書",
"历法" => "曆法",
"历象" => "曆象",
"书å·" => "書å·",
+"曾于" => "曾於",
"会干" => "會幹",
+"会于" => "會於",
"会里" => "會裡",
+"月å°" => "月å°",
"月历" => "月曆",
-"月å°" => "月臺",
+"有害于" => "有害於",
+"有凭有æ®" => "有憑有據",
+"有æŸäºŽ" => "有ææ–¼",
+"有求于人" => "有求於人",
+"有益于" => "有益於",
"有åª" => "有隻",
+"æœåŠ¡å°" => "æœå‹™å°",
+"æœåŠ¡äºŽ" => "æœå‹™æ–¼",
+"æœä»ŽäºŽ" => "æœå¾žæ–¼",
"木制" => "木製",
-"本å°" => "本臺",
+"本å°" => "本å°",
"朴å­" => "朴å­",
"朴实" => "朴實",
"朴忠" => "朴忠",
@@ -3480,14 +3839,17 @@ $zh2TW=array(
"æå¹²" => "æå¹¹",
"æ‘里" => "æ‘裡",
"æœè€å¿—é“" => "æœè€èªŒé“",
+"æŸä¿®" => "æŸè„©",
"æŸå‘" => "æŸé«®",
"æ¯é¢" => "æ¯éºµ",
"东岳" => "æ±å¶½",
"东å¾" => "æ±å¾",
+"东游" => "æ±éŠ",
"æ¾èµžå¹²å¸ƒ" => "æ¾è´Šå¹²å¸ƒ",
"æ¿ç€è„¸" => "æ¿è‘—臉",
"枕借" => "枕藉",
"æž—å®å²³" => "æž—å®å¶½",
+"果于" => "果於",
"æžå¹²" => "æžå¹¹",
"枯干" => "枯幹",
"æŸåª" => "æŸéš»",
@@ -3497,7 +3859,8 @@ $zh2TW=array(
"柜å­" => "柜å­",
"柜柳" => "柜柳",
"查å·" => "查å·",
-"查å·å°" => "查號臺",
+"查å·å°" => "查號å°",
+"查询å°" => "查詢å°",
"校雠学" => "校讎學",
"核准" => "核准",
"æ ¸å¤" => "核覆",
@@ -3507,15 +3870,23 @@ $zh2TW=array(
"æ¡å¹²" => "æ¢å¹¹",
"梯冲" => "梯è¡",
"械系" => "械繫",
+"梳妆å°" => "梳å¦å°",
"棉å·" => "棉å·",
"棉制" => "棉製",
+"棱å°" => "棱å°",
+"栖于" => "棲於",
"æ¤å‘" => "æ¤é«®",
-"楼å°" => "樓臺",
+"ä¹æ„于" => "樂æ„æ–¼",
+"ä¹äºŽ" => "樂於",
+"楼å°" => "樓å°",
"标志ç€" => "標志著",
"标致" => "標緻",
+"标注" => "標註",
"标志" => "標誌",
"模制" => "模製",
"树干" => "樹幹",
+"树干" => "樹榦",
+"æ¡¥å°" => "æ©‹å°",
"横å¾æš´æ•›" => "æ©«å¾æš´æ–‚",
"横冲" => "æ©«è¡",
"æ¡£å·" => "檔å·",
@@ -3525,24 +3896,39 @@ $zh2TW=array(
"å°ç¯" => "檯燈",
"å°çƒ" => "檯çƒ",
"å°é¢" => "檯é¢",
+"柜å°" => "櫃å°",
"柜å°" => "櫃檯",
-"柜å°" => "櫃臺",
"æ å¹²" => "欄干",
+"次于" => "次於",
+"欷å" => "欷å",
"欺蒙" => "欺矇",
-"歌後" => "æ­ŒåŽ",
-"æ­Œå°èˆžæ¦­" => "歌臺舞榭",
+"æ­ŒåŽ" => "æ­ŒåŽ",
"欧几里得" => "æ­å¹¾è£¡å¾—",
+"欧游" => "æ­éŠ",
+"止于" => "止於",
+"正于" => "正於",
"正当ç€" => "正當著",
"此仆彼起" => "此仆彼起",
-"武後" => "æ­¦åŽ",
+"æ­¦åŽ" => "æ­¦åŽ",
"æ­¦æ¾" => "武鬆",
"归并" => "歸併",
+"归功于" => "歸功於",
+"归咎于" => "歸咎於",
+"归因于" => "歸因於",
+"归于" => "歸於",
+"归罪于" => "歸罪於",
+"å½’éšäºŽ" => "歸隨於",
+"归顺于" => "歸順於",
+"死于" => "死於",
"死里求生" => "死裡求生",
"死里逃生" => "死裡逃生",
"残å·" => "殘å·",
"æ€è™«è¯" => "殺虫藥",
"壳里" => "殼裡",
-"æ¯å¾Œ" => "æ¯åŽ",
+"æ¯äºŽ" => "毀於",
+"æ¯åŽ" => "æ¯åŽ",
+"æ¯å°" => "æ¯å°",
+"æ¯äºŽ" => "æ¯æ–¼",
"æ¯åª" => "æ¯éš»",
"比干" => "比干",
"毛å·" => "毛å·",
@@ -3551,17 +3937,24 @@ $zh2TW=array(
"毫å‘" => "毫髮",
"气冲斗牛" => "氣沖斗牛",
"气冲牛斗" => "氣沖牛斗",
-"气象å°" => "氣象臺",
+"气象å°" => "氣象å°",
"æ°´æ–—" => "æ°´æ–—",
"水里" => "水裡",
"水表" => "水錶",
"永历" => "永曆",
"永志ä¸å¿˜" => "永誌ä¸å¿˜",
+"求教于" => "求教於",
"污蔑" => "汙衊",
"江干" => "江干",
"池里" => "池裡",
"污蔑" => "污衊",
+"汲汲于" => "汲汲於",
+"沃å°å…¬å¸" => "沃å°å…¬å¸",
"沈ç€" => "沈著",
+"沉湎于" => "沉湎於",
+"沉溺于" => "沉溺於",
+"沉迷于" => "沉迷於",
+"沉醉于" => "沉醉於",
"没事干" => "沒事幹",
"没精打采" => "沒精打采",
"冲ç€" => "æ²–è‘—",
@@ -3569,113 +3962,174 @@ $zh2TW=array(
"河岳" => "河嶽",
"河里" => "河裡",
"æ²¹é¢" => "油麵",
+"泛游" => "æ³›éŠ",
"泡制" => "泡製",
"泡é¢" => "泡麵",
"æ³°æ–—" => "æ³°æ–—",
+"洄游" => "æ´„éŠ",
"æ´—å‘" => "æ´—é«®",
+"活动于" => "活動於",
"派团å‚加" => "派團åƒåŠ ",
+"æµäºŽ" => "æµæ–¼",
+"æµç†å°" => "æµç†å°",
+"æµè¡ŒäºŽ" => "æµè¡Œæ–¼",
"浪ç´è¡¨" => "浪ç´éŒ¶",
+"浪游" => "浪éŠ",
+"æµ®å°" => "æµ®å°",
"æµ®åŠ" => "æµ®åŠ",
+"浮于" => "浮於",
+"浮夸" => "浮誇",
+"浮游" => "æµ®éŠ",
"海里" => "海裡",
+"浸于" => "浸於",
"涂ç€" => "涂著",
+"涉足于" => "涉足於",
"液晶表" => "液晶錶",
+"凉å°" => "涼å°",
"凉é¢" => "涼麵",
"淡朱" => "淡硃",
+"深于" => "深於",
"渊淳岳峙" => "淵淳嶽峙",
"渠冲" => "渠è¡",
"测验å·" => "測驗å·",
+"港å°" => "港å°",
"港制" => "港製",
"凑åˆç€" => "湊åˆè‘—",
"湖里" => "湖裡",
"汤团" => "湯糰",
"汤é¢" => "湯麵",
+"æºäºŽ" => "æºæ–¼",
+"溢于言表" => "溢於言表",
"温éƒ" => "溫éƒ",
+"溶于" => "溶於",
"å¤åˆ¶" => "滷製",
"å¤é¢" => "滷麵",
"满布" => "滿佈",
+"满于" => "滿於",
"æ¼æ–—" => "æ¼æ–—",
-"æ¼”å¥å°" => "æ¼”å¥è‡º",
+"漫游" => "漫éŠ",
"潜æ„识里" => "æ½›æ„識裡",
"潭里" => "潭裡",
+"溃于èšç©´" => "潰於蟻穴",
+"激于" => "激於",
+"浓于" => "濃於",
"浓éƒ" => "濃éƒ",
"浓å‘" => "濃髮",
"湿地æ¾" => "濕地鬆",
"蒙蒙" => "濛濛",
"蒙雾" => "濛霧",
"蒙鸿" => "濛鴻",
-"瀛å°" => "瀛臺",
+"沈海" => "瀋海",
+"沈阳" => "瀋陽",
+"濒于" => "瀕於",
+"瀛å°" => "瀛å°",
"弥漫" => "瀰漫",
"弥漫ç€" => "瀰漫著",
+"çŒäºŽ" => "çŒæ–¼",
"漓江" => "ç•æ±Ÿ",
"ç«å¹¶" => "ç«ä½µ",
"ç°è’™" => "ç°æ¿›",
"ç‚’é¢" => "炒麵",
+"ç‚®å°" => "ç‚®å°",
"炮制" => "炮製",
"炸è¯" => "炸葯",
"炸酱é¢" => "炸醬麵",
+"为凭" => "為憑",
"为ç€" => "為著",
"乌干达" => "çƒå¹²é”",
"乌è‹é‡Œæ±Ÿ" => "çƒè˜‡è£¡æ±Ÿ",
"乌å‘" => "çƒé«®",
"乌龙é¢" => "çƒé¾éºµ",
"烘制" => "烘製",
-"烽ç«å°" => "烽ç«è‡º",
+"烽ç«å°" => "烽ç«å°",
+"无动于衷" => "無動於衷",
"æ— å¹²" => "ç„¡å¹²",
+"无凭无æ®" => "無憑無據",
+"æ— æŸäºŽ" => "ç„¡ææ–¼",
+"无济于事" => "無濟於事",
+"æ— ç•äºŽ" => "ç„¡ç•æ–¼",
+"无益于事" => "無益於事",
"无精打采" => "無精打采",
+"无补于事" => "無補於事",
+"无视于" => "無視於",
"炼制" => "煉製",
"烟å·å„¿" => "ç…™å·å…’",
+"烟å°" => "ç…™å°",
"烟斗" => "煙斗",
"烟斗ä¸" => "煙斗絲",
-"烟å°" => "煙臺",
"照准" => "照准",
+"熔于" => "熔於",
"熨斗" => "熨斗",
-"ç¯å°" => "燈臺",
+"热衷于" => "熱衷於",
+"ç¯å°" => "燈å°",
"燎å‘" => "燎髮",
+"燕游" => "燕éŠ",
"烫å‘" => "燙髮",
"烫é¢" => "燙麵",
-"烛å°" => "燭臺",
-"炉å°" => "çˆè‡º",
+"烛å°" => "燭å°",
+"爆å" => "爆å",
+"炉å°" => "çˆå°",
"墙里" => "牆裡",
"片言åªè¯­" => "片言隻語",
"牛肉é¢" => "牛肉麵",
"牛åª" => "牛隻",
"特准" => "特准",
"特å¾" => "特å¾",
+"特于" => "特於",
"特里" => "特裡",
"特制" => "特製",
"牵系" => "牽繫",
+"犯å°" => "犯å°",
+"狃于æˆè§" => "狃於æˆè¦‹",
"狼借" => "狼藉",
"猛冲" => "猛è¡",
"奖æ¯" => "çŽç›ƒ",
"获准" => "ç²å‡†",
"率团å‚加" => "率團åƒåŠ ",
-"王侯後" => "王侯åŽ",
-"王後" => "王åŽ",
+"王侯åŽ" => "王侯åŽ",
+"王å°" => "王å°",
+"王åŽ" => "王åŽ",
"ç­é‡Œ" => "ç­è£¡",
+"çƒå°" => "çƒå°",
"ç†å‘" => "ç†é«®",
-"瑶å°" => "瑤臺",
+"环游" => "ç’°éŠ",
+"甘于" => "甘於",
+"甚于" => "甚於",
"甚么" => "甚麼",
"甜é¢é…±" => "甜麵醬",
"生力é¢" => "生力麵",
+"生于" => "生於",
+"生姜" => "生薑",
"生锈" => "生é½",
"生å‘" => "生髮",
+"产于" => "產於",
+"用于" => "用於",
"田里" => "田裡",
"由馀" => "由余",
+"由于" => "由於",
"由表åŠé‡Œ" => "由表åŠè£¡",
"ç”·ä½£" => "ç”·ä½£",
"男用表" => "男用錶",
"ç•™å‘" => "留髮",
"ç•šæ–—" => "ç•šæ–—",
+"划å·" => "ç•«å·",
+"划ç€" => "ç•«è‘—",
+"异于" => "異於",
+"当于" => "當於",
"当ç€" => "當著",
+"ç–于" => "ç–æ–¼",
"ç–æ¾" => "ç–鬆",
"ç–‘ç³»" => "ç–‘ä¿‚",
+"疲于奔命" => "疲於奔命",
"疲困" => "ç–²ç",
"病症" => "病癥",
"症候" => "癥候",
"症状" => "癥狀",
"症结" => "癥çµ",
-"ç™»å°" => "登臺",
+"ç™»å°" => "ç™»å°",
"å‘布" => "發佈",
+"å‘å°„å°" => "發射å°",
+"å‘于" => "發於",
"å‘è’™" => "發矇",
"å‘ç€" => "發著",
"å‘é¢" => "發麵",
@@ -3688,7 +4142,7 @@ $zh2TW=array(
"百谷" => "百穀",
"百里" => "百裡",
"百åª" => "百隻",
-"皇後" => "皇åŽ",
+"皇åŽ" => "皇åŽ",
"皇历" => "皇曆",
"çš“å‘" => "çš“é«®",
"皮里阳秋" => "çš®è£é™½ç§‹",
@@ -3696,21 +4150,26 @@ $zh2TW=array(
"皮制" => "皮製",
"皱折" => "皺摺",
"盒里" => "盒裡",
+"盛行于" => "盛行於",
"监制" => "監製",
"盘里" => "盤裡",
"盘回" => "盤迴",
"直接å‚与" => "直接åƒä¸Ž",
"直冲" => "ç›´è¡",
"相克" => "相剋",
+"相åŒäºŽ" => "相åŒæ–¼",
"相干" => "相干",
"相冲" => "相è¡",
-"看å°" => "看臺",
+"看å°" => "看å°",
+"真凭实æ®" => "真憑實據",
+"眺望å°" => "眺望å°",
"眼帘" => "眼帘",
"眼眶里" => "眼眶裡",
"眼里" => "眼裡",
"å›°ä¹" => "çä¹",
"困倦" => "ç倦",
"ç¡ç€äº†" => "ç¡è‘—了",
+"ç¡æ¸¸ç—…" => "ç¡éŠç—…",
"了如" => "瞭如",
"了望" => "瞭望",
"了然" => "瞭然",
@@ -3724,13 +4183,15 @@ $zh2TW=array(
"蒙眬" => "矇矓",
"蒙蔽" => "矇蔽",
"蒙骗" => "矇騙",
+"矜夸" => "矜誇",
"短å‘" => "短髮",
"矮几" => "矮几",
+"石å°" => "石å°",
"石英表" => "石英錶",
"石莼" => "石蓴",
"研制" => "研製",
"砰当" => "砰噹",
-"ç ²å°" => "砲臺",
+"ç ²å°" => "ç ²å°",
"朱唇皓齿" => "硃唇皓齒",
"朱批" => "硃批",
"朱砂" => "硃砂",
@@ -3739,17 +4200,23 @@ $zh2TW=array(
"朱色" => "硃色",
"朱谕" => "硃諭",
"硬干" => "硬幹",
-"ç šå°" => "硯臺",
+"ç šå°" => "硯å°",
"碑志" => "碑誌",
"ç£åˆ¶" => "ç£è£½",
"磨制" => "磨製",
+"ç¢äºŽ" => "礙於",
"示å¤" => "示覆",
"社里" => "社裡",
+"ç¥è‹±å°" => "ç¥è‹±å°",
+"神å°" => "神å°",
+"神游" => "神éŠ",
"神采" => "神采",
+"祭å°" => "祭å°",
"御侮" => "禦侮",
"御寇" => "禦寇",
"御寒" => "禦寒",
"御敌" => "禦敵",
+"礼å°" => "禮å°",
"礼义干橹" => "禮義干櫓",
"秃å‘" => "禿髮",
"秀斗" => "秀斗",
@@ -3785,18 +4252,24 @@ $zh2TW=array(
"积æžå‚与" => "ç©æžåƒä¸Ž",
"积æžå‚加" => "ç©æžåƒåŠ ",
"积谷防饥" => "ç©ç©€é˜²é¥‘",
+"空å£æ— å‡­" => "空å£ç„¡æ†‘",
"空蒙" => "空濛",
+"窗å°" => "窗å°",
"窗帘" => "窗帘",
"窗明几净" => "窗明几淨",
"窗å°" => "窗檯",
-"窗å°" => "窗臺",
"çªé‡Œ" => "窩裡",
-"çªé˜”å°" => "窩闊臺",
"ç©·å‘" => "窮髮",
-"ç«™å°" => "站臺",
+"立于" => "立於",
+"ç«™å°" => "ç«™å°",
+"竟于" => "竟於",
+"竹林之游" => "竹林之éŠ",
"笆斗" => "笆斗",
"笑里è—刀" => "笑裡è—刀",
"第一å·" => "第一å·",
+"第四å°" => "第四å°",
+"ç­‰åŒäºŽ" => "ç­‰åŒæ–¼",
+"等于" => "等於",
"ç­‹æ–—" => "ç­‹æ–—",
"ç­”å·" => "ç­”å·",
"ç­”å¤" => "答複",
@@ -3805,15 +4278,15 @@ $zh2TW=array(
"箕斗" => "箕斗",
"算历" => "算曆",
"ç­¾ç€" => "簽著",
-"å求" => "籲求",
-"å请" => "籲請",
"粗制" => "粗製",
"ç²—å¤" => "ç²—é¹µ",
"精干" => "精幹",
+"精于" => "精於",
"精明强干" => "精明強幹",
"精致" => "精緻",
"精制" => "精製",
"精辟" => "精辟",
+"精通于" => "精通於",
"精采" => "精采",
"糊里糊涂" => "糊裡糊塗",
"团å­" => "ç³°å­",
@@ -3828,10 +4301,15 @@ $zh2TW=array(
"ç´ å‘" => "ç´ é«®",
"ç´ é¢" => "素麵",
"紫微斗数" => "紫微斗數",
+"紫姜" => "紫薑",
"细致" => "細緻",
+"终于" => "終於",
"组里" => "組裡",
+"结伴åŒæ¸¸" => "çµä¼´åŒéŠ",
"结å‘" => "çµé«®",
"ç»å¯¹å‚ç…§" => "絕å°åƒç…§",
+"ç»ç¼˜å°" => "絕緣å°",
+"络绎于途" => "絡繹於途",
"ä¸æ¥çº¿åŽ»" => "絲來線去",
"ä¸å¸ƒ" => "絲布",
"ä¸æ¿" => "çµ²æ¿",
@@ -3892,21 +4370,34 @@ $zh2TW=array(
"累累" => "çºçº",
"å›å­" => "罈å­",
"å›å›ç½ç½" => "罈罈ç½ç½",
+"置于" => "置於",
"骂ç€" => "罵著",
"ç¾ç³»" => "羈繫",
"美制" => "美製",
"美å‘" => "美髮",
+"羞于" => "羞於",
+"习于" => "習於",
+"翱游" => "翱éŠ",
"ç¿»æ¥å¤åŽ»" => "翻來覆去",
"翻天å¤åœ°" => "翻天覆地",
"ç¿»å¤" => "翻覆",
"翻云å¤é›¨" => "翻雲覆雨",
"è€ä¹ˆ" => "è€ä¹ˆ",
+"è€å°" => "è€å°",
+"è€äºŽä¸–æ•…" => "è€æ–¼ä¸–æ•…",
+"è€å§œ" => "è€è–‘",
"è€æ¿" => "è€é—†",
"考å·" => "考å·",
+"而于" => "而於",
"耕获" => "耕穫",
+"耽于" => "耽於",
+"耿耿于怀" => "耿耿於懷",
"èŠæ–‹å¿—异" => "èŠé½‹èªŒç•°",
+"圣ç«å°" => "è–ç«å°",
"è”ç³»" => "è¯ä¿‚",
+"è”于" => "è¯æ–¼",
"è”ç³»" => "è¯ç¹«",
+"å¬å‡­" => "è½æ†‘",
"肉ä¸é¢" => "肉絲麵",
"肉羹é¢" => "肉羹麵",
"肉æ¾" => "肉鬆",
@@ -3919,59 +4410,33 @@ $zh2TW=array(
"胡里胡涂" => "胡裡胡塗",
"能干" => "能幹",
"脉冲" => "脈è¡",
+"修脯" => "脩脯",
"脱å‘" => "è„«é«®",
"腊味" => "腊味",
"腊笔" => "腊筆",
"腊肉" => "腊肉",
"è„‘å­é‡Œ" => "è…¦å­è£¡",
"腰里" => "腰裡",
+"脚注" => "腳註",
"胶å·" => "膠å·",
"膨æ¾" => "膨鬆",
+"臣æœäºŽ" => "臣æœæ–¼",
+"å§æ¸¸" => "臥éŠ",
"自制" => "自製",
"自觉自愿" => "自覺自愿",
-"å°ä¸Š" => "臺上",
-"å°ä¸‹" => "臺下",
-"å°ä¸­" => "臺中",
-"å°å„¿åº„" => "臺兒莊",
-"å°åŒ—" => "臺北",
-"å°å—" => "臺å—",
-"å°åœ°" => "臺地",
-"å°å¡‘" => "臺塑",
-"å°å¤§" => "臺大",
-"å°å¸" => "臺幣",
-"å°åº§" => "臺座",
-"å°ä¸œ" => "臺æ±",
-"å°æŸ±" => "臺柱",
-"å°æ¦­" => "臺榭",
-"å°æœºè·¯" => "臺機路",
-"å°æ­¥" => "臺步",
-"å°æ±½" => "臺汽",
-"å°æµ·" => "臺海",
-"å°æ¾Žé‡‘马" => "臺澎金馬",
-"å°æ¹¾" => "臺ç£",
-"å°ç¯" => "臺燈",
-"å°çƒ" => "臺çƒ",
-"å°çœ" => "臺çœ",
-"å°ç«¯" => "臺端",
-"å°ç³–" => "臺糖",
-"å°è‚¥" => "臺肥",
-"å°èˆª" => "臺航",
-"å°è¥¿" => "臺西",
-"å°è§†" => "臺視",
-"å°è¯" => "臺詞",
-"å°è½¦" => "臺車",
-"å°é“" => "臺éµ",
-"å°é˜¶" => "臺階",
-"å°ç”µ" => "臺電",
-"å°é¢" => "臺é¢",
+"自夸" => "自誇",
+"至于" => "至於",
+"致力于" => "致力於",
+"臻于完善" => "臻於完善",
"舂谷" => "舂穀",
"兴致" => "興緻",
"兴高采烈" => "興高采烈",
"旧历" => "舊曆",
+"旧游" => "舊éŠ",
"舒å·" => "舒å·",
-"舞榭歌å°" => "舞榭歌臺",
-"舞å°" => "舞臺",
+"舞å°" => "舞å°",
"航海历" => "航海曆",
+"船å°" => "船å°",
"船åª" => "船隻",
"舰åª" => "艦隻",
"芬éƒ" => "芬éƒ",
@@ -3981,13 +4446,15 @@ $zh2TW=array(
"苑里" => "苑裡",
"若干" => "若干",
"若干" => "若幹",
+"若于" => "若於",
"苦干" => "苦幹",
+"苦于" => "苦於",
"苦里" => "苦è£",
"苦å¤" => "苦鹵",
"范仲淹" => "范仲淹",
"范蠡" => "范蠡",
"范阳" => "范陽",
-"茅å°" => "茅臺",
+"茅å°" => "茅å°",
"茶几" => "茶几",
"è‰ä¸›é‡Œ" => "è‰å¢è£¡",
"庄里" => "莊裡",
@@ -3999,19 +4466,30 @@ $zh2TW=array(
"万å·" => "è¬å·",
"万历" => "è¬æ›†",
"万åª" => "è¬éš»",
+"è½äºŽ" => "è½æ–¼",
"è½å‘" => "è½é«®",
"ç€å„¿" => "è‘—å…’",
+"ç€æ‰‹äºŽ" => "著手於",
"ç€ä¹¦ç«‹è¯´" => "著書立說",
"ç€è‰²è½¯ä½“" => "著色軟體",
+"ç€è¿·äºŽ" => "è‘—è¿·æ–¼",
"ç€é‡æŒ‡å‡º" => "è‘—é‡æŒ‡å‡º",
"ç€å½•" => "著錄",
"ç€å½•è§„则" => "著錄è¦å‰‡",
"è“„å‘" => "è“„é«®",
"蓄须" => "蓄鬚",
+"盖于" => "蓋於",
"蓬å‘" => "蓬髮",
"蓬æ¾" => "蓬鬆",
-"莲å°" => "蓮臺",
-"è–‘ä¸" => "è–‘çµ²",
+"莲å°" => "è“®å°",
+"姜末" => "薑末",
+"姜æ¯" => "è–‘æ¯",
+"姜æ±" => "è–‘æ±",
+"姜片" => "薑片",
+"姜糖" => "薑糖",
+"姜ä¸" => "è–‘çµ²",
+"姜茶" => "薑茶",
+"姜饼" => "薑餅",
"è–™å‘" => "薙髮",
"借以" => "藉以",
"借助" => "藉助",
@@ -4026,14 +4504,17 @@ $zh2TW=array(
"借è¯" => "藉詞",
"借资" => "藉資",
"借酒浇æ„" => "藉酒澆æ„",
+"è—匿于" => "è—匿於",
"藤制" => "藤製",
"è•´å«ç€" => "蘊å«è‘—",
"蕴涵ç€" => "蘊涵著",
"蕴借" => "蘊藉",
"èåœ" => "蘿蔔",
"虎须" => "虎鬚",
+"处于" => "處於",
+"虚夸" => "虛誇",
"å·å¿—" => "號誌",
-"蜂後" => "蜂åŽ",
+"蜂åŽ" => "蜂åŽ",
"蜜里调油" => "蜜裡調油",
"è å¹²" => "è å¹¹",
"蛮干" => "蠻幹",
@@ -4086,6 +4567,7 @@ $zh2TW=array(
"è£å¹¶" => "è£ä½µ",
"è£åˆ¶" => "è£è£½",
"里é¢" => "è£é¢",
+"补注" => "補註",
"里人" => "裡人",
"里加" => "裡加",
"里外" => "裡外",
@@ -4197,6 +4679,7 @@ $zh2TW=array(
"西岳" => "西嶽",
"西å¾" => "西å¾",
"西历" => "西曆",
+"西游" => "西éŠ",
"è¦å†²" => "è¦è¡",
"è¦ä¹ˆ" => "è¦éº¼",
"å¤ä¸Š" => "覆上",
@@ -4234,61 +4717,119 @@ $zh2TW=array(
"å¤é€‰" => "覆é¸",
"å¤ç”µ" => "覆電",
"å¤é¼Žé‡‘" => "覆鼎金",
+"è§äºŽ" => "見於",
"è§å¤" => "見覆",
"亲å¾" => "親å¾",
-"观众å°" => "觀眾臺",
-"观å°" => "觀臺",
-"观象å°" => "觀象臺",
+"观å°" => "觀å°",
+"观星å°" => "觀星å°",
+"观望å°" => "觀望å°",
+"观众å°" => "觀眾å°",
+"观象å°" => "觀象å°",
"角è½é‡Œ" => "角è½è£¡",
"觔斗" => "觔斗",
"触须" => "觸鬚",
+"订于" => "訂於",
"订制" => "訂製",
+"访å°" => "訪å°",
+"设å°" => "設å°",
+"设于" => "設於",
"诉说ç€" => "訴說著",
+"注上" => "註上",
+"注册" => "註冊",
+"注失" => "註失",
+"注定" => "註定",
+"注明" => "註明",
+"注标" => "註標",
+"注生娘娘" => "註生娘娘",
+"注ç–" => "註ç–",
+"注脚" => "註腳",
+"注解" => "註解",
+"注记" => "註記",
+"注译" => "註譯",
+"注释" => "註釋",
+"注销" => "註銷",
+"评注" => "評註",
"è¯æ±‡" => "è©žå½™",
"è¯é‡‡" => "詞采",
"试å·" => "試å·",
"试制" => "試製",
"诗å·" => "è©©å·",
"è¯é‡Œæœ‰è¯" => "話裡有話",
+"该于" => "該於",
+"详注" => "詳註",
+"夸下海å£" => "誇下海å£",
+"夸了" => "誇了",
+"夸æ¥å¤¸åŽ»" => "誇來誇去",
+"夸别" => "誇別",
+"夸功" => "誇功",
+"夸å£" => "誇å£",
+"夸嘴" => "誇嘴",
+"夸大" => "誇大",
+"夸张" => "誇張",
+"夸得" => "誇得",
+"夸æˆ" => "誇æˆ",
+"夸奖" => "誇çŽ",
+"夸示" => "誇示",
+"夸耀" => "誇耀",
+"夸ç€" => "誇著",
+"夸夸" => "誇誇",
+"夸诞" => "誇誕",
+"夸讚" => "誇讚",
+"夸起" => "誇起",
+"夸过" => "誇éŽ",
+"夸饰" => "誇飾",
"志哀" => "誌哀",
"志喜" => "誌喜",
"志庆" => "誌慶",
+"诱奸" => "誘姦",
"语云" => "語云",
"语汇" => "語彙",
"诬蔑" => "誣衊",
-"诵ç»å°" => "誦經臺",
"说ç€" => "說著",
"课å¾" => "課å¾",
+"调幅å°" => "調幅å°",
+"è°ƒç†å°" => "調ç†å°",
"调制" => "調製",
-"调频å°" => "調頻臺",
+"调频å°" => "調頻å°",
"请å‚阅" => "è«‹åƒé–±",
-"讲å°" => "講臺",
+"讲å°" => "講å°",
"è°¢ç»å‚观" => "è¬çµ•åƒè§€",
+"è¯äºŽ" => "證於",
+"译注" => "譯註",
"护å‘" => "è­·é«®",
"雠正" => "讎正",
"雠隙" => "讎隙",
"豆è…å¹²" => "豆è…å¹²",
"ç«–ç€" => "豎著",
+"丰å°" => "è±å°",
"丰富多采" => "è±å¯Œå¤šé‡‡",
"丰滨" => "è±æ¿±",
"丰滨乡" => "è±æ¿±é„‰",
"丰采" => "è±é‡‡",
"象å¾ç€" => "象徵著",
"贵干" => "貴幹",
-"贾後" => "賈åŽ",
+"è´¾åŽ" => "賈åŽ",
"赈饥" => "賑饑",
"èµå¤" => "賜覆",
-"贤後" => "è³¢åŽ",
+"è´¤åŽ" => "è³¢åŽ",
"质朴" => "質朴",
"赌å°" => "賭檯",
+"赖于" => "賴於",
"购并" => "購併",
"赤绳系足" => "赤繩繫足",
"赤æ¾" => "赤鬆",
+"èµ´å°" => "èµ´å°",
"èµ·åŠ" => "èµ·åŠ",
+"起因于" => "起因於",
+"起于" => "起於",
"èµ·å¤" => "起複",
"超级æ¯" => "超級盃",
"赶制" => "趕製",
+"趋于" => "趨於",
"è·Ÿæ–—" => "è·Ÿæ–—",
+"跳伞å°" => "跳傘å°",
+"è·³å°" => "è·³å°",
+"跳水å°" => "跳水å°",
"跳表" => "跳錶",
"蹈借" => "蹈藉",
"踬仆" => "躓仆",
@@ -4296,8 +4837,13 @@ $zh2TW=array(
"车库里" => "車庫裡",
"车站里" => "車站裡",
"车里" => "車裡",
+"载于" => "載於",
+"轻于" => "輕於",
"è½»æ¾" => "輕鬆",
+"轮奸" => "輪姦",
"轮回" => "輪迴",
+"转å°" => "轉å°",
+"转播å°" => "轉播å°",
"转å°" => "轉檯",
"辛丑" => "辛丑",
"辟易" => "辟易",
@@ -4307,8 +4853,12 @@ $zh2TW=array(
"辞汇" => "辭彙",
"农历" => "農曆",
"迂回" => "迂迴",
+"近似于" => "近似於",
+"近于" => "近於",
"近日里" => "近日裡",
+"è¿”å°" => "è¿”å°",
"迥然回异" => "迥然迴異",
+"迫于" => "迫於",
"回光返照" => "迴光返照",
"回å‘" => "è¿´å‘",
"回圈" => "迴圈",
@@ -4336,23 +4886,92 @@ $zh2TW=array(
"回首" => "迴首",
"è¿·è’™" => "è¿·æ¿›",
"退伙" => "退伙",
+"é€é¥æ¸¸" => "é€é™éŠ",
"这么ç€" => "這么著",
+"è¿™å°" => "這å°",
"这里" => "這è£",
"这里" => "這裡",
"è¿™åª" => "這隻",
"这么" => "這麼",
"这么ç€" => "這麼著",
+"通奸" => "通姦",
"通心é¢" => "通心麵",
"速食é¢" => "速食麵",
+"è¿žå°å¥½æˆ" => "連å°å¥½æˆ²",
+"连于" => "連於",
"连系" => "連繫",
-"è¿žå°å¥½æˆ" => "連臺好戲",
+"周游" => "週éŠ",
+"游了" => "éŠäº†",
+"游人" => "éŠäºº",
+"游仙" => "éŠä»™",
+"游伴" => "éŠä¼´",
+"游侠" => "éŠä¿ ",
+"游冶" => "éŠå†¶",
+"游动" => "éŠå‹•",
+"游园" => "éŠåœ’",
+"游å­" => "éŠå­",
+"游学" => "éŠå­¸",
+"游客" => "éŠå®¢",
+"游宦" => "éŠå®¦",
+"游山玩水" => "éŠå±±çŽ©æ°´",
+"游必有方" => "éŠå¿…有方",
+"游憩" => "éŠæ†©",
+"游æˆ" => "éŠæˆ²",
+"游手好闲" => "éŠæ‰‹å¥½é–‘",
+"游手好閒" => "éŠæ‰‹å¥½é–’",
+"游击" => "éŠæ“Š",
+"游方" => "éŠæ–¹",
+"游星" => "éŠæ˜Ÿ",
+"游ä¹" => "éŠæ¨‚",
+"游标å¡å°º" => "éŠæ¨™å¡å°º",
+"游历" => "éŠæ­·",
+"游民" => "éŠæ°‘",
+"游河" => "éŠæ²³",
+"游牧" => "éŠç‰§",
+"游猎" => "éŠçµ",
+"游玩" => "éŠçŽ©",
+"游盪" => "éŠç›ª",
+"游目骋怀" => "éŠç›®é¨æ‡·",
+"游程" => "éŠç¨‹",
+"游ä¸" => "éŠçµ²",
+"游兴" => "éŠèˆˆ",
+"游船" => "éŠèˆ¹",
+"游艇" => "éŠè‰‡",
+"游è¡" => "éŠè•©",
+"游艺" => "éŠè—",
+"游行" => "éŠè¡Œ",
+"游街" => "éŠè¡—",
+"游览" => "éŠè¦½",
+"游记" => "éŠè¨˜",
+"游说" => "éŠèªª",
+"游资" => "éŠè³‡",
+"游走" => "éŠèµ°",
+"游踪" => "éŠè¹¤",
+"游逛" => "éŠé€›",
+"游错" => "éŠéŒ¯",
+"游离" => "éŠé›¢",
+"游骑兵" => "éŠé¨Žå…µ",
+"游魂" => "éŠé­‚",
"é布" => "é佈",
+"é于" => "éæ–¼",
+"过于" => "éŽæ–¼",
"递回" => "éžè¿´",
"è¿œå¾" => "é å¾",
+"远于" => "é æ–¼",
+"远游" => "é éŠ",
+"é¨æ¸¸" => "é¨éŠ",
+"适于" => "é©æ–¼",
"适æ‰" => "é©çº”",
"é®å¤" => "é®è¦†",
+"è¿å°" => "é·å°",
+"è¿æ€’于" => "é·æ€’æ–¼",
+"选å°" => "é¸å°",
+"还政于民" => "還政於民",
+"还于" => "還於",
"还冲" => "é‚„è¡",
"邋里邋é¢" => "邋裡邋é¢",
+"é‚¢å°" => "é‚¢å°",
+"é‚£å°" => "é‚£å°",
"那里" => "é‚£è£",
"那里" => "那裡",
"é‚£åª" => "那隻",
@@ -4364,6 +4983,7 @@ $zh2TW=array(
"éƒéƒ" => "éƒéƒ",
"éƒé—­" => "éƒé–‰",
"éƒé¦¥" => "éƒé¦¥",
+"郊游" => "郊éŠ",
"乡愿" => "鄉愿",
"乡里" => "鄉裡",
"邻里" => "鄰裡",
@@ -4372,6 +4992,7 @@ $zh2TW=array(
"é…’æ¯" => "酒盃",
"é…’å›" => "酒罈",
"é…¥æ¾" => "酥鬆",
+"醉心于" => "醉心於",
"醋å›" => "醋罈",
"é…借" => "醞藉",
"é…é…¿ç€" => "醞釀著",
@@ -4390,14 +5011,19 @@ $zh2TW=array(
"采风" => "采風",
"里程表" => "里程錶",
"é‡æŠ˜" => "é‡æ‘º",
+"é‡äºŽ" => "é‡æ–¼",
"é‡åˆ¶" => "é‡è£½",
"é‡å¤" => "é‡è¤‡",
"é‡å¤" => "é‡è¦†",
-"野å°æˆ" => "野臺戲",
+"é‡æ¸¸" => "é‡éŠ",
+"野å°" => "野å°",
+"野游" => "野éŠ",
"金斗" => "金斗",
"金装玉里" => "金è£çŽ‰è£¡",
"金表" => "金錶",
"金å‘" => "金髮",
+"é’“é±¼å°" => "釣魚å°",
+"铉å°" => "鉉å°",
"银朱" => "銀硃",
"银å‘" => "銀髮",
"铜制" => "銅製",
@@ -4411,45 +5037,76 @@ $zh2TW=array(
"表壳" => "錶殼",
"表链" => "錶éˆ",
"表é¢" => "錶é¢",
-"é”…å°" => "é‹è‡º",
+"é”…å°" => "é‹å°",
"é”»éŠå‡º" => "é›éŠå‡º",
"é”»éŠèº«ä½“" => "é›éŠèº«ä½“",
-"é•œå°" => "é¡è‡º",
+"é”®å°" => "éµå°",
+"é’Ÿå­æœŸ" => "é¾å­æœŸ",
+"é’Ÿå±±" => "é¾å±±",
+"钟情" => "é¾æƒ…",
+"钟爱" => "é¾æ„›",
+"钟县" => "é¾ç¸£",
+"钟表" => "é¾éŒ¶",
+"钟离" => "é¾é›¢",
+"é’Ÿçµæ¯“秀" => "é¾éˆæ¯“秀",
+"钟馗" => "é¾é¦—",
+"é•œå°" => "é¡å°",
"锈病" => "é½ç—…",
"锈èŒ" => "é½èŒ",
"锈蚀" => "é½è•",
"钟表" => "é˜éŒ¶",
"é“锈" => "éµé½",
+"鑑于" => "鑑於",
+"鉴于" => "鑒於",
+"é’»å°" => "鑽å°",
+"é•¿å短å¹" => "é•·å短嘆",
+"é•¿å短歎" => "é•·å短歎",
"é•¿å¾" => "é•·å¾",
+"长于" => "長於",
"é•¿å‘" => "é•·é«®",
"长须鲸" => "長鬚鯨",
"门帘" => "門帘",
"门斗" => "門斗",
"门里" => "門裡",
"开伙" => "開伙",
+"开列于åŽ" => "開列於後",
"å¼€å·" => "é–‹å·",
"开诚布公" => "開誠佈公",
"开采" => "開采",
"閒情逸致" => "閒情逸緻",
+"閒游" => "é–’éŠ",
"é—´ä¸å®¹å‘" => "é–“ä¸å®¹é«®",
"闵采尔" => "閔采爾",
+"é—½å°" => "é–©å°",
+"阅兵å°" => "閱兵å°",
"阅å·" => "é–±å·",
+"暗伦" => "闇倫",
+"暗冥" => "闇冥",
+"暗劣" => "闇劣",
+"暗弱" => "闇弱",
+"暗然" => "闇然",
"阑干" => "闌干",
"关系" => "關係",
"关系ç€" => "關係著",
+"关于" => "關於",
"防御" => "防禦",
"防锈" => "防é½",
"防å°" => "防颱",
"阿斗" => "阿斗",
"阿里" => "阿裡",
+"附注" => "附註",
+"é™äºŽ" => "é™æ–¼",
+"é™äºŽ" => "é™æ–¼",
"除旧布新" => "除舊佈新",
"阴干" => "陰干",
"阴历" => "陰曆",
"阴éƒ" => "é™°éƒ",
+"陷于" => "陷於",
"陆å¾ç¥¥" => "陸å¾ç¥¥",
+"陆游" => "陸éŠ",
+"阳å°" => "陽å°",
"阳春é¢" => "陽春麵",
"阳历" => "陽曆",
-"阳å°" => "陽臺",
"åªå­—" => "隻字",
"åªå½±" => "隻影",
"åªæ‰‹é®å¤©" => "隻手é®å¤©",
@@ -4457,37 +5114,47 @@ $zh2TW=array(
"åªè¨€ç‰‡è¯­" => "隻言片語",
"åªèº«" => "隻身",
"雅致" => "雅緻",
+"集于一身" => "集於一身",
+"集游法" => "集éŠæ³•",
"雇佣" => "雇佣",
+"雇于" => "雇於",
"åŒæŠ˜" => "雙摺",
"æ‚å¿—" => "雜誌",
+"鸡奸" => "雞姦",
"鸡ä¸" => "雞絲",
"鸡ä¸é¢" => "雞絲麵",
"鸡腿é¢" => "雞腿麵",
"鸡åª" => "雞隻",
+"难容于" => "難容於",
"éš¾èˆ" => "難æ¨",
-"雨花å°" => "雨花臺",
+"难于" => "難於",
"雪里" => "雪裡",
+"云游" => "雲éŠ",
"云须" => "雲鬚",
+"电å°" => "é›»å°",
"电å­è¡¨" => "é›»å­éŒ¶",
-"电å°" => "電臺",
"电冲" => "é›»è¡",
"电å¤" => "電覆",
-"电视å°" => "電視臺",
+"电视å°" => "電視å°",
"电表" => "電錶",
-"雾å°" => "霧臺",
+"震于" => "震於",
+"雾å°" => "霧å°",
"雾里" => "霧裡",
-"露å°" => "露臺",
-"çµå°" => "éˆè‡º",
-"é’瓦å°" => "é’瓦臺",
+"露å°" => "露å°",
+"çµå°" => "éˆå°",
+"çµä¿®" => "éˆè„©",
+"é’瓦å°" => "é’瓦å°",
"é’霉" => "é’é»´",
+"éžäºŽ" => "éžæ–¼",
"é¢æœç€" => "é¢æœè‘—",
"é¢ä¸´ç€" => "é¢è‡¨è‘—",
+"é¶å°" => "é¶å°",
"鞋里" => "鞋裡",
"鞣制" => "鞣製",
-"秋åƒ" => "鞦韆",
"鞭辟入里" => "鞭辟入裡",
"韩国制" => "韓國製",
"韩制" => "韓製",
+"音ä¹å°" => "音樂å°",
"颂系" => "頌繫",
"预制" => "é è£½",
"é¢å¸ƒ" => "頒佈",
@@ -4497,6 +5164,7 @@ $zh2TW=array(
"颠仆" => "顛仆",
"颠å¤" => "顛複",
"颠å¤" => "顛覆",
+"类似于" => "類似於",
"显ç€æ ‡å¿—" => "顯著標志",
"风土志" => "風土誌",
"风斗" => "風斗",
@@ -4512,6 +5180,7 @@ $zh2TW=array(
"刮走" => "颳走",
"刮起" => "颳起",
"刮风" => "颳風",
+"飘游" => "飄éŠ",
"饭团" => "飯糰",
"饼干" => "餅干",
"馄饨é¢" => "餛飩麵",
@@ -4524,6 +5193,7 @@ $zh2TW=array(
"饥饱" => "饑飽",
"饥饿" => "饑餓",
"饥馑" => "饑饉",
+"首å°" => "首å°",
"首当其冲" => "首當其è¡",
"香éƒ" => "香éƒ",
"馥éƒ" => "馥éƒ",
@@ -4544,8 +5214,9 @@ $zh2TW=array(
"è„çš„" => "é«’çš„",
"è„è¯" => "髒話",
"è„é’±" => "髒錢",
+"高å°" => "高å°",
"高干" => "高幹",
-"高å°" => "高臺",
+"高于" => "高於",
"髭须" => "髭鬚",
"å‘åž‹" => "髮型",
"å‘夹" => "髮夾",
@@ -4628,7 +5299,6 @@ $zh2TW=array(
"魂牵梦系" => "魂牽夢繫",
"é±¼æ¾" => "魚鬆",
"鲸须" => "鯨鬚",
-"鲇鱼" => "鯰魚",
"鸿篇巨制" => "鴻篇巨製",
"鹤å‘" => "鶴髮",
"å¤åŒ–" => "鹵化",
@@ -4687,9 +5357,11 @@ $zh2TW=array(
"霉毒" => "黴毒",
"霉素" => "黴素",
"霉èŒ" => "é»´èŒ",
+"鼓å°" => "鼓å°",
"鼓里" => "鼓裡",
"冬冬" => "鼕鼕",
"é¾™å·" => "é¾å·",
+"龙钟" => "é¾é¾",
"龙须" => "é¾é¬š",
"内存"=>"記憶體",
"默认"=>"é è¨­",
@@ -4739,6 +5411,7 @@ $zh2TW=array(
"端å£"=>"埠",
"ç®—å­"=>"é‹ç®—å…ƒ",
"算法"=>"演算法",
+"演算法"=>"演算法",
"芯片"=>"晶片",
"芯片"=>"晶元",
"è¯ç»„"=>"片語",
@@ -4757,13 +5430,10 @@ $zh2TW=array(
"写ä¿æŠ¤"=>"防寫",
"分布å¼"=>"分散å¼",
"分辨率"=>"解æžåº¦",
-"程åº"=>"程å¼",
"æœåŠ¡å™¨"=>"伺æœå™¨",
-"等于"=>"等於",
"局域网"=>"å€åŸŸç¶²",
"上载"=>"上傳",
"计算机"=>"電腦",
-"å®"=>"巨集",
"扫瞄仪"=>"掃瞄器",
"宽带"=>"寬頻",
"窗å£"=>"視窗",
@@ -4912,7 +5582,6 @@ $zh2TW=array(
"斯洛文尼亞"=>"斯洛維尼亞",
"新西兰"=>"ç´è¥¿è˜­",
"新西蘭"=>"ç´è¥¿è˜­",
-"æœé²œ"=>"北韓",
"格林纳达"=>"格瑞那é”",
"格林ç´é”"=>"格瑞那é”",
"æ ¼é²å‰äºš"=>"喬治亞",
@@ -5000,6 +5669,17 @@ $zh2TW=array(
"狄安娜"=>"黛安娜",
"戴安娜"=>"黛安娜",
"赫拉"=>"希拉",
+"æ“作系统"=>"作業系統",
+"ä¿¡æ¯"=>"資訊",
+"é¢å‘对象"=>"物件導å‘",
+"构造函数"=>"建構å¼",
+"笔记本电脑"=>"筆記型電腦",
+"é’霉素"=>"盤尼西林",
+"塞尔维亚和黑山"=>"塞爾維亞與蒙特內格羅",
+"英è”邦"=>"大英國å”",
+"英è¯é‚¦"=>"大英國å”",
+"下é¢"=>"下é¢",
+
);
@@ -5157,9 +5837,9 @@ $zh2CN=array(
"å¢"=>"丛",
"å°"=>"å°",
"å¶"=>"å¶",
+"å"=>"å",
"åŠ"=>"åŠ",
"åŽ"=>"åŽ",
-"åŽ"=>"後",
"å’"=>"å’¤",
"å³"=>"å´",
"å¶"=>"å‘",
@@ -5230,6 +5910,7 @@ $zh2CN=array(
"囈"=>"呓",
"囌"=>"è‹",
"囑"=>"嘱",
+"囘"=>"回",
"囪"=>"囱",
"圇"=>"囵",
"國"=>"国",
@@ -5294,7 +5975,6 @@ $zh2CN=array(
"奼"=>"姹",
"å¦"=>"妆",
"å§"=>"姗",
-"姜"=>"姜",
"姦"=>"奸",
"娛"=>"娱",
"å©"=>"娄",
@@ -5386,6 +6066,8 @@ $zh2CN=array(
"å¹£"=>"å¸",
"幫"=>"帮",
"幬"=>"帱",
+"å¹²"=>"å¹²",
+"并"=>"并",
"å¹¹"=>"å¹²",
"幺"=>"么",
"幾"=>"几",
@@ -5413,6 +6095,7 @@ $zh2CN=array(
"彈"=>"弹",
"彌"=>"弥",
"彎"=>"弯",
+"彔"=>"录",
"彙"=>"汇",
"彞"=>"å½",
"彥"=>"彦",
@@ -5626,6 +6309,7 @@ $zh2CN=array(
"楨"=>"桢",
"業"=>"业",
"極"=>"æž",
+"榦"=>"干",
"榪"=>"æ©",
"榮"=>"è£",
"榲"=>"榅",
@@ -6083,7 +6767,6 @@ $zh2CN=array(
"籪"=>"簖",
"籬"=>"篱",
"籮"=>"箩",
-"ç±²"=>"å",
"粵"=>"粤",
"ç³"=>"ç³",
"糞"=>"粪",
@@ -6298,6 +6981,7 @@ $zh2CN=array(
"è„…"=>"èƒ",
"脈"=>"脉",
"脛"=>"胫",
+"è„©"=>"ä¿®",
"脫"=>"脱",
"脹"=>"胀",
"è…Š"=>"è…Š",
@@ -6391,6 +7075,7 @@ $zh2CN=array(
"è–ˆ"=>"èŸ",
"è–Š"=>"è“Ÿ",
"薌"=>"芗",
+"薑"=>"姜",
"è–”"=>"è”·",
"è–˜"=>"è™",
"薟"=>"莶",
@@ -7098,6 +7783,7 @@ $zh2CN=array(
"鎸"=>"镌",
"鎿"=>"镎",
"éƒ"=>"é•ž",
+"é‡"=>"æ—‹",
"é‡"=>"é•Ÿ",
"éˆ"=>"链",
"éŒ"=>"镆",
@@ -7162,7 +7848,6 @@ $zh2CN=array(
"鑾"=>"銮",
"鑿"=>"凿",
"é’"=>"é•¢",
-"é•Ÿ"=>"æ—‹",
"é•·"=>"é•¿",
"é–€"=>"é—¨",
"é–‚"=>"é—©",
@@ -7198,6 +7883,7 @@ $zh2CN=array(
"閿"=>"阌",
"闃"=>"阒",
"é—†"=>"æ¿",
+"é—‡"=>"æš—",
"é—ˆ"=>"é—±",
"闊"=>"阔",
"闋"=>"阕",
@@ -7257,11 +7943,9 @@ $zh2CN=array(
"鞀"=>"鼗",
"éž"=>"å·©",
"éž"=>"ç»±",
-"鞦"=>"秋",
"éž½"=>"éž’",
"éŸ"=>"ç¼°",
"韃"=>"鞑",
-"韆"=>"åƒ",
"韉"=>"鞯",
"韋"=>"韦",
"韌"=>"韧",
@@ -7369,6 +8053,7 @@ $zh2CN=array(
"餓"=>"饿",
"餕"=>"馂",
"餖"=>"饾",
+"餘"=>"馀",
"餚"=>"肴",
"餛"=>"馄",
"餜"=>"馃",
@@ -7688,6 +8373,8 @@ $zh2CN=array(
"麗"=>"丽",
"麥"=>"麦",
"麩"=>"麸",
+"麪"=>"é¢",
+"麫"=>"é¢",
"麯"=>"曲",
"麵"=>"é¢",
"麼"=>"么",
@@ -7897,7 +8584,6 @@ $zh2CN=array(
"乙太網"=>"以太网",
"點陣圖"=>"ä½å›¾",
"常å¼"=>"例程",
-"通é“"=>"ä¿¡é“",
"游標"=>"光标",
"光碟"=>"光盘",
"光碟機"=>"光驱",
@@ -7958,7 +8644,6 @@ $zh2CN=array(
"解æžåº¦"=>"分辨率",
"程å¼"=>"程åº",
"伺æœå™¨"=>"æœåŠ¡å™¨",
-"等於"=>"等于",
"å€åŸŸç¶²"=>"局域网",
"上傳"=>"上载",
"電腦"=>"计算机",
@@ -7994,7 +8679,6 @@ $zh2CN=array(
"二極管"=>"二æžç®¡",
"三極體"=>"三æžç®¡",
"三極管"=>"三æžç®¡",
-"數ä½"=>"æ•°ç ",
"數碼"=>"æ•°ç ",
"軟體"=>"软件",
"軟件"=>"软件",
@@ -8221,6 +8905,18 @@ $zh2CN=array(
"戴安娜"=>"狄安娜",
"黛安娜"=>"狄安娜",
"希拉"=>"赫拉",
+"作業系統"=>"æ“作系统",
+"資訊"=>"ä¿¡æ¯",
+"è‘—å"=>"è‘—å",
+"函å¼"=>"函数",
+"物件導å‘"=>"é¢å‘对象",
+"建構å¼"=>"构造函数",
+"筆記型電腦"=>"笔记本电脑",
+"酵素"=>"酶",
+"盤尼西林"=>"é’霉素",
+"塞爾維亞與蒙特內格羅"=>"塞尔维亚和黑山",
+"大英國å”"=>"英è”邦",
+"英è¯é‚¦"=>"英è”邦",
);
$zh2HK=array(
@@ -8237,7 +8933,6 @@ $zh2HK=array(
"三æžç®¡" => "三極管",
"三極體" => "三極管",
"æ•°ç " => "數碼",
-"數ä½" => "數碼",
"软件" => "軟件",
"軟體" => "軟件",
"网络" => "網絡",
@@ -8435,6 +9130,8 @@ $zh2HK=array(
"希特勒" => "希特拉",
"狄安娜" => "戴安娜",
"黛安娜" => "戴安娜",
+"英è”邦" => "英è¯é‚¦",
+"大英國å”" => "英è¯é‚¦",
);
$zh2SG=array(
diff --git a/includes/normal/README b/includes/normal/README
index 3424507d6f27..f8207a1b2e3e 100644
--- a/includes/normal/README
+++ b/includes/normal/README
@@ -32,3 +32,24 @@ have been changed or you remove it.
data from from the net if necessary. If it reports failure, something is
going wrong!
+
+== Benchmarks ==
+
+Run 'make bench' to download some sample texts from Wikipedia and run some
+cheap benchmarks of some of the functions. Take all numbers with large
+grains of salt.
+
+
+== PHP module extension ==
+
+There's an experimental PHP extension module which wraps the ICU library's
+normalization functions. This is *MUCH* faster than doing this work in pure
+PHP code. This is in the 'normal' directory in MediaWiki's CVS extensions
+module. It is known to work with PHP 4.3.8 and 5.0.2 on Linux/x86 but hasn't
+been thoroughly tested on other configurations.
+
+If the php_normal.so module is loaded in php.ini, the normalization functions
+will automatically use it. If you can't (or don't want to) load it in php.ini,
+you may be able to load it using the dl() function before include()ing or
+require()ing UtfNormal.php, and it will be picked up.
+
diff --git a/includes/normal/UtfNormalGenerate.php b/includes/normal/UtfNormalGenerate.php
index 65128b706e66..efe25de5641e 100644
--- a/includes/normal/UtfNormalGenerate.php
+++ b/includes/normal/UtfNormalGenerate.php
@@ -26,6 +26,11 @@
*/
/** */
+
+if( php_sapi_name() != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
require_once 'UtfNormalUtil.php';
$in = fopen("DerivedNormalizationProps.txt", "rt" );
diff --git a/includes/templates/Userlogin.php b/includes/templates/Userlogin.php
index 05da76a10191..dfad7d40c5f9 100644
--- a/includes/templates/Userlogin.php
+++ b/includes/templates/Userlogin.php
@@ -1,5 +1,9 @@
<?php
+if( !defined( 'MEDIAWIKI' ) ) die();
+
+require_once( 'includes/SkinTemplate.php' );
+
/**
* HTML template for Special:Userlogin form
* @package MediaWiki
@@ -13,7 +17,7 @@ class UserloginTemplate extends QuickTemplate {
<p class='error'><?php $this->html('error') ?></p>
<?php } else { ?>
<h2><?php $this->msg('login' ) ?>:</h2>
- <p><?php $this->msg('loginprompt') ?></p>
+ <p><?php $this->msgWiki('loginprompt') ?></p>
<?php } ?>
<form name="userlogin" id="userlogin" method="post" action="<?php $this->text('action') ?>">
<table border='0'>
@@ -98,7 +102,7 @@ class UserloginTemplate extends QuickTemplate {
</table>
</form>
<?php
- $this->msgHtml( 'loginend' );
+ $this->msgWiki( 'loginend' );
}
}
diff --git a/includes/zhtable/Makefile b/includes/zhtable/Makefile
index 372109b65290..cca4bb940b24 100644
--- a/includes/zhtable/Makefile
+++ b/includes/zhtable/Makefile
@@ -2,9 +2,8 @@
# 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. There are also special tables used to for adjustment.
-# Some data in the file simp2trad.manual was taken from the following
-# paper:
+# the SCIM packages and the libtabe package. There are also special
+# tables used to for adjustment.
#
GREP = LANG=zh_CN.UTF8 grep
@@ -42,7 +41,7 @@ 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
+ cat wordlist | $(SED) '/[a-zA-Z]/d' | sort | uniq | $(SED) 's/ //g' > t
mv t wordlist
printutf8: printutf8.c
@@ -54,7 +53,7 @@ unihan.t2s.t: Unihan.txt printutf8
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
+ cat tmp1 trad2simp.manual > trad2simp.t
unihan.s2t.t: Unihan.txt printutf8
$(GREP) kTraditionalVariant Unihan.txt | $(SED) '/#/d' | $(SED) 's/kTraditionalVariant//' | ./printutf8 > unihan.s2t.t
@@ -62,7 +61,7 @@ unihan.s2t.t: Unihan.txt printutf8
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
+ cat tmp1 simp2trad.manual > 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
@@ -122,7 +121,7 @@ tradphrases_4.t: alltradphrases.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
+ cat tradphrases_2.t tradphrases_3.t tradphrases_4.t tradphrases.manual |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
mv t tradphrases.t
diff --git a/includes/zhtable/simp2trad.manual b/includes/zhtable/simp2trad.manual
index b5e1c3aee40e..922fb85f9683 100644
--- a/includes/zhtable/simp2trad.manual
+++ b/includes/zhtable/simp2trad.manual
@@ -1,4 +1,4 @@
-U+0753b画|U+0756b畫|U+07575畵|
+U+053eaåª|U+053eaåª|U+096bbéš»|
U+0677fæ¿|U+0677fæ¿|U+095c6é—†|
U+08868表|U+08868表|U+09336錶|
U+0624dæ‰|U+0624dæ‰|U+07e94纔|
@@ -11,83 +11,134 @@ U+04e30丰|U+08c50è±|U+04e30丰|
U+0522e刮|U+0522e刮|U+098b3颳|
U+0540eåŽ|U+05f8c後|U+0540eåŽ|
U+080e1胡|U+080e1胡|U+09b0dé¬|U+0885aè¡š|
-U+056de回|U+056de回|U+08ff4迴|
+U+056de回|U+056de回|U+08ff4迴|U+056d8囘|
+U+091cc里|U+091cc里|U+088e1裡|U+088cfè£|
+U+0672f术|U+08853術|U+0672f术|U+0672e朮|
+U+05e72干|U+04e7e乾|U+05e72干|U+05e79幹|U+069a6榦|
+U+06c88沈|U+06c88沈|U+0700b瀋|
+U+053f0å°|U+081fa臺|U+053f0å°|U+06aaf檯|U+098b1颱|
+U+0753b画|U+0756b畫|U+07575畵|
+U+05212划|U+05283劃|U+05212划|
+U+05382厂|U+05ee0廠|U+05382厂|
U+04f19伙|U+05925夥|U+04f19伙|
-U+059dc姜|U+08591薑|U+059dc姜|
-U+0501f借|U+0501f借|U+085c9藉|
+U+059dc姜|U+059dc姜|U+08591薑|
U+0514b克|U+0514b克|U+0524b剋|
U+056f0å›°|U+056f0å›°|U+0774fç|
U+06f13漓|U+06f13漓|U+07055ç•|
-U+091cc里|U+091cc里|U+088e1裡|U+088cfè£|
+U+056e2团|U+05718團|U+07cf0糰|
+U+0987b须|U+09808須|U+09b1a鬚|
+U+0810fè„|U+081df臟|U+09ad2é«’|
+U+0949fé’Ÿ|U+09418é˜|U+0937eé¾|
+U+0836fè¯|U+085e5è—¥|U+0846f葯|
+U+0540cåŒ|U+0540cåŒ|U+08855è¡•|
+U+05fd7志|U+05fd7志|U+08a8c誌|
+U+0676fæ¯|U+0676fæ¯|U+076c3盃|
+U+05cb3岳|U+05cb3岳|U+05dbd嶽|
+U+05e03布|U+05e03布|U+04f48佈|
+U+05f53当|U+07576當|U+05679噹|
+U+0540aåŠ|U+05f14å¼”|U+0540aåŠ|
+U+04ec7仇|U+04ec7仇|U+08b8e讎|
+U+0501f借|U+0501f借|U+085c9藉|
U+05e18帘|U+07c3e簾|U+05e18帘|
U+09709霉|U+09709霉|U+09ef4黴|
-U+09762é¢|U+09762é¢|U+09eb5麵|
U+08511蔑|U+08511蔑|U+0884a衊|
-U+05343åƒ|U+05343åƒ|U+097c6韆|
-U+079cb秋|U+079cb秋|U+097a6鞦|
+U+091c7采|U+063a1採|U+091c7采|U+057f0埰|
+U+094b5钵|U+07f3d缽|U+09262鉢|
+U+09508锈|U+092b9銹|U+093fdé½|
+U+09510é”|U+092b3銳|U+092edé‹­|
U+0677eæ¾|U+0677eæ¾|U+09b06鬆|
-U+054b8å’¸|U+054b8å’¸|U+09e79é¹¹|
U+05411å‘|U+05411å‘|U+056aeåš®|U+066cfæ›|
U+04f59余|U+09918餘|U+04f59余|
U+090c1éƒ|U+09b31鬱|U+090c1éƒ|
U+05fa1御|U+05fa1御|U+079a6禦|
U+0613f愿|U+09858願|U+0613f愿|
-U+04e91云|U+096f2雲|U+04e91云|
-U+082b8芸|U+082b8芸|U+08553蕓|
-U+06c84沄|U+06c84沄|U+06f90æ¾|
U+081f4致|U+081f4致|U+07dfb緻|
U+05236制|U+05236制|U+088fd製|
-U+06731朱|U+06731朱|U+07843硃|
U+07b51筑|U+07bc9築|U+07b51筑|
U+051c6准|U+06e96準|U+051c6准|
-U+05382厂|U+05ee0廠|U+05382厂|
U+05e7f广|U+05ee3廣|U+05e7f广|
-U+08f9f辟|U+095e2闢|U+08f9f辟|
-U+0522b别|U+05225別|U+05f46彆|
U+0535cåœ|U+0535cåœ|U+08514è””|
-U+06c88沈|U+06c88沈|U+0700b瀋|
U+051b2冲|U+06c96æ²–|U+0885dè¡|
U+079cdç§|U+07a2e種|U+079cdç§|
U+0866b虫|U+087f2蟲|U+0866b虫|
U+062c5æ‹…|U+064d4æ“”|U+062c5æ‹…|
-U+0515a党|U+09ee8黨|U+0515a党|
+U+067dc柜|U+06ac3櫃|U+067dc柜|
U+06597斗|U+09b25鬥|U+06597斗|
U+0513få„¿|U+05152å…’|U+0513få„¿|
-U+05e72干|U+04e7e乾|U+05e79幹|U+05e72干|U+069a6%G榦%@|
-U+08c37è°·|U+08c37è°·|U+07a40ç©€|
-U+067dc柜|U+06ac3櫃|U+067dc柜|
-U+05408åˆ|U+05408åˆ|U+095a4é–¤|
-U+05212划|U+05283劃|U+05212划|
+U+0590då¤|U+05fa9復|U+08907複|U+08986覆|
+U+06c47汇|U+0532f匯|U+05f59彙|
U+0574få|U+058de壞|U+0574få|
-U+051e0几|U+05e7e幾|U+051e0几|
-U+07cfb系|U+07cfb系|U+07e6b繫|U+04fc2係|
-U+05bb6家|U+05bb6家|U+050a2傢|
-U+04ef7价|U+050f9價|U+04ef7价|
U+0636eæ®|U+064daæ“š|U+0636eæ®|
-U+05377å·|U+06372æ²|U+05377å·|
U+09002适|U+09069é©|U+09002适|
+U+04ef7价|U+050f9價|U+04ef7价|
U+08721蜡|U+0881f蠟|U+08721蜡|
U+0814a腊|U+081d8臘|U+0814a腊|
U+04e86了|U+04e86了|U+077ad瞭|
-U+07d2fç´¯|U+07d2fç´¯|U+07e8dçº|
-U+04e48么|U+09ebd麽|U+04e48么|U+05e7a幺|U+09ebc麼|
-U+08499蒙|U+08499蒙|U+077c7矇|U+06fdb濛|U+061de懞|
U+04e07万|U+0842cè¬|U+04e07万|
U+05b81å®|U+05be7寧|U+05b81å®|
U+06734朴|U+06a38樸|U+06734朴|
U+082f9苹|U+0860b蘋|U+082f9苹|
-U+04ec6仆|U+050d5僕|U+04ec6仆|
U+066f2曲|U+066f2曲|U+09eaf麯|
-U+0786e确|U+078ba確|U+0786e确|
-U+0820dèˆ|U+0820dèˆ|U+06368æ¨|
U+080dc胜|U+052ddå‹|U+080dc胜|
-U+0672f术|U+08853術|U+0672f术|U+0672e朮|
-U+053f0å°|U+053f0å°|U+081fa臺|U+06aaf檯|U+098b1颱|
-U+04f53体|U+09ad4體|U+04f53体|
U+06d82涂|U+05857塗|U+06d82涂|
U+053f6å¶|U+08449葉|U+053f6å¶|
-U+05401å|U+05401å|U+07c72ç±²|
-U+065cbæ—‹|U+065cbæ—‹|U+0955fé•Ÿ|
+U+05401å|U+07c72ç±²|U+05401å|
+U+065cbæ—‹|U+065cbæ—‹|U+093c7é‡|
+U+07ea4纤|U+07e96纖|U+07e34縴|
+U+082cfè‹|U+08607蘇|U+056cc囌|
+U+05899墙|U+07246牆|U+058bb墻|
+U+06781æž|U+06975極|U+06781æž|
+U+07ad6竖|U+08c4e豎|U+07aea竪|
+U+07ee3绣|U+07e61繡|U+07d89綉|
+U+09cc4鳄|U+09c77é±·|U+09c10é°|
+U+04f53体|U+09ad4體|U+04f53体|
+U+0515a党|U+09ee8黨|U+0515a党|
+U+09893颓|U+09839頹|U+0983d頽|
+U+04ea7产|U+07522產|U+07523産|
+U+0989c颜|U+0984fé¡|U+09854é¡”|
+U+08bf4说|U+08aaa說|U+08aac説|
+U+09605阅|U+095b1閱|U+095b2閲|
+U+07ebf线|U+07dda線|U+07dab綫|
+U+04e3a为|U+070ba為|U+07232爲|
+U+04f2a伪|U+0507då½|U+050de僞|
+U+06ca9沩|U+06e88溈|U+06f59潙|
+U+059ab妫|U+05aaf媯|U+05b00嬀|
+U+04f17众|U+0773e眾|U+08846衆|
+U+094a9钩|U+09264鉤|U+0920e鈎|
+U+09e21鸡|U+096de雞|U+09dc4鷄|
+U+058f3壳|U+06bbc殼|U+06bbb殻|
+U+060ab悫|U+06128愨|U+06164慤|
+U+0915dé…|U+0919e醞|U+09196醖|
+U+08574蕴|U+0860a蘊|U+085f4藴|
+U+08c23谣|U+08b20謠|U+08b21謡|
+U+09a82骂|U+07f75罵|U+099e1駡|
+U+05395厕|U+05ec1å»|U+053a0厠|
+U+07eff绿|U+07da0綠|U+07dd1緑|
+U+07eddç»|U+07d55絕|U+07d76絶|
+U+0954cé•Œ|U+0942bé«|U+093b8鎸|
+U+05956奖|U+0734eçŽ|U+0596c奬|
+U+0542få¯|U+0555få•Ÿ|U+05553å•“|
+U+09762é¢|U+09762é¢|U+09eaa麪|U+09eb5麵|U+09eab麫|
+U+054b8å’¸|U+054b8å’¸|U+09e79é¹¹|
+U+04e91云|U+096f2雲|U+04e91云|
+U+082b8芸|U+082b8芸|U+08553蕓|
+U+06c84沄|U+06c84沄|U+06f90æ¾|
+U+06731朱|U+06731朱|U+07843硃|
+U+08f9f辟|U+095e2闢|U+08f9f辟|
+U+0522b别|U+05225別|U+05f46彆|
+U+05e72å¹²|U+04e7eä¹¾|U+05e79å¹¹|U+05e72å¹²|
+U+08c37è°·|U+08c37è°·|U+07a40ç©€|
+U+05408åˆ|U+05408åˆ|U+095a4é–¤|
+U+051e0几|U+05e7e幾|U+051e0几|
+U+07cfb系|U+07cfb系|U+07e6b繫|U+04fc2係|
+U+05bb6家|U+05bb6家|U+050a2傢|
+U+05377å·|U+06372æ²|U+05377å·|
+U+07d2fç´¯|U+07d2fç´¯|U+07e8dçº|
+U+04e48么|U+09ebd麽|U+04e48么|U+05e7a幺|U+09ebc麼|
+U+08499蒙|U+08499蒙|U+077c7矇|U+06fdb濛|U+061de懞|
+U+04ec6仆|U+050d5僕|U+04ec6仆|
+U+0786e确|U+078ba確|U+0786e确|
+U+0820dèˆ|U+0820dèˆ|U+06368æ¨|
U+04f63ä½£|U+050adå‚­|U+04f63ä½£|
U+04e0e与|U+08207與|U+04e0e与|
U+06298折|U+06298折|U+0647a摺|
@@ -95,8 +146,10 @@ U+05f81å¾|U+05fb5å¾µ|U+05f81å¾|
U+075c7症|U+075c7症|U+07665癥|
U+06076æ¶|U+060e1惡|U+05641å™|
U+053d1å‘|U+0767c發|U+09aeeé«®|
-U+0590då¤|U+05fa9復|U+08907複|U+08986覆|
-U+06c47汇|U+0532f匯|U+05f59彙|
+U+05978奸|U+05978奸|U+059e6姦|
+U+06e38游|U+06e38游|U+0904aéŠ|
+U+04e8e于|U+04e8e于|U+065bc於|
+U+05938夸|U+05938夸|U+08a87誇|
U+083b7获|U+07372ç²|U+07a6bç©«|
U+09965饥|U+098e2飢|U+09951饑|
U+05c3d尽|U+076e1盡|U+05118儘|
@@ -104,75 +157,28 @@ U+05386历|U+06b77歷|U+066c6曆|
U+05364å¤|U+06ef7æ»·|U+09e75é¹µ|
U+05f25弥|U+05f4c彌|U+07030瀰|
U+07b7eç­¾|U+07c3dç°½|U+07c56ç±–|
-U+07ea4纤|U+07e96纖|U+07e34縴|
-U+082cfè‹|U+08607蘇|U+056cc囌|
U+0575bå›|U+058c7壇|U+07f48罈|
-U+056e2团|U+05718團|U+07cf0糰|
-U+0987b须|U+09808須|U+09b1a鬚|
-U+0810fè„|U+081df臟|U+09ad2é«’|
-U+053eaåª|U+053eaåª|U+096bbéš»|
-U+0949fé’Ÿ|U+09418é˜|U+0937eé¾|
-U+0836fè¯|U+085e5è—¥|U+0846f葯|
-U+0540cåŒ|U+0540cåŒ|U+08855è¡•|
-U+05fd7志|U+05fd7志|U+08a8c誌|
-U+0676fæ¯|U+0676fæ¯|U+076c3盃|
-U+05cb3岳|U+05cb3岳|U+05dbd嶽|
-U+05e03布|U+05e03布|U+04f48佈|
-U+05f53当|U+07576當|U+05679噹|
-U+0540aåŠ|U+05f14å¼”|U+0540aåŠ|
-U+04ec7仇|U+04ec7仇|U+08b8e讎|
-U+08574蕴|U+0860a蘊|U+085f4藴|
-U+07ebf线|U+07dda線|U+07dab綫|
-U+04e3a为|U+070ba為|U+07232爲|
-U+04ea7产|U+07522產|U+07523産|
-U+04f17众|U+0773e眾|U+08846衆|
-U+04f2a伪|U+0507då½|U+050de僞|
U+051eb凫|U+09ce7鳧|U+09cec鳬|
-U+05395厕|U+05ec1å»|U+053a0厠|
-U+0542få¯|U+0555få•Ÿ|U+05553å•“|
-U+05899墙|U+07246牆|U+058bb墻|
-U+058f3壳|U+06bbc殼|U+06bbb殻|
-U+05956奖|U+0734eçŽ|U+0596c奬|
-U+059ab妫|U+05aaf媯|U+05b00嬀|
-U+05e76并|U+04e26並|U+04f75併|
-U+05f55录|U+09304錄|U+09332録|
-U+060ab悫|U+06128愨|U+06164慤|
-U+06781æž|U+06975極|U+06781æž|
-U+06ca9沩|U+06e88溈|U+06f59潙|
+U+05e76并|U+04e26並|U+04f75併|U+05e76并|
+U+05f55录|U+09304錄|U+09332録|U+05f54彔|
U+07618瘘|U+0763a瘺|U+0763b瘻|
U+07877硷|U+09e7c鹼|U+07906礆|
-U+07ad6竖|U+08c4e豎|U+07aea竪|
-U+07eddç»|U+07d55絕|U+07d76絶|
-U+07ee3绣|U+07e61繡|U+07d89綉|
U+07ee6绦|U+07d5b絛|U+07e27縧|
U+07ef1ç»±|U+07dd4ç·”|U+0979déž|
U+07ef7绷|U+07db3綳|U+07e43繃|
-U+07eff绿|U+07da0綠|U+07dd1緑|
U+07f30ç¼°|U+097c1éŸ|U+07e6eç¹®|
U+082e7苧|U+082ce苎|U+085b4薴|
U+083bc莼|U+08493蒓|U+084f4蓴|
-U+08bf4说|U+08aaa說|U+08aac説|
-U+08c23谣|U+08b20謠|U+08b21謡|
U+08c2b谫|U+08b7e譾|U+08b2d謭|
U+08d43赃|U+08d13贓|U+08d1c贜|
U+08d4dèµ|U+09f4e齎|U+08ceb賫|
U+08d5dèµ|U+08d17è´—|U+08d0bè´‹|
-U+0915dé…|U+0919e醞|U+09196醖|
-U+091c7采|U+063a1採|U+091c7采|U+057f0埰|
-U+094a9钩|U+09264鉤|U+0920e鈎|
-U+094b5钵|U+07f3d缽|U+09262鉢|
-U+09508锈|U+092b9銹|U+093fdé½|
-U+09510é”|U+092b3銳|U+092edé‹­|
U+09528锨|U+06774æ´|U+09341é|
-U+0954cé•Œ|U+0942bé«|U+093b8鎸|
U+09562é•¢|U+09481é’|U+0941dé|
-U+09605阅|U+095b1閱|U+095b2閲|
-U+09893颓|U+09839頹|U+0983d頽|
-U+0989c颜|U+0984fé¡|U+09854é¡”|
-U+09980馀|U+09918餘|
-U+09a82骂|U+07f75罵|U+099e1駡|
U+09c87鲇|U+09bf0鯰|U+09b8e鮎|
U+09c9e鲞|U+09bd7鯗|U+09b9dé®|
-U+09cc4鳄|U+09c77é±·|U+09c10é°|
-U+09e21鸡|U+096de雞|U+09dc4鷄|
U+09e5a鹚|U+09dbf鶿|U+09dc0鷀|
+U+06697æš—|U+06697æš—|U+095c7é—‡|
+U+04feeä¿®|U+04feeä¿®|U+08129è„©|
+U+051ed凭|U+051ed凭|U+06191憑|
+U+06ce8注|U+06ce8注|U+08a3b註| \ No newline at end of file
diff --git a/includes/zhtable/toCN.manual b/includes/zhtable/toCN.manual
index caff9c14e37d..484d7a32a814 100644
--- a/includes/zhtable/toCN.manual
+++ b/includes/zhtable/toCN.manual
@@ -5,7 +5,6 @@
乙太網 以太网
點陣圖 ä½å›¾
å¸¸å¼ ä¾‹ç¨‹
-é€šé“ ä¿¡é“
游標 光标
光碟 光盘
光碟機 光驱
@@ -66,7 +65,6 @@
解æžåº¦ 分辨率
ç¨‹å¼ ç¨‹åº
伺æœå™¨ æœåŠ¡å™¨
-等於 等于
å€åŸŸç¶² 局域网
上傳 上载
電腦 计算机
@@ -102,7 +100,6 @@
二極管 二æžç®¡
三極體 三æžç®¡
三極管 三æžç®¡
-æ•¸ä½ æ•°ç 
數碼 æ•°ç 
軟體 软件
軟件 软件
@@ -328,4 +325,16 @@
希特拉 希特勒
戴安娜 狄安娜
黛安娜 狄安娜
-希拉 赫拉 \ No newline at end of file
+希拉 赫拉
+作業系統 æ“作系统
+資訊 ä¿¡æ¯
+è‘—å è‘—å
+å‡½å¼ å‡½æ•°
+ç‰©ä»¶å°Žå‘ é¢å‘对象
+å»ºæ§‹å¼ æž„é€ å‡½æ•°
+筆記型電腦 笔记本电脑
+酵素 酶
+盤尼西林 é’霉素
+塞爾維亞與蒙特內格羅 塞尔维亚和黑山
+å¤§è‹±åœ‹å” è‹±è”邦
+英è¯é‚¦ 英è”邦 \ No newline at end of file
diff --git a/includes/zhtable/toHK.manual b/includes/zhtable/toHK.manual
index ab62345573a0..4ef0a5a525c8 100644
--- a/includes/zhtable/toHK.manual
+++ b/includes/zhtable/toHK.manual
@@ -11,7 +11,6 @@
三æžç®¡ 三極管
三極體 三極管
æ•°ç  æ•¸ç¢¼
-æ•¸ä½ æ•¸ç¢¼
软件 軟件
軟體 軟件
网络 網絡
@@ -208,4 +207,6 @@
迈克尔·舒马赫 舒麥加
希特勒 希特拉
狄安娜 戴安娜
-黛安娜 戴安娜 \ No newline at end of file
+黛安娜 戴安娜
+英è”邦 英è¯é‚¦
+å¤§è‹±åœ‹å” è‹±è¯é‚¦ \ No newline at end of file
diff --git a/includes/zhtable/toTW.manual b/includes/zhtable/toTW.manual
index 5c90dbe334ed..05a2d3c75ecd 100644
--- a/includes/zhtable/toTW.manual
+++ b/includes/zhtable/toTW.manual
@@ -46,6 +46,7 @@
ç«¯å£ åŸ 
ç®—å­ é‹ç®—å…ƒ
算法 演算法
+演算法 演算法
芯片 晶片
芯片 晶元
è¯ç»„ 片語
@@ -64,13 +65,10 @@
写ä¿æŠ¤ 防寫
åˆ†å¸ƒå¼ åˆ†æ•£å¼
分辨率 解æžåº¦
-ç¨‹åº ç¨‹å¼
æœåŠ¡å™¨ 伺æœå™¨
-等于 等於
局域网 å€åŸŸç¶²
上载 上傳
计算机 電腦
-å® å·¨é›†
扫瞄仪 掃瞄器
宽带 寬頻
çª—å£ è¦–çª—
@@ -219,7 +217,6 @@
斯洛文尼亞 斯洛維尼亞
新西兰 ç´è¥¿è˜­
新西蘭 ç´è¥¿è˜­
-æœé²œ 北韓
格林纳达 格瑞那é”
格林ç´é” 格瑞那é”
æ ¼é²å‰äºš 喬治亞
@@ -306,4 +303,14 @@
凡高 梵谷
狄安娜 黛安娜
戴安娜 黛安娜
-赫拉 希拉 \ No newline at end of file
+赫拉 希拉
+æ“作系统 作業系統
+ä¿¡æ¯ è³‡è¨Š
+é¢å‘对象 物件導å‘
+构造函数 建構å¼
+笔记本电脑 筆記型電腦
+é’霉素 盤尼西林
+塞尔维亚和黑山 塞爾維亞與蒙特內格羅
+英è”邦 大英國å”
+英è¯é‚¦ 大英國å”
+ä¸‹é¢ ä¸‹é¢
diff --git a/includes/zhtable/trad2simp.manual b/includes/zhtable/trad2simp.manual
index da069310c675..108095f07d05 100644
--- a/includes/zhtable/trad2simp.manual
+++ b/includes/zhtable/trad2simp.manual
@@ -13,3 +13,5 @@ U+056aeåš®|U+05411å‘|
U+09031週|U+05468周|
U+0904aéŠ|U+06e38游|
U+06de9淩|U+051cc凌|
+U+05f8c後|U+0540eåŽ|
+U+0540eåŽ|U+0540eåŽ|
diff --git a/index.php b/index.php
index 1de29771604f..4e7d896ab953 100644
--- a/index.php
+++ b/index.php
@@ -31,10 +31,6 @@ OutputPage::setEncodings(); # Not really used yet
$action = $wgRequest->getVal( "action", "view" );
$title = $wgRequest->getVal( "title" );
-# Placeholders in case of DB error
-$wgTitle = Title::newFromText( wfMsgForContent( "badtitle" ) );
-$wgArticle = new Article($wgTitle);
-
$action = strtolower( trim( $action ) );
if ($wgRequest->getVal( "printable" ) == "yes") {
$wgOut->setPrintable();
@@ -64,7 +60,11 @@ if ( !is_null( $wgTitle ) && !$wgTitle->userCanRead() ) {
wfProfileIn( "main-action" );
$search = $wgRequest->getText( 'search' );
-if( !is_null( $search ) && $search !== '' ) {
+if( $wgDisableInternalSearch && !is_null( $search ) && $search !== '' ) {
+ $wgTitle = Title::makeTitle( NS_SPECIAL, "Search" );
+}
+
+if( !$wgDisableInternalSearch && !is_null( $search ) && $search !== '' ) {
require_once( 'includes/SpecialSearch.php' );
$wgTitle = Title::makeTitle( NS_SPECIAL, "Search" );
wfSpecialSearch();
diff --git a/install-utils.inc b/install-utils.inc
index 1fb2cc8e82b9..105818d4004d 100644
--- a/install-utils.inc
+++ b/install-utils.inc
@@ -72,12 +72,14 @@ function replacevars( $ins ) {
$varnames = array(
"wgDBserver", "wgDBname", "wgDBintlname", "wgDBuser",
"wgDBpassword", "wgDBsqluser", "wgDBsqlpassword",
- "wgDBadminuser", "wgDBadminpassword"
+ "wgDBadminuser", "wgDBadminpassword", "wgDBprefix"
);
foreach ( $varnames as $var ) {
global $$var;
$ins = str_replace( '{$' . $var . '}', $$var, $ins );
+ $ins = str_replace( '/*$' . $var . '*/`', '`' . $$var, $ins );
+ $ins = str_replace( '/*$' . $var . '*/', $$var, $ins );
}
return $ins;
}
diff --git a/irc/rcdumper.php b/irc/rcdumper.php
index 002b046a7961..2913350e1faf 100644
--- a/irc/rcdumper.php
+++ b/irc/rcdumper.php
@@ -4,7 +4,7 @@
Example command-line:
php rcdumper.php | irc -d -c \#channel-to-join nick-of-bot some.irc.server
where irc is the name of the ircII executable.
-The name of the IRC server should match $ircServer below.
+The name of the the IRC should match $ircServer below.
*/
$ircServer = "irc.freenode.net";
@@ -48,34 +48,35 @@ if ( empty($options['b']) ) {
if (isset($args[0]) && isset($args[1])) {
$lowest = $args[0];
$highest = $args[1];
- #$what = $args[0][0];
- #$highest = $args[0][1];
}
-#sleep(30);
-$res = $dbr->query( "SELECT rc_timestamp FROM $recentchanges ORDER BY rc_timestamp DESC LIMIT 1" );
-$row = $dbr->fetchObject( $res );
-$oldTimestamp = $row->rc_timestamp;
+$res = wfQuery( "SELECT MAX(rc_id) as m FROM recentchanges", DB_READ );
+$row = wfFetchObject( $res );
+$oldId = $row->m;
$serverCount = 0;
while (1) {
- $res = $dbr->query( "SELECT * FROM $recentchanges WHERE rc_timestamp>'$oldTimestamp' ORDER BY rc_timestamp" );
+ $res = wfQuery( "SELECT rc_this_oldid,rc_timestamp,rc_user_text,rc_namespace,rc_title,rc_comment,rc_minor,
+ rc_bot,rc_new,rc_cur_id,rc_last_oldid,rc_type,rc_moved_to_ns,rc_moved_to_title,rc_id,
+ cur_text, old_text, old_flags FROM recentchanges LEFT OUTER JOIN old ON rc_last_oldid=old_id
+ LEFT OUTER JOIN cur ON rc_cur_id=cur_id WHERE rc_id>'$oldId' $bots
+ ORDER BY rc_timestamp", DB_READ );
+
$rowIndex = 0;
- while ( $row = $dbr->fetchObject( $res ) ) {
- if ( ++$serverCount % 20 == 0 ) {
- print "/server $ircServer\n";
- }
+ while ( $row = wfFetchObject( $res ) ) {
+ $oldtext = $row->old_text;
+ if (strstr($row->old_flags, "gzip"))
+ $oldtext = gzinflate($oldtext);
+ $szdiff = strlen($row->cur_text) - strlen($oldtext);
+ if ($szdiff >= 0)
+ $szdiff = "+$szdiff";
$ns = $wgLang->getNsText( $row->rc_namespace ) ;
if ( $ns ) {
$title = "$ns:{$row->rc_title}";
} else {
$title = $row->rc_title;
}
- /*if ( strlen( $row->rc_comment ) > 50 ) {
- $comment = substr( $row->rc_comment, 0, 50 );
- } else {*/
- $comment = $row->rc_comment;
-// }
+ $comment = $row->rc_comment;
$bad = array("\n", "\r");
$empty = array("", "");
$comment = str_replace($bad, $empty, $comment);
@@ -83,7 +84,6 @@ while (1) {
$a = $title[0];
if ($a < 'A' || $a > 'Z')
$a = 'Z';
- #if ((isset($highest)) && (($what == "<" && $a > "$highest") || ($what == ">" && $a <= "$highest")))
if ((isset($highest) && ($a > $highest)) || (isset($lowest) && $a <= $lowest))
continue;
$user = str_replace($bad, $empty, $row->rc_user_text);
@@ -99,18 +99,18 @@ while (1) {
}
$url = str_replace($stupid_urlencode, $haha_take_that, $url);
$title = str_replace("_", " ", $title);
- # see http://www.irssi.org/?page=docs&doc=formats for some colour codes. prefix is \003,
+ # see http://www.irssi.org/?page=docs&doc=formats for some colour codes. prefix is \003,
# no colour (\003) switches back to the term default
$comment = preg_replace("/\/\* (.*) \*\/(.*)/", "\00315\$1\003 - \00310\$2\003", $comment);
$fullString = "\00314[[\00307$title\00314]]\0034 $flag\00310 " .
- "\00302$url\003 \0035*\003 \00303$user\003 \0035*\003 \00310$comment\003\n";
+ "\00302$url\003 \0035*\003 \00303$user\003 \0035*\003 ($szdiff) \00310$comment\003\n";
if ( $channel ) {
$fullString = "$channel\t$fullString";
}
print( $fullString );
- $oldTimestamp = $row->rc_timestamp;
- sleep(2);
+ $oldId = max( $row->rc_id, $oldId );
+ sleep(1);
}
sleep(5);
}
diff --git a/languages/Language.php b/languages/Language.php
index f43024f54b61..4fec4da3c575 100644
--- a/languages/Language.php
+++ b/languages/Language.php
@@ -58,7 +58,8 @@ if(isset($wgExtraNamespaces)) {
'highlightbroken' => 1, 'stubthreshold' => 0,
'previewontop' => 1, 'editsection'=>1,'editsectiononrightclick'=>0, 'showtoc'=>1,
'showtoolbar' =>1,
- 'date' => 0, 'imagesize' => 2
+ 'date' => 0, 'imagesize' => 2,
+ 'fancysig' => 0,
);
/* private */ $wgQuickbarSettingsEn = array(
@@ -127,6 +128,7 @@ define( 'MW_DATE_USER_FORMAT', true );
'previewontop',
'previewonfirst',
'nocache',
+ 'fancysig'
);
/* private */ $wgBookstoreListEn = array(
@@ -205,7 +207,9 @@ $wgLanguageNamesEn =& $wgLanguageNames;
MAG_LOCALURL => array( 0, 'LOCALURL:' ),
MAG_LOCALURLE => array( 0, 'LOCALURLE:' ),
MAG_SERVER => array( 0, 'SERVER' ),
- MAG_GRAMMAR => array( 0, 'GRAMMAR:' )
+ MAG_GRAMMAR => array( 0, 'GRAMMAR:' ),
+ MAG_NOTITLECONVERT => array( 0, '__NOTITLECONVERT__', '__NOTC__'),
+ MAG_NOCONTENTCONVERT => array( 0, '__NOCONTENTCONVERT__', '__NOCC__'),
);
#-------------------------------------------------------------------
@@ -241,6 +245,7 @@ global $wgRightsText;
'tog-previewontop' => 'Show preview before edit box and not after it',
'tog-previewonfirst' => 'Show preview on first edit',
'tog-nocache' => 'Disable page caching',
+'tog-fancysig' => 'Raw signatures (without automatic link)',
# dates
'sunday' => 'Sunday',
@@ -471,6 +476,9 @@ Please report this to an administrator, making note of the URL.",
'formerror' => 'Error: could not submit form',
'badarticleerror' => 'This action cannot be performed on this page.',
'cannotdelete' => 'Could not delete the page or image specified. (It may have already been deleted by someone else.)',
+'block_compress_delete' => "Can't delete this article because it contains block-compressed revisions.
+This is a temporary situation which the developers are well aware of, and should be fixed within a month or two.
+Please mark the article for deletion and wait for a developer to fix our buggy software.",
'badtitle' => 'Bad title',
'badtitletext' => "The requested page title was invalid, empty, or
an incorrectly linked inter-language or inter-wiki title.",
@@ -530,7 +538,7 @@ Your account has been created. Don't forget to change your {{SITENAME}} preferen
'yournick' => 'Your nickname (for signatures)',
'emailforlost' => "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.<br /><br />Your real name, if you choose to provide it, will be used for giving you attribution for your work.",
-'prefs-help-userdata' => '* <strong>Real name</strong> (optional): if you choose to provide it this will be used for giving you attribution for your work.<br/>
+'prefs-help-userdata' => '* <strong>Real name</strong> (optional): if you choose to provide it this will be used for giving you attribution for your work.<br />
* <strong>Email</strong> (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.',
'loginerror' => 'Login error',
@@ -689,7 +697,7 @@ Please check the URL you used to access this page.\n",
'next' => 'next',
'last' => 'last',
'orig' => 'orig',
-'histlegend' => 'Diff selection: mark the radio boxes of the versions to compare and hit enter or the button at the bottom.<br/>
+'histlegend' => 'Diff selection: mark the radio boxes of the versions to compare and hit enter or the button at the bottom.<br />
Legend: (cur) = difference with current version,
(last) = difference with preceding version, M = minor edit.',
'history_copyright' => '-',
@@ -1016,6 +1024,7 @@ That comes to '''$5''' average edits per page, and '''$6''' views per edit.",
'validate' => 'Validate page',
'lonelypages' => 'Orphaned pages',
'uncategorizedpages' => 'Uncategorized pages',
+'uncategorizedcategories' => 'Uncategorized categories',
'unusedimages' => 'Unused images',
'popularpages' => 'Popular pages',
'nviews' => '$1 views',
@@ -1280,7 +1289,7 @@ to a previously blocked IP address or username.',
'blocklogpage' => 'Block_log',
'blocklogentry' => 'blocked "$1" with an expiry time of $2',
'blocklogtext' => 'This is a log of user blocking and unblocking actions. Automatically
-blocked IP addresses are not be listed. See the [[Special:Ipblocklist|IP block list]] for
+blocked IP addresses are not listed. See the [[Special:Ipblocklist|IP block list]] for
the list of currently operational bans and blocks.',
'unblocklogentry' => 'unblocked "$1"',
'range_block_disabled' => 'The sysop ability to create range blocks is disabled.',
@@ -1338,6 +1347,7 @@ Type the name of the user in the box and press the button to make the user an ad
'makesysopfail' => "<b>User \"$1\" could not be made into a sysop. (Did you enter the name correctly?)</b>",
'setbureaucratflag' => 'Set bureaucrat flag',
'bureaucratlog' => 'Bureaucrat_log',
+'rightslogtext' => 'This is a log of changes to user rights.',
'bureaucratlogentry' => "Rights for user \"$1\" set \"$2\"",
'rights' => 'Rights:',
'set_user_rights' => 'Set user rights',
@@ -1356,8 +1366,8 @@ for a newer revision, but also keep your other settings for this article in
this revision, just select which option you intend to <i>change</i>, and
merging will fill in the other options with your previous settings.',
'val_noop' => 'No opinion',
-'val_percent' => '<b>$1%</b><br>($2 of $3 points<br>by $4 users)',
-'val_percent_single' => '<b>$1%</b><br>($2 of $3 points<br>by one user)',
+'val_percent' => '<b>$1%</b><br />($2 of $3 points<br />by $4 users)',
+'val_percent_single' => '<b>$1%</b><br />($2 of $3 points<br />by one user)',
'val_total' => 'Total',
'val_version' => 'Version',
'val_tab' => 'Validate',
@@ -1443,13 +1453,14 @@ article [[Train]].
'allmessages' => 'All system messages',
'allmessagestext' => 'This is a list of all system messages available in the MediaWiki: namespace.',
-'allmessagesnotsupportedUI' => 'Your current interface language <b>$1</b> is not supported by Special:AllMessages at this site.',
+'allmessagesnotsupportedUI' => 'Your current interface language <b>$1</b> is not supported by Special:AllMessages at this site. ',
'allmessagesnotsupportedDB' => 'Special:AllMessages not supported because wgUseDatabaseMessages is off.',
# Thumbnails
'thumbnail-more' => 'Enlarge',
'missingimage' => "<b>Missing image</b><br /><i>$1</i>\n",
+'filemissing' => 'File missing',
# Special:Import
'import' => 'Import pages',
@@ -1597,6 +1608,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');
'showbigimage' => 'Download high resolution version ($1x$2, $3 KB)',
'newimages' => 'New images gallery',
+'noimages' => 'Nothing to see.',
'sitesettings' => 'Site Settings',
'sitesettings-features' => 'Features',
@@ -1632,6 +1644,21 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');
'sitesettings-performance' => 'Performance',
'sitesettings-images' => 'Images',
+# short names for language variants used for language conversion links.
+# to disable showing a particular link, set it to 'disable', e.g.
+# 'variantname-zh-sg' => 'disable',
+'variantname-zh-cn' => 'cn',
+'variantname-zh-tw' => 'tw',
+'variantname-zh-hk' => 'hk',
+'variantname-zh-sg' => 'sg',
+'variantname-zh' => 'zh',
+
+# Chinese conversion table
+'zhconversiontable' => '-{}-',
+
+# labels for User: and Title: on Special:Log pages
+'specialloguserlabel' => 'User: ',
+'speciallogtitlelabel' => 'Title: ',
);
@@ -1688,6 +1715,12 @@ class Language {
return false;
}
+ # short names for language variants used for language conversion links.
+ # so far only used by zh
+ function getVariantname( $code ) {
+ return wfMsg( 'variantname-' . $code );
+ }
+
function specialPage( $name ) {
return $this->getNsText(NS_SPECIAL) . ':' . $name;
}
@@ -1740,8 +1773,12 @@ class Language {
}
function getMonthName( $key ) {
- global $wgMonthNamesEn;
- return wfMsg($wgMonthNamesEn[$key-1]);
+ global $wgMonthNamesEn, $wgContLang;
+ // see who called us and use the correct message function
+ if( get_class( $wgContLang->getLangObj() ) == get_class( $this ) )
+ return wfMsgForContent($wgMonthNamesEn[$key-1]);
+ else
+ return wfMsg($wgMonthNamesEn[$key-1]);
}
/* by default we just return base form */
@@ -1750,13 +1787,21 @@ class Language {
}
function getMonthAbbreviation( $key ) {
- global $wgMonthAbbreviationsEn;
- return wfMsg(@$wgMonthAbbreviationsEn[$key-1]);
+ global $wgMonthAbbreviationsEn, $wgContLang;
+ // see who called us and use the correct message function
+ if( get_class( $wgContLang->getLangObj() ) == get_class( $this ) )
+ return wfMsgForContent(@$wgMonthAbbreviationsEn[$key-1]);
+ else
+ return wfMsg(@$wgMonthAbbreviationsEn[$key-1]);
}
function getWeekdayName( $key ) {
- global $wgWeekdayNamesEn;
- return wfMsg($wgWeekdayNamesEn[$key-1]);
+ global $wgWeekdayNamesEn, $wgContLang;
+ // see who called us and use the correct message function
+ if( get_class( $wgContLang->getLangObj() ) == get_class( $this ) )
+ return wfMsgForContent($wgWeekdayNamesEn[$key-1]);
+ else
+ return wfMsg($wgWeekdayNamesEn[$key-1]);
}
function userAdjust( $ts ) {
@@ -2036,106 +2081,18 @@ class Language {
return $word;
}
-
- # convert text to different variants of a language. the automatic
- # conversion is done in autoConvert(). here we parse the text
- # marked with -{}-, which specifies special conversions of the
- # text that can not be accomplished in autoConvert()
- #
- # syntax of the markup:
- # -{code1:text1;code2:text2;...}- or
- # -{text}- in which case no conversion should take place for text
- function convert( $text , $isTitle=false) {
- global $wgDisableLangConversion;
- if($wgDisableLangConversion)
- return $text;
- if(sizeof($this->getVariants())<2)
- return $text;
-
- if($isTitle)
- return $this->convertTitle($text);
-
- // no conversion if redirecting
- if(substr($text,0,9) == "#REDIRECT") {
- return $text;
- }
-
-
- $plang = $this->getPreferredVariant();
- $fallback = $this->getVariantFallback($plang);
-
- $tarray = explode("-{", $text);
- $tfirst = array_shift($tarray);
- $text = $this->autoConvert($tfirst);
-
- foreach($tarray as $txt) {
- $marked = explode("}-", $txt);
-
- $choice = explode(";", $marked{0});
- if(!array_key_exists(1, $choice)) {
- /* a single choice */
- $text .= $choice{0};
- } else {
- $choice1=false;
- $choice2=false;
- foreach($choice as $c) {
- $v = explode(":", $c);
- if(!array_key_exists(1, $v)) {
- //syntax error in the markup, give up
- break;
- }
- $code = trim($v{0});
- $content = trim($v{1});
- if($code == $plang) {
- $choice1 = $content;
- break;
- }
- if($code == $fallback)
- $choice2 = $content;
- }
- if ( $choice1 )
- $text .= $choice1;
- elseif ( $choice2 )
- $text .= $choice2;
- else
- $text .= $marked{0};
- }
- if(array_key_exists(1, $marked))
- $text .= $this->autoConvert($marked{1});
- }
-
+ # languages like Chinese need to be segmented in order for the diff
+ # to be of any use
+ function segmentForDiff( $text ) {
return $text;
}
-
- /* this does the real conversion to the preferred variant.
- see LanguageZh.php for example
- */
- function autoConvert( $text, $toVariant=false ) {
+ # and unsegment to show the result
+ function unsegmentForDiff( $text ) {
return $text;
}
- /* returns all possible variants of the given text
-
- normally we will just call autoConvert() for each variant, but
- in case of zh where the conversion is performed by zhdaemon,
- possibily over the network, we want to
- cut down the number of connections to save time.
- */
- function autoConvertToAllVariants($text) {
- $ret = array();
- $variants = $this->getVariants();
- if(sizeof($variants)==1) {
- return $false;
- }
- foreach( $variants as $lang=>$v ) {
- $ret[$v] = $this->autoConvert( $text, $v );
- }
- return $ret;
- }
-
- /* hook for converting the title, which may needs special treatment
- */
- function convertTitle( $text ) {
+ # convert text to different variants of a language.
+ function convert( $text , $isTitle=false) {
return $text;
}
@@ -2156,51 +2113,42 @@ class Language {
}
function getPreferredVariant() {
- global $wgUser;
-
- // if user logged in, get in from user's preference
- if( $wgUser->getID() != 0 )
- return $wgUser->getOption( 'variant' );
-
- // if we have multiple variants for this langauge,
- // pick the first one as default
- $v = $this->getVariants();
- if( !empty( $v ) )
- return $v{0};
-
- // otherwise there should really be just one variant,
- // get it from the class name
- $lang = strtolower( substr( get_class( $this ), 8 ) );
- return $lang;
+ return strtolower( substr( get_class( $this ), 8 ) );
}
/* if a language supports multiple variants, it is
possible that non-existing link in one variant
actually exists in another variant. this function
- tries to find it.
+ tries to find it. See e.g. LanguageZh.php
*/
function findVariantLink( &$link, &$nt ) {
- static $count=0; //used to limit this operation
- static $cache=array();
- global $wgDisableLangConversion;
- $count++;
- if( $wgDisableLangConversion || $count > 50)
- return;
- $variants = $this->autoConvertToAllVariants($link);
- if($variants == false) //give up
- return;
- foreach( $variants as $v ) {
- if(isset($cache[$v]))
- continue;
- $cache[$v] = 1;
- $varnt = Title::newFromText( $v );
- if( $varnt && $varnt->getArticleID() > 0 ) {
- $nt = $varnt;
- $link = $v;
- break;
- }
- }
+ return;
+ }
+
+ /*
+ returns an array of extra options used by User::getPageRenderHash()
+ */
+ function getExtraHashOptions() {
+ return '';
+ }
+
+ /**
+ * A regular expression to match legal word-trailing characters
+ * which should be merged onto a link of the form [[foo]]bar.
+ * FIXME
+ *
+ * @return string
+ * @access public
+ */
+ function linkTrail() {
+ $trail = $this->getMessage( 'linktrail' );
+ if( empty( $trail ) ) $trail = Language::linkTrail();
+ return $trail;
+ }
+
+ function getLangObj() {
+ return $this;
}
}
diff --git a/languages/LanguageAf.php b/languages/LanguageAf.php
index 284a2169ebb4..a2abccfd3619 100644
--- a/languages/LanguageAf.php
+++ b/languages/LanguageAf.php
@@ -286,13 +286,13 @@ moenie vergeet om jou persoonlike voorkeure te stel nie.",
"yourpasswordagain" => "Tik weer jou wagwoord in",
"newusersonly" => " (slegs nuwe gebruikers)",
"remembermypassword" => "Onthou my wagwoord oor sessies.",
-"loginproblem" => "<b>Daar was probleme met jou intekening.</b><br>Probeer weer.",
-"alreadyloggedin" => "<font color=red><b>Gebruiker $1, jy is reeds ingeteken.</b></font><br>\n",
+"loginproblem" => "<b>Daar was probleme met jou intekening.</b><br />Probeer weer.",
+"alreadyloggedin" => "<font color=red><b>Gebruiker $1, jy is reeds ingeteken.</b></font><br />\n",
"areyounew" => "Indien jy nuut is by {{SITENAME}}, en ingeteken,
voer jou gebruikersnaam en wagwoord in.
Jou e-pos is opsioneel; indien jy jou wagwoord vergeet, kan jy vra dat dit na
-die e-pos adres gestuur word.<br>\n",
+die e-pos adres gestuur word.<br />\n",
"login" => "Teken in",
"userlogin" => "Teken in",
@@ -331,7 +331,7 @@ Teken asseblief in na jy dit ontvang het.",
"showpreview" => "Wys voorskou",
"blockedtitle" => "Gebruiker is geblokkeer",
"blockedtext" => "Jou gebruikersnaam of IP-adres is deur $1 geblokkeer:
-<br>''$2''<p>Jy mag $1 of een van die ander [[{{ns:4}}:administreerders|administreerders]] kontak
+<br />''$2''<p>Jy mag $1 of een van die ander [[{{ns:4}}:administreerders|administreerders]] kontak
om dit te bespreek.",
"newarticle" => "(Nuut)",
"newarticletext" =>
@@ -359,7 +359,7 @@ As jy dit stoor, sal enige wysigings sedert hierdie wysiging verloor word.</stro
"yourdiff" => "Wysigings",
"copyrightwarning" => "Alle bydraes aan {{SITENAME}} word beskou as beskikbaar gestel onder
die ''GNU Free Documentation License'' (lees $1 vir meer inligting).
-As jy nie wil hê dat jou werk ongemagtig gewysig of versprei mag word nie, moet jy dit nie hier indien nie.<br>
+As jy nie wil hê dat jou werk ongemagtig gewysig of versprei mag word nie, moet jy dit nie hier indien nie.<br />
Jy belowe ons ook dat jy dit self geskryf het, of verkry het van 'n bron wat toelaat dat dit hier mag wees.<br />
<strong>Moenie werk beskerm deur kopiereg sonder toestemming indien nie!</strong>",
"longpagewarning" => "Waarskuwing: hierdie bladsy is $1 kilogrepe lank; sekere blaaiers
@@ -413,8 +413,8 @@ woorde wat nie geindekseer word nie, of spesifisering van meer as een woord (sle
bevat, word gewys).",
"powersearch" => "Soek",
"powersearchtext" => "
-Search in namespaces :<br>
-$1<br>
+Search in namespaces :<br />
+$1<br />
$2 List redirects Search for $3 $9", #fixMe
@@ -571,7 +571,7 @@ Volg asseblief hierdie skakel: ($2) na die beskrywingsbladsy en vul inligting in
"deleteimg" => "skrap",
"deleteimgcompletely" => "skrap",
"imghistlegend" => "Legende: (huidig) = dit is die huidige prent, (skrap) = skrap hierdie ou weergawe, (gaan terug) = gaan terug na hierdie ou weergawe.
-<br><i>Kliek die datum om die prent te sien wat op daardie datum gelaai is</i>.",
+<br /><i>Kliek die datum om die prent te sien wat op daardie datum gelaai is</i>.",
"imagelinks" => "Prentskakels",
"linkstoimage" => "Die volgende bladsye gebruik hierdie prent:",
"nolinkstoimage" => "Daar is geen bladsye wat hierdie prent gebruik nie.",
@@ -597,9 +597,9 @@ Dit werk uit op gemiddeld <b>$5</b> veranderings per bladsy, en bladsye word <b>
"maintenancebacklink" => "Terug na die instandhoudingsbladsy",
"disambiguations" => "Bladsye wat onduidelikhede opklaar",
"disambiguationspage" => "{{ns:4}}:Links_to_disambiguating_pages",
-"disambiguationstext" => "Die volgende artikels skakel na 'n <i>bladsy wat onduidelikhede opklaar</i>. Hulle behoort eerder na die relevante onderwerp te skakel.<br>'n Bladsy word gesien as een wat onduidelikhede opklaar as $1 daarna toe skakel.<br>Skakels van ander naamkontekste is <i>nie</i> hier gelys nie.",
+"disambiguationstext" => "Die volgende artikels skakel na 'n <i>bladsy wat onduidelikhede opklaar</i>. Hulle behoort eerder na die relevante onderwerp te skakel.<br />'n Bladsy word gesien as een wat onduidelikhede opklaar as $1 daarna toe skakel.<br />Skakels van ander naamkontekste is <i>nie</i> hier gelys nie.",
"doubleredirects" => "Dubbele aansture",
-"doubleredirectstext" => "<b>Let op:</b> Hierdie lys bevat moontlik false positiewe. Dit beteken gewoonlik dat daar nog teks met skakels onder die eerste #REDIRECT is.<br>\nElke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste reël van van die tweede aanstuurteks, wat gewoonlik die \"regte\" teikenbladsy gee waarna die eerste aanstuur behoort te wys.",
+"doubleredirectstext" => "<b>Let op:</b> Hierdie lys bevat moontlik false positiewe. Dit beteken gewoonlik dat daar nog teks met skakels onder die eerste #REDIRECT is.<br />\nElke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste reël van van die tweede aanstuurteks, wat gewoonlik die \"regte\" teikenbladsy gee waarna die eerste aanstuur behoort te wys.",
"brokenredirects" => "Stukkende aansture",
"brokenredirectstext" => "Die volgende aansture skakel na 'n bladsy wat nie bestaan nie.",
"selflinks" => "Bladsye met selfskakels",
@@ -760,7 +760,7 @@ Vul 'n spesifieke rede hier onder in (haal byvoorbeeld spesifieke bladsye wat ge
"noblockreason" => "Jy moet 'n rede vir die blokkering gee.",
"blockipsuccesssub" => "Blokkering het geslaag",
"blockipsuccesstext" => "Die IP-adres \"$1\" is geblok.
-<br>Kyk na [[Special:Ipblocklist|IP block list]] vir 'n oorsig van blokkerings.",
+<br />Kyk na [[Special:Ipblocklist|IP block list]] vir 'n oorsig van blokkerings.",
"unblockip" => "Maak IP-adres oop",
"unblockiptext" => "Gebruik die vorm hier onder om skryftoegang te herstel vir 'n voorheen geblokkeerde IP-adres.",
"ipusubmit" => "Maak hierdie adres oop",
@@ -787,7 +787,7 @@ Bevestig asseblief dat dit is wat jy wil doen.",
"lockdbsuccesssub" => "Databasissluit het geslaag",
"unlockdbsuccesssub" => "Databasisslot is verwyder",
"lockdbsuccesstext" => "Die {{SITENAME}} databasis is gesluit.
-<br>Onthou om dit te ontsluit wanneer jou onderhoud afgehandel is.",
+<br />Onthou om dit te ontsluit wanneer jou onderhoud afgehandel is.",
"unlockdbsuccesstext" => "Die {{SITENAME}} databasis is ontsluit.",
# SQL query
diff --git a/languages/LanguageBg.php b/languages/LanguageBg.php
index 753a7513d84f..89ddbc4c5e5e 100644
--- a/languages/LanguageBg.php
+++ b/languages/LanguageBg.php
@@ -469,7 +469,7 @@ MySQL дава грешка \"$3: $4\".\n",
'yourrealname' => 'Вашето иÑтинÑко име*',
'yournick' => 'ВашиÑÑ‚ пÑевдоним (за подпиÑи)',
'emailforlost' => '* Полетата, отбелÑзани ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° (*), Ñа незадължителни. ПоÑочването на електронна поща позволÑва на хората да Ñе Ñвържат Ñ Ð’Ð°Ñ, без да Ñе налага да им Ñъобщавате адреÑа Ñи, а Ñъщо може да Ñе използва, за да Ви Ñе изпрати нова парола, ако Ñлучайно забравите Ñегашната Ñи.<br /><br /> Ðко поÑочите иÑтинÑкото Ñи име, на него ще бъдат припиÑани Вашите приноÑи.',
-'prefs-help-userdata' => '* <strong>ИÑтинÑко име</strong> (незадължително): ако го поÑочите, на него ще бъдат припиÑани Вашите приноÑи.<br/>
+'prefs-help-userdata' => '* <strong>ИÑтинÑко име</strong> (незадължително): ако го поÑочите, на него ще бъдат припиÑани Вашите приноÑи.<br />
* <strong>Електронна поща</strong> (незадължително): позволÑва на хората да Ñе Ñвържат Ñ Ð’Ð°Ñ, без да Ñе налага да им Ñъобщавате адреÑа Ñи, а Ñъщо може да Ñе използва, за да Ви Ñе изпрати нова парола, ако Ñлучайно забравите Ñегашната Ñи.',
'loginerror' => 'Грешка при влизане',
'nocookiesnew' => "ПотребителÑката Ñметка бе Ñъздадена, но вÑе още не Ñте влезли. {{SITENAME}} използва биÑквитки при влизане на потребителите. МолÑ, разрешете биÑквитките във Ð’Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€, тъй като те Ñа забранени, и Ñлед това влезте Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñкото Ñи име и парола.",
@@ -620,7 +620,7 @@ MySQL дава грешка \"$3: $4\".\n",
'next' => 'Ñлед',
'last' => 'поÑл',
'orig' => 'ориг',
-'histlegend' => 'Разлики: направете отметки в кутийките Ñрещу верÑиите, които желаете да Ñравните, и натиÑнете "Enter" или бутона отдолу.<br/>
+'histlegend' => 'Разлики: направете отметки в кутийките Ñрещу верÑиите, които желаете да Ñравните, и натиÑнете "Enter" или бутона отдолу.<br />
Легенда: (<b>тек</b>) = разлика Ñ Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ‚Ð° верÑиÑ,
(<b>поÑл</b>) = разлика Ñ Ð¿Ñ€ÐµÐ´Ð¸ÑˆÐ½Ð°Ñ‚Ð° верÑиÑ, <b>Ðœ</b>&nbsp;=&nbsp;малка промÑна',
diff --git a/languages/LanguageBn.php b/languages/LanguageBn.php
index c8818899929e..8de6ab89a4bf 100644
--- a/languages/LanguageBn.php
+++ b/languages/LanguageBn.php
@@ -307,13 +307,13 @@ Don't forget to personalize your wikipedia preferences.",
"yourpasswordagain" => "Retype password",
"newusersonly" => " (new users only)",
"remembermypassword" => "Remember my password across sessions.",
-"loginproblem" => "<b>There has been a problem with your login.</b><br>Try again!",
-"alreadyloggedin" => "<font color=red><b>User $1, you are already logged in!</b></font><br>\n",
+"loginproblem" => "<b>There has been a problem with your login.</b><br />Try again!",
+"alreadyloggedin" => "<font color=red><b>User $1, you are already logged in!</b></font><br />\n",
"areyounew" => "If you are new to Wikipedia and want to get a user account,
enter a user name, then type and re-type a password.
Your e-mail address is optional; if you lose your password you can request
-that it be to the address you give.<br>\n",
+that it be to the address you give.<br />\n",
"login" => "Log in",
"userlogin" => "Log in",
@@ -357,7 +357,7 @@ Please log in again after you receive it.",
"showpreview" => "Show preview",
"blockedtitle" => "User is blocked",
"blockedtext" => "Your user name or IP address has been blocked by $1.
-The reason given is this:<br>''$2''<p>You may contact $1 or one of the other
+The reason given is this:<br />''$2''<p>You may contact $1 or one of the other
[[Wikipedia:administrators|administrators]] to discuss the block.",
"newarticle" => "(New)",
"newarticletext" =>
@@ -393,7 +393,7 @@ If you save it, any changes made since this revision will be lost.</strong>\n",
considered to be released under the GNU Free Documentation License
(see $1 for details).
If you don't want your writing to be edited mercilessly and redistributed
-at will, then don't submit it here.<br>
+at will, then don't submit it here.<br />
You are also promising us that you wrote this yourself, or copied it from a
public domain or similar free resource.
<strong>DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!</strong>",
@@ -462,8 +462,8 @@ 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).",
"powersearch" => "Search",
"powersearchtext" => "
-Search in namespaces :<br>
-$1<br>
+Search in namespaces :<br />
+$1<br />
$2 List redirects &nbsp; Search for $3 $9",
@@ -612,7 +612,7 @@ created and by whom, and anything else you may know about it.",
"deleteimgcompletely" => "del",
"imghistlegend" => "Legend: (cur) = this is the current image, (del) = delete
this old version, (rev) = revert to this old version.
-<br><i>Click on date to see image uploaded on that date</i>.",
+<br /><i>Click on date to see image uploaded on that date</i>.",
"imagelinks" => "Image links",
"linkstoimage" => "The following pages link to this image:",
"nolinkstoimage" => "There are no pages that link to this image.",
@@ -640,9 +640,9 @@ That comes to <b>$5</b> average edits per page, and <b>$6</b> views per edit.",
"maintenancebacklink" => "Back to Maintenance Page",
"disambiguations" => "Disambiguation pages",
"disambiguationspage" => "Wikipedia:Links_to_disambiguating_pages",
-"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "Double Redirects",
-"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br>\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
+"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br />\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
"brokenredirects" => "Broken Redirects",
"brokenredirectstext" => "The following redirects link to a non-existing article.",
"selflinks" => "Pages with Self Links",
@@ -839,7 +839,7 @@ pages that were vandalized).",
"noblockreason" => "You must supply a reason for the block.",
"blockipsuccesssub" => "Block succeeded",
"blockipsuccesstext" => "The IP address \"$1\" has been blocked.
-<br>See [[Special:Ipblocklist|IP block list]] to review blocks.",
+<br />See [[Special:Ipblocklist|IP block list]] to review blocks.",
"unblockip" => "Unblock IP address",
"unblockiptext" => "Use the form below to restore write access
to a previously blocked IP address.",
@@ -872,7 +872,7 @@ Please confirm that this is what you intend to do.",
"lockdbsuccesssub" => "Database lock succeeded",
"unlockdbsuccesssub" => "Database lock removed",
"lockdbsuccesstext" => "The Wikipedia database has been locked.
-<br>Remember to remove the lock after your maintenance is complete.",
+<br />Remember to remove the lock after your maintenance is complete.",
"unlockdbsuccesstext" => "The Wikipedia database has been unlocked.",
# SQL query
diff --git a/languages/LanguageCa.php b/languages/LanguageCa.php
index 7f991257dbf1..10705982fccc 100644
--- a/languages/LanguageCa.php
+++ b/languages/LanguageCa.php
@@ -129,8 +129,8 @@
"tog-editwidth" => "La caixa d'edició té l'ample màxim",
"tog-editondblclick" => "Edita pàgines amb un doble clic (JavaScript)",
"tog-editsection"=>"Enable section editing via [edit] links",
-"tog-editsectiononrightclick"=>"Enable section editing by right clicking<br> on section titles (JavaScript)",
-"tog-showtoc"=>"Show table of contents<br>(for articles with more than 3 headings)",
+"tog-editsectiononrightclick"=>"Enable section editing by right clicking<br /> on section titles (JavaScript)",
+"tog-showtoc"=>"Show table of contents<br />(for articles with more than 3 headings)",
"tog-watchdefault" => "Vigila articles nous i modificats",
"tog-minordefault" => "Marca totes les edicions com menors per defecte",
"tog-previewontop" => "Show preview before edit box and not after it",
@@ -291,14 +291,14 @@ Recordeu personalitzar les vostres preferències del {{SITENAME}}.",
"yourpasswordagain" => "Repetiu la contrasenya",
"newusersonly" => " (només usuaris nous)",
"remembermypassword" => "Vull que recordis la meva contrasenya entre sessions.",
-"loginproblem" => "<b>Hi ha hagut un problema amb l'entrada.</b><br>Proveu-ho de nou!",
-"alreadyloggedin" => "<font color=red><b>Benvingut, usuari $1!</b></font><br>\n",
+"loginproblem" => "<b>Hi ha hagut un problema amb l'entrada.</b><br />Proveu-ho de nou!",
+"alreadyloggedin" => "<font color=red><b>Benvingut, usuari $1!</b></font><br />\n",
"areyounew" => "Si sou nou a la {{SITENAME}} en català, i
voleu tenir un compte d'usuari, ingresseu un nom d'usuari,
i teclegeu i repetiu una contrasenya.
La vostra direcció electrònica és opcional: si perdeu o oblideu la
-contrasenya, podeu demanar que s'enviï a la direcció que vulgueu<br>\n",
+contrasenya, podeu demanar que s'enviï a la direcció que vulgueu<br />\n",
"login" => "Registre/Entrada",
"userlogin" => "Registre/Entrada",
"logout" => "Sortida",
@@ -336,7 +336,7 @@ Entreu-hi de nou després de rebre-la.cibas.",
"showpreview" => "Mostra previsualizació",
"blockedtitle" => "L'usuari està bloquejat",
"blockedtext" => "El vostre nombre d'usuari o direcció IP ha estat bloquejada per $1.
-La raó és la que segueix:<br>$2<p>Podeu contactar amb l'administrador per discutir el bloqueig.",
+La raó és la que segueix:<br />$2<p>Podeu contactar amb l'administrador per discutir el bloqueig.",
"newarticle" => "(Nou)",
"newarticletext" => "Poseu el text per la pàgina nova ací.",
"noarticletext" => "(En aquest moment, a aquesta pàgina, no hi ha text)",
@@ -361,7 +361,7 @@ Si la graveu, els canvis fets des d'eixa revisió es perdran.</strong>\n",
es consideren fetes públiques sota la llicència de documentació lliure GNU
(mostra detalls a $1).
Si no desitgeu que la gent corregeixi els vostres escrits sense pietat
-i els distribueixi lliurement, llavors no els poseu ací. <br>
+i els distribueixi lliurement, llavors no els poseu ací. <br />
També ens heu d'assegurar que tot plegat és obra vostra i que sou l'amo dels drets d'autor, o els heu copiat des del domini públic
o una altra font lliura.
<strong>NO EMPREU ESCRITS AMB COPYRIGHT SENSE PERMÃS!</strong>",
@@ -416,8 +416,8 @@ que no es troben a l'índex, o per especificar més d'una paraula a cercar( nomÃ
que contenen tots els termes d'una recerca apareixeran en el resultat).",
"powersearch" => "Recerca",
"powersearchtext" => "
-Cerca en espais de nom :<br>
-$1<br>
+Cerca en espais de nom :<br />
+$1<br />
$2 Llista redireccions Cerca $3 $9",
# Preferences page
@@ -582,7 +582,7 @@ i l'autor, i qualsevol altra cosa que pugueu saber al respecte.",
"deleteimgcompletely" => "borr",
"imghistlegend" => "Simbologia: (act) = aquesta és la imatge actual, (esb) = esborra
aquesta versió antiga, (rev) = reverteix a aquesta versió antiga.
-<br><i>Cliqueu a la data per veure la imatge carregada en aquesta data</i>.",
+<br /><i>Cliqueu a la data per veure la imatge carregada en aquesta data</i>.",
"imagelinks" => "Enllaços a la imatge",
"linkstoimage" => "Les següents pàgines enllacen a aquesta imatge:",
"nolinkstoimage" => "No hi ha pàgines que enllacen aquesta imatge.",
@@ -614,13 +614,13 @@ sobrecarregar la base de dades, així que si us plau, no torneu a carregar la pÃ
"disambiguationspage" => "{{ns:4}}:Enllaços a pàgines de desambiguació",
"disambiguationstext" => "Els següents articles enllacen a una<i>pàgina de desambiguació</i>. Haurien d'enllaçar al tema apropiat.
-<br>Una pàgina és considerada una pàgina de desambiguació si és enllaçada des de $1.<br>Enllaços des d'altres espais de nom (Com Viquipè
+<br />Una pàgina és considerada una pàgina de desambiguació si és enllaçada des de $1.<br />Enllaços des d'altres espais de nom (Com Viquipè
dia: o usuari:) <i>no</i> són llistats ací.",
"doubleredirects" => "Redireccions Dobles",
"doubleredirectstext" => "<b>Atenció:</b> aquest llistat pot contenir falsos positius. Això normalment significa que hi ha text
-addicional amb enllaços sota el primer #REDIRECT.<br>\nCada fila conté enllaços al segon i tercer redireccionament, així com la primera línia del
+addicional amb enllaços sota el primer #REDIRECT.<br />\nCada fila conté enllaços al segon i tercer redireccionament, així com la primera línia del
segon redireccionament, la qual cosa dóna normalment l'article \"real\", al que el primer redireccionamet hauria d'apuntar.",
"selflinks" => "Pàgines amb autoenllaços",
@@ -807,7 +807,7 @@ quines pàgines en concret estan sent vandalitzades).",
"noblockreason" => "Heu de donar un motiu per al bloqueig.",
"blockipsuccesssub" => "S'ha bloquejat amb èxit",
"blockipsuccesstext" => "La direcció IP \"$1\" ha estat bloquejada.
-<br>Vegeu [[Especial:llistat d'IP bloquejades|llistat d'IPs bloquejades]] per revisar bloquejos.",
+<br />Vegeu [[Especial:llistat d'IP bloquejades|llistat d'IPs bloquejades]] per revisar bloquejos.",
"unblockip" => "Desbloqueja direcció IP",
"unblockiptext" => "Empreu el següent formulari per restaurar
l'accés a l'escriptura a una direcció IP prèviament bloquejada.",
@@ -840,7 +840,7 @@ Confirmeu que això és el que voleu fer.",
"lockdbsuccesssub" => "S'ha assolit el bloqueig de la base de dades",
"unlockdbsuccesssub" => "S'ha extret el bloqueig de la base de dades",
"lockdbsuccesstext" => "S'ha bloquejat la base de dades de la {{SITENAME}}.
-<br>Recordeu-vos-en d'extreure el bloqueig havent acabant el manteniment.",
+<br />Recordeu-vos-en d'extreure el bloqueig havent acabant el manteniment.",
"unlockdbsuccesstext" => "La base de dades de la {{SITENAME}} ha estat desbloquejada.",
# SQL query
diff --git a/languages/LanguageCs.php b/languages/LanguageCs.php
index 90bc5819d47f..57e36bb5f914 100644
--- a/languages/LanguageCs.php
+++ b/languages/LanguageCs.php
@@ -159,7 +159,7 @@
# Části textu používané různými stránkami:
#
# Písmena, která se mají objevit jako Äást odkazu ve formÄ› "[[jazyk]]y" atd:
-"linktrail" => "/^([a-z]+)(.*)$/sD",
+"linktrail" => "/^((?:[a-z]|á|Ä|Ä|é|Ä›|í|ň|ó|Å™|Å¡|Å¥|ú|ů|ý|ž)+)(.*)$/sD",
"mainpage" => "Hlavní strana",
"about" => "Úvod",
"aboutsite" => "O Wikipedii", #FIXME
@@ -266,8 +266,8 @@ Můžete pracovat ve Wikipedii anonymně, nebo se přihlásit znovu jako stejný
"yourpasswordagain" => "Napište heslo znovu",
"newusersonly" => " (pouze noví uživatelé)",
"remembermypassword" => "Pamatuj si mé heslo od seance k seanci.",
-"loginproblem" => "<b>Nastal problém při vašem přihlášení.</b><br>Zkuste to znovu!",
-"alreadyloggedin" => "<font color=\"red\"><b>Uživateli $1, již jste přihlášen!</b></font><br>\n",
+"loginproblem" => "<b>Nastal problém při vašem přihlášení.</b><br />Zkuste to znovu!",
+"alreadyloggedin" => "<font color=\"red\"><b>Uživateli $1, již jste přihlášen!</b></font><br />\n",
"login" => "Přihlašte se", #FIXME, what exactly do the following go to?
"userlogin" => "Přihlašte se",
@@ -303,7 +303,7 @@ DoporuÄujeme, abyste se nyní pÅ™ihlásil a radÄ›ji zmÄ›nil heslo.", #FIXME
"showpreview" => "Ukaž náhled", #FIXME eh?
"blockedtitle" => "Uživatel odblokován", #FIXME cu 'Konto forbarita'?
"blockedtext" => "Váš úÄet nebo IP-adresa byly odblokovány osobou ,
-která popsala příÄinu takto:<br><p>Máte právo se spojit se správcem systému a prodiskutovat odblokování.", #FIXME - sistemestro?
+která popsala příÄinu takto:<br /><p>Máte právo se spojit se správcem systému a prodiskutovat odblokování.", #FIXME - sistemestro?
"newarticle" => "(Nový)",
"newarticletext" => "Vložte sem text nového Älánku.", #FIXME?
"noarticletext" => "(Článek zatím neobsahuje text)", #FIXME
@@ -366,8 +366,8 @@ která popsala příÄinu takto:<br><p>Máte právo se spojit se správcem systÃ
"nonefound" => "<strong>Poznámka</strong>: neúspěšné hledání zaviňuje Äasto zadání slov, které nejsou v indexu, nebo mnoha slov najednou (jen stránky, které obsahují vÅ¡echna zadaná slova, se objeví ve výsledku).",
"powersearch" => "Sercu",
#"powersearchtext" => "Hledej"
-#Sercu en sekcioj: :<br>
-#<br>
+#Sercu en sekcioj: :<br />
+#<br />
# Kun alidirektiloj &nbsp; Sercu ",
# Preferences page
@@ -508,7 +508,7 @@ Věnuj pozornost následujícímu odkazu: ($2) na stránku popisu a napiš pár
"deleteimg" => "for",
"deleteimgcompletely" => "for",
"imghistlegend" => "(nun) = toto je souÄasná verze souboru, (for) = odstranit tuto starou verzi, (res) = obnovit starou verzi.
-<br><i>Click on date to see image uploaded on that date</i>.",
+<br /><i>Click on date to see image uploaded on that date</i>.",
"imagelinks" => "Odkazy k souboru ",
"linkstoimage" => "K souboru odkazují tyto stránky:",
"nolinkstoimage" => "Žádná stránka neodkazuje na tento soubor.",
@@ -534,9 +534,9 @@ To je v průměru jedna stránka na <b></b> návštěv, a na <b></b> redakcí.",
"maintenancebacklink" => "Návrat k nástrojům",
"disambiguations" => "Å patnÄ› odkázané oddÄ›lovaÄe ",
"disambiguationspage" => "Wikipedie:OddÄ›lovaÄe",
-"disambiguationstext" => "Tyto stránky odkazují na <i>stránkový oddÄ›lovaÄ</i>. MÄ›ly by místo toho odkazovat na správný subjekt.<br>Bereme do úvahy stránky, které odkazují na oddÄ›lovaÄ.<br>Odkazy na sekci neÄlánkových souborů <i>ne</i> se zapisují zde.",
+"disambiguationstext" => "Tyto stránky odkazují na <i>stránkový oddÄ›lovaÄ</i>. MÄ›ly by místo toho odkazovat na správný subjekt.<br />Bereme do úvahy stránky, které odkazují na oddÄ›lovaÄ.<br />Odkazy na sekci neÄlánkových souborů <i>ne</i> se zapisují zde.",
"doubleredirects" => "Dvojité přesměrování",
-"doubleredirectstext" => "<b>Pozor:</b> Může se stát, že tento seznam bude obsahovat falešné pozitivy. Všeobecně to znamená, že existuje další text s odkazy po #REDIERCT.<br>
+"doubleredirectstext" => "<b>Pozor:</b> Může se stát, že tento seznam bude obsahovat falešné pozitivy. Všeobecně to znamená, že existuje další text s odkazy po #REDIERCT.<br />
Každý řádek ukazuje odkaz k prvnímu a druhému pÅ™esmÄ›rování, plus první řádek textu druhého pÅ™esmÄ›rování, který vÅ¡eobecnÄ› ukazuje \"skuteÄný\" hlavní Älánek, na který odkazuje první pÅ™esmÄ›rování.",
"brokenredirects" => "Přerušené přesměrování",
"brokenredirectstext" => "Tato pÅ™esmÄ›rování se vztahují na neexistující Älánky.",
@@ -630,7 +630,7 @@ a bude poÄítány v seznamu tvých Oblíbených.
"confirm" => "Potvrdit",
"confirmdelete" => "Potvrdit odstranění",
"deletesub" => "(Odstraňuje se \"$1\")",
-"confirmdeletetext" => "Odstraníš Älánek nebo soubor a smažeÅ¡ celou jeho historii z databáze.<br>
+"confirmdeletetext" => "Odstraníš Älánek nebo soubor a smažeÅ¡ celou jeho historii z databáze.<br />
PotvrÄ prosím, že to opravdu chceÅ¡, že si uvÄ›domujeÅ¡ důsledky a že dodržujeÅ¡ [[Wikipedie:Pravidla o odstraňování]].",
"confirmcheck" => "Ano, jsem naprosto jist, že chci toto odstranit.",
"actioncomplete" => "Provedeno",
@@ -691,7 +691,7 @@ Níže objasni pÅ™esný důvod (napÅ™. uveÄ stránku, která se stala terÄem v
"noblockreason" => "Nutno uvést důvod zablokování.",
"blockipsuccesssub" => "Úspěšné zablokování",
"blockipsuccesstext" => "Adresa IP \"$1\" je zablokována.
-<br>Viz [[Special:Ipblocklist|seznam zablokování IP]].",
+<br />Viz [[Special:Ipblocklist|seznam zablokování IP]].",
"unblockip" => "Zrušit blokování adresy IP",
"unblockiptext" => "Tímto formulářem možno obnovit právo blokované adresy IP opět přispívat do wikipedie.",
"ipusubmit" => "Zrušit blokování adresy",
@@ -716,7 +716,7 @@ Níže objasni pÅ™esný důvod (napÅ™. uveÄ stránku, která se stala terÄem v
"lockdbsuccesssub" => "Databáze uzamknuta",
"unlockdbsuccesssub" => "Databáze odemknuta",
"lockdbsuccesstext" => "Databáze wikipedie je uzamknuta.
-<br>Nezapomeň ji odemknout po opravách.",
+<br />Nezapomeň ji odemknout po opravách.",
"unlockdbsuccesstext" => "Databáze wikipedie je odemknuta.",
# SQL query
diff --git a/languages/LanguageCy.php b/languages/LanguageCy.php
index e0b0d1bb926f..d5d721fbb33f 100644
--- a/languages/LanguageCy.php
+++ b/languages/LanguageCy.php
@@ -325,8 +325,8 @@ Adroddwch hwn i gweinyddwr os gwelwch yn dda, a cofiwch sylwi'r URL.",
"badtitletext" => "Mae'r teitl rydych wedi gofyn yn anilys, gwag, neu cysylltu'n anghywir rhwng ieithoedd neu wicïau.",
"perfdisabled" => "Sori! Mae'r nodwedd hon wedi cael eu anablo am achosion perfformiadau yn yr amserau brysyrach; dewch yn ôl rhwng 02:00 a 14:00 GMT a triwch eto.",
"perfdisabledsub" => "Dyma copi rydym wedi cadw ers $1:",
-"wrong_wfQuery_params" => "Incorrect parameters to wfQuery()<br>
-Function: $1<br>
+"wrong_wfQuery_params" => "Incorrect parameters to wfQuery()<br />
+Function: $1<br />
Query: $2
",
"viewsource" => "Gwyliwch y ffynhonnell",
@@ -348,10 +348,10 @@ Gallwch chi defnyddio'r Wicipedia yn anhysbys, neu gallwch chi mewngofnodi eto f
"yourpasswordagain" => "Ail-teipiwch allweddair",
"newusersonly" => " (defnyddwyr newydd yn unig)",
"remembermypassword" => "Cofiwch fy allweddair dros mwy nag un sesiwn.",
-"loginproblem" => "<b>Mae problem efo'ch mewngofnodi.</b><br>Triwch eto!",
-"alreadyloggedin" => "<font color=red><b>Defnyddwr $1, yr ydych eisioes wedi mewngofnodi!</b></font><br>\n",
+"loginproblem" => "<b>Mae problem efo'ch mewngofnodi.</b><br />Triwch eto!",
+"alreadyloggedin" => "<font color=red><b>Defnyddwr $1, yr ydych eisioes wedi mewngofnodi!</b></font><br />\n",
-"areyounew" => "Os ydych chi newydd wedi dod i Wicipedia ac yn eisiau cael accownt defnyddwr, teipiwch enw defnyddwr, felly teipiwch ac ail-teipiwch allweddair. Dydy eich cyfeiriad e-bost ddim yn gorfodol; os collwch eich allweddair mae'n bosibl i chi gofyn i gael hi eu anfon at y cyfeiriad e-bost hon.<br>\n",
+"areyounew" => "Os ydych chi newydd wedi dod i Wicipedia ac yn eisiau cael accownt defnyddwr, teipiwch enw defnyddwr, felly teipiwch ac ail-teipiwch allweddair. Dydy eich cyfeiriad e-bost ddim yn gorfodol; os collwch eich allweddair mae'n bosibl i chi gofyn i gael hi eu anfon at y cyfeiriad e-bost hon.<br />\n",
"login" => "Mewngofnodi",
"loginprompt" => "Rhaid i chi galluogi cwcis i mewngofnodi i $wgSitename.",
@@ -416,7 +416,7 @@ Allweddair defnyddwr \"$2\" rwan yw \"$3\". Ddylwch chi mewngofnodi rwan a newid
"preview" => "Blaenwelediad",
"showpreview" => "Gweler blaenwelediad",
"blockedtitle" => "Mae'r defnyddwr wedi gael eu blocio",
-"blockedtext" => "Mae eich enw defnyddwr neu cyfeiriad IP wedi gael eu blocio gan $1. Y rheswm yw:<br>''$2''<p>Ellwch cysylltu $1 neu un o'r
+"blockedtext" => "Mae eich enw defnyddwr neu cyfeiriad IP wedi gael eu blocio gan $1. Y rheswm yw:<br />''$2''<p>Ellwch cysylltu $1 neu un o'r
[[Wicipedia:administrators|swyddogion]] eraill i trafodi'r bloc.",
"whitelistedittitle" => "Rhaid mewngofnodi i golygu",
"whitelistedittext" => "Rhaid i chi [[Special:Userlogin|mewngofnodi]] i olygu erthyglau.",
@@ -450,10 +450,10 @@ Fydd rhaid i chi ymsoddi eich newidiadau i mewn i'r testun sydd mewn bod.
"editingold" => "<strong>RHYBUDD: Rydych yn golygu hen fersiwn y tudalen hon. Os cadwch hi, fydd unrhyw newidiadau hwyrach yn gael eu colli!.</strong>\n",
"yourdiff" => "Gwahaniaethau",
"copyrightwarning" => "Sylwch mae pob cyfraniad i Wicipedia yn gael eu rhyddhau o dan termau'r Trwydded Dogfen Rhydd GNU (gwelwch $1 am manylion).
-Os nid ydych chi'n fodlon cael eich ysgrifeniad eu golygu heb trugaredd, a creu copïau dros y wê, peidiwch cyfranu'r ysgrifeniad yma.<br>
+Os nid ydych chi'n fodlon cael eich ysgrifeniad eu golygu heb trugaredd, a creu copïau dros y wê, peidiwch cyfranu'r ysgrifeniad yma.<br />
Hefyd, rydych chi'n addo chi yw'r awdur y cyfraniad, neu rydych chi wedi copïo fe oddiwrth y parth cyhoeddus neu rhyw modd rhydd tebyg.
<strong>PEIDIWCH CYFRANNU GWAITH O DAN HAWLFRAINT HEB CANIATÂD!</strong>",
-"longpagewarning" => "RHYBUDD: Mae hyd y tudalen hon yn $1 kilobyte; mae rhai porwyr yn cael problemau yn golygu tudalennau hirach na 32kb.<br>
+"longpagewarning" => "RHYBUDD: Mae hyd y tudalen hon yn $1 kilobyte; mae rhai porwyr yn cael problemau yn golygu tudalennau hirach na 32kb.<br />
Ystyriwch torri'r tudalen i mewn i ddarnau llai, os gwelwch yn dda.",
"readonlywarning" => "RHYBUDD: Mae'r databas wedi cloi i gael eu trwsio,
felly fyddwch chi ddim yn medru cadw eich olygiadau rwan. Efalle fyddwch chi'n eisio tori-a-pastio'r
@@ -507,8 +507,8 @@ Mae'n tebygol roedd hyn am achos yr ydych wedi trio chwilio a gair gyda llai na
sydd ddim yn cael eu mynegai.",
"powersearch" => "Chwilio",
"powersearchtext" => "
-Edrychwch mewn lle-enw:<br>
-$1<br>
+Edrychwch mewn lle-enw:<br />
+$1<br />
$2 Rhestrwch ail-cyfeiriadau &nbsp; Chwiliwch am $3 $9",
"searchdisabled" => "<p>Mae'r peiriant chwilio'r holl databas wedi cael eu troi i ffwrdd i gwneud pethau'n hawddach ar y gwasanaethwr. Gobeithiwn fydd yn bosibl i troi'r peiriant ymlaen cyn bo hir, ond yn y cyfamser mae'n posibl gofyn Google:</p>",
"googlesearch" => "
@@ -524,9 +524,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio
name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch
-value=\"{$wgServer}\" checked> {$wgServer} <br>
+value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -688,7 +688,7 @@ Dilynwch y cyswllt hon: ($2) i'r tudalen disgrifiad a llenwch gwybodaeth amdano'
"deleteimg" => "dil",
"deleteimgcompletely" => "dil",
"imghistlegend" => "Eglurhad: (cyf) = hon yw'r delwedd cyfoes, (dil) = dilewch yr hen fersiwn hon, (dych) = dychwelio i hen fersiwn hon.
-<br><i>Cliciwch ar dyddiad i weld y delwedd ag oedd llwythiad ar y dyddiad hon</i>.",
+<br /><i>Cliciwch ar dyddiad i weld y delwedd ag oedd llwythiad ar y dyddiad hon</i>.",
"imagelinks" => "Cysylltiadau delwedd",
"linkstoimage" => "Mae'r tudalennau isod yn cysylltu i'r delwedd hon: ",
"nolinkstoimage" => "Does dim tudalen yn cysylltu i'r delwedd hon. ",
@@ -712,9 +712,9 @@ Sef <b>$5</b> golygiadau pob tudalen, ar gyfartaledd, a <b>$6</b> golygon o bob
"maintenancebacklink" => "Back to Maintenance Page",
"disambiguations" => "Disambiguation pages",
"disambiguationspage" => "Wicipedia:Links_to_disambiguating_pages",
-"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "Double Redirects",
-"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br>\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
+"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br />\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
"brokenredirects" => "Broken Redirects",
"brokenredirectstext" => "The following redirects link to a non-existing article.",
"selflinks" => "Pages with Self Links",
@@ -913,7 +913,7 @@ Llenwch rheswm am y bloc, isod (e.e. enwch y tudalennau a oedd wedi fandalo).",
"noblockreason" => "Rhaid i chi rhoi rheswm am y bloc.",
"blockipsuccesssub" => "Bloc yn llwyddiannus",
"blockipsuccesstext" => "Mae cyfeiriad IP \"$1\" wedi cael eu blocio.
-<br>Gwelwch [[Arbennig:Ipblocklist|rhestr bloc IP]] i arolygu blociau.",
+<br />Gwelwch [[Arbennig:Ipblocklist|rhestr bloc IP]] i arolygu blociau.",
"unblockip" => "Di-blociwch cyfeiriad IP",
"unblockiptext" => "Defnyddwch y ffurflen isod i di-blocio mynedfa ysgrifenol i cyfeiriad IP sydd wedi cael eu blocio'n gynt.",
"ipusubmit" => "Di-blociwch y cyfeiriad hwn",
@@ -956,7 +956,7 @@ Please confirm that this is what you intend to do.",
"lockdbsuccesssub" => "Database lock succeeded",
"unlockdbsuccesssub" => "Database lock removed",
"lockdbsuccesstext" => "The database has been locked.
-<br>Remember to remove the lock after your maintenance is complete.",
+<br />Remember to remove the lock after your maintenance is complete.",
"unlockdbsuccesstext" => "The database has been unlocked.",
# SQL query -- left untranslated
diff --git a/languages/LanguageDa.php b/languages/LanguageDa.php
index dbf21a1df32c..a6b968ce2bee 100644
--- a/languages/LanguageDa.php
+++ b/languages/LanguageDa.php
@@ -154,13 +154,13 @@ require_once( "LanguageUtf8.php" );
"tog-highlightbroken" => "Brug røde henvisninger til tomme sider",
"tog-justify" => "Justér afsnit",
"tog-hideminor" => "Skjul mindre ændringer i seneste ændringer listen",
-"tog-usenewrc" => "Udvidet seneste ændringer liste<br>(ikke for alle browsere)",
+"tog-usenewrc" => "Udvidet seneste ændringer liste<br />(ikke for alle browsere)",
"tog-numberheadings" => "Automatisk nummerering af overskrifter",
"tog-showtoolbar" => "Vis værktøjslinje til redigering",
"tog-editondblclick" => "Redigér sider med dobbeltklik (JavaScript)",
"tog-editsection"=>"Redigér afsnit ved hjælp af [redigér]-henvisning",
-"tog-editsectiononrightclick"=>"Redigér afsnit ved at højreklikke<br> på afsnittets titel (JavaScript)",
-"tog-showtoc"=>"Vis indholdsfortegnelse<br>(for artikler med mere end tre afsnit)",
+"tog-editsectiononrightclick"=>"Redigér afsnit ved at højreklikke<br /> på afsnittets titel (JavaScript)",
+"tog-showtoc"=>"Vis indholdsfortegnelse<br />(for artikler med mere end tre afsnit)",
"tog-rememberpassword" => "Husk adgangskode til næste besøg",
"tog-editwidth" => "Redigeringsboksen har fuld bredde",
"tog-watchdefault" => "Overvåg nye og ændrede artikler",
@@ -364,9 +364,9 @@ oprettet. Glem ikke at personliggøre dine Wikipedia-indstillinger.",
"newusersonly" => " (kun nye brugere)",
"remembermypassword" => "Husk min adgangskode til næste gang.",
"loginproblem" => "<b>Der har været et problem med at få dig logget
-på.</b><br>Prøv igen!",
+på.</b><br />Prøv igen!",
"alreadyloggedin" => "<font color=red><b>Bruger $1, du er allerede logget
-på!</b></font><br>\n",
+på!</b></font><br />\n",
"login" => "Log på",
"userlogin" => "Log på",
@@ -412,16 +412,16 @@ Du bør logge på og ændre din adgangskode straks efter, du har modtaget den.",
"showpreview" => "Forhåndsvisning",
"blockedtitle" => "Brugeren er blokeret",
"blockedtext" => "Dit brugernavn eller din IP-adresse er blevet blokeret af
-$1. Begrundelsen er denne:<br>$2<p>Du kan kontakte $1
+$1. Begrundelsen er denne:<br />$2<p>Du kan kontakte $1
eller en af de andre [[Wikipedia:Administratorer|administratorer]] for at diskutere blokeringen.
Din IP-adresse er $3.
Sørg venligst for at inkludere dette nummer i alle henvendelser til en administrator.
",
"newarticle" => "(Ny)",
-"newarticletext" => "Der er på nuværende tidspunkt ingen tekst på denne side.<br>
+"newarticletext" => "Der er på nuværende tidspunkt ingen tekst på denne side.<br />
Du kan begynde en artikel ved at skrive i boksen herunder.
-(se [[Wikipedia:Hjælp|hjælpen]] for yderligere information).<br>
+(se [[Wikipedia:Hjælp|hjælpen]] for yderligere information).<br />
Hvis det ikke var din mening, så tryk på '''Tilbage''' eller '''Back''' knappen.",
"anontalkpagetext" => "---- ''Dette er en diskussionsside for en anonym bruger der
ikke har oprettet en konto endnu eller ikke bruger den. Vi er derfor nødt til at
@@ -461,7 +461,7 @@ overskrevet.</strong>\n",
at betragte som udgivet under GNU Free Documentation License
(se $1 for detaljer).
Hvis du ikke vil have din tekst redigeret uden nåde og kopieret efter
-forgodtbefindene, så skal du ikke lægge det her.<br>
+forgodtbefindene, så skal du ikke lægge det her.<br />
Du lover os også, at du skrev teksten selv, kopierede fra en
public domain eller lignende fri ressource.
<strong>LÆG ALDRIG MATERIALE HER SOM ER BESKYTTET AF ANDRES OPHAVSRET UDEN
@@ -533,8 +533,8 @@ der ikke er indekseret, eller ved at specificere mere end et søgeord (da kun
sider der indeholder alle søgeordene vil blive fundet).",
"powersearch" => "Søg",
"powersearchtext" => "
-Søg i navnerum :<br>
-$1<br>
+Søg i navnerum :<br />
+$1<br />
$2 List omdirigeringer &nbsp; Søg efter $3 $9",
"searchdisabled" => "<p>Søgefunktionen er midlertidigt afbrudt på grund af
for stort pres på serveren; vi håber vi kan sætte den på igen når vi har
@@ -552,9 +552,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio
name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch
-value=\"{$wgServer}\" checked> {$wgServer} <br>
+value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -735,7 +735,7 @@ og af hvem, og andre ting du ved om filen.",
"deleteimgcompletely" => "slet",
"imghistlegend" => "Forklaring: (nuværende) = dette er det nuværende billede,
(slet) = slet denne gamle version, (gendan) = gendan en gammel version.
-<br><i>Klik på en dato for at se billedet, som er lagt op den dag</i>.",
+<br /><i>Klik på en dato for at se billedet, som er lagt op den dag</i>.",
"imagelinks" => "Billedehenvisninger",
"linkstoimage" => "De følgende sider henviser til dette billede:",
"nolinkstoimage" => "Der er ingen sider der henviser til dette billede.",
@@ -770,12 +770,12 @@ hver gang du har rettet en enkelt ting ;-)",
"disambiguationspage" => "Wikipedia:Henvisninger til artikler med flertydige titler",
"disambiguationstext" => "De følgende artikler henviser til
<i>artikler med flertydige titler</i>. De skulle henvise til en ikke-flertydig
-titel i stedet for.<br>En artikel bliver behandlet som flertydig, hvis den er
-henvist fra $1.<br>Henvisninger fra andre navnerum er <i>ikke</i> listet her.",
+titel i stedet for.<br />En artikel bliver behandlet som flertydig, hvis den er
+henvist fra $1.<br />Henvisninger fra andre navnerum er <i>ikke</i> listet her.",
"doubleredirects" => "Dobbelte omdirigeringer",
"doubleredirectstext" => "<b>Bemærk:</b> Denne liste kan indeholde forkerte
resultater. Det er som regel, fordi siden indeholder ekstra tekst under den
-første #REDIRECT.<br>\nHver linje indeholder henvisninger til den første og den
+første #REDIRECT.<br />\nHver linje indeholder henvisninger til den første og den
anden omdirigering, og den første linje fra den anden omdirigeringstekst,
det giver som regel den \"rigtige\" målartikel, som den første omdirigering
skulle have peget på.",
@@ -1012,7 +1012,7 @@ sider der har været udsat for vandalisme).",
"noblockreason" => "Du skal angive en begrundelse for denne blokering.",
"blockipsuccesssub" => "Blokering udført med success",
"blockipsuccesstext" => "\"$1\" er blevet blokeret.
-<br>Se [[Speciel:Ipblocklist|IP blokeringslisten]] for alle blokeringer.",
+<br />Se [[Speciel:Ipblocklist|IP blokeringslisten]] for alle blokeringer.",
"unblockip" => "Ophæv blokering af bruger",
"unblockiptext" => "Brug formularen herunder for at gendanne skriveadgangen
for en tidligere blokeret IP-adresse eller bruger.",
@@ -1046,7 +1046,7 @@ Bekræft venligst at du har til hensigt at gøre dette.",
"lockdbsuccesssub" => "Databasen er nu låst",
"unlockdbsuccesssub" => "Databasen er nu låst op",
"lockdbsuccesstext" => "Wikipediadatabasen er låst.
-<br>Husk at fjerne låsen når du er færdig med din vedligeholdelse.",
+<br />Husk at fjerne låsen når du er færdig med din vedligeholdelse.",
"unlockdbsuccesstext" => "Wikipediadatabasen er låst op.",
# SQL query
diff --git a/languages/LanguageDe.php b/languages/LanguageDe.php
index 650ae726600d..b46f960d887e 100644
--- a/languages/LanguageDe.php
+++ b/languages/LanguageDe.php
@@ -339,7 +339,7 @@ gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung",
"cannotdelete" => "Kann spezifizierte Seite oder Artikel nicht löschen. (Wurde möglicherweise schon von jemand anderem gelöscht.)",
"badtitle" => "Ungültiger Titel",
"badtitletext" => "Der Titel der angeforderten Seite war ungültig, leer, oder ein ungültiger Sprachlink von einem anderen Wiki.",
-"perfdisabled" => "Diese Funktion wurde wegen Überlastung des Servers vorübergehend deaktiviert. Versuchen Sie es bitte zwischen 02:00 und 14:00 UTC noch einmal<br>(Aktuelle Serverzeit : ".date("H:i:s")." UTC).",
+"perfdisabled" => "Diese Funktion wurde wegen Überlastung des Servers vorübergehend deaktiviert. Versuchen Sie es bitte zwischen 02:00 und 14:00 UTC noch einmal<br />(Aktuelle Serverzeit : ".date("H:i:s")." UTC).",
"perfdisabledsub" => "Hier ist eine gespeicherte Kopie von $1:",
"perfcached" => "Die folgenden Daten stammen aus dem Cache und sind möglicherweise nicht aktuell:",
"wrong_wfQuery_params" => "Falsche Parameter für wfQuery()<br />
@@ -368,8 +368,8 @@ Vergessen Sie nicht, Ihre Einstellungen anzupassen.",
"yourpasswordagain" => "Passwort wiederholen",
"newusersonly" => " (nur für neue Mitglieder)",
"remembermypassword" => "Dauerhaftes einloggen",
-"loginproblem" => "<b>Es gab ein Problem mit Ihrer Anmeldung.</b><br>Bitte versuchen Sie es nochmal!",
-"alreadyloggedin" => "<font color=red><b>Benutzer $1, Sie sind bereits angemeldet!</b></font><br>\n",
+"loginproblem" => "<b>Es gab ein Problem mit Ihrer Anmeldung.</b><br />Bitte versuchen Sie es nochmal!",
+"alreadyloggedin" => "<font color=red><b>Benutzer $1, Sie sind bereits angemeldet!</b></font><br />\n",
"login" => "Anmelden",
"loginprompt" => "Um sich bei {{SITENAME}} anmelden zu können, müssen Cookies aktiviert sein.",
@@ -416,7 +416,7 @@ Bitte melden Sie sich an, sobald Sie es erhalten.",
"showpreview" => "Vorschau zeigen",
"blockedtitle" => "Benutzer ist blockiert",
"blockedtext" => "Ihr Benutzername oder Ihre IP-Adresse wurde von $1 blockiert.
-Als Grund wurde angegeben:<br>$2<p>Bitte kontaktieren Sie den Administrator, um über die Blockierung zu sprechen.",
+Als Grund wurde angegeben:<br />$2<p>Bitte kontaktieren Sie den Administrator, um über die Blockierung zu sprechen.",
"whitelistedittitle" => "Zum Bearbeiten ist es erforderlich angemeldet zu sein",
"whitelistedittext" => "Sie müssen sich [[Spezial:Userlogin|hier anmelden]] um Artikel bearbeiten zu können.",
"whitelistreadtitle" => "Zum Lesen ist es erforderlich angemeldet zu sein",
@@ -487,7 +487,7 @@ Benutzer mit Sysop-Rechten bearbeitet werden kann. Beachten Sie bitte die
"last" => "Letzte",
"orig" => "Original",
"histlegend" => "Diff Auswahl: Die Boxen der gewünschten
-Versionen markieren und 'Enter' drücken oder den Button unten klicken/alt-v.<br/>
+Versionen markieren und 'Enter' drücken oder den Button unten klicken/alt-v.<br />
Legende:
(Aktuell) = Unterschied zur aktuellen Version,
(Letzte) = Unterschied zur vorherigen Version,
@@ -532,8 +532,8 @@ Sie die Volltextsuche oder legen Sie den Artikel <a href=\"$1\">neu</a> an. ",
Erfolglose Suchanfragen werden häufig verursacht durch den Versuch, nach 'gewöhnlichen' Worten zu suchen; diese sind nicht indiziert.",
"powersearch" => "Suche",
"powersearchtext" => "
-Suche in Namensräumen :<br>
-$1<br>
+Suche in Namensräumen :<br />
+$1<br />
$2 Zeige auch REDIRECTs &nbsp; Suche nach $3 $9",
"searchdisabled" => "<p>Entschuldigung! Die Volltextsuche wurde wegen Überlastung temporär deaktiviert. Derweil können Sie die folgende Google Suche verwenden, die allerdings nicht den aktuellen Stand wiederspiegelt.<p>
@@ -549,9 +549,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio name
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio name
=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer
-}\" checked> {$wgServer} <br>
+}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -609,8 +609,8 @@ Ihre interne ID-Nummer ist $2.",
"changes" => "Änderungen",
"recentchanges" => "Letzte Änderungen",
"recentchangestext" => "
-Diese Seite wird beim Laden automatisch aktualisiert. Angezeigt werden Seiten, die zuletzt bearbeitet wurden, sowie die Zeit und der Name des Autors.<br>
-Falls Sie neu bei {{SITENAME}} sind, lesen Sie bitte die [[Project:Willkommen|Willkommensseite]] und [[Project:Erste Schritte|Erste Schritte]].<br>
+Diese Seite wird beim Laden automatisch aktualisiert. Angezeigt werden Seiten, die zuletzt bearbeitet wurden, sowie die Zeit und der Name des Autors.<br />
+Falls Sie neu bei {{SITENAME}} sind, lesen Sie bitte die [[Project:Willkommen|Willkommensseite]] und [[Project:Erste Schritte|Erste Schritte]].<br />
Wenn Sie möchten, dass {{SITENAME}} zu einem Erfolg wird, dann fügen Sie bitte keine Texte hinzu, die dem [[Project:Urheberrechte beachten|Urheberrecht]] anderer unterliegen. Dies könnte dem Projekt sonst schweren Schaden zufügen.",
"rcloaderr" => "Lade Letzte Änderungen",
"rcnote" => "Hier sind die letzten <b>$1</b> Änderungen der letzten <b>$2</b> Tage. (<b>N</b> - Neuer Artikel; <b>M</b> - kleine Änderung)",
@@ -737,7 +737,7 @@ Davon haben <b>$2</b> Administrator-Rechte (siehe $3).",
"maintenancebacklink" => "Zurück zur Wartungsseite",
"disambiguations" => "Begriffsklärungsseiten",
"disambiguationspage" => "Project:Begriffsklärung",
-"disambiguationstext" => "Die folgenden Artikel verweisen auf eine <i>Seite zur Begriffsklärung</i>. Sie sollten statt dessen auf die eigentlich gemeinte Seite verweisen.<br>Eine Seite wird als Begriffsklärungsseite behandelt, wenn $1 auf sie verweist.<br>Verweise aus Namensräumen werden hier <i>nicht</i> aufgelistet.",
+"disambiguationstext" => "Die folgenden Artikel verweisen auf eine <i>Seite zur Begriffsklärung</i>. Sie sollten statt dessen auf die eigentlich gemeinte Seite verweisen.<br />Eine Seite wird als Begriffsklärungsseite behandelt, wenn $1 auf sie verweist.<br />Verweise aus Namensräumen werden hier <i>nicht</i> aufgelistet.",
"doubleredirects" => "Doppelte Redirects",
"doubleredirectstext" => "<b>Achtung:</b> Diese Liste kann \"falsche Positive\" enthalten. Das ist dann der Fall, wenn ein Redirect außer dem Redirect-Verweis noch weiteren Text mit anderen Verweisen enthält. Letztere sollten dann entfernt werden.",
"brokenredirects" => "Kaputte Redirects",
@@ -935,7 +935,7 @@ Bitte tragen Sie den Grund für die Blockade ein.",
"noblockreason" => "Sie müssen einen Grund für die Blockade angeben.",
"blockipsuccesssub" => "Blockade erfolgreich",
"blockipsuccesstext" => "Die IP-Adresse \"$1\" wurde blockiert.
-<br>Auf [[Spezial:Ipblocklist|IP block list]] ist eine Liste der Blockaden.",
+<br />Auf [[Spezial:Ipblocklist|IP block list]] ist eine Liste der Blockaden.",
"unblockip" => "IP-Adresse freigeben",
"unblockiptext" => "Benutzen Sie das Formular, um eine blockierte IP-Adresse freizugeben.",
"ipusubmit" => "Diese Adresse freigeben",
@@ -961,7 +961,7 @@ Bitte tragen Sie den Grund für die Blockade ein.",
"lockdbsuccesssub" => "Datenbank wurde erfolgreich gesperrt",
"unlockdbsuccesssub" => "Datenbank wurde erfolgreich freigegeben",
"lockdbsuccesstext" => "Die {{SITENAME}}-Datenbank wurde gesperrt.
-<br>Bitte geben Sie die Datenbank wieder frei, sobald die Wartung abgeschlossen ist.",
+<br />Bitte geben Sie die Datenbank wieder frei, sobald die Wartung abgeschlossen ist.",
"unlockdbsuccesstext" => "Die {{SITENAME}}-Datenbank wurde freigegeben.",
# SQL query
@@ -1009,7 +1009,7 @@ Diskussions-Seite nicht, da schon eine mit dem neuen Titel existiert. Bitte glei
"export" => "Seiten exportieren",
"exporttext" => "Sie können den Text und die Bearbeitungshistorie einer bestimmten oder einer Auswahl von Seiten nach XML exportieren. Das Ergebnis kann in ein anderes Wiki mit WikiMedia Software eingespielt werden, bearbeitet oder archiviert werden.",
"exportcuronly" => "Nur die aktuelle Version der Seite exportieren",
-"missingimage" => "<b>Fehlendes Bild</b><br><i>$1</i>\n",
+"missingimage" => "<b>Fehlendes Bild</b><br /><i>$1</i>\n",
#Tooltips:
'tooltip-atom' => 'Atom-Feed von dieser Seite',
@@ -1181,7 +1181,9 @@ Diskussions-Seite nicht, da schon eine mit dem neuen Titel existiert. Bitte glei
'mw_math_source' =>"Als TeX belassen (für Textbrowser)",
'mw_math_modern' => "Empfehlenswert für moderne Browser",
'mw_math_mathml' => 'MathML (experimentell)',
-
+# labels for User: and Title: on Special:Log pages
+'specialloguserlabel' => 'Benutzer: ',
+'speciallogtitlelabel' => 'Titel: ',
);
diff --git a/languages/LanguageEs.php b/languages/LanguageEs.php
index 3483da449a0f..45fee284a229 100644
--- a/languages/LanguageEs.php
+++ b/languages/LanguageEs.php
@@ -142,8 +142,8 @@ require_once( "LanguageUtf8.php" );
"tog-editwidth" => "La caja de edición tiene el ancho máximo",
"tog-editondblclick" => "Editar páginas con doble click (JavaScript)",
"tog-editsection"=>"Habilitar la edicion de secciones usando el enlace [editar]",
-"tog-editsectiononrightclick"=>"Habilitar la edición de secciones presionando el boton de la derecha<br> en los titulos de secciones (JavaScript)",
-"tog-showtoc"=>"Mostrar la tabla de contenidos<br>(para paginas con mas de 3 encabezados)",
+"tog-editsectiononrightclick"=>"Habilitar la edición de secciones presionando el boton de la derecha<br /> en los titulos de secciones (JavaScript)",
+"tog-showtoc"=>"Mostrar la tabla de contenidos<br />(para paginas con mas de 3 encabezados)",
"tog-watchdefault" => "Vigilar artículos nuevos y modificados",
"tog-minordefault" => "Marcar todas las ediciones como menores por defecto",
"tog-previewontop" => "Mostrar la previsualización antes de la caja de edición en lugar de después",
@@ -336,8 +336,8 @@ No olvides perzonalizar tus preferencia de $wgSitename.",
"yourpasswordagain" => "Repite tu contraseña",
"newusersonly" => " (sólo usuarios nuevos)",
"remembermypassword" => "Quiero que recuerden mi contraseña entre sesiones.",
-"loginproblem" => "<b>Hubo un problema con tu entrada.</b><br>¡Inténtalo otra vez!",
-"alreadyloggedin" => "<font color=red><b>Usuario $1, ya entraste!</b></font><br>\n",
+"loginproblem" => "<b>Hubo un problema con tu entrada.</b><br />¡Inténtalo otra vez!",
+"alreadyloggedin" => "<font color=red><b>Usuario $1, ya entraste!</b></font><br />\n",
"login" => "Registrarse/Entrar",
"userlogin" => "Registrarse/Entrar",
@@ -378,7 +378,7 @@ Por favor entra otra vez después de que la recibas.",
"showpreview" => "Mostrar previsualización",
"blockedtitle" => "El usuario está bloqueado",
"blockedtext" => "Tu nombre de usuario o dirección IP ha sido bloqueada por $1.
-La razón dada es la que sigue:<br>$2<p> Puedes contactar a $1 o a otro de los [[$wgMetaNamespace:Administradores|administradores]] para
+La razón dada es la que sigue:<br />$2<p> Puedes contactar a $1 o a otro de los [[$wgMetaNamespace:Administradores|administradores]] para
discutir el bloqueo.",
"newarticle" => "(Nuevo)",
"newarticletext" => "$wgSitename es una enciclopedia en desarrollo, y esta página aún no existe. Puedes pedir información en [[$wgMetaNamespace:Consultas]], pero no esperes una respuesta pronta. Si lo que quieres es crear esta página, empieza a escribir en la caja que sigue. Si llegaste aquí por error, presiona la tecla para volver a la página anterior de tu navegador.",
@@ -407,15 +407,15 @@ Vas a tener que incorporar tus cambios en el texto existente.
de esta página.
Si la grabas, los cambios hechos desde esa revisión se perderán.</strong>\n",
"yourdiff" => "Diferencias",
-"copyrightwarning" => "Ayuda de edición, caracteres especiales: á é í ó ú à É à Ó Ú ü Ü ñ Ñ ¡ ¿ <br><br>Nota por favor que todas las contribuciones a $wgSitename
+"copyrightwarning" => "Ayuda de edición, caracteres especiales: á é í ó ú à É à Ó Ú ü Ü ñ Ñ ¡ ¿ <br /><br />Nota por favor que todas las contribuciones a $wgSitename
se consideran hechas públicas bajo la Licencia de Documentación Libre GNU
(ver detalles en $1).
Si no deseas que la gente corrija tus escritos sin piedad
-y los distribuya libremente, entonces no los pongas aquí. <br>
+y los distribuya libremente, entonces no los pongas aquí. <br />
También tú nos aseguras que escribiste esto tú mismo y
eres dueño de los derechos de autor, o lo copiaste desde el dominio público
u otra fuente libre.
- <strong>¡NO USES ESCRITOS CON COPYRIGHT SIN PERMISO!</strong><br>",
+ <strong>¡NO USES ESCRITOS CON COPYRIGHT SIN PERMISO!</strong><br />",
"longpagewarning" => "ADVERTENCIA: Esta página tiene un tamaño de $1 kilobytes; algunos navegadores pueden tener problemas editando páginas de 32kb o más.
Por favor considera la posibilidad de descomponer esta página en secciones más pequeñas.",
"readonlywarning" => "ADVERTENCIA: La base de datos ha sido bloqueada para mantenimiento, así que no podrás grabar tus modificaciones en este momento.
@@ -476,8 +476,8 @@ que no están en el índice, o por especificar más de una palabra para buscar (
que contengan todos los términos de una búsqueda aparecerán en el resultado).",
"powersearch" => "Búsqueda",
"powersearchtext" => "
-Buscar en espacios de nombre :<br>
-$1<br>
+Buscar en espacios de nombre :<br />
+$1<br />
$2 Listar redirecciones Buscar $3 $9",
"searchdisabled" => "<p>Búsqueda en todo el texto ha sido desactivada temporalmente
debido a carga alta del servidor; esperamos tenerla otra vez en linea despues de algunas actualizaciones de
@@ -495,9 +495,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio
name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch
-value=\"{$wgServer}\" checked> {$wgServer} <br>
+value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -676,7 +676,7 @@ creado y por quién, y cualquier otra cosa que puedas saber al respecto.",
"deleteimgcompletely" => "borr",
"imghistlegend" => "Simbología: (act) = esta es la imagen actual, (borr) = borrar
esta versión antigua, (rev) = revertir a esta versión antigua.
-<br><i>Click en la fecha para ver imagen subida en esa fecha</i>.",
+<br /><i>Click en la fecha para ver imagen subida en esa fecha</i>.",
"imagelinks" => "Enlaces a la imagen",
"linkstoimage" => "Las siguientes páginas enlazan a esta imagen:",
"nolinkstoimage" => "No hay páginas que enlacen a esta imagen.",
@@ -704,9 +704,9 @@ de los cuales <b>$2</b> son administradores (ver $3).",
"maintenancebacklink" => "Volver a la Página de Mantenimiento",
"disambiguations" => "Páginas de desambiguación",
"disambiguationspage" => "$wgMetaNamespace:Enlaces a páginas de desambiguación",
-"disambiguationstext" => "Los siguientes artículos enlazan a una <i>página de desambiguación</i>. Deberían enlazar al artículo apropiado.<br>Una página es considerada de desambiguación si está enlazada desde $1.<br>Enlaces desde otros espacios de nombre (Como $wgMetaNamespace: o usuario:) <b>no</b> son listados aquí.",
+"disambiguationstext" => "Los siguientes artículos enlazan a una <i>página de desambiguación</i>. Deberían enlazar al artículo apropiado.<br />Una página es considerada de desambiguación si está enlazada desde $1.<br />Enlaces desde otros espacios de nombre (Como $wgMetaNamespace: o usuario:) <b>no</b> son listados aquí.",
"doubleredirects" => "Redirecciones Dobles",
-"doubleredirectstext" => "<b>Atención:</b> Esta lista puede contener falsos positivos. Eso significa usualmente que hay texto adicional con enlaces bajo el primer #REDIRECT.<br>\nCada fila contiene enlaces al segundo y tercer redirect, así como la primera línea del segundo redirect, en la que usualmente se encontrará el artículo \"real\" al que el primer redirect debería apuntar.",
+"doubleredirectstext" => "<b>Atención:</b> Esta lista puede contener falsos positivos. Eso significa usualmente que hay texto adicional con enlaces bajo el primer #REDIRECT.<br />\nCada fila contiene enlaces al segundo y tercer redirect, así como la primera línea del segundo redirect, en la que usualmente se encontrará el artículo \"real\" al que el primer redirect debería apuntar.",
"brokenredirects" => "Redirecciones incorrectas",
"brokenredirectstext" => "Las redirecciones siguientes enlazan a un artículo que no existe.",
"selflinks" => "Páginas con autoenlaces",
@@ -909,7 +909,7 @@ ls páginas en particular que han sido objeto de vandalismo desde la dirección
"noblockreason" => "Debes dar una razón para el bloqueo.",
"blockipsuccesssub" => "Bloqueo exitoso",
"blockipsuccesstext" => "La direccion IP \"$1\" ha sido bloqueada.
-<br>Ver [[Especial:Ipblocklist|lista de IP bloqueadas]] para revisar bloqueos.",
+<br />Ver [[Especial:Ipblocklist|lista de IP bloqueadas]] para revisar bloqueos.",
"unblockip" => "Desbloquear dirección IP",
"unblockiptext" => "Usa el formulario que sigue para restaurar el
acceso de escritura a una dirección IP previamente bloqueada.",
@@ -937,7 +937,7 @@ acceso de escritura a una dirección IP previamente bloqueada.",
"lockdbsuccesssub" => "El bloqueo se ha realizado con éxito",
"unlockdbsuccesssub" => "El desbloqueo se ha realizado con éxito",
"lockdbsuccesstext" => "La base de datos de $wgSitename ha sido bloqueada.
-<br>Recuerda retirar el bloqueo después de completar las tareas de mantenimiento.",
+<br />Recuerda retirar el bloqueo después de completar las tareas de mantenimiento.",
"unlockdbsuccesstext" => "La base de datos de $wgSitename ha sido desbloqueada.",
# SQL query
diff --git a/languages/LanguageEt.php b/languages/LanguageEt.php
index a7ff1684e057..8ef962827c35 100644
--- a/languages/LanguageEt.php
+++ b/languages/LanguageEt.php
@@ -286,12 +286,12 @@ Võite kasutada Vikipeediat anonüümselt või uuesti sisse logida sama või tei
"yourpasswordagain" => "Sisestage parool uuesti",
"newusersonly" => " (ainult uued kasutajad)",
"remembermypassword" => "Parooli meeldejätmine tulevasteks seanssideks.",
-"loginproblem" => "<b>Sisselogimine ei õnnestunud.</b><br>Proovige uuesti!",
-"alreadyloggedin" => "<font color=red><b>Kasutaja $1, Te olete juba sisse loginud!</b></font><br>\n",
+"loginproblem" => "<b>Sisselogimine ei õnnestunud.</b><br />Proovige uuesti!",
+"alreadyloggedin" => "<font color=red><b>Kasutaja $1, Te olete juba sisse loginud!</b></font><br />\n",
"areyounew" => "Kui olete Vikipeedias uustulnuk ja tahate saada kasutajakontot, siis
sisestage kasutajanimi, seejärel parool (kaks korda).
-E-posti aadress ei ole kohustuslik; kui Te kaotate oma parooli, võite lasta selle saata Teie poolt antud aadressil.<br>\n",
+E-posti aadress ei ole kohustuslik; kui Te kaotate oma parooli, võite lasta selle saata Teie poolt antud aadressil.<br />\n",
"login" => "Logi sisse",
"userlogin" => "Logi sisse",
@@ -330,7 +330,7 @@ Pärast parooli saamist palun logige sisse.",
"showpreview" => "Näita eelvaadet",
"blockedtitle" => "Kasutaja on blokeeritud",
"blockedtext" => "Teie kasutajanime või IP-aadressi blokeeris $1.
-Tema põhjendus on järgmine:<br>''$2''<p>Küsimuse arutamiseks võite pöörduda $1 või mõne teise
+Tema põhjendus on järgmine:<br />''$2''<p>Küsimuse arutamiseks võite pöörduda $1 või mõne teise
[[Vikipeedia:administraatorid|administraatori]] poole.",
"newarticle" => "(Uus)",
"newarticletext" =>
@@ -359,7 +359,7 @@ Kui Te selle salvestate, siis kõik Teie tehtud muudatused lähevad kaduma.</str
"yourdiff" => "Erinevused",
"copyrightwarning" => "Pidage silmas, et kõik Vikipeediale tehtud kaastööd loetakse avaldatuks vastavalt litsentsile GNU Free Documentation License
(üksikasjad on leheküljel $1).
-Kui Te ei soovi, et Teie poolt kirjutatut halastamatult redigeeritakse ja omal äranägemisel kasutatakse, siis ärge seda siia salvestage.<br>
+Kui Te ei soovi, et Teie poolt kirjutatut halastamatult redigeeritakse ja omal äranägemisel kasutatakse, siis ärge seda siia salvestage.<br />
Te kinnitate ka, et kirjutasite selle ise või võtsite selle kopeerimiskitsenduseta allikast.
<strong>ÄRGE SAATKE AUTORIÕIGUSEGA KAITSTUD MATERJALI ILMA LOATA!</strong>",
"longpagewarning" => "HOIATUS: Selle lehekülje pikkus ületab $1 kilobaiti. Mõne brauseri puhul valmistab raskusi 32 kilobaidile läheneva pikkusega lehekülgede redigeerimine. Palun kaaluge selle lehekülje sisu jaotamist lühemate lehekülgede vahel.",
@@ -415,8 +415,8 @@ ning $3 artikli tekstis.",
või kasutatakse mitut otsingusõna (tulemina ilmuvad ainult leheküljed, mis sisaldavad kõiki otsingusõnu).",
"powersearch" => "Otsi",
"powersearchtext" => "
-Otsing nimeruumidest :<br>
-$1<br>
+Otsing nimeruumidest :<br />
+$1<br />
$2 Loetle ümbersuunamisi &nbsp; Otsi $3 $9",
@@ -555,7 +555,7 @@ created and by whom, and anything else you may know about it.",
"deleteimgcompletely" => "del",
"imghistlegend" => "Legend: (viim) = see on pildi viimane versioon, (del) = kustuta
see vana versioon, (taas) = taasta see vana versioon.
-<br><i>Click on date to see image uploaded on that date</i>.",
+<br /><i>Click on date to see image uploaded on that date</i>.",
"imagelinks" => "Image links",
"linkstoimage" => "Sellele pildile viitavad järgmised leheküljed:",
"nolinkstoimage" => "Selle pildile ei viita ükski lehekülg.",
@@ -583,9 +583,9 @@ Nende hulgas on <b>$2</b> administraatorit (vt $3).",
"maintenancebacklink" => "Tagasi hooldusleheküljele",
"disambiguations" => "Disambiguation pages",
"disambiguationspage" => "Wikipedia:Links_to_disambiguating_pages",
-"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "Double Redirects",
-"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br>\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
+"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br />\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
"brokenredirects" => "Broken Redirects",
"brokenredirectstext" => "The following redirects link to a non-existing article.",
"selflinks" => "Iseendale viitavad leheküljed",
@@ -769,7 +769,7 @@ pages that were vandalized).",
"noblockreason" => "You must supply a reason for the block.",
"blockipsuccesssub" => "Block succeeded",
"blockipsuccesstext" => "IP-aadress \"$1\" on blokeeritud.
-<br>See [[Special:Ipblocklist|IP block list]] to review blocks.",
+<br />See [[Special:Ipblocklist|IP block list]] to review blocks.",
"unblockip" => "Unblock IP address",
"unblockiptext" => "Use the form below to restore write access
to a previously blocked IP address.",
@@ -802,7 +802,7 @@ Please confirm that this is what you intend to do.",
"lockdbsuccesssub" => "Andmebaas kirjutuskaitse all",
"unlockdbsuccesssub" => "Kirjutuspääs taastatud",
"lockdbsuccesstext" => "Vikipeedia andmebaas on nüüd kirjutuskaitse all.
-<br>Kui Teie hooldustöö on läbi, ärge unustage taastada kirjutuspääs!",
+<br />Kui Teie hooldustöö on läbi, ärge unustage taastada kirjutuspääs!",
"unlockdbsuccesstext" => "Vikipeedia andmebaasi kirjutuspääs on taastatud.",
# SQL query
diff --git a/languages/LanguageFa.php b/languages/LanguageFa.php
index d66d91aca6a2..18815487b9ca 100644
--- a/languages/LanguageFa.php
+++ b/languages/LanguageFa.php
@@ -129,8 +129,8 @@ require_once("LanguageUtf8.php");
"tog-showtoolbar"=>"نمایش نوار ابزار جعبه‌ی ویرایش",
"tog-editondblclick" => "ویرایش صÙحه‌ها با دوکلیک (جاوااسکریپت)",
"tog-editsection"=>"به کار انداختن ویرایش قسمت‌ها از طریق پیوندهای [ویرایش]",
-"tog-editsectiononrightclick"=>"به کار انداختن ویرایش قسمت‌ها با کلیک راست<br>روی عناوین قسمت‌ها (جاوااسکریپت)",
-"tog-showtoc"=>"نمایش Ùهرست مندرجات<br>(برای مقالات با بیش از Û³ سرÙصل)",
+"tog-editsectiononrightclick"=>"به کار انداختن ویرایش قسمت‌ها با کلیک راست<br />روی عناوین قسمت‌ها (جاوااسکریپت)",
+"tog-showtoc"=>"نمایش Ùهرست مندرجات<br />(برای مقالات با بیش از Û³ سرÙصل)",
"tog-rememberpassword" => "کلمه‌ی عبور برای نشست‌های بعدی بماند",
"tog-editwidth" => "عرض جعبه‌ی ویرایش کامل باشد",
"tog-watchdefault" => "اÙزودن صÙحاتی Ú©Ù‡ ویرایش می‌کند به Ùهرست تعقیبات",
@@ -306,8 +306,8 @@ The administrator who locked it offered this explanation:
"perfdisabled" => "شرمنده! این امکان موÙقتاً برداشته شده چون پایگاه داده را چنان کند می‌کند
Ú©Ù‡ هیچ کس نمی‌تواند از ویکی استÙاده کند.",
"perfdisabledsub" => "این نسخه‌ی ذخیره‌شده‌ای از $1 است: ",
-"wrong_wfQuery_params" => "پارامترهای wfQuery() نادرست است<br>
-تابع: $1<br>
+"wrong_wfQuery_params" => "پارامترهای wfQuery() نادرست است<br />
+تابع: $1<br />
پرس‌وجو: $2
",
"viewsource" => "نمایش مبدأ",
@@ -333,8 +333,8 @@ The administrator who locked it offered this explanation:
"yourpasswordagain" => "کلمه‌ی عبور را دوباره وارد کنید",
"newusersonly" => " (Ùقط کاربران جدید)",
"remembermypassword" => "کلمه‌ی عبور بین نشست‌ها به خاطر سپرده شود.",
-"loginproblem" => "<b>ورود شما به سیستم با مشکلی مواجه شد.</b><br>دوباره تلاش کنید!",
-"alreadyloggedin" => "<font color=red><b>کاربر $1, شما از قبل وارد سیستم شده‌اید!</b></font><br>\n",
+"loginproblem" => "<b>ورود شما به سیستم با مشکلی مواجه شد.</b><br />دوباره تلاش کنید!",
+"alreadyloggedin" => "<font color=red><b>کاربر $1, شما از قبل وارد سیستم شده‌اید!</b></font><br />\n",
"login" => "ورود به سیستم",
"loginprompt" => "برای ورود به ویکی‌پدیا باید cookieها را Ùعال کنید.",
@@ -409,7 +409,7 @@ You should log in and change your password now.",
"showpreview" => "پیش‌نمایش نمایش یابد",
"blockedtitle" => "کاربر بسته شده است",
"blockedtext" => "نام کاربری یا نشانی IP شما توسط $1 بسته شده است.
-دلیل داده‌شده این است:<br>''$2''<p>شما می‌توانید با $1 یا یکی از
+دلیل داده‌شده این است:<br />''$2''<p>شما می‌توانید با $1 یا یکی از
[[ویکی‌پدیا:مدیران|مدیران]] تماس بگیرید و در این باره صحبت کنید.
توجه کنید Ú©Ù‡ شما نمی‌توانید از امکان «Ùرستادن پست الکترونیکی به این کاربر» استÙاده کنید مگر اینکه نشانی پست الکترونیکی
@@ -472,7 +472,7 @@ You should log in and change your password now.",
تحت اجازه‌نامه‌ی مستندات آزاد گنو منتشر می‌شوند
(برای جزئیات بیشتر به $1 مراجعه کنید).
اگر نمی‌خواهد نوشته‌هایتان بیرحمانه ویرایش شده و به دلخواه توزیع شود،
-اینجا Ù†Ùرستیدشان.<br>
+اینجا Ù†Ùرستیدشان.<br />
همینطور شما دارید به ما قول می‌دهید که خودتان این را نوشته‌اید، یا آن را از یک منبع آزاد با
مالکیت عمومی یا مشابه آن برداشته‌اید.
<strong>کارهای دارای حق انحصاری تکثیر (کپی‌رایت) را بی اجازه Ù†Ùرستید!</strong>",
@@ -539,8 +539,8 @@ 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).",
"powersearch" => "جستجو",
"powersearchtext" => "
-جستجو در Ùضاهای نام :<br>
-$1<br>
+جستجو در Ùضاهای نام :<br />
+$1<br />
$2 تغییرمسیرها Ùهرست شوند &nbsp; جستجو برای $3 $9",
"searchdisabled" => "<p>شرمنده! جستجوی کل متن موقتاً از کار انداخته شده, for performance reasons. In the meantime, you can use the Google search below, which may be out of date.</p>
@@ -555,7 +555,7 @@ border=\"0\" ALT=\"Ú¯ÙˆÚ¯Ù„\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"جستجوی گوگل\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br>
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -736,7 +736,7 @@ you may be blocked from uploading if you abuse the system.",
"deleteimgcompletely" => "حذÙ",
"imghistlegend" => "شرح: (Ùعلی) = این تصویر Ùعلی است، (حذÙ) = این
نسخه‌ی قدیمی حذ٠شود، (برگرد) = برگرداندن به این نسخه‌ی قدیمی.
-<br><i>برای دیدن تصویر بار شده در تاریخ مشخص، روی تاریخ کلیک کنید</i>.",
+<br /><i>برای دیدن تصویر بار شده در تاریخ مشخص، روی تاریخ کلیک کنید</i>.",
"imagelinks" => "پیوند‌های تصاویر",
"linkstoimage" => "این صÙحات به این تصویر پیوند دارند:",
"nolinkstoimage" => "هیچ صÙحه‌ای به این تصویر پیوند ندارد.",
@@ -764,9 +764,9 @@ you may be blocked from uploading if you abuse the system.",
"disambiguations" => "صÙحات رÙع ابهام",
"disambiguationspage" => "ویکی‌پدیا:پیوند به صÙحات رÙع ابهام",
"disambiguationstext" => "مقاله‌های زیر به یک <i>صÙحه‌ی رÙع ابهام</i> پیوند دارند. به جای این، این صÙحات باید به
-They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "تغییرمسیرهای دوتایی",
-"doubleredirectstext" => "<b>توجه:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br>\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
+"doubleredirectstext" => "<b>توجه:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br />\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
"brokenredirects" => "تغییرمسیرهای خراب",
"brokenredirectstext" => "تغییرمسیرهای زیر به یک صÙحه‌ی ناموجود پیوند دارند.",
"selflinks" => "صÙحات با پیوند به خود",
@@ -982,7 +982,7 @@ by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled bac
"noblockreason" => "شما باید دلیلی برای بستن مشخص کنید.",
"blockipsuccesssub" => "بستن با موÙقیت انجام شد",
"blockipsuccesstext" => "«$1» بسته شده است.
-<br>برای بررسی بسته‌شدن‌ها، به [[ویژه:ÙهرستIPهای‌بسته|Ùهرست IPهای بسته]] مراجعه کنید.",
+<br />برای بررسی بسته‌شدن‌ها، به [[ویژه:ÙهرستIPهای‌بسته|Ùهرست IPهای بسته]] مراجعه کنید.",
"unblockip" => "باز کردن کاربر",
"unblockiptext" => "برای باز گرداندن دسترسی نوشتن به یک نشانی IP یا نام کاربری بسته‌شده
از Ùرم زیر استÙاده کنید.",
@@ -1022,7 +1022,7 @@ Please confirm that this is what you intend to do.",
"lockdbsuccesssub" => "Ù‚ÙÙ„ کردن پایگاه داده با موÙقیت انجام شد",
"unlockdbsuccesssub" => "Ù‚ÙÙ„ پایگاه داده برداشته شد",
"lockdbsuccesstext" => "پایگاه داده Ù‚ÙÙ„ شد.
-<br>Ùراموش نکنید Ú©Ù‡ پس از اتمام نگهداری Ù‚ÙÙ„ را بردارید.",
+<br />Ùراموش نکنید Ú©Ù‡ پس از اتمام نگهداری Ù‚ÙÙ„ را بردارید.",
"unlockdbsuccesstext" => "پایگاه داده از Ù‚ÙÙ„ در آمد.",
# SQL query
diff --git a/languages/LanguageFi.php b/languages/LanguageFi.php
index 9f0d821223ca..9a5508f7b349 100644
--- a/languages/LanguageFi.php
+++ b/languages/LanguageFi.php
@@ -283,8 +283,8 @@ Käyttäjätunnuksesi on luotu.
"yourpasswordagain" => "Salasana uudelleen",
"newusersonly" => " (vain uudet käyttäjät)",
"remembermypassword" => "Muista salasana saman yhteyden istunnoissa",
-"loginproblem" => "<b>Sisäänkirjautumisessasi oli ongelmia.</b><br>Yritä uudelleen!",
-"alreadyloggedin" => "<font color=red><b>Käyttäjä $1, olet jo kirjautunut sisään!</b></font><br>\n",
+"loginproblem" => "<b>Sisäänkirjautumisessasi oli ongelmia.</b><br />Yritä uudelleen!",
+"alreadyloggedin" => "<font color=red><b>Käyttäjä $1, olet jo kirjautunut sisään!</b></font><br />\n",
"notloggedin" => "Et ole kirjautunut",
"login" => "Kirjaudu sisään",
@@ -323,7 +323,7 @@ sähköpostiosoitteeseen. Kirjaudu sisään uudestaan, kun olet saanut sen.",
"showpreview" => "Esikatsele",
"blockedtitle" => "Pääsy käyttäjältä estetty",
"blockedtext" => "$1 on estänyt pääsysi Wikpediaan joko käyttäjänimesi tai IP-osoitteesi perusteella.
-Syynä tähän on:<br>''$2''<p>Ota yhteyttä henkilöön $1 tai johonkuhun
+Syynä tähän on:<br />''$2''<p>Ota yhteyttä henkilöön $1 tai johonkuhun
muuhun [[{{ns:project}}:ylläpitäjät|ylläpitäjään]] keskustellaksesi estosta.",
"newarticle" => "(uusi)",
"newarticletext" => "Olet seurannut linkkiä sivulle, jota ei ole vielä olemassa.Luodaksesi sivun, kirjoita alla olevaan laatikkoon (katso [[{{ns:project}}:Ohje|ohjeesta]] lisätietoja). Jos tarkoituksesi ei ole luoda uutta sivua, paina selaimesi '''back'''-painiketta.",
@@ -348,7 +348,7 @@ Jos tallennat sen, kaikki tämän version jälkeen tehdyt muutokset katoavat.</s
"copyrightwarning" => "Huomaa, että kaikki {{grammar:illative|{{SITENAME}}}} tehtävät tuotokset
katsotaan julkaistuksi GNU Free Documentation -lisenssin mukaisesti
(katso sivulta $1 yksityiskohtia). Jos et halua, että kirjoitustasi
-muokataan armottomasti ja uudelleenkäytetään vapaasti, älä tallenna kirjoitustasi.<br>
+muokataan armottomasti ja uudelleenkäytetään vapaasti, älä tallenna kirjoitustasi.<br />
Lupaa myös, että kirjoitit tämän itse, tai kopioit sen jostain vapaasta lähteestä.
<strong>ÄLÄ KÄYTÄ TEKIJÄNOIKEUDEN ALAISTA MATERIAALIA ILMAN LUPAA!</strong>",
"longpagewarning" => "VAROITUS: Tämän sivun tekstiosuus on $1 kilotavua pitkä. Joillakin selaimilla voi olla vaikeuksia yli 32 kilotavun kokoisten sivujen muokkaamisessa. Harkitse, voisiko sivun jakaa pienempiin osiin.",
@@ -403,8 +403,8 @@ joita ei indeksoida, tai useamman kuin yhden hakutermin määrittelemisestä (va
joilla on kaikki hakutermin sanat, näkyvät tuloksissa).",
"powersearch" => "Etsi",
"powersearchtext" => "
-Haku nimiavaruuksista:<br>
-$1<br>
+Haku nimiavaruuksista:<br />
+$1<br />
$2 Listaa uudelleenohjaukset &nbsp; Etsi $3 $9",
# Preferences page
@@ -568,7 +568,7 @@ mistä se on peräisin, milloin se on luotu, kuka sen loi ja mahdollisesti muita
"deleteimgcompletely" => "poista",
"imghistlegend" => "Merkinnät: (nyk.) = nykyinen kuva, (poista) = poista
tämä vanha versio, (palauta) = palauta kuva tähän vanhaan versioon.
-<br><i>Klikkaa päiväystä nähdäksesi silloin tallennettu kuva</i>.",
+<br /><i>Klikkaa päiväystä nähdäksesi silloin tallennettu kuva</i>.",
"imagelinks" => "Kuvalinkit",
"linkstoimage" => "Seuraavilta sivuilta on linkki tähän kuvaan:",
"nolinkstoimage" => "Tähän kuvaan ei ole linkkejä miltään sivulta.",
@@ -597,9 +597,9 @@ Keskimäärin sivua on muokattu <b>$5</b> kertaa, ja muokkausta kohden sivua on
"maintenancebacklink" => "Takaisin ylläpitosivulle",
"disambiguations" => "Tarkennussivu",
"disambiguationspage" => "{{ns:project}}:Linkkejä_tarkennussivuihin",
-"disambiguationstext" => "Seuraavat artikkelit linkittävät <i>tarkennussivuun</i>. Sen sijasta niiden pitäisi linkittää asianomaiseen aiheeseen.<br>Sivua kohdellaan tarkennussivuna jos siihen on linkki sivulta $1.<br>Linkkejä muihin nimiavaruuksiin <i>ei</i> ole listattu tässä.",
+"disambiguationstext" => "Seuraavat artikkelit linkittävät <i>tarkennussivuun</i>. Sen sijasta niiden pitäisi linkittää asianomaiseen aiheeseen.<br />Sivua kohdellaan tarkennussivuna jos siihen on linkki sivulta $1.<br />Linkkejä muihin nimiavaruuksiin <i>ei</i> ole listattu tässä.",
"doubleredirects" => "Kaksinkertaiset uudelleenohjaukset",
-"doubleredirectstext" => "<b>Huomio:</b> Tässä listassa saattaa olla virheitä. Yleensä kyseessä on sivu, jossa ensimmäisen #REDIRECT:in jälkeen on tekstiä.<br>\nJokaisella rivillä on linkit ensimmäiseen ja toiseen uudelleenohjaukseen sekä toisen uudelleenohjauksen kohteen ensimmäiseen riviin, eli yleensä \"oikeaan\" kohteeseen, johon ensimmäisen uudelleenohjauksen pitäisi osoittaa.",
+"doubleredirectstext" => "<b>Huomio:</b> Tässä listassa saattaa olla virheitä. Yleensä kyseessä on sivu, jossa ensimmäisen #REDIRECT:in jälkeen on tekstiä.<br />\nJokaisella rivillä on linkit ensimmäiseen ja toiseen uudelleenohjaukseen sekä toisen uudelleenohjauksen kohteen ensimmäiseen riviin, eli yleensä \"oikeaan\" kohteeseen, johon ensimmäisen uudelleenohjauksen pitäisi osoittaa.",
"brokenredirects" => "Virheelliset uudelleenohjaukset",
"brokenredirectstext" => "Seuraavat uudelleenohjaukset on linkitetty artikkeleihin, joita ei ole olemassa.",
"selflinks" => "Sivut, jotka linkittävät itseensä",
@@ -761,7 +761,7 @@ Ilmoita syy alapuolella (esimerkiksi lista vandalisoiduista sivuista).",
"noblockreason" => "Sinun täytyy antaa syy estämiselle.",
"blockipsuccesssub" => "Esto onnistui",
"blockipsuccesstext" => "IP-osoite \"$1\" on estetty.
-<br>Katso [[Erityissivut:Ipblocklist|IP-estolista]] katsellaksesi estoja.",
+<br />Katso [[Erityissivut:Ipblocklist|IP-estolista]] katsellaksesi estoja.",
"unblockip" => "Poista IP-osoitteen muokkausesto",
"unblockiptext" => "Käytä allaolevaa lomaketta poistaaksesi kirjoitusesto aikaisemmin estetyltä IP-osoitteelta.",
"ipusubmit" => "Poista tämän osoitteen esto",
@@ -786,7 +786,7 @@ Ilmoita syy alapuolella (esimerkiksi lista vandalisoiduista sivuista).",
"lockdbsuccesssub" => "Tietokannan lukitseminen onnistui",
"unlockdbsuccesssub" => "Tietokannan vapauttaminen onnistui",
"lockdbsuccesstext" => "Wikipedia-tietokanta on lukittu.
-<br>Muista vapauttaa tietokanta ylläpitotoimenpiteiden jälkeen.",
+<br />Muista vapauttaa tietokanta ylläpitotoimenpiteiden jälkeen.",
"unlockdbsuccesstext" => "Wikipedia-tietokanta on vapautettu.",
# SQL query
diff --git a/languages/LanguageFo.php b/languages/LanguageFo.php
index 7c2cca89d5cc..522c2114094a 100644
--- a/languages/LanguageFo.php
+++ b/languages/LanguageFo.php
@@ -168,13 +168,13 @@ require_once( 'LanguageUtf8.php');
"tog-highlightbroken" => "Brúka reyða ávísing til tómar síður",
"tog-justify" => "Stilla greinpart",
"tog-hideminor" => "Goym minni broytingar í seinast broytt listanum", # Skjul mindre ændringer i seneste ændringer listen
-"tog-usenewrc" => "víðka seinastu broytingar lista<br>(ikki til alla kagarar)",
+"tog-usenewrc" => "víðka seinastu broytingar lista<br />(ikki til alla kagarar)",
"tog-numberheadings" => "Sjálvtalmerking av yvirskrift",
"tog-showtoolbar" => "Vís amboðslinju í rætting",
"tog-editondblclick" => "Rætta síðu við at tvíklikkja (JavaScript)",
"tog-editsection" =>"Rætta greinpart við hjálp av [rætta]-ávísing",
-"tog-editsectiononrightclick"=>"Rætta greinpart við at høgraklikkja<br> á yvirskrift av greinparti (JavaScript)",
-"tog-showtoc"=>"Vís innihaldsyvurlit<br>(Til greinir við meira enn trimun greinpartum)",
+"tog-editsectiononrightclick"=>"Rætta greinpart við at høgraklikkja<br /> á yvirskrift av greinparti (JavaScript)",
+"tog-showtoc"=>"Vís innihaldsyvurlit<br />(Til greinir við meira enn trimun greinpartum)",
"tog-rememberpassword" => "Minst til loyniorð næstu ferð",
"tog-editwidth" => "Rættingarkassin hevur fulla breid",
"tog-watchdefault" => "Vaka yvur nýggjum og broyttum greinum",
diff --git a/languages/LanguageFr.php b/languages/LanguageFr.php
index 322ad3ac5195..7248f1908731 100644
--- a/languages/LanguageFr.php
+++ b/languages/LanguageFr.php
@@ -174,7 +174,7 @@ require_once( "LanguageUtf8.php" );
"subcategories" => "Sous-catégories", // Looxix "Subcategories",
-"linktrail" => "/^([a-zàâçéèêîôû]+)(.*)\$/sD",
+"linktrail" => "/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÃÖÜÀÈÙ]+)(.*)$/sD",
"mainpage" => "Accueil",
"mainpagetext" => "Logiciel {{SITENAME}} installé.",
"portal" => "Accueil communauté",
@@ -1032,8 +1032,8 @@ Tapez le nom de l'utilisateur dans la boite et pressez le bouton pour lui donner
'val_clear_old' => 'Supprimer mes données de validation pour $1',
'val_merge_old' => 'Utiliser mes précédents choix pour les choix marqués \'Sans opinion\'',
'val_noop' => 'Sans opinion',
-'val_percent' => '<b>$1%</b><br>($2 sur $3 points<br>par $4 utilisateurs)',
-'val_percent_single' => '<b>$1%</b><br>($2 sur $3 points<br>par un utilisateur)',
+'val_percent' => '<b>$1%</b><br />($2 sur $3 points<br />par $4 utilisateurs)',
+'val_percent_single' => '<b>$1%</b><br />($2 sur $3 points<br />par un utilisateur)',
'val_total' => 'Total',
'val_version' => 'Version',
'val_tab' => 'Valider',
diff --git a/languages/LanguageFy.php b/languages/LanguageFy.php
index 5770b779b346..84253748fbb8 100644
--- a/languages/LanguageFy.php
+++ b/languages/LanguageFy.php
@@ -319,8 +319,8 @@ Ferjit net se oan jo foarkar oan te passen.",
"yourpasswordagain" => "Jo wachtwurd (nochris)",
"newusersonly" => " (allinnich foar nije brûkers)",
"remembermypassword" => "Oare kear fansels oanmelde.",
-"loginproblem" => "<b>Der wie wat mis mei jo oanmelden.</b><br>Besykje it nochris, a.j.w.",
-"alreadyloggedin" => "<font color=red><b>Brûker $1, jo binne al oanmeld!</b></font><br>\n",
+"loginproblem" => "<b>Der wie wat mis mei jo oanmelden.</b><br />Besykje it nochris, a.j.w.",
+"alreadyloggedin" => "<font color=red><b>Brûker $1, jo binne al oanmeld!</b></font><br />\n",
"login" => "Oanmelde",
"userlogin" => "Oanmelde",
"logout" => "Ofmelde",
@@ -331,7 +331,7 @@ Ferjit net se oan jo foarkar oan te passen.",
"userexists" => "Dy brûkersname wurdt al brûkt. Besykje in oarenien.",
"youremail" => "Jo e-postadres (*).",
"yournick" => "Jo alias (foar sinjaturen)",
-"emailforlost" => "* In e-postadres hoecht net.<br>
+"emailforlost" => "* In e-postadres hoecht net.<br />
Mar it helpt, soenen jo jo wachtwurd ferjitte.
En mei in e-postadres kinne oaren fan de web siden contact mei jo krije,
sûnder dat se dat adres witte. (Dat leste kin ek wer útset by de instellings.)",
@@ -367,7 +367,7 @@ Please log in again after you receive it.",
"showpreview" => "Oerlêze foar de side fêstlein is",
"blockedtitle" => "Brûker is útsletten troch",
"blockedtext" => "Jo brûkersname of Ynternet-adres is útsletten.
-As reden is opjûn:<br>''$2''<p>As jo wolle, kinne jo hjiroer kontakt op nimme meid de behearder.
+As reden is opjûn:<br />''$2''<p>As jo wolle, kinne jo hjiroer kontakt op nimme meid de behearder.
(Om't in Ynternet-adressen faak mar foar ien sessie tawiisd wurde, kin it wêze
dat it eins gjit om in oar dy't deselde tagongferskaffer hat as jo hawwe. As it jo
@@ -416,7 +416,7 @@ Soenen jo dizze fêstlizze, dan is al wat sûnt dy tiid feroare is kwyt.</strong
as fallend ûnder de GNU Iepen Dokumentaasje Lisinsje
(sjoch fierders: \"$1\").
As jo net wolle dat jo skriuwen ûnferbidlik oanpast en frij ferspraat wurdt,
-dan is it baas, en set it net op de $wgSitename.<br>
+dan is it baas, en set it net op de $wgSitename.<br />
Jo ferklare ek dat jo dit sels skreaun hawwe, of it oernaam hawwe út in
publyk eigendom of in oare iepen boarne.
<strong><big>Foeg gjin wurk ûnder auteursrjocht ta sûnder tastimming!</big></strong>",
@@ -481,8 +481,8 @@ wurden syke wurde, allinnich siden fûn wurde wêr't <b>alle</b> worden op fûn
"powersearch" => "Sykje",
"powersearchtext" => "
-Sykje in nammeromten :<br>
-$1<br>
+Sykje in nammeromten :<br />
+$1<br />
$2 List trochferwizings &nbsp; Sykje nei \"$3\" \"$9\"",
"searchdisabled" => "<p>Op it stuit stjit it trochsykjen fan tekst net oan, om't de
@@ -501,9 +501,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Sykje mei Google\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio
name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch
-value=\"{$wgServer}\" checked> $wgSitename <br>
+value=\"{$wgServer}\" checked> $wgSitename <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -679,7 +679,7 @@ en wat jo fierder mar oan ynformaasje hawwe.",
"deleteimgcompletely" => "wisk",
"imghistlegend" => "Utlis: (no) = dit is it hjoeddeiske ôfbyld,
(wisk) = wiskje dizze âldere ferzje, (tebek) = set ôfbyld tebek nei dizze âldere ferzje.
-<br><i>Fia de datum kinne jo it ôfbyld dat doe oanbean besjen</i>.",
+<br /><i>Fia de datum kinne jo it ôfbyld dat doe oanbean besjen</i>.",
"imagelinks" => "Ofbyldkeppelings",
"linkstoimage" => "Dizze siden binne keppele oan it ôfbyld:",
@@ -690,9 +690,9 @@ en wat jo fierder mar oan ynformaasje hawwe.",
"statistics" => "Statistyk",
"sitestats" => "Side statistyk",
"userstats" => "Brûker statistyk",
-"sitestatstext" => "It tal fan siden in de $wgSitename is: <b>$2</b>.<br>
+"sitestatstext" => "It tal fan siden in de $wgSitename is: <b>$2</b>.<br />
(Oerlissiden, siden oer de $wgSitename, oare bysûndere siden, stobben en
-trochferwizings yn de databank binne dêrby net meiteld.)<br>
+trochferwizings yn de databank binne dêrby net meiteld.)<br />
It tal fan siden in de databank is: <b>$1</b>.
<p>
Der is <b>$3</b> kear in side opfrege, en <b>$4</b> kear in side bewurke,
@@ -715,12 +715,12 @@ eltse oanpassing daalks in fernijde side op.",
"disambiguationspage" => "$wgMetaNamespace:trochferwizing",
"disambiguationstext" => "Dizze siden binne keppele fia in
[[$wgMetaNamespace:trochferwizing]].
-Se soenen mei de side sels keppele wurde moatte.<br>
+Se soenen mei de side sels keppele wurde moatte.<br />
(Allinnich siden út deselde nammeromte binne oanjûn.)",
"doubleredirects" => "Dûbele trochverwizings",
"doubleredirectstext" => "<b>Let op!</b> Der kinne missen yn dizze list stean!
-Dat komt dan ornaris troch oare keppelings ûnder de \"#REDIRECT\".<br>
+Dat komt dan ornaris troch oare keppelings ûnder de \"#REDIRECT\".<br />
Eltse rigel jout keppelings nei de earste en twadde trochverwizing, en dan de earste regel fan
de twadde trochferwizing, wat it \"echte\" doel wêze moat.",
@@ -932,7 +932,7 @@ Meld de krekte reden! Begelyk, neam de siden dy't oantaaste waarden.",
"badipaddress" => "Dy brûker bestiet net",
"noblockreason" => "Jo moatte de krekte reden opjaan.",
"blockipsuccesssub" => "Utsluting slagge",
-"blockipsuccesstext" => "Brûker \"$1\" is útsletten.<br>
+"blockipsuccesstext" => "Brûker \"$1\" is útsletten.<br />
(List fan [[Wiki:Ipblocklist|útslette brûkers]].)",
"unblockip" => "Lit brûker der wer yn",
"unblockiptext" => "Brûk dizze fjilden om in brûker wer skriuwtagong te jaan.",
@@ -965,7 +965,7 @@ Befêstigje dat dit is wat jo wolle.",
"lockdbsuccesssub" => "Databank is 'Net-skriuwe'",
"unlockdbsuccesssub" => "Database is skriuwber",
"lockdbsuccesstext" => "De $wgSitename databank is 'Net-skriuwe' makke.
-<br>Tink derom en meitsje de databank skriuwber as jo ûnderhâld ree is.",
+<br />Tink derom en meitsje de databank skriuwber as jo ûnderhâld ree is.",
"unlockdbsuccesstext" => "De $wgSitename databank is skriuwber makke.",
# SQL query
@@ -1175,5 +1175,4 @@ class LanguageFy extends LanguageUtf8 {
}
-?>
-
+?> \ No newline at end of file
diff --git a/languages/LanguageGa.php b/languages/LanguageGa.php
index 0f389e8643d0..34fb8d7988c2 100755
--- a/languages/LanguageGa.php
+++ b/languages/LanguageGa.php
@@ -184,8 +184,8 @@ DISCUSSION!
"tog-numberheadings" => "Uimhrigh ceannteidil go huathoibrí­och",
"tog-editondblclick" => "Cuir leathanaigh in eagar le roghna dúbailte (JavaScript)",
"tog-editsection"=>"Cumasaigh eagarthóireacht mí­r le lúibí­ní­ [athraithe]",
-"tog-editsectiononrightclick"=>"Cumasaigh eagarthóireacht mí­r le deas-roghna<br> ar ceannteidil (JavaScript)",
-"tog-showtoc"=>"Déan liosta na ceannteideal<br>(do ailt le ní­os mó ná 3 ceannteidil)",
+"tog-editsectiononrightclick"=>"Cumasaigh eagarthóireacht mí­r le deas-roghna<br /> ar ceannteidil (JavaScript)",
+"tog-showtoc"=>"Déan liosta na ceannteideal<br />(do ailt le ní­os mó ná 3 ceannteidil)",
"tog-rememberpassword" => "Cuimhnigh mo focal faire",
"tog-editwidth" => "Cuir uasméid ar an mbosca eagair",
"tog-watchdefault" => "Breathnaigh ar leathanaigh a d'athraigh tú",
@@ -416,8 +416,8 @@ san oideasra MediaWiki. De ghnáth, tarlaí­onn sé sin nuair a leantar nasc st
teideal idirtheangach no idir-Wiki nasctha go mí­cheart.",
"perfdisabled" => "Tá brón orainnn! Mhí­chumasaí­odh an gné seo go sealadach chun luas an bunachair sonraí­ a chosaint.",
"perfdisabledsub" => "Seo cóip i dtaisce ó $1:",
-"wrong_wfQuery_params" => "Paraiméadair mí­chearta don wfQuery()<br>
-Feidhm: $1<br>
+"wrong_wfQuery_params" => "Paraiméadair mí­chearta don wfQuery()<br />
+Feidhm: $1<br />
Órdú: $2
",
'perfcached' => 'Fuarthas na sonraí seo as dtaisce, agus is dócha nach bhfuil siad reatha:',
@@ -446,13 +446,13 @@ Ná déan dearmad do sainroghanna phearsanta a athrú.",
"yourpasswordagain" => "Athiontráil d'fhocal faire",
"newusersonly" => " (D'úsáideoirí­ úrnua amháin)",
"remembermypassword" => "Cuimhnigh m'fhocal faire.",
-"loginproblem" => "<b>Bhí­ fadhb leis an logáil isteach.</b><br>Déan iarracht eile!",
-"alreadyloggedin" => "<font color=red><b>A húsáideoir $1, tá tú logáilte isteach cheana féin!</b></font><br>\n",
+"loginproblem" => "<b>Bhí­ fadhb leis an logáil isteach.</b><br />Déan iarracht eile!",
+"alreadyloggedin" => "<font color=red><b>A húsáideoir $1, tá tú logáilte isteach cheana féin!</b></font><br />\n",
"areyounew" => "Má tá tú i do núí­osach chuig an Vicipéid agus tá cuntas úsáideora ag teastáil uait,
iontráil ainm úsáideora, agus ansin iontráil agus athiontráil focal faire.
Níl an seoladh rí­omhphoist ach rud roghnach; dá scríobhfá d'fhocal faire, is feidir leat a iarradh
-go seolfar é chuig an seoladh rí­omhphoist a thug tú.<br>\n",
+go seolfar é chuig an seoladh rí­omhphoist a thug tú.<br />\n",
"login" => "Log ann",
'loginprompt' => "Tá chomhaid aithintáin (<i>cookies</i>) riachtanach chun logáil isteach san {{SITENAME}} a dhéanamh.",
@@ -470,7 +470,7 @@ go seolfar é chuig an seoladh rí­omhphoist a thug tú.<br>\n",
"emailforlost" => "* Níl na boscaí le réalt (*) ach roghnach. Le seoladh ríomhphoist i dtaisce, ba féidir le daoine teagmhail a dhéanamh leat
trí­d an suí­omh gan do sheoladh rí­omhphoist a nochtaigh dóibh. Ina theannta sin,
is cabhair é má dheanfá dearmad ar d'fhocal faire.<br /><br />Má toghaíonn tú d'ainm ceart a chur isteach, úsáidfear é chun do chuid dreachtaí a chur i leith tusa",
-'prefs-help-userdata' => '* <strong>Ainm ceart</strong> (roghnach): má toghaíonn tú é sin a chur ar fáil, úsáidfear é chun do chuid dreachtaí a chur i leith tusa.<br/>
+'prefs-help-userdata' => '* <strong>Ainm ceart</strong> (roghnach): má toghaíonn tú é sin a chur ar fáil, úsáidfear é chun do chuid dreachtaí a chur i leith tusa.<br />
* <strong>Ríomhphost</strong> (roghnach): Ba féidir le daoine teagmháil a dhéanamh leat gan do sheoladh ríomhphoist
a thaispeáint dóibh, agus ba féidir focal faire nua a sheol chugat má dhéanfá dearmad air.',
"loginerror" => "Earráid leis an logáil isteach",
@@ -531,7 +531,7 @@ Agus atá sé agat, logáil isteach arí­s leis le do thoil.",
"showpreview" => "Reamhspléach",
"blockedtitle" => "Tá an úsáideoir seo faoi chosc",
"blockedtext" => "Chuir $1 cosc ar d'ainm úsáideora nó do seoladh IP.
-Seo é an cúis a thugadh:<br>''$2''<p>Is féidir leat teagmháil a dhéanamh le $1 nó le ceann eile de na
+Seo é an cúis a thugadh:<br />''$2''<p>Is féidir leat teagmháil a dhéanamh le $1 nó le ceann eile de na
[[$wgMetaNamespace:Riarthóirí­|riarthóirí­]] chun an cosc a phléigh.
Tabhair faoi deara nach bhfuil cead agat an gné \"cuir rí­omhphost chuig an úsáideoir seo\" a úsáid
@@ -590,7 +590,7 @@ Dá shábhálfá é, caillfear aon athrú a rinneadh ó shin an eagrán seo.</st
"copyrightwarning" => "Tabhair faoi deara go scaoilí­tear gach dréacht chuig an Vicipéid maidir lena tearmaí­ an <i>GNU Free Documentation License</i>
(tuilleadh eolais ag $1).
Muna aontaíonn tú go cuirfear do chuid scrí­bhinn in eagar go héadrócaireach agus go athdálfar é gan teorainn,
-ná tabhair isteach é anseo.<br>
+ná tabhair isteach é anseo.<br />
Ina theannta sin, geallann tú duinn go scrí­obh tusa féin an rud seo, nó go chóipeáil tú é as
fhoinse atá gan chóipcheart.
<strong>Nà TABHAIR ISTEACH OBAIR ATà FAOI CHÓIPCHEART GAN CEAD!</strong>",
@@ -617,7 +617,7 @@ Cinntigh an URL a d'úsáid tú chun an leathanach seo a rochtain.\n",
"next" => "lns",
"last" => "rmh",
"orig" => "bun",
-'histlegend' => "Difríochtaí a roghnú: marcáil na boscaí de na eagráin atá ag teastail uait á cuir i gcomparáid, agus brúigh Iontráil nó an cnaipe ag bun an leathanaigh.<br/>
+'histlegend' => "Difríochtaí a roghnú: marcáil na boscaí de na eagráin atá ag teastail uait á cuir i gcomparáid, agus brúigh Iontráil nó an cnaipe ag bun an leathanaigh.<br />
Eochair: (rth) = difrí­ocht leis an eagrán reatha,
(rmh) = difrí­ocht leis an eagrán roimhe, M = mionathrú",
@@ -660,8 +660,8 @@ a nach bhfuil innéacsaí­tear, nó nuair a ceisteann tú ní­os mó ná téar
taispeáintear sna toraidh ach na leathanaigh ina bhfuil go leoir na téarmaí­ cuardaigh).",
"powersearch" => "Cuardaigh",
"powersearchtext" => "
-Cuardaigh sna hainmranna :<br>
-$1<br>
+Cuardaigh sna hainmranna :<br />
+$1<br />
$2 Cuir athsheolaidh in áireamh &nbsp; Cuardaigh ar $3 $9",
"searchdisabled" => "<p>Tá brón orainn! Mhí­chumasaí­odh an cuardach téacs iomlán go sealadach chun luas an suí­mh
a chosaint. Idir an dá linn, is féidir leat an cuardach Google anseo thí­os a úsáid - b'fhéidir go bhfuil sé as dáta.</p>",
@@ -680,7 +680,7 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
<input type=hidden name=domains value=\"{$wgServer}\">
-<br><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br>
+<br /><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -870,7 +870,7 @@ chruthaí­odh é agus rud eile ar bith tá 'fhios agat faoi.",
"deleteimgcompletely" => "scr",
"imghistlegend" => "Eochair: (rth) = seo é an eagrán reatha, (scr) = scrios an
sean-eagrán seo, (ath) = athúsáid an sean-eagrán seo.
-<br><i>Bruigh an dáta chun feach ar an í­omhá mar a suaslódálaí­odh é ar an dáta sin</i>.",
+<br /><i>Bruigh an dáta chun feach ar an í­omhá mar a suaslódálaí­odh é ar an dáta sin</i>.",
"imagelinks" => "Naisc í­omhá",
"linkstoimage" => "Is iad na leathanaigh seo a leanas a nascaí­onn chuig an í­omhá seo:",
"nolinkstoimage" => "Ní­l aon leathanach ann a nascaí­onn chuig an í­omhá seo.",
@@ -901,11 +901,11 @@ chrí­ochnaí­onn tú ;-)",
"disambiguations" => "Leathanaigh easathbhrí­ochais",
"disambiguationspage" => "Vicipéid:Naisc_go_leathanaigh_easathbhrí­ochais",
"disambiguationstext" => "Nascaí­onn na ailt seo a leanas go <i>leathanach easathbhrí­ochais</i>. Ba chóir dóibh nasc a
-dhéanamh leis an ábhar oiriúnach ina áit.<br>Tugtar an teideal easathbhrí­ochais ar leathanach má bhfuil násc aige
-ó $1.<br><i>Ní­</i> cuirtear naisc ó ranna eile ar an liosta seo.",
+dhéanamh leis an ábhar oiriúnach ina áit.<br />Tugtar an teideal easathbhrí­ochais ar leathanach má bhfuil násc aige
+ó $1.<br /><i>Ní­</i> cuirtear naisc ó ranna eile ar an liosta seo.",
"doubleredirects" => "Athsheolaidh Dúbailte",
"doubleredirectstext" => "<b>Tabhair faoi deara:</b> B'fheidir go bhfuil toraidh bréagacha ar an liosta seo.
-De ghnáth cí­allaí­onn sé sin go bhfuil téacs breise le naisc thí­os sa chéad #REDIRECT no #ATHSHEOLADH.<br>\n Sa gach
+De ghnáth cí­allaí­onn sé sin go bhfuil téacs breise le naisc thí­os sa chéad #REDIRECT no #ATHSHEOLADH.<br />\n Sa gach
sraith tá náisc chuig an chéad is an dara athsheoladh, chomh maith le chéad lí­ne an dara téacs athsheolaidh. De ghnáth
tugann sé sin an sprioc-alt \"fí­or\".",
"brokenredirects" => "Athsheolaidh Briste",
@@ -1149,7 +1149,7 @@ leathanaigh áirithe a rinne an duine damáiste ar).",
"noblockreason" => "Ní mór duit cúis a thabhairt don cosc.",
"blockipsuccesssub" => "D'éirigh leis an cosc",
"blockipsuccesstext" => "Choisceadh \"$1\".
-<br>Féach ar [[Speisialta:Ipblocklist|Liosta coisc IP]] chun coisc a athbhreithnigh.",
+<br />Féach ar [[Speisialta:Ipblocklist|Liosta coisc IP]] chun coisc a athbhreithnigh.",
"unblockip" => "Bain an cosc den úsáideoir",
"unblockiptext" => "Úsáid an foirm anseo thí­os chun bealach scrí­ofa a thabhairt ar ais go seoladh
IP nó ainm úsáideora a raibh coiscthe roimhe seo.",
@@ -1238,8 +1238,8 @@ hathrú, ach ba mhaith leat do roghanna eile don alt a chosaint, ná roghnaigh
rud ar bith ach amháin an rogha ba mhaith leat a <i>athrú</i>, agus le
cumaisc líonfar na roghanna eile de réir na roghanna a raibh agat roimhe ré.',
'val_noop' => 'Gan tuairim',
-'val_percent' => '<b>$1%</b><br>($2 de $3 pointí<br>a rinne $4 úsáideoirí)',
-'val_percent_single' => '<b>$1%</b><br>($2 de $3 pointí<br>a rinne aon úsáideoir)',
+'val_percent' => '<b>$1%</b><br />($2 de $3 pointí<br />a rinne $4 úsáideoirí)',
+'val_percent_single' => '<b>$1%</b><br />($2 de $3 pointí<br />a rinne aon úsáideoir)',
'val_total' => 'Iomlán',
'val_version' => 'Leagan',
'val_tab' => 'Seiceáil an bhailíocht',
diff --git a/languages/LanguageHe.php b/languages/LanguageHe.php
index d9d8efbf8e2f..362a8173ddfa 100644
--- a/languages/LanguageHe.php
+++ b/languages/LanguageHe.php
@@ -124,8 +124,8 @@ require_once("LanguageUtf8.php");
"tog-showtoolbar" => "Show edit toolbar",
"tog-editondblclick" => "ערוך ×“×¤×™× ×‘×œ×—×™×¦×” כפולה (דורש ×’'×ווה סקריפט)",
"tog-editsection"=>"Enable section editing via [edit] links",
-"tog-editsectiononrightclick"=>"Enable section editing by right clicking<br> on section titles (JavaScript)",
-"tog-showtoc"=>"Show table of contents<br>(for articles with more than 3 headings",
+"tog-editsectiononrightclick"=>"Enable section editing by right clicking<br /> on section titles (JavaScript)",
+"tog-showtoc"=>"Show table of contents<br />(for articles with more than 3 headings",
"tog-rememberpassword" => "זכור ×ת ×”×¡×™×¡×ž× ×©×œ×™ ×‘×¤×¢×ž×™× ×”×‘×ות",
"tog-editwidth" => "תיבת העריכה ברוחב מל×",
"tog-watchdefault" => "עקוב ×חרי מ××ž×¨×™× ×©×¢×¨×›×ª×™ ×ו יצרתי",
@@ -292,8 +292,8 @@ $1",
"yourpasswordagain" => "הקש ×¡×™×¡×ž× ×©× ×™×ª",
"newusersonly" => " (רק ×× ×ת/×” משתמש חדש)",
"remembermypassword" => "זכור ×ת ×”×¡×™×¡×ž× ×©×œ×™ ×‘×¤×¢× ×”×‘××”.",
-"loginproblem" => "<b>×רעה שגי××” בכניסה ל×תר. </b><br>!נסה שנית",
-"alreadyloggedin" => "<font color=red><b> משתמש $1, כבר ביצעת כניסה ל×תר!</b></font><br>\n",
+"loginproblem" => "<b>×רעה שגי××” בכניסה ל×תר. </b><br />!נסה שנית",
+"alreadyloggedin" => "<font color=red><b> משתמש $1, כבר ביצעת כניסה ל×תר!</b></font><br />\n",
"login" => "כניסה לחשבון",
"userlogin" => "כניסה לחשבון",
@@ -332,7 +332,7 @@ $1",
"showpreview" => "הר××” תצוגה מקדימה",
"blockedtitle" => "המשתמש חסו×",
"blockedtext" => "×©× ×”×ž×©×ª×ž×© ×ו כתובת ×”-IP שלך נחסמו על-ידי $1.
-הסיבה שניתנה ×”×™×:<br>''$2''<p>×תה יכול ליצור קשר ×¢× $1 ×ו ×חד מ[[ויקיפדיה:מפעילי_מערכת]] כדי לדון בחסימה.",
+הסיבה שניתנה ×”×™×:<br />''$2''<p>×תה יכול ליצור קשר ×¢× $1 ×ו ×חד מ[[ויקיפדיה:מפעילי_מערכת]] כדי לדון בחסימה.",
"newarticle" => "(חדש)",
"newarticletext" => "כתוב ×›×ן ×ת הטקסט עבור הדף החדש:",
"anontalkpagetext" => " ---- ''זהו דף שיחה של משתמש/ת ש×ין לו/×” חשבון במערכת ומזוהה רק לפי כתובת ×”-IP שלו/×”. יתכן ודף ×–×” ישותף ×¢× ×ž×©×ª×ž×©×™× ×× ×•× ×™×ž×™×™× ×חרי×''",
@@ -404,8 +404,8 @@ $1",
"nonefound" => "×œ× × ×ž×¦×ו מ××ž×¨×™× ×¢× ×ª×•×›×Ÿ תו××, ×× × ×•×“×ו ×©×”×™×§×©×ª× ×ת החיפוש נכונה. ×× ×כן ×”×§×©×ª× × ×›×•× ×” ××– נסו ×ולי לחפש × ×•×©× ×›×œ×œ×™ יותר.",
"powersearch" => "חפש",
"powersearchtext" => "
-חפש במרחבי ש×:<br>
-$1<br>
+חפש במרחבי ש×:<br />
+$1<br />
$2 הצג ×’× ×“×¤×™ הפנייה
$3 $9",
"blanknamespace" => "(ר×שי)",
@@ -544,7 +544,7 @@ $3 $9",
"deleteimg" => "מחק",
"deleteimgcompletely" => "מחק",
"imghistlegend" => "×ž×§×¨× (נוכ) = זו התמונה הנוכחית, (מחק) = מחק גירסה ישנה זו, (חזור) חזור לגירסה ישנה זו.
-<br><i>הקש על ת×ריך לר×ות ×ת התמונה שהועלתה בת×ריך ×–×”</i>.",
+<br /><i>הקש על ת×ריך לר×ות ×ת התמונה שהועלתה בת×ריך ×–×”</i>.",
"imagelinks" => "קישורי תמונות",
"linkstoimage" => "×”×“×¤×™× ×”×‘××™× ×ž×©×ª×ž×©×™× ×‘×ª×ž×•× ×” זו:",
"nolinkstoimage" => "×ין ×“×¤×™× ×”×ž×©×ª×ž×©×™× ×‘×ª×ž×•× ×” זו.",
@@ -569,9 +569,9 @@ $3 $9",
"maintenancebacklink" => "חזרה לדף התחזוקה",
"disambiguations" => "דפי רב-משמעות",
"disambiguationspage" => "ויקיפדיה:דפי_רב_משמעות",
-"disambiguationstext" => "המ××ž×¨×™× ×©×œ×”×œ×Ÿ ×ž×¦×‘×™×¢×™× ×ל <i>דפי רב-משמעות</i>. תפקיד ×“×¤×™× ×לה ×”×•× ×œ×”×¤× ×•×ª לדף ×”× ×•×©× ×”×¨×œ×•×•× ×˜×™.<br>×נו ×ž×ª×™×™×—×¡×™× ×œ×“×£ כרב-משמעות ×× ×ž×¦×‘×™×¢ ×ליו $1.<br>×§×™×©×•×¨×™× ×”×ž×’×™×¢×™× ×ל דף ממרחבי ×©× ××—×¨×™× <i>××™× ×</i> ×ž×•×¦×’×™× ×›×ן.",
+"disambiguationstext" => "המ××ž×¨×™× ×©×œ×”×œ×Ÿ ×ž×¦×‘×™×¢×™× ×ל <i>דפי רב-משמעות</i>. תפקיד ×“×¤×™× ×לה ×”×•× ×œ×”×¤× ×•×ª לדף ×”× ×•×©× ×”×¨×œ×•×•× ×˜×™.<br />×נו ×ž×ª×™×™×—×¡×™× ×œ×“×£ כרב-משמעות ×× ×ž×¦×‘×™×¢ ×ליו $1.<br />×§×™×©×•×¨×™× ×”×ž×’×™×¢×™× ×ל דף ממרחבי ×©× ××—×¨×™× <i>××™× ×</i> ×ž×•×¦×’×™× ×›×ן.",
"doubleredirects" => "הפניות כפולות",
-"doubleredirectstext" => "<b>×©×™× ×œ×‘:</b> רשימה זו עלולה לכלול ×“×¤×™× ×©× ×ž×¦×ו בטעות. ×–×ת ×ומרת, ×©×‘×“×¤×™× ×©× ×ž×¦×ו ישנו טקסט נוסף ×¢× ×§×™×©×•×¨×™× ×ž×ª×—×ª ל-#REDIRECT הר×שון.<br>\nכל שורה מכילה קישור להפנייה הר×שונה והשנייה, וכן ×ת שורת הטקסט הר×שונה של ההפניה השניה, שלרוב × ×ž×¦× ×‘×” היעד ×”×מיתי של ההפניה, ×ליו ×מורה ההפניה הר×שונה להצביע.",
+"doubleredirectstext" => "<b>×©×™× ×œ×‘:</b> רשימה זו עלולה לכלול ×“×¤×™× ×©× ×ž×¦×ו בטעות. ×–×ת ×ומרת, ×©×‘×“×¤×™× ×©× ×ž×¦×ו ישנו טקסט נוסף ×¢× ×§×™×©×•×¨×™× ×ž×ª×—×ª ל-#REDIRECT הר×שון.<br />\nכל שורה מכילה קישור להפנייה הר×שונה והשנייה, וכן ×ת שורת הטקסט הר×שונה של ההפניה השניה, שלרוב × ×ž×¦× ×‘×” היעד ×”×מיתי של ההפניה, ×ליו ×מורה ההפניה הר×שונה להצביע.",
"brokenredirects" => "הפניות ×œ× ×ª×§×™× ×•×ª",
"brokenredirectstext" => "ההפניות שלהלן מצביעות למ××ž×¨×™× ×©××™× × ×§×™×™×ž×™×:",
"selflinks" => "×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×¢×¦×ž×",
@@ -727,7 +727,7 @@ $3 $9",
"noblockreason" => ".עליך לציין סיבה לחסימה",
"blockipsuccesssub" => "החסימה הצליחה",
"blockipsuccesstext" => "הכתובת \"$1\" נחסמה.
-<br>ר××” ×ת [[מיוחד:רשימת כתובות IP חסומות|רשימת הכתובות החסומות]] כדי לצפות בחסימות",
+<br />ר××” ×ת [[מיוחד:רשימת כתובות IP חסומות|רשימת הכתובות החסומות]] כדי לצפות בחסימות",
"unblockip" => "שחרר כתובת IP",
"unblockiptext" => "השתמש בטופס שלהלן בכדי להחזיר הרש×ות כתיבה לכתובת IP חסומה.",
"ipusubmit" => "שחרר כתובת זו",
@@ -754,7 +754,7 @@ $3 $9",
"lockdbsuccesssub" => "נעילת בסיס-×”× ×ª×•× ×™× ×”×¦×œ×™×—×”",
"unlockdbsuccesssub" => "שוחררה הנעילה מבסיס-הנתוני×",
"lockdbsuccesstext" => "בסיס-×”× ×ª×•× ×™× ×©×œ ויקיפדיה ננעל.
-<br>זכור לשחרר ×ת הנעילה ל×חר שפעולת התחזוקה הסתיימה.",
+<br />זכור לשחרר ×ת הנעילה ל×חר שפעולת התחזוקה הסתיימה.",
"unlockdbsuccesstext" => "שוחררה הנעילה מבסיס-×”× ×ª×•× ×™× ×©×œ ויקיפדיה",
# SQL query
diff --git a/languages/LanguageHu.php b/languages/LanguageHu.php
index 8c315bbec6f8..e7e7e7c59440 100644
--- a/languages/LanguageHu.php
+++ b/languages/LanguageHu.php
@@ -364,8 +364,8 @@ Ne felejtsd el átnézni a személyes $wgSitename beállításaidat.",
"yourpasswordagain" => "Jelszavad ismét",
"newusersonly" => " (csak új felhasználóknak)",
"remembermypassword" => "Jelszó megjegyzése a használatok között.",
-"loginproblem" => "<b>Valami probléma van a belépéseddel.</b><br>Kérlek próbáld ismét!",
-"alreadyloggedin" => "<font color=red><b>Kedves $1, már be vagy lépve!</b></font><br>\n",
+"loginproblem" => "<b>Valami probléma van a belépéseddel.</b><br />Kérlek próbáld ismét!",
+"alreadyloggedin" => "<font color=red><b>Kedves $1, már be vagy lépve!</b></font><br />\n",
"login" => "Belépés",
"userlogin" => "Belépés",
@@ -410,7 +410,7 @@ Lépj be a levélben található adatokkal.",
"showpreview" => "Előnézet megtekintése",
"blockedtitle" => "A felhasználó le van tiltva",
"blockedtext" => "A felhasználói neved vagy IP számod $1 letiltotta.
-Az indoklás:<br>''$2''
+Az indoklás:<br />''$2''
<p>Felveheted a kapcsolatot $1 adminnal vagy bármely más
[[{$wgMetaNamespace}:adminisztrátorok|adminisztrátorral]] hogy megvitasd a letiltást.",
"whitelistedittitle" => "A szerkesztéshez be kell lépned",
@@ -459,7 +459,7 @@ módosítás elvész.</strong>\n",
$wgSitenameBA küldött anyag a GNU Szabad Dokumentum Licenc alatti
publikálásnak számít (lásd $1 a részletekért).
Ha nem akarod, hogy az írásod könyörtelenül módosíthassák vagy
-tetszés szerint terjesszék, akkor ne küldd be ide.<br>
+tetszés szerint terjesszék, akkor ne küldd be ide.<br />
A beküldéssel együtt azt is garantálod hogy mindezt saját
magad írtad, vagy másoltad be egy szabadon elérhető vagy
közkincs (public domain) forrásból.
@@ -533,8 +533,8 @@ rendszer nem indexel fel, vagy több független keresési szó szerepeltetése
végeredményben).",
"powersearch" => "Keresés",
"powersearchtext" => "
-Keresés a névterekben:<br>
-$1<br>
+Keresés a névterekben:<br />
+$1<br />
$2 Ãtirányítások listája &nbsp; Keresés:$3 $9",
"searchdisabled" => "<p>Elnézésed kérjük, de a teljes szöveges keresés terhelési okok miatt átmenetileg nem használható. Ezidő alatt használhatod a lenti Google keresést, mely viszont lehetséges, hogy nem teljesen friss adatokkal dolgozik.</p>
@@ -550,7 +550,7 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"\">
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br>
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -742,7 +742,7 @@ más információ amit meg tudsz adni.",
"imghistlegend" => "Jelmagyarázat: (akt) = ez az aktuális kép,
(töröl) = ezen régi változat törlése,
(régi) = visszaállás erre a régi változatra.
-<br><i>Klikkelj a dátumra hogy megnézhesd az akkor felküldött képet</i>.",
+<br /><i>Klikkelj a dátumra hogy megnézhesd az akkor felküldött képet</i>.",
"imagelinks" => "Kép hivatkozások",
"linkstoimage" => "Az alábbi lapok hivatkoznak erre a képre:",
"nolinkstoimage" => "Erre a képre nem hivatkozik lap.",
@@ -772,9 +772,9 @@ Ebből <b>$2</b> darab adminisztrátor (lásd $3).",
"maintenancebacklink" => "Vissza a karbantartás lapra",
"disambiguations" => "Egyértelműsítő lapok",
"disambiguationspage" => "{$wgMetaNamespace}:Egyértelműsítő lapok",
-"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "Double Redirects",
-"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br>\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
+"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br />\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
"brokenredirects" => "Broken Redirects",
"brokenredirectstext" => "The following redirects link to a non-existing article.",
"selflinks" => "Pages with Self Links",
@@ -990,7 +990,7 @@ pages that were vandalized).",
"noblockreason" => "You must supply a reason for the block.",
"blockipsuccesssub" => "Block succeeded",
"blockipsuccesstext" => "The IP address \"$1\" has been blocked.
-<br>See [[Speciális:Ipblocklist|IP block list]] to review blocks.",
+<br />See [[Speciális:Ipblocklist|IP block list]] to review blocks.",
"unblockip" => "Unblock IP address",
"unblockiptext" => "Use the form below to restore write access
to a previously blocked IP address.",
@@ -1031,7 +1031,7 @@ Please confirm that this is what you intend to do.",
"unlockdbsuccesssub" => "Database lock removed",
"lockdbsuccesstext" => "The Wikipedia database has been locked.
-<br>Remember to remove the lock after your maintenance is complete.",
+<br />Remember to remove the lock after your maintenance is complete.",
"unlockdbsuccesstext" => "The Wikipedia database has been unlocked.",
# SQL query
diff --git a/languages/LanguageIa.php b/languages/LanguageIa.php
index 146c746c52f8..d3c3040ccbdd 100644
--- a/languages/LanguageIa.php
+++ b/languages/LanguageIa.php
@@ -301,8 +301,8 @@ Non oblida personalisar Wikipedia secundo tu preferentias.",
"yourpasswordagain" => "Confirmar contrasigno",
"newusersonly" => " (solmente pro nove usatores)",
"remembermypassword" => "Recordar contrasigno inter sessiones.",
-"loginproblem" => "<b>Occurreva problemas pro initiar tu session.</b><br>Tenta de nove!",
-"alreadyloggedin" => "<font color=red><b>Usator $1, tu session ja es aperte!</b></font><br>\n",
+"loginproblem" => "<b>Occurreva problemas pro initiar tu session.</b><br />Tenta de nove!",
+"alreadyloggedin" => "<font color=red><b>Usator $1, tu session ja es aperte!</b></font><br />\n",
"login" => "Aperir session",
"userlogin" => "Aperir session",
@@ -343,7 +343,7 @@ Per favor initia un session post reciper lo.",
"showpreview" => "Monstrar previsualisation",
"blockedtitle" => "Le usator es blocate",
"blockedtext" => "Tu nomine de usator o adresse de IP ha essite blocate per $1.
-Le motivo presentate es iste:<br>''$2''<p>Tu pote contactar $1 o un del altere
+Le motivo presentate es iste:<br />''$2''<p>Tu pote contactar $1 o un del altere
[[Wikipedia:administratores|administratores]] pro discuter le bloco.",
"newarticle" => "(Nove)",
"newarticletext" =>
@@ -377,7 +377,7 @@ Si tu lo salvara, tote le modificationes facite post iste revision essera perdit
considerate public secundo le terminos del Licentia de Documentation Libere GNU
(vide plus detalios in $1).
Si tu non vole que tu scripto sia modificate impietosemente e redistribuite
-a voluntate, alora non lo edita hic.<br>
+a voluntate, alora non lo edita hic.<br />
Additionalmente, tu nos garanti que tu es le autor de tu contributiones,
o que tu los ha copiate de un ressource libere de derectos.
<strong>NON USA MATERIAL COPERITE PER DERECTOS DE AUTOR (COPYRIGHT) SIN AUTORISATION EXPRESSE!</strong>",
@@ -441,8 +441,8 @@ terminos de recerca (solmente le paginas que contine tote le terminos
de recerca apparera in le resultato).",
"powersearch" => "Recercar",
"powersearchtext" => "
-Recerca in contextos :<br>
-$1<br>
+Recerca in contextos :<br />
+$1<br />
$2 Listar redireciones &nbsp; Recercar pro $3 $9",
@@ -621,7 +621,7 @@ a su proposito.",
"deleteimgcompletely" => "elim",
"imghistlegend" => "Legend: (actu) = iste es le imagine actual, (elim) = elimina
iste version antique, (rev) = reverte a iste version antique.
-<br><i>Clica super le data pro vider le imagine cargate in ille die.</i>",
+<br /><i>Clica super le data pro vider le imagine cargate in ille die.</i>",
"imagelinks" => "Ligamines al imagine",
"linkstoimage" => "Le paginas sequente se liga a iste imagine:",
"nolinkstoimage" => "Necun pagina se liga a iste imagine.",
@@ -652,12 +652,12 @@ non preme \"Reload\" post cata item reparate. ;-)",
"disambiguations" => "Paginas de disambiguation",
"disambiguationspage" => "Wikipedia:Ligamines_a_paginas_de_disambiguation",
"disambiguationstext" => "Le articulos sequente se liga a un <i>pagina de disambiguation</i>.
-Illos deberea ligar se directemente al topico appropriate.<br>
+Illos deberea ligar se directemente al topico appropriate.<br />
Un pagina es tractate como un pagina de disambiguation si existe un ligamine
a illo in $1. Ligamines de altere contextos <i>non</i> es listate hic.",
"doubleredirects" => "Redirectiones duple",
"doubleredirectstext" => "<b>Attention:</b> Iste lista pote continer items false.
-Illo generalmente significa que il ha texto additional con ligamines sub le prime #REDIRECT.<br>
+Illo generalmente significa que il ha texto additional con ligamines sub le prime #REDIRECT.<br />
Cata linea contine ligamines al prime e secunde redirection, assi como le prime linea del
secunde texto de redirection, generalmente exhibiente le articulo scopo \"real\",
al qual le prime redirection deberea referer se.",
@@ -842,7 +842,7 @@ specific que ha essite vandalisate).",
"noblockreason" => "Tu debe fornir un motivo pro le blocage.",
"blockipsuccesssub" => "Blocage con successo",
"blockipsuccesstext" => "Le adresse IP \"$1\" ha essite blocate.
-<br>Vide [[Special:Ipblocklist|Lista de IPs blocate]] pro revider le blocages.",
+<br />Vide [[Special:Ipblocklist|Lista de IPs blocate]] pro revider le blocages.",
"unblockip" => "Disblocar adresse IP",
"unblockiptext" => "Usa le formulario infra pro restaurar le accesso de scriptura
a un adresse de IP blocate previemente.",
@@ -875,7 +875,7 @@ Per favor confirma que iste es tu intention.",
"lockdbsuccesssub" => "Base de datos blocate con successo",
"unlockdbsuccesssub" => "Base de datos disblocate con successo",
"lockdbsuccesstext" => "Le base de datos de Wikipedia ha essite blocate.
-<br>Rememora te de disblocar lo post completar tu mantenentia.",
+<br />Rememora te de disblocar lo post completar tu mantenentia.",
"unlockdbsuccesstext" => "Le base de datos de Wikipedia ha essite disblocate.",
# SQL query
diff --git a/languages/LanguageIs.php b/languages/LanguageIs.php
index ea0db217cd5b..cbe5b5dbf4fe 100644
--- a/languages/LanguageIs.php
+++ b/languages/LanguageIs.php
@@ -579,7 +579,7 @@ border=\"0\" ALT=\"Google\"></A>
#'linklistsub' => "(List of links)",
#'linkshere' => "The following pages link to here:",
'linkstoimage' => "Eftirfarandi síður tengjast í mynd þessa:",
-'linktrail' => "/^([a-z]+)(.*)\$/sD",
+'linktrail' => '/^([á|ð|é|í|ó|ú|ý|þ|æ|ö|a-z]+)(.*)$/sD',
'listadmins' => "Stjórnendalisti",
#'listform' => "list",
'listusers' => "Notendalisti",
@@ -802,7 +802,7 @@ You should log in and change your password now.",
# $1<br />
# $2 List redirects &nbsp; Search for $3 $9",
'preferences' => "Stillingar",
-'prefs-help-userdata' => "* <strong>Real name</strong> (optional): if you choose to provide it this will be used for giving you attribution for your work.<br/>
+'prefs-help-userdata' => "* <strong>Real name</strong> (optional): if you choose to provide it this will be used for giving you attribution for your work.<br />
* <strong>Email</strong> (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.",
#'prefs-misc' => "Misc settings",
diff --git a/languages/LanguageIt.php b/languages/LanguageIt.php
index d70caee7574e..2eca2837e5d1 100644
--- a/languages/LanguageIt.php
+++ b/languages/LanguageIt.php
@@ -115,20 +115,20 @@
"tog-hover" => "Mostra etichetta sui wiki-links",
"tog-underline" => "Sottolinea links",
-"tog-highlightbroken" => "Evidenzia i links che puntano ad<br>articoli ancora da scrivere",
+"tog-highlightbroken" => "Evidenzia i links che puntano ad<br />articoli ancora da scrivere",
"tog-justify" => "Paragrafo: giustificato",
-"tog-hideminor" => "Nascondi le modifiche minori<br>nella pagina \"Modifiche recenti\"",
+"tog-hideminor" => "Nascondi le modifiche minori<br />nella pagina \"Modifiche recenti\"",
"tog-usenewrc" => "Enhanced recent changes (not for all browsers)",
-"tog-numberheadings" => "Auto-numerazione dei<br>titoli di paragrafo",
+"tog-numberheadings" => "Auto-numerazione dei<br />titoli di paragrafo",
"tog-showtoolbar" => "Show edit toolbar",
-"tog-editondblclick" => "Doppio click per modificare l'articolo<br>(richiede JavaScript)",
+"tog-editondblclick" => "Doppio click per modificare l'articolo<br />(richiede JavaScript)",
"tog-editsection"=>"Enable section editing via [edit] links",
-"tog-editsectiononrightclick"=>"Enable section editing by right clicking<br> on section titles (JavaScript)",
-"tog-showtoc"=>"Show table of contents<br>(for articles with more than 3 headings)",
-"tog-rememberpassword" => "Ricorda la password<br>(non limitare a una sessione<br>- richiede uso di cookies)",
-"tog-editwidth" => "Casella di edizione ampliata<br>alla massima larghezza",
+"tog-editsectiononrightclick"=>"Enable section editing by right clicking<br /> on section titles (JavaScript)",
+"tog-showtoc"=>"Show table of contents<br />(for articles with more than 3 headings)",
+"tog-rememberpassword" => "Ricorda la password<br />(non limitare a una sessione<br />- richiede uso di cookies)",
+"tog-editwidth" => "Casella di edizione ampliata<br />alla massima larghezza",
"tog-watchdefault" => "Notifica articoli nuovi e modificati",
-"tog-minordefault" => "Indica ogni modifica come minore<br>(solo come predefinito)",
+"tog-minordefault" => "Indica ogni modifica come minore<br />(solo come predefinito)",
"tog-previewontop" => "Show preview before edit box and not after it",
"tog-nocache" => "Disable page caching",
# dates
@@ -250,11 +250,11 @@ MySQL ha restituito un errore \"<tt>$3: $4</tt>\".",
"nodb" => "Selezione del database $1 fallita",
"readonly" => "Accesso al database temporaneamente disabilitato",
"enterlockreason" => "Fornisci una spiegazione sui motivi del blocco, includendo le probabili data ed ora di riattivazione o di rimozione del blocco.",
-"readonlytext" => "Il database di Wikipedia è al momento bloccato, e non consente nuove immissioni né modifiche, molto probabilmente per manutenzione server, nel qual caso il database sarà presto di nuovo completamente accessibile.<br>
+"readonlytext" => "Il database di Wikipedia è al momento bloccato, e non consente nuove immissioni né modifiche, molto probabilmente per manutenzione server, nel qual caso il database sarà presto di nuovo completamente accessibile.<br />
L'amministratore di sistema che ha imposto il blocco, ha lasciato questa nota:
<p>:$1",
-"missingarticle" => "Il database non ha trovato il testo di una pagina, che invece avrebbe dovuto trovare, intitolata \"$1\".<br>
-Questo non è un errore del database, ma più probabilmente un problema del software.<br>
+"missingarticle" => "Il database non ha trovato il testo di una pagina, che invece avrebbe dovuto trovare, intitolata \"$1\".<br />
+Questo non è un errore del database, ma più probabilmente un problema del software.<br />
Per favore, segnalate l'accaduto ad un amministratore di sistema, segnalando la URL e l'ora dell'incidente.",
"internalerror" => "Errore interno",
"filecopyerror" => "Non è stato possibile copiare il file \"$1\" come \"$2\".",
@@ -267,7 +267,7 @@ Per favore, segnalate l'accaduto ad un amministratore di sistema, segnalando la
"cannotdelete" => "Impossibile cancellare la pagina o l'immagine richiesta.",
"badtitle" => "Titolo non corretto",
"badtitletext" => "La pagina richiesta non è disponibile, potrebbe essere non valida, vuota, o potrebbe trattarsi di un errore in un link interlinguistico o fra diverse versioni di Wikipedia.",
-"perfdisabled" => "Siamo davvero rammaricati, ma questa funzionalità è temporaneamente disabilitata durante le ore di maggiore accesso al database, per ragioni di accessibilità al resto del sito!<br>Torna fra le 02:00 e le 14:00 UTC e riprova.<br><br>Grazie.",
+"perfdisabled" => "Siamo davvero rammaricati, ma questa funzionalità è temporaneamente disabilitata durante le ore di maggiore accesso al database, per ragioni di accessibilità al resto del sito!<br />Torna fra le 02:00 e le 14:00 UTC e riprova.<br /><br />Grazie.",
# Login and logout pages
#
@@ -275,7 +275,7 @@ Per favore, segnalate l'accaduto ad un amministratore di sistema, segnalando la
"logouttext" => "Logout effettuato.
Ora puoi continuare ad usare Wikipedia come utente anonimo (ma il tuo indirizzo IP resterà riconoscibile), oppure puoi nuovamente richiedere il login con il precedente username, oppure come uno diverso.\n",
-"welcomecreation" => "<h2>Benvenuto, $1!</h2><p>Il tuo account è stato creato con successo.<br>Grazie per aver scelto di far crescere Wikipedia con il tuo aiuto.<br>Per rendere Wikipedia più tua, e per usarla più scorrevolmente, non dimenticare di personalizzare le tue preferenze.",
+"welcomecreation" => "<h2>Benvenuto, $1!</h2><p>Il tuo account è stato creato con successo.<br />Grazie per aver scelto di far crescere Wikipedia con il tuo aiuto.<br />Per rendere Wikipedia più tua, e per usarla più scorrevolmente, non dimenticare di personalizzare le tue preferenze.",
"loginpagetitle" => "Login",
"yourname" => "Il tuo user name",
@@ -283,8 +283,8 @@ Ora puoi continuare ad usare Wikipedia come utente anonimo (ma il tuo indirizzo
"yourpasswordagain" => "Ripeti la password",
"newusersonly" => " (solo per nuovi Utenti)",
"remembermypassword" => "Ricorda la mia password per più sessioni (richiede uso dei cookies).",
-"loginproblem" => "<b>Si è verificato un errore durante il tuo tentativo di login.</b><br>Riprova, sarai più fortunato!",
-"alreadyloggedin" => "<font color=red><b>Ehi, Utente $1, hai già fatto il login, sei già connesso al nostro server!</b></font><br>\n",
+"loginproblem" => "<b>Si è verificato un errore durante il tuo tentativo di login.</b><br />Riprova, sarai più fortunato!",
+"alreadyloggedin" => "<font color=red><b>Ehi, Utente $1, hai già fatto il login, sei già connesso al nostro server!</b></font><br />\n",
"login" => "Log in",
"userlogin" => "Log in",
@@ -292,7 +292,7 @@ Ora puoi continuare ad usare Wikipedia come utente anonimo (ma il tuo indirizzo
"userlogout" => "Log out",
"createaccount" => "Crea nuovo account",
"badretype" => "Le password che hai immesso non coincidono, sono diverse fra loro.",
-"userexists" => "Siamo spiacenti.<br>Lo user name che hai scelto è già usato da un altro Utente.<br>Ti preghiamo perciò di voler scegliere uno user name diverso.",
+"userexists" => "Siamo spiacenti.<br />Lo user name che hai scelto è già usato da un altro Utente.<br />Ti preghiamo perciò di voler scegliere uno user name diverso.",
"youremail" => "La tua e-mail",
"yournick" => "Il tuo diminutivo o soprannome (per le firme)",
"emailforlost" => "Se per caso ti dimenticassi della tua password, ne potresti ricevere una nuova di zecca presso la casella e-mail che ci hai indicato.",
@@ -300,9 +300,9 @@ Ora puoi continuare ad usare Wikipedia come utente anonimo (ma il tuo indirizzo
"noname" => "Lo user name indicato non è valido, non è possibile creare un account a questo nome.",
"loginsuccesstitle" => "Login effettuato con successo!",
"loginsuccess" => "Sei stato ammesso alla connessione al server di Wikipedia con il nome utente di \"$1\".",
-"nosuchuser" => "Attenzione<br><br>a seguito di verifica, non ci risulta alcun Utente con il nome di \"$1\".<br><br>
+"nosuchuser" => "Attenzione<br /><br />a seguito di verifica, non ci risulta alcun Utente con il nome di \"$1\".<br /><br />
Controlla per favore il nome digitato, oppure usa il modulo qui sotto per creare un nuovo user account.",
-"wrongpassword" => "La password immessa non è corretta.<br><br>Riprova, per favore.",
+"wrongpassword" => "La password immessa non è corretta.<br /><br />Riprova, per favore.",
"mailmypassword" => "Spediscimi una nuova password in posta elettronica",
"passwordremindertitle" => "Servizio Password Reminder di Wikipedia",
"passwordremindertext" => "Qualcuno (probabilmente tu, con indirizzo IP $1)
@@ -322,8 +322,8 @@ Per favore, fai subito un log in non appena la ricevi.",
"preview" => "Anteprima",
"showpreview" => "Visualizza Anteprima",
"blockedtitle" => "Questo User name corrisponde purtroppo ad un Utente che è stato disabilitato alla modifica degli articoli.",
-"blockedtext" => "Il tuo User name o il tuo indirizzo IP sono stati bloccati da $1.<br>
-La motivazione del blocco è la seguente:<br>:''$2''<p>Se lo desideri, puoi contattare $1, o uno degli altri [[Wikipedia:administrators|amministratori]] per discutere del blocco.",
+"blockedtext" => "Il tuo User name o il tuo indirizzo IP sono stati bloccati da $1.<br />
+La motivazione del blocco è la seguente:<br />:''$2''<p>Se lo desideri, puoi contattare $1, o uno degli altri [[Wikipedia:administrators|amministratori]] per discutere del blocco.",
"newarticle" => "(Nuovo)",
"newarticletext" => "Scrivi qui il tuo testo.",
"noarticletext" => "(Questo articolo è vuoto, potresti gentilmente iniziare l'articolo, oppure richiedere la cancellazione di questa pagina)",
@@ -333,17 +333,17 @@ La motivazione del blocco è la seguente:<br>:''$2''<p>Se lo desideri, puoi cont
"previewconflict" => "Questa anteprima rappresenta il testo nella casella di edizione di sopra, l'articolo apparirà in questa forma se sceglierai di salvare la pagina ora.",
"editing" => "Modifica di $1",
"editconflict" => "Conflitto di edizione: $1",
-"explainconflict" => "Qualcun altro ha salvato una sua versione dell'articolo nel tempo in cui tu stavi preparando la tua versione.<br>
+"explainconflict" => "Qualcun altro ha salvato una sua versione dell'articolo nel tempo in cui tu stavi preparando la tua versione.<br />
La casella di modifica di sopra contiene il testo dell'articolo nella sua forma attuale (cioè il testo attualmente online). Le tue modifiche sono invece contenute nella casella di modifica inferiore.
Dovrai inserire, se lo desideri, le tue modifiche nel testo esistente, e perciò scriverle nella casella di sopra.
<b>Soltanto</b> il testo nella casella di sopra sarà salvato se premerai il bottone \"Salva\".\n<p>",
"yourtext" => "Il tuo testo",
"storedversion" => "Versione in archivio",
-"editingold" => "<strong>ATTENZIONE: Stai modificando una versione dell'articolo non aggiornata.<br>
+"editingold" => "<strong>ATTENZIONE: Stai modificando una versione dell'articolo non aggiornata.<br />
Se la salvi così, tutti i cambiamenti apportati dopo questa revisione verranno persi per sempre.</strong>\n",
"yourdiff" => "Differenze",
"copyrightwarning" => "Nota, per favore, che tutti i contributi a Wikipedia si considerano rilasciati sotto licenza di tipo GNU Free Documentation License (vedi $1 per maggiori dettagli).
-Se non vuoi che il tuo testo possa essere modificato e ridistribuito da chiunque senza pietà e senza altri limiti, allora non inviarlo a Wikipedia, ma realizza piuttosto un tuo sito web personale.<br>
+Se non vuoi che il tuo testo possa essere modificato e ridistribuito da chiunque senza pietà e senza altri limiti, allora non inviarlo a Wikipedia, ma realizza piuttosto un tuo sito web personale.<br />
Con l'invio di questo testo stai garantendo, a tua responsabilità, che il testo è stato scritto da te personalmente ed originalmente, oppure che è stato copiato da una fonte di publico dominio, o da una simile fonte, oppure che hai ottenuto espressa autorizzazione ad usare questo testo e che puoi dimostrarlo.
<strong>NON USARE MATERIALE COPERTO DA DIRITTO DI AUTORE (COPYRIGHT - (c)) IN MANCANZA DI ESPRESSA AUTORIZZAZIONE!!!</strong>",
@@ -382,7 +382,7 @@ Controlla per favore la URL che hai usato per accedere a questa pagina.\n",
Questo potrebbe dipendere dall'aver ricercato una parola di meno di tre caratteri.
Oppure potresti aver scritto male la richiesta, per esempio \"pesce and and azzurro\".
Per favore, riprova.",
-"matchtotals" => "La ricerca per la voce \"$1\" ha trovato<br>$2 riscontri nei titoli degli articoli e<br>$3 riscontri nei testi degli articoli.",
+"matchtotals" => "La ricerca per la voce \"$1\" ha trovato<br />$2 riscontri nei titoli degli articoli e<br />$3 riscontri nei testi degli articoli.",
"titlematches" => "Nei titoli degli articoli",
"notitlematches" => "Voce richiesta non trovata in titoli di articolo",
"textmatches" => "Nel testo degli articoli ",
@@ -394,8 +394,8 @@ Per favore, riprova.",
"nonefound" => "<strong>Nota</strong>: la ricerca di parole troppo comuni, come \"avere\" o \"essere\", che non sono indicizzate, può causare un esito negativo, così come indicare più di un termine da ricercare (solo le pagine che contengano tutti i termini ricercati verrebbero infatti visualizzate fra i risultati).",
"powersearch" => "Ricerca",
"powersearchtext" => "
-Cerca fra i campi :<br>
-$1<br>
+Cerca fra i campi :<br />
+$1<br />
$2 Elenca i redirects &nbsp; cerca per $3 $9",
@@ -430,7 +430,7 @@ Il tuo numero identificativo (ID) interno è $2.",
"timezonetext" => "Immetti il numero di ore di differenza fra la tua ora locale e la ora del server (UTC).",
"localtime" => "Ora Locale",
"timezoneoffset" => "Offset",
-"emailflag" => "Nascondi la mia e-mail<br>agli altri utenti",
+"emailflag" => "Nascondi la mia e-mail<br />agli altri utenti",
# Recent changes
#
@@ -483,7 +483,7 @@ Uploads e cancellazioni delle immagini sono registrati nello
[[Project:Upload_log|upload log]].
Usa il modulo sottostante per caricare nuovi files immagine da utilizzare per arricchire ed illustrare i tuoi articoli.
-Sulla maggior parte dei browsers, dovresti vedere un bottone con la scritta \"Browse...\" (oppure \"Sfoglia...\", che aprirà una comune finestra di dialogo.<br>
+Sulla maggior parte dei browsers, dovresti vedere un bottone con la scritta \"Browse...\" (oppure \"Sfoglia...\", che aprirà una comune finestra di dialogo.<br />
Scegliendo uno dei files sul tuo PC, il nome di questo file verrà scritto in automatico nella casella di testo a fianco al bottone.<p>
'''Devi anche selezionare la casellina nella quale affermi che con questo upload non stai violando nessun copyright.'''
@@ -520,7 +520,7 @@ Tutti i tempi indicati sono calcolati sul fuso orario del server (UTC).
"largefile" => "Il peso raccomandato per le immagini deve essere inferiore a 100kb.",
"successfulupload" => "Caricamento completato",
"fileuploaded" => "File \"$1\" correttamente caricato sul server.
-Segui questo link: ($2) per modificare la pagina di descrizione del file che hai appena caricato, e immetti subito le informazioni che ritieni opportune (cosa rappresenta, dove lo hai trovato, chi lo ha creato e quando, etc) oltre ad una nota circa la situazione di copyright sul file.<br>Non omettere la nota sul copyright, o il file verrebbe cancellato molto presto. ",
+Segui questo link: ($2) per modificare la pagina di descrizione del file che hai appena caricato, e immetti subito le informazioni che ritieni opportune (cosa rappresenta, dove lo hai trovato, chi lo ha creato e quando, etc) oltre ad una nota circa la situazione di copyright sul file.<br />Non omettere la nota sul copyright, o il file verrebbe cancellato molto presto. ",
"uploadwarning" => "Avviso di Upload",
"savefile" => "Salva file",
"uploadedimage" => "caricato \"$1\"",
@@ -545,7 +545,7 @@ Segui questo link: ($2) per modificare la pagina di descrizione del file che hai
"deleteimg" => "canc",
"deleteimgcompletely" => "canc",
"imghistlegend" => "Legenda: (cur) = immagine corrente, (canc) = cancella questa vecchia versione, (ripr) = ripristina questa vecchia versione come versione attuale.
-<br><i>Clicca su una data per vedere tutte le immagini che sono state caricate in quella data </i>.",
+<br /><i>Clicca su una data per vedere tutte le immagini che sono state caricate in quella data </i>.",
"imagelinks" => "Link alle immagini",
"linkstoimage" => "Le pagine seguenti linkano questa immagine:",
"nolinkstoimage" => "Nessuna pagina linka questa immagine.",
@@ -570,9 +570,9 @@ Questa media rivela che ci sono state una media di <b>$5</b> modifiche per cias
"maintenancebacklink" => "Torna alla pagina manutenzione",
"disambiguations" => "Disambiguation pages",
"disambiguationspage" => "Wikipedia:Links_to_disambiguating_pages",
-"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "Doppi Redirects",
-"doubleredirectstext" => "<b>Attenzione:</b> Questa lista può talvolta contenere dei risultati non corretti. Ciò potrebbe magari accadere perchè vi sono del testo aggiuntivo o dei link dopo il tag #REDIRECT.<br>\nOgni riga contiene i link al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene il \"reale\" articolo di destinazione, quello al quale anche il primo redirect dovrebbe puntare.",
+"doubleredirectstext" => "<b>Attenzione:</b> Questa lista può talvolta contenere dei risultati non corretti. Ciò potrebbe magari accadere perchè vi sono del testo aggiuntivo o dei link dopo il tag #REDIRECT.<br />\nOgni riga contiene i link al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene il \"reale\" articolo di destinazione, quello al quale anche il primo redirect dovrebbe puntare.",
"brokenredirects" => "Redirects errati",
"brokenredirectstext" => "I seguenti redirects puntano ad articoli non ancora creati.",
"selflinks" => "Pagine con Auto-Links",
@@ -694,7 +694,7 @@ Tutti i tempi sono in ora del server (UTC).
"undeletepagetext" => "Le pagine qui di seguito indicate sono state cancellate, ma sono ancora in archivio e pertanto possono essere recuperate. L'archivio viene svuotato periodicamente.",
"undeletearticle" => "Recupera un articolo cancellato",
"undeleterevisions" => "$1 revisioni in archivio",
-"undeletehistory" => "Se recuperi questo articolo, tutte le sue revisioni verranno recuperate nella relativa cronologia.<br>
+"undeletehistory" => "Se recuperi questo articolo, tutte le sue revisioni verranno recuperate nella relativa cronologia.<br />
Se una nuova pagina è stata creata con questo stesso nome dopo la cancellazione, le revisioni recuperate saranno inserite nella cronologia e la versione attualmente online della pagina non verrà modificata.",
"undeleterevision" => "Cancellata revisione $1",
"undeletebtn" => "RIPRISTINA!",
@@ -724,8 +724,8 @@ Vedi [[Wikipedia:Deletion_log]] per un elenco delle pagine cancellate e recupera
# Block/unblock IP
#
"blockip" => "Blocca indirizzo IP",
-"blockiptext" => "Usa il modulo sottostante per bloccare l'accesso con diritto di scrittura da uno specifico indirizzo IP.<br>
-Questo blocco deve essere operato SOLO per prevenire atti di vandalismo, ed in stretta osservanza dei principi tutti della [[Wikipedia:Policy|policy di Wikipedia]].<br>Il blocco non può in nessun caso essere applicato per motivi ideologici.<p>
+"blockiptext" => "Usa il modulo sottostante per bloccare l'accesso con diritto di scrittura da uno specifico indirizzo IP.<br />
+Questo blocco deve essere operato SOLO per prevenire atti di vandalismo, ed in stretta osservanza dei principi tutti della [[Wikipedia:Policy|policy di Wikipedia]].<br />Il blocco non può in nessun caso essere applicato per motivi ideologici.<p>
Scrivi un motivo specifico per il quale questo indirizzo IP dovrebbe a tuo avviso essere bloccato (per esempio, cita i titoli di pagine eventualmente già oggetto di vandalismo editoriale).",
"ipaddress" => "Indirizzo IP (IP Address)",
"ipbreason" => "Motivazione",
@@ -734,7 +734,7 @@ Scrivi un motivo specifico per il quale questo indirizzo IP dovrebbe a tuo avvis
"noblockreason" => "Devi obbligatoriamente fornire una motivazione per il blocco.",
"blockipsuccesssub" => "Blocco eseguito",
"blockipsuccesstext" => " L'indirizzo IP \"$1\" è stato bloccato.
-<br>Vedi [[Special:Ipblocklist|lista IP bloccati]].",
+<br />Vedi [[Special:Ipblocklist|lista IP bloccati]].",
"unblockip" => " Sblocca indirizzo IP",
"unblockiptext" => "Usa il modulo sottostante per restituire il diritto di scrittura ad un indirizzo IP precedentemente bloccato.",
"ipusubmit" => "Sblocca questo indirizzo IP",
@@ -749,7 +749,7 @@ Scrivi un motivo specifico per il quale questo indirizzo IP dovrebbe a tuo avvis
#
"lockdb" => "Blocca il database",
"unlockdb" => "Sblocca il database",
-"lockdbtext" => "Bloccare il database sospenderà la possibilità per tutti gli Utenti di modificare le pagine o di crearne di nuove, di cambiare le loro preferenze, di modificare le loro liste di Osservati Speciali, ed in genere non consentirà a nessuno di eseguire operazioni che richiedano modifiche del database.<br><br>
+"lockdbtext" => "Bloccare il database sospenderà la possibilità per tutti gli Utenti di modificare le pagine o di crearne di nuove, di cambiare le loro preferenze, di modificare le loro liste di Osservati Speciali, ed in genere non consentirà a nessuno di eseguire operazioni che richiedano modifiche del database.<br /><br />
Per cortesia, conferma che questo è effettivamente quanto tu intendi ora effettuare e, soprattutto, che il prima possibile sbloccherai nuovamente il database, ripristinandone la corretta funzionalità, non appena avrai terminato le tue manutenzioni.",
"unlockdbtext" => "Sbloccare il database ripristinerà la possibilità per tutti gli Utenti di modificare le pagine o di crearne di nuove, di cambiare le loro preferenze, di modificare le loro liste di Osservati Speciali, ed in genere di eseguire operazioni che richiedano modifiche del database.
Per cortesia, conferma che questo è effettivamente quanto tu intendi ora effettuare.",
@@ -761,7 +761,7 @@ Per cortesia, conferma che questo è effettivamente quanto tu intendi ora effett
"lockdbsuccesssub" => "Blocco del database eseguito",
"unlockdbsuccesssub" => "Sblocco del database eseguito, rimosso blocco",
"lockdbsuccesstext" => "Il database di Wikipedia è stato bloccato.
-<br>Ricordati di rimuovere il blocco non appena avrai terminatoi le tue manutenzioni.",
+<br />Ricordati di rimuovere il blocco non appena avrai terminatoi le tue manutenzioni.",
"unlockdbsuccesstext" => " Il database di Wikipedia è stato sbloccato.",
# SQL query
@@ -801,7 +801,7 @@ per poter spostare una pagina.",
"movepagebtn" => "Sposta questa pagina",
"pagemovedsub" => "Spostamento effettuato con successo",
"pagemovedtext" => "Pagina \"[[$1]]\" rinominata in \"[[$2]]\".",
-"articleexists" => "Una pagina con questo nome esiste già, oppure il nome che hai scelto non è valido.<br>
+"articleexists" => "Una pagina con questo nome esiste già, oppure il nome che hai scelto non è valido.<br />
Scegli, per cortesia, un titolo diverso per l'articolo.",
"talkexists" => "La pagina è stata spostata correttamente, ma non si è potuto spostare la pagina di discussione perché ne esiste già un'altra con il nuovo titolo. Per favore, modifica manualmente i contenuti delle due pagine discussione, così da mantenerle entrambe per non perdere potenzialmente interessanti riflessioni.",
"movedto" => "spostata a ",
diff --git a/languages/LanguageJa.php b/languages/LanguageJa.php
index c463d743a712..c6481ad33c20 100644
--- a/languages/LanguageJa.php
+++ b/languages/LanguageJa.php
@@ -287,8 +287,8 @@ again as the same or as a different user.\n",
"yourpasswordagain" => "パスワードå†å…¥åŠ›",
"newusersonly" => " (æ–°è¦ãƒ¦ãƒ¼ã‚¶ã®ã¿)",
"remembermypassword" => "セッションをã¾ãŸãŒã£ã¦ãƒ‘スワードをä¿æŒã™ã‚‹ã€‚",
-"loginproblem" => "<b>ログインã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚</b><br>å†åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„。",
-"alreadyloggedin" => "<font color=red><b>ユーザ $1 ã¯ã€ã™ã§ã«ãƒ­ã‚°ã‚¤ãƒ³æ¸ˆã¿ã§ã™ã€‚</b></font><br>\n",
+"loginproblem" => "<b>ログインã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚</b><br />å†åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„。",
+"alreadyloggedin" => "<font color=red><b>ユーザ $1 ã¯ã€ã™ã§ã«ãƒ­ã‚°ã‚¤ãƒ³æ¸ˆã¿ã§ã™ã€‚</b></font><br />\n",
"login" => "ログイン",
"userlogin" => "ログイン",
@@ -324,7 +324,7 @@ again as the same or as a different user.\n",
"showpreview" => "プレビューを実行",
"blockedtitle" => "ユーザã¯ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚",
"blockedtext" => "ã‚ãªãŸã®ãƒ¦ãƒ¼ã‚¶åã¾ãŸã¯IPアドレス㯠$1 ã«ã‚ˆã£ã¦ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚
-ãã®ç†ç”±ã¯æ¬¡ã®é€šã‚Šã§ã™ã€‚:<br>$2<p>詳細ã¯ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。",
+ãã®ç†ç”±ã¯æ¬¡ã®é€šã‚Šã§ã™ã€‚:<br />$2<p>詳細ã¯ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。",
"newarticle" => "(æ–°è¦)",
"newarticletext" => "æ–°ã—ã„記事を書ã込んã§ãã ã•ã„。",
"noarticletext" => "(ã“ã®ãƒšãƒ¼ã‚¸ã«ã¯ç¾åœ¨è¨˜äº‹ãŒã‚ã‚Šã¾ã›ã‚“。)",
@@ -646,7 +646,7 @@ created and by whom, and anything else you may know about it." */,
"revertimg" => "差戻",
"deleteimg" => "削除",
"deleteimgcompletely" => "削除",
-"imghistlegend" => "凡例: (最新)=最新版ã®ç”»åƒ, (削除)=ã“ã®ç‰ˆã®ç”»åƒã‚’削除, (差戻)=ã“ã®ç‰ˆã®ç”»åƒã«å·®ã—戻ã™<br><b>アップロードã•ã‚ŒãŸç”»åƒã‚’見るã«ã¯æ—¥ä»˜ã‚’クリックã—ã¾ã™ã€‚</b>",
+"imghistlegend" => "凡例: (最新)=最新版ã®ç”»åƒ, (削除)=ã“ã®ç‰ˆã®ç”»åƒã‚’削除, (差戻)=ã“ã®ç‰ˆã®ç”»åƒã«å·®ã—戻ã™<br /><b>アップロードã•ã‚ŒãŸç”»åƒã‚’見るã«ã¯æ—¥ä»˜ã‚’クリックã—ã¾ã™ã€‚</b>",
"imagelinks" => "リンク",
"linkstoimage" => "ã“ã®ç”»åƒã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã®ä¸€è¦§:",
"nolinkstoimage" => "ã“ã®ç”»åƒã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯ã‚ã‚Šã¾ã›ã‚“。",
@@ -842,7 +842,7 @@ pages that were vandalized).",
"noblockreason" => "You must supply a reason for the block.",
"blockipsuccesssub" => "Block succeeded",
"blockipsuccesstext" => "The IP address \"$1\" has been blocked.
-<br>See [[Special:Ipblocklist|IP block list]] to review blocks.",
+<br />See [[Special:Ipblocklist|IP block list]] to review blocks.",
"unblockip" => "Unblock IP address",
"unblockiptext" => "Use the form below to restore write access
to a previously blocked IP address.",
@@ -875,7 +875,7 @@ Please confirm that this is what you intend to do.",
"lockdbsuccesssub" => "Database lock succeeded",
"unlockdbsuccesssub" => "Database lock removed",
"lockdbsuccesstext" => "The {{SITENAME}} database has been locked.
-<br>Remember to remove the lock after your maintenance is complete.",
+<br />Remember to remove the lock after your maintenance is complete.",
"unlockdbsuccesstext" => "The {{SITENAME}} database has been unlocked.",
# SQL query (ã“ã®éƒ¨åˆ†ã¯ç®¡ç†è€…用ãªã®ã§å½“é¢è‹±æ–‡ã‚’残ã—ã¦ãŠãã¾ã™ã€‚)
diff --git a/languages/LanguageKo.php b/languages/LanguageKo.php
index 9d78ce4aa294..1cd5f10bdb5f 100644
--- a/languages/LanguageKo.php
+++ b/languages/LanguageKo.php
@@ -296,8 +296,8 @@ Please report this to an administrator, making note of the URL.",
"yourpasswordagain" => "암호 ë˜ í•œë²ˆ",
"newusersonly" => " (새내기 사용ìž)",
"remembermypassword" => "세쎤ë™ì•ˆ 암호를 기억합니다.",
-"loginproblem" => "<b>들어가는 ë° ë¬¸ì œê°€ 있습니다.</b><br>다시 í•´ 보세요!",
-"alreadyloggedin" => "<font color=red><b>$1 님, ë²Œì¨ ë“¤ì–´ì™€ 있습니다!</b></font><br>\n",
+"loginproblem" => "<b>들어가는 ë° ë¬¸ì œê°€ 있습니다.</b><br />다시 í•´ 보세요!",
+"alreadyloggedin" => "<font color=red><b>$1 님, ë²Œì¨ ë“¤ì–´ì™€ 있습니다!</b></font><br />\n",
"login" => "들어가기",
"userlogin" => "들어가기",
@@ -335,7 +335,7 @@ Please report this to an administrator, making note of the URL.",
"showpreview" => "미리보기",
"blockedtitle" => "ì‚¬ìš©ìž ì ‘ê·¼ê¸ˆì§€",
"blockedtext" => "$1 ê°€ ë‹¹ì‹ ì˜ ë˜ì´ë¦„ì´ë‚˜ IP를 막았습니다.
-ì´ìœ ëŠ” 다ìŒê³¼ 같습니다:<br>$2<p> ì ‘ê·¼ê¸ˆì§€ì— ëŒ€í•´ì„  관리ìžì™€ ìƒì˜í•˜ì‹­ì‹œì˜¤.",
+ì´ìœ ëŠ” 다ìŒê³¼ 같습니다:<br />$2<p> ì ‘ê·¼ê¸ˆì§€ì— ëŒ€í•´ì„  관리ìžì™€ ìƒì˜í•˜ì‹­ì‹œì˜¤.",
"newarticle" => "(새문서)",
"newarticletext" => "ìƒˆë¬¸ì„œì— ë‚´ìš©ì„ ì¨ ë„£ìœ¼ì„¸ìš”.",
"noarticletext" => "(현재 문서는 비어 있습니다.)",
@@ -364,7 +364,7 @@ text editing area as it will appear if you choose to save.",
"yourdiff" => "ì°¨ì´",
"copyrightwarning" => "{{SITENAME}}ì— ë‹¹ì‹ ì´ ê¸°ì—¬í•œ ê²ƒì€ ëª¨ë‘ GNU ìžìœ  문서 사용허가서(GFDL)
($1참조)ì— ë”°ë¼ ë°°í¬ë©ë‹ˆë‹¤.
-ë‹¹ì‹ ì´ ì¨ ë„£ì€ ë‚´ìš©ì´ ì œí•œì—†ì´ ê³ ì³ì§€ê³ , 재배í¬ë˜ëŠ” ê²ƒì´ ì‹«ë‹¤ë©´, 저장하지 마십시오.ì— ë°˜ëŒ€í•  ë•Œì—는, ì—¬ê¸°ì— ì“°ì§€ 마시길 ë°”ëžë‹ˆë‹¤.<br>
+ë‹¹ì‹ ì´ ì¨ ë„£ì€ ë‚´ìš©ì´ ì œí•œì—†ì´ ê³ ì³ì§€ê³ , 재배í¬ë˜ëŠ” ê²ƒì´ ì‹«ë‹¤ë©´, 저장하지 마십시오.ì— ë°˜ëŒ€í•  ë•Œì—는, ì—¬ê¸°ì— ì“°ì§€ 마시길 ë°”ëžë‹ˆë‹¤.<br />
ë˜í•œ, 여기 ì¨ ë„£ì€ ë‚´ìš©ì„ ìŠ¤ìŠ¤ë¡œ ì¼ìŒì„, í˜¹ì€ ëª¨ë‘ì—게 ê³µê°œëœ ìžë£Œì—ì„œ 빌어왔ìŒì„
ê°™ì´ ì•½ì†í•´ì•¼ 합니다.
<strong>ì €ìž‘ê¶Œì˜ ë³´í˜¸ë¥¼ 받는 ë‚´ìš©ì„ ì €ìž‘ê¶Œìžì˜ í—ˆê°€ì—†ì´ ë³´ë‚´ì§€ 마십시오!</strong>",
@@ -437,8 +437,8 @@ 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).",
"powersearch" => "찾기",
"powersearchtext" => "
-Search in namespaces :<br>
-$1<br>
+Search in namespaces :<br />
+$1<br />
$2 List redirects &nbsp; Search for $3 $9",
@@ -602,7 +602,7 @@ $1ì˜ ì¡°ê±´ìœ¼ë¡œ ì‚¬ìš©ì„ í—ˆê°€í–ˆìŒì„ 확ì¸í•©ë‹ˆë‹¤.",
"deleteimg" => "지우기",
"deleteimgcompletely" => "지우기",
"imghistlegend" => "ìƒì„¸ì„¤ëª…: (현재) = í˜„ìž¬ì˜ ê·¸ë¦¼ìž…ë‹ˆë‹¤, (지움) = 옛 ë²„ì ¼ì„ ì§€ì›ë‹ˆë‹¤, (ëŒë¦¼) = 옛 버젼으로 ë˜ëŒë ¤ 놓습니다.
-<br><i>특정 ë‚ ì§œì— ì˜¬ë¼ì˜¨ ê·¸ë¦¼ì„ ë³´ë ¤ë©´, 날짜를 ì°ì–´ 주세요</i>.",
+<br /><i>특정 ë‚ ì§œì— ì˜¬ë¼ì˜¨ ê·¸ë¦¼ì„ ë³´ë ¤ë©´, 날짜를 ì°ì–´ 주세요</i>.",
"imagelinks" => "그림고리",
"linkstoimage" => "ë‹¤ìŒ ë¬¸ì„œë“¤ì´ ì´ ê·¸ë¦¼ì„ ë‹´ê³  있습니다:",
"nolinkstoimage" => "ì´ ê·¸ë¦¼ì„ ë‹´ê³  있는 문서는 없습니다.",
@@ -631,9 +631,9 @@ $1ì˜ ì¡°ê±´ìœ¼ë¡œ ì‚¬ìš©ì„ í—ˆê°€í–ˆìŒì„ 확ì¸í•©ë‹ˆë‹¤.",
"maintenancebacklink" => "Back to Maintenance Page",
"disambiguations" => "Disambiguation pages",
"disambiguationspage" => "{{ns:4}}:Links_to_disambiguating_pages",
-"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "Double Redirects",
-"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br>\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
+"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br />\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
"selflinks" => "Pages with Self Links",
"selflinkstext" => "The following pages contain a link to themselves, which they should not.",
"missinglanguagelinks" => "Missing Language Links",
@@ -795,7 +795,7 @@ pages that were vandalized).",
"noblockreason" => "You must supply a reason for the block.",
"blockipsuccesssub" => "Block succeeded",
"blockipsuccesstext" => "The IP address \"$1\" has been blocked.
-<br>See [[특수기능:Ipblocklist|IP block list]] to review blocks.",
+<br />See [[특수기능:Ipblocklist|IP block list]] to review blocks.",
"unblockip" => "Unblock IP address",
"unblockiptext" => "Use the form below to restore write access
to a previously blocked IP address.",
@@ -828,7 +828,7 @@ Please confirm that this is what you intend to do.",
"lockdbsuccesssub" => "Database lock succeeded",
"unlockdbsuccesssub" => "Database lock removed",
"lockdbsuccesstext" => "The Wikipedia database has been locked.
-<br>Remember to remove the lock after your maintenance is complete.",
+<br />Remember to remove the lock after your maintenance is complete.",
"unlockdbsuccesstext" => "The Wikipedia database has been unlocked.",
# SQL query
diff --git a/languages/LanguageLatin1.php b/languages/LanguageLatin1.php
index e031007e4d82..f680133d8cd8 100644
--- a/languages/LanguageLatin1.php
+++ b/languages/LanguageLatin1.php
@@ -263,18 +263,20 @@ class LanguageLatin1 {
return $this->lang->getPreferredVariant();
}
+ function segmentForDiff( $text ) {
+ return $text;
+ }
+
+ function unsegmentForDiff( $text ) {
+ return $text;
+ }
+
function convert( $text, $isTitle=false ) {
return utf8_decode( $this->lang->convert( utf8_encode( $text ), $isTitle ) );
}
- function autoConvert($text, $toVariant=false) {
- return utf8_decode( $this->lang->autoConvert( utf8_encode( $text ), $toVariant ) );
- }
-
- /* hook for converting the title, which may needs special treatment
- */
- function convertTitle($text) {
- return utf8_decode( $this->lang->convertTitle( utf8_encode( $text ) ) );
+ function getVariantname( $code ) {
+ return utf8_decode( $this->lang->getVariantname( $code ) );
}
function getVariants() {
@@ -284,6 +286,18 @@ class LanguageLatin1 {
function convertForSearchResult( $termsArray ) {
return $termsArray;
}
+
+ function getExtraHashOptions() {
+ return '';
+ }
+
+ function linkTrail() {
+ return $this->lang->linkTrail();
+ }
+
+ function getLangObj() {
+ return $this->lang;
+ }
}
?>
diff --git a/languages/LanguageLi.php b/languages/LanguageLi.php
index 30d7d1c790ad..d1012d43c47c 100644
--- a/languages/LanguageLi.php
+++ b/languages/LanguageLi.php
@@ -255,11 +255,11 @@ U kan Wikipedia anoniem blijven gebruiken, of u opnieuw aanmelden onder dezelfde
"yourpasswordagain" => "Wachtwoord opnieuw ingeven",
"newusersonly" => " (alleen nieuwe gebroekers)",
"remembermypassword" => "mien wachtwoord onthouden voor latere sessies.",
-"loginproblem" => "<b>Er is een probleem met het aanmelden.</b><br>Probeer het opnieuw a.u.b.",
-"alreadyloggedin" => "<font color=red><b>gebroeker $1, u bent al aangemeld.</b></font><br>\n",
+"loginproblem" => "<b>Er is een probleem met het aanmelden.</b><br />Probeer het opnieuw a.u.b.",
+"alreadyloggedin" => "<font color=red><b>gebroeker $1, u bent al aangemeld.</b></font><br />\n",
"areyounew" => "Bent u nieuw op Wikipedia en wilt u een gebroekersprofiel aanmaken, voer dan een gebroekersnaam in en voer tweemaal hetzelfde wachtwoord in.
-Invoeren van uw e-mailadres is neet verplicht; het is handig als u uw wachtwoord bent vergeten; dat kan dan per e-mail worden opgestuurd.<br>\n",
+Invoeren van uw e-mailadres is neet verplicht; het is handig als u uw wachtwoord bent vergeten; dat kan dan per e-mail worden opgestuurd.<br />\n",
"login" => "Aanmelden",
"userlogin" => "Aanmelden",
@@ -293,7 +293,7 @@ Gelieve na ontvangst opnieuw aan te melden.",
"preview" => "Noakieke",
"showpreview" => "Toon bewerking ter controle",
"blockedtitle" => "gebroeker is geBlokkierd",
-"blockedtext" => "Uw gebroekersnaam of IP-adres is door $1 geBlokkierd. De opgegeven reden:<br>$2<p>. U kunt voor euverlik contact opnemen met de [[Wikipedia:Systeembeheerders|systeembeheerders]].",
+"blockedtext" => "Uw gebroekersnaam of IP-adres is door $1 geBlokkierd. De opgegeven reden:<br />$2<p>. U kunt voor euverlik contact opnemen met de [[Wikipedia:Systeembeheerders|systeembeheerders]].",
"newarticle" => "(Nieuw)",
"newarticletext" => "Verwijder dit en beschrijf hier de nieuwe pagina.",
"noarticletext" => "(Deze pagina bevat momenteel geen tekst)",
@@ -308,7 +308,7 @@ Gelieve na ontvangst opnieuw aan te melden.",
"storedversion" => "Opgesjlage versie",
"editingold" => "<strong>WAARSCHUWING: U bent bezig een oude versie van deze pagina te bewerken. Wanneer u uw bewerking opslaat, gaan alle wijzigingen die na deze versie gedaan zijn verloren.\n.</strong>\n",
"yourdiff" => "Wijzigingen",
-"copyrightwarning" => "Opgelet: Alle bijdragen aan Wikipedia worden geacht te zijn vrijgegeven onder de GNU Free Documentation License. Als u neet wil dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan neet voor 'Pagina Opslaan'.<br> Hierbij belooft u ons tevens dat u deze tekst zelf hebt geschreven, of overgenomen uit een vrije, openbare bron.<br> <strong>GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAARTOE TOESTEMMING HEBT!</strong>",
+"copyrightwarning" => "Opgelet: Alle bijdragen aan Wikipedia worden geacht te zijn vrijgegeven onder de GNU Free Documentation License. Als u neet wil dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan neet voor 'Pagina Opslaan'.<br /> Hierbij belooft u ons tevens dat u deze tekst zelf hebt geschreven, of overgenomen uit een vrije, openbare bron.<br /> <strong>GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAARTOE TOESTEMMING HEBT!</strong>",
# History pages
@@ -354,16 +354,15 @@ Gelieve na ontvangst opnieuw aan te melden.",
"nonefound" => "<strong>Merk op:</strong> wanneer een zoekopdracht mislukt komt dat vaak door gebruik van (in het Engels) veel voorkomende woorden zoals \"of\" en \"be\", die neet geïndexeerd zijn, of door verschillende zoektermen tegelijk op te geven (u krijgt dan alleen in pagina's waaarin alle opgegeven termen voorkomen).",
"powersearch" => "Zoeken",
"powersearchtext" => "
- Zoek in naamruimten :<br>
-$1<br>
+ Zoek in naamruimten :<br />
+$1<br />
$2 Toon redirects Zoek: $3 $9",
# Preferences page
# Voorkeuren
"preferences" => "Voorkeuren",
"prefsnologin" => "Niet aangemeld",
-"prefsnologintext" => "U dient <a href=\"" .
- wfLocalUrl( "Special:Userlogin" ) . "\">aangemeld</a> te zijn om voorkeuren te kunnen instellen.",
+"prefsnologintext" => "U dient <a href=\"{{localurl:Special:Userlogin}}\">aangemeld</a> te zijn om voorkeuren te kunnen instellen.",
"prefslogintext" => "U bent aangemeld als \"$1\". Uw interne identificatienummer is $2.",
"prefsreset" => "Standaardvoorkeuren hersteld.",
"qbsettings" => "Menubalkinstellingen",
@@ -395,7 +394,7 @@ $2 Toon redirects Zoek: $3 $9",
"recentchangestext" => "Deze pagina toont de meest recente wijzigingen aan Wikipedia.
Mocht u hier nieuw zijn, dan welkom bij Wikipedia! Bekijk AUB de volgende pagina's eens: [[Wikipedia:Veel gestelde vragen|Veel gestelde vragen]], [[Wikipedia:Instructies|Instructies]], [[Wikipedia:Objectiviteit|Objectiviteit]] en [[Wikipedia:Wat je neet moet doen|Wat je NIET moet doen]].
Als u pagina's wilt verwijderen, ga naar [[Wikipedia:Te verwijderen pagina's|Te verwijderen pagina's]], als u iets wilt bediscussiëren, ga naar [[Wikipedia:euverlik gewenst|euverlik gewenst]]. Er is ook een email-liest voor WikipediaNL: [http://www.wikipedia.org/mailman/listinfo/wikinl-l WikiNL-l].
-<br>Om Wikipedia te laten slagen is het erg belangrijk '''geen''' materiaal toe te voegen waarop iemand anders auteursrechten heeft, tenzij u daartoe toestemming heeft. De wettelijke gevolgen van inbreuk op de rechten van anderen zouden de hele onderneming zwaar kunnen schaden.",
+<br />Om Wikipedia te laten slagen is het erg belangrijk '''geen''' materiaal toe te voegen waarop iemand anders auteursrechten heeft, tenzij u daartoe toestemming heeft. De wettelijke gevolgen van inbreuk op de rechten van anderen zouden de hele onderneming zwaar kunnen schaden.",
"rcloaderr" => "Meest recente wijzigingen laden",
"rcnote" => "Hieronder zijn de <strong>$1</strong> laatste wijzigingen gedaan in de laatste <strong>$2</strong> dagen.",
"rcnotefrom" => "Veranderingen sinds <b>$2</b> (met een maximum van <b>$1</b> veranderingen).",
@@ -421,22 +420,24 @@ Als u pagina's wilt verwijderen, ga naar [[Wikipedia:Te verwijderen pagina's|Te
"reupload" => "Opnieuw uploaden",
"reuploaddesc" => "Terug naar het uploadformulier.",
"uploadnologin" => "Niet aangemeld",
-"uploadnologintext" => "U dient <a href=\"" .
- wfLocalUrl( "Speciaal:Userlogin" ) . "\">aangemeld te zijn</a>
+"uploadnologintext" => "U dient <a href=\"{{localurl:Special:Userlogin}}\">aangemeld te zijn</a>
om bestanden te uploaden.",
"uploadfile" => "upload bestand",
"uploaderror" => "upload fout",
"uploadtext" => "<strong>STOP!</strong> Voor u iets hier upload,
-wees zeker dat het in overeenkomst is met het Wikipedia <a href=\"" .
-wfLocalUrlE( "Wikipedia:Beleid_voor_gebruik_van_afbeeldingen" ) . "\">afbeeldingsbeleid</a>.
-<p>Om de reeds ge-uploade bestanden te bekijken of te zoeken ga naar de <a href=\"" . wfLocalUrlE( "Speciaal:Imagelist" ) .
-"\">liest van ge-uploade bestanden</a>.
-Uploads en verwijderingen worden bijgehouden in het <a href=\"" .
-wfLocalUrlE( "Wikipedia:Upload_logboek" ) . "\">upload logboek</a>.
-<p>Gebroek het onderstaande formulier om bestanden zoals afbeeldingen en geluidsbestanden die relevant zijn voor uw artikel te u-loaden. Bij de meeste browers zoals 'Internet Explorer' en 'Mozilla' zult u een \"Bladeren...\" of \"Browse..\" knop zien die een standaard dialoogscherm van uw bestuuringssysteem oproept. Kiest u een bestand, dan zal het ingevuld worden in het veld naast de \"Bladeren...\" knop. U dient ook het vakje aan te vinken waarmee u bevestigt dat er geen schending van auteursrechten plaatsvindt door het gebruik van dat bestand. Vul het veld \"Omschrijving\" in. Druk op de \"Upload\" knop om het uploaden te voltooien. Dit kan even duren als u een langzame internetverbinding gebruikt.
-<p>Gebroek bij voorkeur JPEG voor foto's, PNG voor tekeningen en dergelijke en OGG voor geluid.
-Geef uw bestanden een duidelijk omschrijvende naam om verwarring te voorkomen. Om het bestand in een pagina te laten verschijnen, kunt u het volgende doen; <b>[[afbeelding:uw_foto.jpg]]</b> of <b>[[afbeelding:uw_logo.png|alt text]]</b> of <b>[[media:uw_geluid.ogg]]</b> voor audio.
-<p>Vergeet neet dat net als met andere pagina's op Wikipedia anderen de ge-uploade bestanden kunnen verwijderen indien men denkt dat dat in het voordeel van het project is. Bij misbruik van dit systeem kan u de toegang tot Wikipedia ontzegd worden.",
+wees zeker dat het in overeenkomst is met het Wikipedia
+[[Wikipedia:Beleid_voor_gebruik_van_afbeeldingen|afbeeldingsbeleid]].
+
+Om de reeds ge-uploade bestanden te bekijken of te zoeken ga naar de . [[Special:Imagelist|liest van ge-uploade bestanden]].
+Uploads en verwijderingen worden bijgehouden in het
+[[Special:Log/upload|upload logboek]].
+
+Gebroek het onderstaande formulier om bestanden zoals afbeeldingen en geluidsbestanden die relevant zijn voor uw artikel te u-loaden. Bij de meeste browers zoals 'Internet Explorer' en 'Mozilla' zult u een \"Bladeren...\" of \"Browse..\" knop zien die een standaard dialoogscherm van uw bestuuringssysteem oproept. Kiest u een bestand, dan zal het ingevuld worden in het veld naast de \"Bladeren...\" knop. U dient ook het vakje aan te vinken waarmee u bevestigt dat er geen schending van auteursrechten plaatsvindt door het gebruik van dat bestand. Vul het veld \"Omschrijving\" in. Druk op de \"Upload\" knop om het uploaden te voltooien. Dit kan even duren als u een langzame internetverbinding gebruikt.
+
+Gebroek bij voorkeur JPEG voor foto's, PNG voor tekeningen en dergelijke en OGG voor geluid.
+Geef uw bestanden een duidelijk omschrijvende naam om verwarring te voorkomen. Om het bestand in een pagina te laten verschijnen, kunt u het volgende doen; <b><nowiki>[[afbeelding:uw_foto.jpg]]</nowiki></b> of <b><nowiki>[[afbeelding:uw_logo.png|alt text]]</nowiki></b> of <b><nowiki>[[media:uw_geluid.ogg]]</nowiki></b> voor audio.
+
+Vergeet neet dat net als met andere pagina's op Wikipedia anderen de ge-uploade bestanden kunnen verwijderen indien men denkt dat dat in het voordeel van het project is. Bij misbruik van dit systeem kan u de toegang tot Wikipedia ontzegd worden.",
"uploadlog" => "upload logboek",
"uploadlogpage" => "Upload_logboek",
"uploadlogpagetext" => "Hieronder de liest met de meest recent ge-uploade bestanden. Alle tieden zijn servertied (UTC).
@@ -479,7 +480,7 @@ Geef uw bestanden een duidelijk omschrijvende naam om verwarring te voorkomen. O
"imghistory" => "Geschiedenis van de afbeelding",
"revertimg" => "rev",
"deleteimg" => "verw",
-"imghistlegend" => "Verklaring: (cur)= huidige afbeelding, (verw) = verwijder de oude versie, (rev) = breng oude versie terug.<br>
+"imghistlegend" => "Verklaring: (cur)= huidige afbeelding, (verw) = verwijder de oude versie, (rev) = breng oude versie terug.<br />
<i>Klik op de datum om de afbeeldingen die ge-upload zijn op die datum te zien</i>.",
"imagelinks" => "Afbeeldingsverwijzingen",
"linkstoimage" => "Deze afbeelding wordt gebruikt op de volgende pagina's:",
@@ -501,9 +502,9 @@ Er is in totaal $3 maal een pagina bekeken, en $4 maal een pagina bewerkt. Dat g
"maintenancebacklink" => "Terug naar de Onderhoudspagina",
"disambiguations" => "Doorverwijspagina's",
"disambiguationspage" => "Wikipedia:Doorverwijspagina",
-"disambiguationstext" => "De onderstaande artikelen verwijzen naar een [[Wikipedia:Doorverwijspagina|doorverwijspagina]]. Deze zouden waarschijnlijk direct naar de onderwerpspagina moeten verwijzen. <br>Als doorverwijspagina's worden die pagina's beschouwd waar vanaf $1 naar verwezen wordt.<br>Opmerking: Deze liest toont alleen pagina's vanuit de hoofdnaamruimte, en dus neet euverlikpagina's, Wikipedia:pagina's en dergelijke.",
+"disambiguationstext" => "De onderstaande artikelen verwijzen naar een [[Wikipedia:Doorverwijspagina|doorverwijspagina]]. Deze zouden waarschijnlijk direct naar de onderwerpspagina moeten verwijzen. <br />Als doorverwijspagina's worden die pagina's beschouwd waar vanaf $1 naar verwezen wordt.<br />Opmerking: Deze liest toont alleen pagina's vanuit de hoofdnaamruimte, en dus neet euverlikpagina's, Wikipedia:pagina's en dergelijke.",
"doubleredirects" => "Dubbele redirects",
-"doubleredirectstext" => "<b>Let op:</b> Er kunnen in deze liest redirects staan die er neet in thuishoren. Dat komt over het algemeen doordat er na de #REDIRECT nog andere links op de pagina staan.<br>\nOp elke regel vindt u de eerste redirectpagina, de tweede redirectpagina en de eerste regel van de tweede redirectpagina. Normaal gesproken bevat deze laatste de pagina waar de eerste redirect naartoe zou moeten verwijzen.",
+"doubleredirectstext" => "<b>Let op:</b> Er kunnen in deze liest redirects staan die er neet in thuishoren. Dat komt over het algemeen doordat er na de #REDIRECT nog andere links op de pagina staan.<br />\nOp elke regel vindt u de eerste redirectpagina, de tweede redirectpagina en de eerste regel van de tweede redirectpagina. Normaal gesproken bevat deze laatste de pagina waar de eerste redirect naartoe zou moeten verwijzen.",
"brokenredirects" => "Gebroken redirects",
"brokenredirectstext" => "De onderstaande redirectpagina's bevatten een redirect naar een neet-bestaande pagina.",
"selflinks" => "Pagina's die naar zichzelf verwijzen",
@@ -546,10 +547,8 @@ Er is in totaal $3 maal een pagina bekeken, en $4 maal een pagina bewerkt. Dat g
# Email this user
# E-mail deze gebroeker
"mailnologin" => "Geen e-mailadres gekend voor deze gebroeker",
-"mailnologintext" => "U dient <a href=\"" .
- wfLocalUrl( "Speciaal:Userlogin" ) . "\">aangemeld te zijn </a>
-en een geldig e-mailadres in uw <a href=\"" .
- wfLocalUrl( "Speciaal:Preferences" ) . "\">voorkeuren</a>
+"mailnologintext" => "U dient <a href=\"{{localurl:Special:Userlogin}}\">aangemeld te zijn </a>
+en een geldig e-mailadres in uw <a href=\"{{localurl:Special:Preferences}}\">voorkeuren</a>
to send e-mail to other users.",
"emailuser" => "E-mail deze gebroeker",
"emailpage" => "E-mail gebroeker",
@@ -570,17 +569,14 @@ to send e-mail to other users.",
"watchlistsub" => "(van gebroeker \"$1\")",
"nowatchlist" => "Er staat neets op uw volgliest.",
"watchnologin" => "U bent neet aangemeld",
-"watchnologintext" => "Om uw volgliest te veranderen dient u eerst <a href=\"" .
- wfLocalUrl( "Speciaal:Userlogin" ) . "\">aangemeld</a>
+"watchnologintext" => "Om uw volgliest te veranderen dient u eerst <a href=\"{{localurl:Special:Userlogin}}\">aangemeld</a>
te zijn.",
"addedwatch" => "Toegevoegd aan volgliest",
-"addedwatchtext" => "De pagina \"$1\" is aan uw <a href=\"" .
- wfLocalUrl( "Speciaal:Watchlist" ) . "\">volgliest</a> toegevoegd.
+"addedwatchtext" => "De pagina \"$1\" is aan uw [[Special:Watchlist|volgliest]] toegevoegd.
Toekomstige wijzigingen aan deze pagina en euverlikpagina zullen hier vermeld worden.
-Ook zullen deze pagina's in het <b>vet</b> verschijnen in de <a href=\"" .
- wfLocalUrl( "Speciaal:Recentchanges" ) . "\">liest van recente wijzigingen</a> zodat u ze eenvoudiger kan opmerken.</p>
+Ook zullen deze pagina's in het <b>vet</b> verschijnen in de [[Special:Recentchanges|liest van recente wijzigingen]] zodat u ze eenvoudiger kan opmerken.
-<p>Indien u een pagina wenst te verwijderen van uw volgliest klik dan op \"Van volgliest verwijderen\" in de menubalk.",
+Indien u een pagina wenst te verwijderen van uw volgliest klik dan op \"Van volgliest verwijderen\" in de menubalk.",
"removedwatch" => "Van volgliest verwijderen",
"removedwatchtext" => "De pagina \"$1\" is van uw volgliest verwijderd.",
"watchthispage" => "Volg deze pagina",
@@ -652,8 +648,8 @@ Ook zullen deze pagina's in het <b>vet</b> verschijnen in de <a href=\"" .
"badipaddress" => "Het IP-adres heeft een ongeldige opmaak.",
"noblockreason" => "U dient een reden op te geven voor het blokkeren van een IP-adres.",
"blockipsuccesssub" => "Blokkering gelukt",
-"blockipsuccesstext" => "Het IP-adres \"$1\" is geBlokkierd.<br>
-Zie de [[speciaal:Ipblocklist|liest van geBlokkierde IP-adressen]].",
+"blockipsuccesstext" => "Het IP-adres \"$1\" is geBlokkierd.<br />
+Zie de [[Special:Ipblocklist|liest van geBlokkierde IP-adressen]].",
"unblockip" => "De-Blokkier IP-adres",
"unblockiptext" => "Gebroek het onderstaande formulier om terug schrijftoegang te geven aan een geBlokkierd IP-adres.",
"ipusubmit" => "De-Blokkier dit IP-adres.",
@@ -700,14 +696,13 @@ Vergeet neet de database opnieuw te de-blokkeren zodra u klaar bent met uw onder
* Als u de onderstaande radiobox neet aangevinkt laat",
"movearticle" => "Verplaatsj pagina",
"movenologin" => "Neet aangemeld",
-"movenologintext" => "U dient <a href=\"" .
- wfLocalUrl( "Speciaal:Userlogin" ) . "\">aangemeld</a>
+"movenologintext" => "U dient <a href=\"{{localurl:Special:Userlogin}}\">aangemeld</a>
te zijn om een pagina te verplaatsen.",
"newtitle" => "Noa de nuuje titel",
"movepagebtn" => "Verplaatsj pagina",
"pagemovedsub" => "De verplaatsjing is gelukt",
"pagemovedtext" => "Pagina \"[[$1]]\" verplaatst naar \"[[$2]]\".",
-"articleexists" => "D'r is al un pagina mit deze titel of de titel is ongeldig. <br>Gelieve een andere titel te kiezen.",
+"articleexists" => "D'r is al un pagina mit deze titel of de titel is ongeldig. <br />Gelieve een andere titel te kiezen.",
"talkexists" => "De pagina zelf is verplaatst, maar de euverlikpagina kon neet worden verplaatst, omdat de doeltitel al een neet-lege euverlikpagina had. Combineer de euverlikpagina's a.u.b. handmatig.",
"movedto" => "verplaatsjt noa",
"movetalk" => "Verplaatsj \"euverlik\" pagina auch indien aanwezig.",
diff --git a/languages/LanguageLt.php b/languages/LanguageLt.php
index 0b31f165a307..f07c75918d5e 100644
--- a/languages/LanguageLt.php
+++ b/languages/LanguageLt.php
@@ -289,7 +289,7 @@ ir kad jūs tai darote nenusižengdamas
'copyrightpagename' => "Wikipedia copyright",
'copyrightwarning' => "Atkreipkite dėmesį, kad viskam, kas patenka į Wikipediją, yra taikoma GNU Laisvos Documentacijos Licenzija
(detaliau - $1).
-Jei nepageidaujate, kad jÅ«sų įvestas turinys bÅ«tų negailestingai redaguojamas ir platinamas, neraÅ¡ykite Äia.<br>
+Jei nepageidaujate, kad jÅ«sų įvestas turinys bÅ«tų negailestingai redaguojamas ir platinamas, neraÅ¡ykite Äia.<br />
JÅ«s taip pat pasižadate, kad tai jÅ«sų paÄių raÅ¡ytas turinys arba kopijuotas iÅ¡ viešų ar panaÅ¡ių nemokamų Å¡altinių.
<strong>NEKOPIJUOKITE AUTORINĖMIS TEISĖMIS APSAUGOTŲ DARBŲ BE LEIDIMO!</strong>",
#'couldntremove' => "Couldn't remove item '$1'...",
@@ -436,7 +436,7 @@ border=\"0\" ALT=\"Google\"></A>
'hide' => "paslÄ—pti",
'hidetoc' => "slÄ—pti",
'hist' => "ist",
-/*#'histlegend' => "Diff selection: mark the radio boxes of the versions to compare and hit enter or the button at the bottom.<br/>
+/*#'histlegend' => "Diff selection: mark the radio boxes of the versions to compare and hit enter or the button at the bottom.<br />
Legend: (cur) = difference with current version,
(last) = difference with preceding version, M = minor edit.",*/
'history' => "Straipsnio istorija",
@@ -529,7 +529,7 @@ unlock the database when your maintenance is done.",*/
'loginsuccesstitle' => "SÄ—kmingai prisijungÄ—te",
'logout' => "Atsijungti",
'logouttext' => "JÅ«s atsijungÄ—te nuo Wikipedijos.
-Galite toliau naudoti WikipedijÄ… anonimiÅ¡kai arba prisijunkite iÅ¡ naujo tuo paÄiu ar kitu vartotoju.<br>
+Galite toliau naudoti WikipedijÄ… anonimiÅ¡kai arba prisijunkite iÅ¡ naujo tuo paÄiu ar kitu vartotoju.<br />
P.S.: kai kuriuose puslapiuose ir toliau gali rodyti lyg būtumėte prisijungęs iki tol, kol išvalysite savo naršyklės išsaugotas puslapių kopijas",
#'logouttitle' => "User logout",
'lonelypages' => "Vieniši straipsniai",
@@ -746,7 +746,7 @@ Search in namespaces :<br />
$1<br />
$2 List redirects &nbsp; Search for $3 $9",*/
'preferences' => "Nustatymai",
-'prefs-help-userdata' => "* <strong>Real name</strong> (optional): if you choose to provide it this will be used for giving you attribution for your work.<br/>
+'prefs-help-userdata' => "* <strong>Real name</strong> (optional): if you choose to provide it this will be used for giving you attribution for your work.<br />
* <strong>Email</strong> (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.",
#'prefs-misc' => "Misc settings",
diff --git a/languages/LanguageMs.php b/languages/LanguageMs.php
index e529e0324dfd..df9b4c1cfcbd 100644
--- a/languages/LanguageMs.php
+++ b/languages/LanguageMs.php
@@ -313,13 +313,13 @@ Sila kemaskini konfigurasi butir-butir diri anda.", #"<h2>Welcome, $1!</h2><p>Yo
"yourpasswordagain" => "Ulang Kata Laluan", #Retype password",
"newusersonly" => "(Hanya pengguna baru)", # (new users only)",
"remembermypassword" => "Sentiasa ingatan kata laluan.", # Remember my password across sessions.",
-"loginproblem" => "<b>Terdapat masalah dengan data kemasukan.</b><br>Cuba semula!", # There has been a problem with your login.</b><br>Try again!",
-"alreadyloggedin" => "<font color=red><b>Pengguna $1, anda telah berjaya masuk!</b></font><br>\n",
+"loginproblem" => "<b>Terdapat masalah dengan data kemasukan.</b><br />Cuba semula!", # There has been a problem with your login.</b><br />Try again!",
+"alreadyloggedin" => "<font color=red><b>Pengguna $1, anda telah berjaya masuk!</b></font><br />\n",
"areyounew" =>"Sekiranya anda baru dalam Wikipedia dan ingin mendapatkan akaun pengguna,
masukan nama pengguna, kemudia taip kata laluan dan ulang semula kata laluan.
Alamat email anda adalah tidak diwajibkan;sekiranya kehilangan kata laluan
-boleh diminta melalui email yg diberikan.<br>\n",
+boleh diminta melalui email yg diberikan.<br />\n",
"login" => "Masuk", #Log in
"userlogin" => "Laluan masuk", #Log in
@@ -363,7 +363,7 @@ Sila masuk setelah menerima email tersebut.", #Please log in again after you rec
"showpreview" => "Tunjuk Paparan", #"Show preview",
"blockedtitle" => "Pengguna diblok", #"User is blocked",
"blockedtext" => "Kata nama anda atau alamat IP telah diblok oleh $1.
-Alasannya kerana :<br>$2<p>Anda boleh menghubungi sistem admin untuk
+Alasannya kerana :<br />$2<p>Anda boleh menghubungi sistem admin untuk
membincangkan sebab-sebabnya.",
"newarticle" => "(Baru)", #"(New)",
"newarticletext" =>
@@ -467,8 +467,8 @@ yang mana bukan dalam senarai indeks atau dengan dikhususkan lebih dari
satu istilah carian(hanya halaman).", # "<strong>Note</strong>: unsuccessful searches are often caused by searching for common words like \"have\" and \"from\",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).",
"powersearch" => "Cari", #"Search",
"powersearchtext" => "
-Search in namespaces :<br>
-$1<br>
+Search in namespaces :<br />
+$1<br />
$2 List redirects &nbsp; Search for $3 $9",
@@ -617,7 +617,7 @@ oleh siapa, dan lain-lain yang anda ketahui.",
"deleteimgcompletely" => "del",
"imghistlegend" => "Legend: (cur) = this is the current image, (del) = delete
this old version, (rev) = revert to this old version.
-<br><i>Click on date to see image uploaded on that date</i>.",
+<br /><i>Click on date to see image uploaded on that date</i>.",
"imagelinks" => "Pautan imej", #"Image links",
"linkstoimage" => "Halaman berikut berpaut pada imej ini:", #"The following pages link to this image:",
"nolinkstoimage" => "Tiada halaman yang berpaut pada imej ini.", #"There are no pages that link to this image.",
@@ -645,9 +645,9 @@ Ini menjadikan <b>$5</b> purata halaman yang disunting, dan <b>$6</b> paparan ya
"maintenancebacklink" => "Kembali ke halaman penyelenggaran", #"Back to Maintenance Page",
"disambiguations" => "Halaman yang tidak samar", #"Disambiguation pages",
"disambiguationspage" => "Wikipedia:Pautan_ke_halaman_yang_tidak_samar", #"Wikipedia:Links_to_disambiguating_pages",
-"disambiguationstext" => "Halaman-halaman yang berikutnya bersambung ke satu <i>halaman yang tidak samar</i>. Halaman-halaman tersebut sepatutnya bersambung ke topik-topik yang berkenaan.<br>Satu halaman dianggap sebagai tidak samar jika ia disambung dari $1.<br>Pautan dari ruang nama yang lain <i>tidak</i> tersenarai di sini.",
+"disambiguationstext" => "Halaman-halaman yang berikutnya bersambung ke satu <i>halaman yang tidak samar</i>. Halaman-halaman tersebut sepatutnya bersambung ke topik-topik yang berkenaan.<br />Satu halaman dianggap sebagai tidak samar jika ia disambung dari $1.<br />Pautan dari ruang nama yang lain <i>tidak</i> tersenarai di sini.",
"doubleredirects" => "Peralihan Halaman Berganda", #"Double Redirects",
-"doubleredirectstext" => "<b>Perhatian:</b> Senarai ini mungkin tidak tepat. Ini biasanya bermaksud terdapat tambahan teks dengan pautan di bawah #REDIRECT yang pertama.<br>\nSetiap baris mengandungi pautan kepada peralihan halaman yang pertama dan kedua, sebagaimana baris pertama bagi teks peralihan halaman kedua, biasanya memberikan halaman sasaran \"sebenar\" yang sepatutnya peralihan pertama disambungkan.",
+"doubleredirectstext" => "<b>Perhatian:</b> Senarai ini mungkin tidak tepat. Ini biasanya bermaksud terdapat tambahan teks dengan pautan di bawah #REDIRECT yang pertama.<br />\nSetiap baris mengandungi pautan kepada peralihan halaman yang pertama dan kedua, sebagaimana baris pertama bagi teks peralihan halaman kedua, biasanya memberikan halaman sasaran \"sebenar\" yang sepatutnya peralihan pertama disambungkan.",
"brokenredirects" => "Peralihan Halaman Rosak", #"Broken Redirects",
"brokenredirectstext" => "Peralihan halaman berikut bersambung ke satu halaman yang tidak wujud", #"The following redirects link to a non-existing page.",
"selflinks" => "Halaman-halaman dengan pautan sendiri", #"Pages with Self Links",
@@ -844,7 +844,7 @@ halaman tertentu yang telah dirosakkan).",
"noblockreason" => "Anda mesti sediakan alasan untuk pemblokan tersebut.", #"You must supply a reason for the block.",
"blockipsuccesssub" => "Pemblokan berjaya", #"Block succeeded",
"blockipsuccesstext" => "Alamat IP atau pengguna \"$1\" telah diblok.
-<br>Lihat [[Istimewa:Ipblocklist|IP and user block list]] untuk semak pemblokan.", #"The IP address or username \"$1\" has been blocked.
+<br />Lihat [[Istimewa:Ipblocklist|IP and user block list]] untuk semak pemblokan.", #"The IP address or username \"$1\" has been blocked.
"unblockip" => "Lepaskan semula alamat IP atau pengguna dari diblok", #"Unblock IP address or user",
"unblockiptext" => "Gunakan borang di bawah untuk masukkan semula
capaian kemaskini ke alamat IP atau pengguna yang telah diblok sebelumnya.",
@@ -877,7 +877,7 @@ kemaskini terhadap pangkalan data. Sila pastikan anda mahu berbuat demikian.",
"lockdbsuccesssub" => "Penguncian pangkalan data berjaya", #"Database lock succeeded",
"unlockdbsuccesssub" => "Kunci pangkalan data telah dihapuskan", #"Database lock removed",
"lockdbsuccesstext" => "Pangkalan data Wikipedia telah dikunci.
-<br>Pastikan anda membukanya semula dari dikunci setelah penyelenggaraan selesai.",
+<br />Pastikan anda membukanya semula dari dikunci setelah penyelenggaraan selesai.",
"unlockdbsuccesstext" => "Pangkalan data Wikipedia telah dibuka semula dari dikunci.", #"The Wikipedia database has been unlocked.",
# SQL query
diff --git a/languages/LanguageNl.php b/languages/LanguageNl.php
index 700aca95482d..728ad743eb80 100644
--- a/languages/LanguageNl.php
+++ b/languages/LanguageNl.php
@@ -301,8 +301,8 @@ U kunt {{SITENAME}} anoniem blijven gebruiken, of u opnieuw aanmelden onder deze
"yourpasswordagain" => "Wachtwoord opnieuw ingeven",
"newusersonly" => " (alleen nieuwe gebruikers)",
"remembermypassword" => "Mijn wachtwoord onthouden voor latere sessies.",
-"loginproblem" => "<b>Er is een probleem met het aanmelden.</b><br>Probeer het opnieuw a.u.b.",
-"alreadyloggedin" => "<font color=red><b>Gebruiker $1, u bent al aangemeld.</b></font><br>\n",
+"loginproblem" => "<b>Er is een probleem met het aanmelden.</b><br />Probeer het opnieuw a.u.b.",
+"alreadyloggedin" => "<font color=red><b>Gebruiker $1, u bent al aangemeld.</b></font><br />\n",
"login" => "Aanmelden & Inschrijven",
"userlogin" => "Aanmelden",
@@ -315,7 +315,7 @@ U kunt {{SITENAME}} anoniem blijven gebruiken, of u opnieuw aanmelden onder deze
"userexists" => "De gebruikersnaam die u heeft ingevoerd is al in gebruik. Gelieve een andere naam te kiezen.",
"youremail" => "Uw e-mailadres",
"yournick" => "Uw bijnaam (voor handtekeningen)",
-"emailforlost" => "Het opgeven van een e-mailadres is niet verplicht.<br>Enkel als er een email-adres beschikbaar is, kunt u een nieuw wachtwoord aanvragen indien u het oude vergeten bent.<br>Een emailadres geeft andere gebruikers de mogelijkheid u een email te sturen via een formulier. U kunt die functie eventueel uitzetten via de voorkeuren.",
+"emailforlost" => "Het opgeven van een e-mailadres is niet verplicht.<br />Enkel als er een email-adres beschikbaar is, kunt u een nieuw wachtwoord aanvragen indien u het oude vergeten bent.<br />Een emailadres geeft andere gebruikers de mogelijkheid u een email te sturen via een formulier. U kunt die functie eventueel uitzetten via de voorkeuren.",
"loginerror" => "Inlogfout",
"noname" => "U dient een gebruikersnaam op te geven.",
"loginsuccesstitle" => "Aanmelden gelukt.",
@@ -339,7 +339,7 @@ Gelieve na ontvangst opnieuw aan te melden.",
"preview" => "Nakijken",
"showpreview" => "Toon bewerking ter controle",
"blockedtitle" => "Gebruiker is geblokkeerd",
-"blockedtext" => "Uw gebruikersnaam of IP-adres is door $1 geblokkeerd. De opgegeven reden:<br>$2<p>. Elke computer die verbonden is met het internet krijgt een [[ip-adres]] toegewezen van zijn [[internetprovider]]. In veel gevallen krijgt een gebruiker regelmatig een ander ip-adres toegewezen. Het het door u gebruikte ip-adres is recent gebruikt door u of iemand anders voor bewerkingen die in overtreding zijn van de [[{{ns:4}}:Toch een paar regels|regels]] van {{SITENAME}}.<p>U kunt voor overleg contact opnemen met de [[{{ns:4}}:Systeembeheerders|systeembeheerders]] via [http://wikinl.sol3.info/wikinl_info.html#email wikinl-l-owner@wikipedia.org een formulier].",
+"blockedtext" => "Uw gebruikersnaam of IP-adres is door $1 geblokkeerd. De opgegeven reden:<br />$2<p>. Elke computer die verbonden is met het internet krijgt een [[ip-adres]] toegewezen van zijn [[internetprovider]]. In veel gevallen krijgt een gebruiker regelmatig een ander ip-adres toegewezen. Het het door u gebruikte ip-adres is recent gebruikt door u of iemand anders voor bewerkingen die in overtreding zijn van de [[{{ns:4}}:Toch een paar regels|regels]] van {{SITENAME}}.<p>U kunt voor overleg contact opnemen met de [[{{ns:4}}:Systeembeheerders|systeembeheerders]] via [http://wikinl.sol3.info/wikinl_info.html#email wikinl-l-owner@wikipedia.org een formulier].",
"whitelistedittitle" => "Aanmelden verplicht",
"whitelistedittext" => "Om dit artikel te kunnen wijzigen, moet u [[Speciaal:Userlogin|ingelogd]] zijn.",
"whitelistreadtitle" => "Aanmelden verplicht",
@@ -349,7 +349,7 @@ Gelieve na ontvangst opnieuw aan te melden.",
"accmailtitle" => "Wachtwoord verzonden.",
"accmailtext" => "Het wachtwoord voor '$1' is verzonden naar $2.",
"newarticle" => "(Nieuw)",
-"newarticletext" => "Er bestaat nog geen artikel over dit onderwerp.<br>Als u wilt, kunt u hieronder een nieuw artikel schrijven.<br>Was dit niet de bedoeling, gebruik dan de 'Terug' knop van uw browser.<p>WAARSCHUWING: Let er goed op dat uw tekst vrij van auteursrechten is, bijvoorbeeld omdat u het zelf geschreven heeft. Neem geen teksten over uit boeken, tijdschriften of andere websites tenzij u zeker weet dat deze vrij van auteursrechten zijn.",
+"newarticletext" => "Er bestaat nog geen artikel over dit onderwerp.<br />Als u wilt, kunt u hieronder een nieuw artikel schrijven.<br />Was dit niet de bedoeling, gebruik dan de 'Terug' knop van uw browser.<p>WAARSCHUWING: Let er goed op dat uw tekst vrij van auteursrechten is, bijvoorbeeld omdat u het zelf geschreven heeft. Neem geen teksten over uit boeken, tijdschriften of andere websites tenzij u zeker weet dat deze vrij van auteursrechten zijn.",
"anontalkpagetext" => "<hr>Deze overlegpagina hoort bij een anonieme gebruiker die hetzij geen loginnaam heeft, hetzij deze niet gebruikt. We gebruiken daarom het IP-adres ter identificatie. Het kan echter zijn dat meerdere personen hetzelfde IP-adres gebruiken. Het kan daarom zijn dat u hier berichten ontvangt die niet voor u bedoeld zijn. Mocht u dat willen voorkomen, dan kunt u [[Speciaal:Userlogin|een gebruikersnaam aanvragen of u aanmelden]].",
"noarticletext" => "(Deze pagina bevat momenteel geen tekst)",
"updated" => "(Bijgewerkt)",
@@ -365,7 +365,7 @@ Gelieve na ontvangst opnieuw aan te melden.",
"storedversion" => "Opgeslagen versie",
"editingold" => "<strong>WAARSCHUWING: U bent bezig een oude versie van deze pagina te bewerken. Wanneer u uw bewerking opslaat, gaan alle wijzigingen die na deze versie gedaan zijn verloren.\n.</strong>\n",
"yourdiff" => "Wijzigingen",
-"copyrightwarning" => "Opgelet: Alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de GNU Free Documentation License. Als u niet wil dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor 'Pagina Opslaan'.<br> Hierbij belooft u ons tevens dat u deze tekst zelf hebt geschreven, of overgenomen uit een vrije, openbare bron.<br> <strong>GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAARTOE TOESTEMMING HEBT!</strong>",
+"copyrightwarning" => "Opgelet: Alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de GNU Free Documentation License. Als u niet wil dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor 'Pagina Opslaan'.<br /> Hierbij belooft u ons tevens dat u deze tekst zelf hebt geschreven, of overgenomen uit een vrije, openbare bron.<br /> <strong>GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAARTOE TOESTEMMING HEBT!</strong>",
"longpagewarning" => "Waarschuwing! Deze pagina is $1 kilobyte lang. Pagina's langer dan 32 kb zorgen voor problemen op sommige browsers. Het is daarom waarschijnlijk een goed idee deze pagina in meerdere pagina's te splitsen.",
"readonlywarning" => "Waarschuwing! De database is op dit moment in onderhoud; het is daarom niet mogelijk op dit moment pagina's te wijzigen. Wij adviseren u de tekst op uw eigen computer op te slaan en later opnieuw te proberen deze pagina te bewerken.",
"protectedpagewarning" => "Waarschuwing! U staat op het punt een beveiligde pagina te wijzigen. Gewone gebruikers kunnen deze pagina niet bewerken.",
@@ -416,12 +416,12 @@ Het kan natuurlijk dat er gewoon nog geen artikel aanwezig op {{SITENAME}} NL ov
",
"powersearch" => "Zoeken",
"powersearchtext" => "
- Zoek in naamruimten :<br>
-$1<br>
+ Zoek in naamruimten :<br />
+$1<br />
$2 Toon redirects &nbsp; Zoek: $3 $9",
"searchdisabled" => "Wegens een overbelasting van de server zijn sommige functies die het systeem extra belasten tijdelijk niet beschikbaar.
Hierdoor is in de interne zoekfunctie van {{SITENAME}} (vermoedelijk) niet beschikbaar voor onbepaalde duur.<p>
-Via google kunt u zoeken op {{SITENAME}}. <br>
+Via google kunt u zoeken op {{SITENAME}}. <br />
<form method=\"get\" action=\"http://www.google.com/search\">
<table bgcolor=\"#ffffff\" style=\"width: 752px; height: 76px;\"><tbody><tr><td>
<a href=\"http://www.google.com/\">
@@ -431,7 +431,7 @@ Via google kunt u zoeken op {{SITENAME}}. <br>
<input type=\"text\" name=\"q\" size=\"31\" maxlength=\"255\" value=\"\">
<input type=\"submit\" name=\"btnG\" value=\"Met Google zoeken in {{SITENAME}}\">
<font size=\"-1\">
-<input type=\"hidden\" name=\"domains\" value=\"http://nl.wikipedia.org\"><br><input type=\"radio\" name=\"sitesearch\" value=\"\">Het volledige internet<input type=\"radio\" name=\"sitesearch\" value=\"http://nl.wikipedia.org\" checked=\"checked\">{{SITENAME}} NL<br>
+<input type=\"hidden\" name=\"domains\" value=\"http://nl.wikipedia.org\"><br /><input type=\"radio\" name=\"sitesearch\" value=\"\">Het volledige internet<input type=\"radio\" name=\"sitesearch\" value=\"http://nl.wikipedia.org\" checked=\"checked\">{{SITENAME}} NL<br />
</font>
</td></tr></tbody></table>
</form>
@@ -490,7 +490,7 @@ Een beschrijving van de verschillende opties staat op [[{{ns:4}}:Voorkeuren]].",
# Recente wijzigingen
"changes" => "wijzigingen",
"recentchanges" => "Recente wijzigingen",
-"recentchangestext" => "Deze pagina toont de laatste aanpassingen aan artikelen van {{SITENAME}} NL. <br>
+"recentchangestext" => "Deze pagina toont de laatste aanpassingen aan artikelen van {{SITENAME}} NL. <br />
Ben je hier nieuw? Lees dan ook [[{{ns:4}}:Welkom voor nieuwelingen|Welkom voor nieuwelingen]] -- Wil je een pagina verwijderd hebben? Ga dan naar [[{{ns:4}}:Te verwijderen pagina's|Te verwijderen pagina's]] -- Wil je iets met andere gebruikers overleggen? Ga naar [[{{ns:4}}:Overleg gewenst|Overleg gewenst]] of meld je aan voor de discussielijst [http://mail.wikipedia.org/mailman/listinfo/wikinl-l WikiNL-l] -- Zin in een gezellige babbel? Kom naar de [[{{ns:4}}:De kroeg|De kroeg]] of doe mee op ons nieuwe [http://chat.wikipedia.be Wiki-chatkanaal].<p>
Om {{SITENAME}} te laten slagen is het erg belangrijk geen materiaal toe te voegen waarop iemand anders auteursrechten heeft, tenzij je daartoe toestemming hebt. De wettelijke gevolgen van inbreuk op de rechten van anderen zouden de hele onderneming grote schade kunnen toebrengen.",
"rcloaderr" => "Meest recente wijzigingen laden",
@@ -584,7 +584,7 @@ Vergeet niet dat net als met andere pagina's op {{SITENAME}} anderen de ge-uploa
"revertimg" => "rev",
"deleteimg" => "verw",
"deleteimgcompletely" => "verw",
-"imghistlegend" => "Verklaring: (cur)= huidige afbeelding, (verw) = verwijder de oude versie, (rev) = breng oude versie terug.<br>
+"imghistlegend" => "Verklaring: (cur)= huidige afbeelding, (verw) = verwijder de oude versie, (rev) = breng oude versie terug.<br />
<i>Klik op de datum om de afbeeldingen die ge-upload zijn op die datum te zien</i>.",
"imagelinks" => "Afbeeldingsverwijzingen",
"linkstoimage" => "Deze afbeelding wordt gebruikt op de volgende pagina's:",
@@ -606,9 +606,9 @@ Er is in totaal $3 maal een pagina bekeken, en $4 maal een pagina bewerkt. Dat g
"maintenancebacklink" => "Terug naar de Onderhoudspagina",
"disambiguations" => "Doorverwijspagina's",
"disambiguationspage" => "{{ns:4}}:Doorverwijspagina",
-"disambiguationstext" => "De onderstaande artikelen verwijzen naar een [[{{ns:4}}:Doorverwijspagina|doorverwijspagina]]. Deze zouden waarschijnlijk direct naar de onderwerpspagina moeten verwijzen. <br>Als doorverwijspagina's worden die pagina's beschouwd waar vanaf $1 naar verwezen wordt.<br>Opmerking: Deze lijst toont alleen pagina's vanuit de hoofdnaamruimte, en dus niet Overlegpagina's, {{ns:4}}:pagina's en dergelijke.",
+"disambiguationstext" => "De onderstaande artikelen verwijzen naar een [[{{ns:4}}:Doorverwijspagina|doorverwijspagina]]. Deze zouden waarschijnlijk direct naar de onderwerpspagina moeten verwijzen. <br />Als doorverwijspagina's worden die pagina's beschouwd waar vanaf $1 naar verwezen wordt.<br />Opmerking: Deze lijst toont alleen pagina's vanuit de hoofdnaamruimte, en dus niet Overlegpagina's, {{ns:4}}:pagina's en dergelijke.",
"doubleredirects" => "Dubbele redirects",
-"doubleredirectstext" => "<b>Let op:</b> Er kunnen in deze lijst redirects staan die er niet in thuishoren. Dat komt over het algemeen doordat er na de #REDIRECT nog andere links op de pagina staan.<br>\nOp elke regel vindt u de eerste redirectpagina, de tweede redirectpagina en de eerste regel van de tweede redirectpagina. Normaal gesproken bevat deze laatste de pagina waar de eerste redirect naartoe zou moeten verwijzen.",
+"doubleredirectstext" => "<b>Let op:</b> Er kunnen in deze lijst redirects staan die er niet in thuishoren. Dat komt over het algemeen doordat er na de #REDIRECT nog andere links op de pagina staan.<br />\nOp elke regel vindt u de eerste redirectpagina, de tweede redirectpagina en de eerste regel van de tweede redirectpagina. Normaal gesproken bevat deze laatste de pagina waar de eerste redirect naartoe zou moeten verwijzen.",
"brokenredirects" => "Gebroken redirects",
"brokenredirectstext" => "De onderstaande redirectpagina's bevatten een redirect naar een niet-bestaande pagina.",
"selflinks" => "Pagina's die naar zichzelf verwijzen",
@@ -782,7 +782,7 @@ op 'Verwijderen' onderaan deze pagina.",
"badipaddress" => "Geen bestaande gebruikersnaam of geldig IP-adres",
"noblockreason" => "U dient een reden op te geven voor het blokkeren van een gebruiker.",
"blockipsuccesssub" => "Blokkering gelukt",
-"blockipsuccesstext" => "\"$1\" is geblokkeerd.<br>
+"blockipsuccesstext" => "\"$1\" is geblokkeerd.<br />
Zie de [[speciaal:Ipblocklist|Lijst van geblokkeerde IP-adressen]].",
"unblockip" => "De-blokkeer gebruiker",
"unblockiptext" => "Gebruik het onderstaande formulier om terug schrijftoegang te geven aan een geblokkeerde gebruiker of IP-adres.",
@@ -839,7 +839,7 @@ te zijn om een pagina te verplaatsen.",
"movepagebtn" => "Verplaats pagina",
"pagemovedsub" => "De verplaatsing was succesvol",
"pagemovedtext" => "Pagina \"[[$1]]\" is verplaatst naar \"[[$2]]\".",
-"articleexists" => "Er is reeds een pagina met deze titel of de titel is ongeldig. <br>Gelieve een andere titel te kiezen.",
+"articleexists" => "Er is reeds een pagina met deze titel of de titel is ongeldig. <br />Gelieve een andere titel te kiezen.",
"talkexists" => "De pagina zelf is verplaatst, maar de Overlegpagina kon niet worden verplaatst, omdat de doeltitel al een niet-lege overlegpagina had. Combineer de overlegpagina's a.u.b. handmatig.",
"movedto" => "verplaatst naar",
"movetalk" => "Verplaats \"Overleg\" pagina ook indien aanwezig.",
diff --git a/languages/LanguageNo.php b/languages/LanguageNo.php
index 6c7919cac96b..0ebcd31ce11c 100644
--- a/languages/LanguageNo.php
+++ b/languages/LanguageNo.php
@@ -121,8 +121,8 @@
"tog-showtoolbar" => "Show edit toolbar",
"tog-editondblclick" => "Rediger sider med dobbeltklikk (JavaScript)",
"tog-editsection"=>"Rediger avsnitt ved hjelp av [rediger]-lenke",
-"tog-editsectiononrightclick"=>"Rediger avsnitt ved å høyreklikke<br> på avsnittsoverskrift (JavaScript)",
-"tog-showtoc"=>"Vis innholdsfortegnelse<br>(for artikler med mer enn tre avsnitt)",
+"tog-editsectiononrightclick"=>"Rediger avsnitt ved å høyreklikke<br /> på avsnittsoverskrift (JavaScript)",
+"tog-showtoc"=>"Vis innholdsfortegnelse<br />(for artikler med mer enn tre avsnitt)",
"tog-rememberpassword" => "Husk passordet til neste gang",
"tog-editwidth" => "Redigeringsboksen har full bredde",
"tog-watchdefault" => "Overvåk nye og endrede artikler",
@@ -319,11 +319,11 @@ Hvis du vil, kan du personliggjøre brukerinnstillingene.",
"yourpasswordagain" => "Gjenta passord",
"newusersonly" => " (kun nye brukere)",
"remembermypassword" => "Husk passordet til neste gang.",
-"loginproblem" => "<b>Du ble ikke logget inn.</b><br>Prøv igjen!",
-"alreadyloggedin" => "<font color=red><b>Bruker $1 er allerede logget inn!</b></font><br>\n",
+"loginproblem" => "<b>Du ble ikke logget inn.</b><br />Prøv igjen!",
+"alreadyloggedin" => "<font color=red><b>Bruker $1 er allerede logget inn!</b></font><br />\n",
"areyounew" => "Hvis du er ny på Wikipedia og vil ha en brukerkonto, skriv inn et brukernavn og et passord, og bekreft passordet ved å skrive det inn en gang til.
-E-postadresse er frivillig; hvis du oppgir det, kan du få passordet tilsendt om du glemmer det.<br>\n",
+E-postadresse er frivillig; hvis du oppgir det, kan du få passordet tilsendt om du glemmer det.<br />\n",
"login" => "Logg inn",
"userlogin" => "Logg inn",
@@ -364,7 +364,7 @@ Logg inn når du har mottatt det nye passordet.",
"showpreview" => "Forhåndsvisning",
"blockedtitle" => "Brukeren er blokkert",
"blockedtext" => "Ditt brukernavn eller din IP-adresse er blokkert av $1.
-Følgende begrunnelse ble gitt:<br>''$2''<p>Du kan kontakte $1 eller en annen
+Følgende begrunnelse ble gitt:<br />''$2''<p>Du kan kontakte $1 eller en annen
[[Wikipedia:Administratorer|administrator]] for å diskutere utestengelsen.",
"newarticle" => "(Ny)",
"newarticletext" =>
@@ -399,7 +399,7 @@ overskrevet.</strong>\n",
Ã¥ betrakte som utgitt under GNU fri dokumentasjonslisens
(se $1 for detaljer).
Hvis du ikke vil ha teksten redigert uten nåde og kopiert etter
-forgodtbefinnende, kan du ikke legge den her.<br>
+forgodtbefinnende, kan du ikke legge den her.<br />
Du lover oss også at du skrev teksten selv eller kopierte fra en
ressurs som ikke er beskyttet av opphavsrett.
@@ -471,8 +471,8 @@ som ikke er indeksert, eller ved å spesifisere mer enn et søkeord (da kun
sider som inneholder alle søkeordene vil bli funnet).",
"powersearch" => "Søk",
"powersearchtext" => "
-Søk i navnerom :<br>
-$1<br>
+Søk i navnerom :<br />
+$1<br />
$2 List opp omdirigeringer Søk etter $3 $9",
"searchdisabled" => "<p>Søkefunksjonen er midlertidig avbrutt på grunn av
for stort press på tjeneren; vi håper vi kan sette den på igjen når vi har
@@ -490,9 +490,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio
name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch
-value=\"{$wgServer}\" checked> {$wgServer} <br>
+value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -672,7 +672,7 @@ og av hvem, og andre ting du vet om filen.",
"deleteimgcompletely" => "slett",
"imghistlegend" => "Forklaring: (nå) = dette er det nåværende bilde,
(slett) = slett denne gamle versjonen, (gjenopprett) = gjenopprett en gammel versjon.
-<br><i>Klikk på en dato for å se bildet som ble lastet opp da</i>.",
+<br /><i>Klikk på en dato for å se bildet som ble lastet opp da</i>.",
"imagelinks" => "Billedlenker",
"linkstoimage" => "De følgende sider har lenker til dette bildet:",
"nolinkstoimage" => "Det er ingen sider som har lenker til dette bildet.",
@@ -706,12 +706,12 @@ hver gang du har rettet en enkelt ting",
"disambiguationspage" => "Wikipedia:Lenker til artikler med flertydige titler",
"disambiguationstext" => "De følgende artikler har lenker til
<i>artikler med flertydige titler</i>. De burde ha lenke til en ikke-flertydig
-tittel i stedet.<br>En artikkel blir behandlet som flertydig hvis den har
-lenker fra $1.<br>Lenker fra andre navnerom er <i>ikke</i> listet her.",
+tittel i stedet.<br />En artikkel blir behandlet som flertydig hvis den har
+lenker fra $1.<br />Lenker fra andre navnerom er <i>ikke</i> listet her.",
"doubleredirects" => "Dobbelte omdirigeringer",
"doubleredirectstext" => "<b>NB:</b> Denne listen kan inneholde gale
resultater. Det er som regel fordi siden inneholder ekstra tekst under den
-første #REDIRECT.<br>\nHver linje inneholder lenker til den første og den
+første #REDIRECT.<br />\nHver linje inneholder lenker til den første og den
anden omdirigeringen, og den første linjen fra den andre omdirigeringsteksten.
Det gir som regel den \"riktige\" målartikkelen, som den første omdirigeringen
skulle ha pekt på.",
@@ -948,7 +948,7 @@ sider som har vært utsatt for vandalisme).",
"noblockreason" => "Du må angi en begrunnelse for denne blokkeringen.",
"blockipsuccesssub" => "Blokkering utført",
"blockipsuccesstext" => "IP-adressen \"$1\" er blokkert.
-<br>Se [[Spesial:Ipblocklist|IP-blokkeringslisten]] for alle blokkeringer.",
+<br />Se [[Spesial:Ipblocklist|IP-blokkeringslisten]] for alle blokkeringer.",
"unblockip" => "Opphev blokkeringen av IP-adresse",
"unblockiptext" => "Bruk skjemaet nedenunder for å gjenopprette skriveadgangen
for en tidligere blokkert IP-adresse.",
@@ -982,7 +982,7 @@ Bekreft at du har til hensikt å gjøre dette.",
"lockdbsuccesssub" => "Databasen er nå låst",
"unlockdbsuccesssub" => "Databasen er nå låst opp",
"lockdbsuccesstext" => "Wikipedia-databasen er låst.
-<br>Husk å fjerne låsen når du er ferdig med vedlikeholdet.",
+<br />Husk å fjerne låsen når du er ferdig med vedlikeholdet.",
"unlockdbsuccesstext" => "Wikipedia-databasen er låst opp.",
# SQL query
diff --git a/languages/LanguageOc.php b/languages/LanguageOc.php
index d4fe310003c9..05499afcc35b 100644
--- a/languages/LanguageOc.php
+++ b/languages/LanguageOc.php
@@ -108,18 +108,18 @@ require_once( "LanguageUtf8.php" );
"tog-highlightbroken" => "Ligams sus los subjèctes non creats aparéisson en rog",
"tog-justify" => "Paragrafes justificats",
"tog-hideminor" => "Amagar las <i>Cambiadas recentas</i> minoras",
-"tog-usenewrc" => "Cambiadas recentas melhorats<br> (non per tots los navigaires)",
+"tog-usenewrc" => "Cambiadas recentas melhorats<br /> (non per tots los navigaires)",
"tog-numberheadings" => "Numerotacion automatica de los títols",
"tog-showtoolbar" => "Show edit toolbar",
"tog-editondblclick" => "Editar paginas amb un doble clic (JavaScript)",
"tog-editsection" => "Éditer une section via les liens [éditer]", //Looxix (Enable section editing via [edit] links)
-"tog-editsectiononrightclick" => "Éditer une section en cliquant à droite<br> sur le titre de la section", // Looxix
-"tog-showtoc" => "Afficher la table des matières<br> (pour les articles ayant plus de 3 sections)",
+"tog-editsectiononrightclick" => "Éditer une section en cliquant à droite<br /> sur le titre de la section", // Looxix
+"tog-showtoc" => "Afficher la table des matières<br /> (pour les articles ayant plus de 3 sections)",
"tog-rememberpassword" => "Se souvenir de mon mot de passe (cookie)",
"tog-editwidth" => "La fenêtre d'édition s'affiche en pleine largeur",
"tog-watchdefault" => "Suivre les articles que je crée ou modifie",
-"tog-minordefault" => "Mes modifications sont considérées<br> comme mineures par défaut",
-"tog-previewontop" => "La prévisualisation s'affiche au<br> dessus de la boite de rédaction",
+"tog-minordefault" => "Mes modifications sont considérées<br /> comme mineures par défaut",
+"tog-previewontop" => "La prévisualisation s'affiche au<br /> dessus de la boite de rédaction",
"tog-nocache" => "Désactiver le cache des pages", // Looxix "Disable page caching"
# Dates
@@ -303,8 +303,8 @@ N'oubliez pas de personnaliser votre Wikipédia en consultant la page Préféren
"yourpasswordagain" => "Entrez à nouveau votre mot de passe",
"newusersonly" => " (nouveaux utilisateurs uniquement)",
"remembermypassword" => "Se souvenir de mon mot de passe (cookie)",
-"loginproblem" => "<b>Problème d'identification.</b><br>Essayez à nouveau !",
-"alreadyloggedin" => "<font color=red><b>Utilisateur $1, vous êtes déjà identifié !</b></font><br>\n",
+"loginproblem" => "<b>Problème d'identification.</b><br />Essayez à nouveau !",
+"alreadyloggedin" => "<font color=red><b>Utilisateur $1, vous êtes déjà identifié !</b></font><br />\n",
"login" => "Identification",
"userlogin" => "Identification",
@@ -343,7 +343,7 @@ Veuillez vous identifier dès que vous l'aurez reçu.",
"preview" => "Prévisualiser",
"showpreview" => "Prévisualisation",
"blockedtitle" => "Utilisateur bloqué",
-"blockedtext" => "Votre compte utilisateur ou votre adresse IP ont été bloqués par $1 pour la raison suivante :<br>$2<p> Vous pouvez contacter l'administrateur pour en discuter.",
+"blockedtext" => "Votre compte utilisateur ou votre adresse IP ont été bloqués par $1 pour la raison suivante :<br />$2<p> Vous pouvez contacter l'administrateur pour en discuter.",
"whitelistedittitle" => "Login requis pour rédiger", // Looxix "Login required to edit",
"whitelistedittext" => "Vous devez être [[Special:Userlogin|connecté]] pour pouvoir rédiger", // Looxix
"whitelistreadtitle" => "Login requis pour lire", // Looxix "Login required to read",
@@ -435,8 +435,8 @@ qui ne sont pas indexés, ou à l'emploi de plusieurs termes de recherche (seule
contenant tous les termes apparaissent dans les résultats).",
"powersearch" => "Recherche",
"powersearchtext" => "
-Rechercher dans les espaces :<br>
-$1<br>
+Rechercher dans les espaces :<br />
+$1<br />
$2 Inclure les page de redirections Rechercher $3 $9",
"blanknamespace" => "(Principal)", // FIXME FvdP: trad de "(Main)"
@@ -481,7 +481,7 @@ Voir [[Wikipédia:Aide pour les préférences]] pour les explications concernant
"timezoneoffset" => "Décalage horaire",
"servertime" => "Heure du serveur", //Looxix (Server time is now)
"guesstimezone" => "Utiliser la valeur du navigateur", //Looxix (Fill in from browser)
-"emailflag" => "Ne pas recevoir de courrier électronique<br> des autres utilisateurs",
+"emailflag" => "Ne pas recevoir de courrier électronique<br /> des autres utilisateurs",
"defaultns" => "Par défaut, rechercher dans ces espaces :", //Looxix (Search in these namespaces by default)
# Recent changes
@@ -530,7 +530,7 @@ pour copier des fichiers sur le serveur.",
"uploadfile" => "Copier un fichier",
"uploaderror" => "Erreur",
"uploadtext" => "'''STOP !''' Avant de copier votre fichier sur le serveur,
-prenez connaissance des [[Project:règles d'utilisation des images|règles d'utilisation des images]] de Wikipédia et assurez-vous que vous les respectez.<br>N'oubliez pas de remplir la [[Project:Page de description d'une image|page de description de l'image]] quand celle-ci sera sur le serveur.
+prenez connaissance des [[Project:règles d'utilisation des images|règles d'utilisation des images]] de Wikipédia et assurez-vous que vous les respectez.<br />N'oubliez pas de remplir la [[Project:Page de description d'une image|page de description de l'image]] quand celle-ci sera sur le serveur.
Pour voir les images déjà placées sur le serveur ou pour effectuer une recherche parmi celles-ci,
allez à la [[Special:Imagelist|liste des images]].
@@ -599,7 +599,7 @@ Suivez ce lien: ($2) pour accéder à la page de description, et donner des info
"deleteimgcompletely" => "suppr",
"imghistlegend" => "Légende: (actu) = ceci est l'image actuelle, (suppr) = supprimer
cette ancienne version, (rétab) = rétablir cette ancienne version.
-<br><i>Cliquez sur la date pour voir l'image copiée à cette date</i>.",
+<br /><i>Cliquez sur la date pour voir l'image copiée à cette date</i>.",
"imagelinks" => "Liens vers l'image",
"linkstoimage" => "Les pages ci-dessous comportent un lien vers cette image:",
"nolinkstoimage" => "Aucune page ne comporte de lien vers cette image.",
@@ -628,9 +628,9 @@ Parmi ceux-ci, <b>$2</b> ont le statut d'administrateur (voir $3).",
"maintenancebacklink" => "Retour à la page de maintenance",
"disambiguations" => "Pages d'homonymie",
"disambiguationspage" => "Wikipédia:Liens_aux_pages_d'homonymie",
-"disambiguationstext" => "Les articles suivants sont liés à une <i>page d'homonymie</i>. Or, ils devraient être liés au sujet.<br>Une page est considérée comme page d'homonymie si elle est liée à partir de $1.<br>Les liens à partir d'autres <i>espaces</i> ne sont pas pris en compte.",
+"disambiguationstext" => "Les articles suivants sont liés à une <i>page d'homonymie</i>. Or, ils devraient être liés au sujet.<br />Une page est considérée comme page d'homonymie si elle est liée à partir de $1.<br />Les liens à partir d'autres <i>espaces</i> ne sont pas pris en compte.",
"doubleredirects" => "Double redirection",
-"doubleredirectstext" => "<b>Attention:</b> cette liste peut contenir des \"faux positifs\". Dans ce cas, c'est probablement la page du premier #REDIRECT contient aussi du texte.<br>Chaque ligne contient les liens à la 1re et 2e page de redirection, ainsi que la première ligne de cette dernière, qui donne normalement la \"vraie\" destination. Le premier #REDIRECT devrait lier vers cette destination.",
+"doubleredirectstext" => "<b>Attention:</b> cette liste peut contenir des \"faux positifs\". Dans ce cas, c'est probablement la page du premier #REDIRECT contient aussi du texte.<br />Chaque ligne contient les liens à la 1re et 2e page de redirection, ainsi que la première ligne de cette dernière, qui donne normalement la \"vraie\" destination. Le premier #REDIRECT devrait lier vers cette destination.",
"brokenredirects" => "Redirections cassées",
"brokenredirectstext" => "Ces redirections mènent a une page qui n'existe pas.",
"selflinks" => "Page avec un lien circulaire",
@@ -824,7 +824,7 @@ Donnez ci-dessous une raison précise (par exemple en indiquant les pages qui on
"noblockreason" => "Vous devez indiquer le motif du blocage.",
"blockipsuccesssub" => "Blocage réussi",
"blockipsuccesstext" => "L'adresse IP \"$1\" a été bloquée.
-<br>Vous pouvez consulter sur cette [[Special:Ipblocklist|page]] la liste des adresses IP bloquées.",
+<br />Vous pouvez consulter sur cette [[Special:Ipblocklist|page]] la liste des adresses IP bloquées.",
"unblockip" => "Débloquer une adresse IP",
"unblockiptext" => "Utilisez le formulaire ci-dessous pour rétablir l'accès en écriture
à partir d'une adresse IP précédemment bloquée.",
@@ -856,7 +856,7 @@ Veuillez confirmer que c'est bien là ce que vous voulez faire.",
"unlockdbsuccesssub" => "Base déverrouillée.",
"lockdbsuccesstext" => "La base de données de Wikipédia est verrouillée.
-<br>N'oubliez pas de la déverrouiller lorsque vous aurez terminé votre opération de maintenance.",
+<br />N'oubliez pas de la déverrouiller lorsque vous aurez terminé votre opération de maintenance.",
"unlockdbsuccesstext" => "La base de données de Wikipédia est déverrouillée.",
# SQL query
@@ -879,7 +879,7 @@ Wikipédia.",
"movepage" => "Déplacer un article",
"movepagetext" => "Utilisez le formulaire ci-dessous pour renommer un article, en déplaçant toutes ses versions antérieures vers le nouveau nom.
Le titre précédent deviendra une page de redirection vers le nouveau titre.
-Les liens vers l'ancien titre ne seront pas modifiés et la page discussion, si elle existe, ne sera pas déplacée.<br>
+Les liens vers l'ancien titre ne seront pas modifiés et la page discussion, si elle existe, ne sera pas déplacée.<br />
<b>ATTENTION !</b>
Il peut s'agir d'un changement radical et inattendu pour un article souvent consulté;
assurez-vous que vous en comprenez bien les conséquences avant de procéder.",
diff --git a/languages/LanguagePl.php b/languages/LanguagePl.php
index d1a9aeb4741f..1eef68e6a861 100644
--- a/languages/LanguagePl.php
+++ b/languages/LanguagePl.php
@@ -136,7 +136,7 @@ default:
"tog-showtoolbar" => "Show edit toolbar",
"tog-editondblclick" => "Podwójne kliknięcie rozpoczyna edycję (JavaScript)",
"tog-editsection" => "Możliwość edycji poszczególnych sekcji strony",
-"tog-editsectiononrightclick" => "Kliknięcie prawym klawiszem na tytule sekcji<br>rozpoczyna jej edycję (JavaScript)",
+"tog-editsectiononrightclick" => "Kliknięcie prawym klawiszem na tytule sekcji<br />rozpoczyna jej edycję (JavaScript)",
"tog-showtoc" => "Spis treści (na stronach zawierających więcej niż 3 nagłówki)",
"tog-rememberpassword" => "Pamiętaj hasło między sesjami",
"tog-editwidth" => "Obszar edycji o pełnej szerokości",
@@ -356,8 +356,8 @@ Nie zapomnij dostosować <i>preferencji</i>.",
"yourpasswordagain" => "Powtórz hasło",
"newusersonly" => " (tylko nowi użytkownicy)",
"remembermypassword" => "Pamiętaj moje hasło między sesjami.",
-"loginproblem" => "<b>Są problemy z Twoim logowaniem.</b><br>Spróbuj ponownie!",
-"alreadyloggedin" => "<font color=red><b>$1, jesteś już zalogowany!</b></font><br>\n",
+"loginproblem" => "<b>Są problemy z Twoim logowaniem.</b><br />Spróbuj ponownie!",
+"alreadyloggedin" => "<font color=red><b>$1, jesteś już zalogowany!</b></font><br />\n",
"login" => "Zaloguj mnie",
"userlogin" => "Logowanie",
@@ -398,7 +398,7 @@ Po otrzymaniu go zaloguj siÄ™ ponownie.",
"showpreview" => "PodglÄ…d",
"blockedtitle" => "Użytkownik jest zablokowany",
"blockedtext" => "Twoje konto lub adres IP zostały zablokowane przez $1.
-Podany powód to:<br>$2.<p>W celu wyjaśnienia sprawy zablokowania możesz się skontaktować z $1 lub innym
+Podany powód to:<br />$2.<p>W celu wyjaśnienia sprawy zablokowania możesz się skontaktować z $1 lub innym
[[{{ns:4}}:Administratorzy|administratorem]].",
"newarticle" => "(Nowy)",
"newarticletext" => "Nie ma jeszcze artykułu o tym tytule. W poniższym polu można wpisać pierwszy jego fragment. Jeśli nie to było Twoim zamiarem, wciśnij po prostu ''Wstecz''.",
@@ -432,9 +432,9 @@ Jeśli zapiszesz ją wszystkie późniejsze zmiany zostaną skasowane.</strong><
"yourdiff" => "Różnice",
"copyrightwarning" => "Proszę pamiętać o tym, że przyjmuje się, iż wszelki
wkład do Wikipedii jest udostępniany na zasadach <i>GNU Free Documentation License</i>
-(szczegóły w $1). <br>Jeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go w Wikipedii. Niniejszym jednocześnie oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na zasadach <i>public domain</i> albo
+(szczegóły w $1). <br />Jeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go w Wikipedii. Niniejszym jednocześnie oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na zasadach <i>public domain</i> albo
licencji <i>GNU Free Documentation License</i> lub kompatybilnej.
-<br><strong>PROSZĘ NIE UÅ»YWAĆ BEZ POZWOLENIA MATERIAÅÓW OBJĘTYCH PRAWEM
+<br /><strong>PROSZĘ NIE UÅ»YWAĆ BEZ POZWOLENIA MATERIAÅÓW OBJĘTYCH PRAWEM
AUTORSKIM!</strong>",
"longpagewarning" => "UWAGA: Ta strona ma $1 kilobajt-y/-ów; w przypadku niektórych
przeglądarek mogą wystąpić problemy w edycji stron mających więcej niż 32 kilobajty.
@@ -503,8 +503,8 @@ zapytaniu więcej niż jednego słowa (na liście odnalezionych stron znajdą si
tylko te, które zawierają wszystkie podane słowa).",
"powersearch" => "Szukaj",
"powersearchtext" => "
-Szukaj w przestrzeniach nazw :<br>
-$1<br>
+Szukaj w przestrzeniach nazw :<br />
+$1<br />
$2 Pokaż przekierowania Szukany tekst $3 $9",
"searchdisabled" => "<p>Ze względu na duże obciążenie serwera wyszukiwanie
w treści artykułów zostało czasowo wyłączone; mamy nadzieję, że
@@ -523,9 +523,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio
name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch
-value=\"{$wgServer}\" checked> {$wgServer} <br>
+value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -705,7 +705,7 @@ i cokolwiek co wiesz o pliku, a wydaje Ci się ważne.",
"deleteimgcompletely" => "usuń",
"imghistlegend" => "Legenda: (bież) = to jest obecny plik, (usuń) = usuń
tę starszą wersję, (przywróć) = przywróć tę starszą wersję.
-<br><i>Kliknij na datę aby zobaczyć jakie pliki przesłano tego dnia</i>.",
+<br /><i>Kliknij na datę aby zobaczyć jakie pliki przesłano tego dnia</i>.",
"imagelinks" => "Linki do pliku",
"linkstoimage" => "Oto strony odwołujące się do tego pliku:",
"nolinkstoimage" => "Żadna strona nie odwołuje się do tego pliku.",
@@ -737,13 +737,13 @@ więc, by ich nie nadużywać.",
"disambiguationspage" => "{{ns:4}}:Strony_ujednoznaczniajÄ…ce",
"disambiguationstext" => "Poniższe artykuły odwołują się do <i>stron
ujednoznaczniających</i>, a powinny odwoływać się bezpośrednio do hasła
-związanego z treścią artykułu.<br>Strona uznawana jest za ujednoznaczniającą
-jeśli odwołuje się do niej $1.<br>Linki z innych przestrzeni nazw <i>nie</i>
+związanego z treścią artykułu.<br />Strona uznawana jest za ujednoznaczniającą
+jeśli odwołuje się do niej $1.<br />Linki z innych przestrzeni nazw <i>nie</i>
zostały tu uwzględnione.",
"doubleredirects" => "Podwójne przekierowania",
"doubleredirectstext" => "<b>Uwaga:</b> Na tej liście mogą znajdować się
przekierowania pozorne. Oznacza to, że poniżej pierwszej linii artykułu,
-zawierającej \"#REDIRECT ...\", może znajdować się dodatkowy tekst.<br>Każdy
+zawierającej \"#REDIRECT ...\", może znajdować się dodatkowy tekst.<br />Każdy
wiersz listy zawiera odwołania do pierwszego i drugiego przekierowania oraz
pierwszą linię tekstu drugiego przekierowania. Umożliwia to w większości
przypadków odnalezienie właściwego artykułu, do którego powinno się
@@ -919,7 +919,7 @@ Autorem ostatniej zmiany jest teraz [[Wikipedysta:$3|$3]] ([[Dyskusja_wikipedyst
"undelete" => "Odtwórz skasowaną stronę",
"undeletepage" => "Odtwarzanie skasowanych stron",
"undeletepagetext" => "Poniższe strony zostały skasowane, ale ich kopia wciąż
-znajduje się w archiwum.<br><b>Uwaga:</b> archiwum co jakiś czas także jest kasowane!",
+znajduje się w archiwum.<br /><b>Uwaga:</b> archiwum co jakiś czas także jest kasowane!",
"undeletearticle" => "Odtwórz skasowaną stronę",
"undeleterevisions" => "Liczba zarchiwizowanych wersji: $1",
"undeletehistory" => "Odtworzenie strony spowoduje przywrócenie także jej
@@ -972,7 +972,7 @@ siÄ™ wandalizmu).",
"noblockreason" => "Musisz podać powód blokady.",
"blockipsuccesssub" => "Zablokowanie powiodło się",
"blockipsuccesstext" => "Adres IP \"$1\" został zablokowany.
-<br>Przejdź do [[Specjalna:Ipblocklist|Listy zablokowanych adresów IP]] by przejrzeć blokady.",
+<br />Przejdź do [[Specjalna:Ipblocklist|Listy zablokowanych adresów IP]] by przejrzeć blokady.",
"unblockip" => "Odblokuj adres IP",
"unblockiptext" => "Użyj poniższego formularza by przywrócić prawa zapisu
dla poprzednio zablokowanego adresu IP.",
@@ -1005,7 +1005,7 @@ Potwierdź, proszę, że to jest zgodne z Twoimi zamiarami.",
"lockdbsuccesssub" => "Baza danych została pomyślnie zablokowana",
"unlockdbsuccesssub" => "Blokada bazy danych usunięta",
"lockdbsuccesstext" => "Baza danych Wikipedii została zablokowana.
-<br>Pamiętaj usunąć blokadę po zakończeniu spraw administracyjnych.",
+<br />Pamiętaj usunąć blokadę po zakończeniu spraw administracyjnych.",
"unlockdbsuccesstext" => "Baza danych Wikipedii została odblokowana.",
# SQL query
diff --git a/languages/LanguagePs.php b/languages/LanguagePs.php
new file mode 100644
index 000000000000..bf8ec6cd16b3
--- /dev/null
+++ b/languages/LanguagePs.php
@@ -0,0 +1,22 @@
+<?php
+
+# Stub for Pashto
+
+require_once( "LanguageUtf8.php" );
+
+class LanguagePs extends LanguageUtf8 {
+
+ function getDefaultUserOptions() {
+ $opt = Language::getDefaultUserOptions();
+ $opt["quickbar"] = 2; # Right-to-left
+ $opt["underline"] = 0; # Underline is hard to read in Arabic script
+ return $opt;
+ }
+
+ # For right-to-left language support
+ function isRTL() {
+ return true;
+ }
+}
+
+?>
diff --git a/languages/LanguagePt.php b/languages/LanguagePt.php
index 45e67140d6d5..ee453956360a 100644
--- a/languages/LanguagePt.php
+++ b/languages/LanguagePt.php
@@ -140,8 +140,8 @@
"tog-showtoolbar" => "Mostrar barra de edição",
"tog-editondblclick" => "Editar páginas quando houver clique duplo(JavaScript)",
"tog-editsection"=>"Habilitar seção de edição via links [edit]",
-"tog-editsectiononrightclick"=>"Habilitar seção de edição por clique <br> com o botão direito no título da seção (JavaScript)",
-"tog-showtoc"=>"Mostrar Tabela de Conteúdos<br>(para artigos com mais de 3 cabeçalhos)",
+"tog-editsectiononrightclick"=>"Habilitar seção de edição por clique <br /> com o botão direito no título da seção (JavaScript)",
+"tog-showtoc"=>"Mostrar Tabela de Conteúdos<br />(para artigos com mais de 3 cabeçalhos)",
"tog-rememberpassword" => "Lembra senha entre sessões",
"tog-editwidth" => "Caixa de edição com largura completa",
"tog-watchdefault" => "Observa artigos novos e modificados",
@@ -342,10 +342,10 @@ Não se esqueça de personalizar suas preferências na {{SITENAME}}.",
"yourpasswordagain" => "Redigite sua senha",
"newusersonly" => " (somente novos usuários)",
"remembermypassword" => "Lembrar de minha senha em outras sessões.",
-"loginproblem" => "<b>Houve um problema com a sua autenticação.</b><br>Tente novamente!",
-"alreadyloggedin" => "<font color=red><b>Utilizador $1, você já está autenticado!</b></font><br>\n",
+"loginproblem" => "<b>Houve um problema com a sua autenticação.</b><br />Tente novamente!",
+"alreadyloggedin" => "<font color=red><b>Utilizador $1, você já está autenticado!</b></font><br />\n",
-"areyounew" => "Se você é novo(a) na {{SITENAME}} e quer fazer uma conta de utilizador, entre com um nome de utilizador e depois digite e re-digite uma senha. Seu e-mail é opcional - se você perder a sua senha, você pode requisitar para que ela seja enviada para o endereço que você informou.<br>\n",
+"areyounew" => "Se você é novo(a) na {{SITENAME}} e quer fazer uma conta de utilizador, entre com um nome de utilizador e depois digite e re-digite uma senha. Seu e-mail é opcional - se você perder a sua senha, você pode requisitar para que ela seja enviada para o endereço que você informou.<br />\n",
"login" => "Entrar",
"userlogin" => "Entrar",
@@ -388,7 +388,7 @@ Por favor, reconecte-se ao recebê-lo.",
"showpreview" => "Mostrar Pré-Visualização",
"blockedtitle" => "Usuário está bloqueado",
"blockedtext" => "Seu nome de usuário ou numero de IP foi bloqueado por $1.
-O motivo é:<br>''$2''<p>Você pode contactar $1 ou outro
+O motivo é:<br />''$2''<p>Você pode contactar $1 ou outro
[[{{ns:4}}:administradores|administrador]] para discutir sobre o bloqueio.",
"whitelistedittitle" => "Login necessário para edição",
"whitelistedittext" => "Você precisa se [[Especial:Userlogin|logar]] para editar artigos.",
@@ -427,7 +427,7 @@ Se você salvá-lo, todas as mudanças feitas a partir desta revisão serão per
"yourdiff" => "Diferenças",
"copyrightwarning" => "Por favor note que todas as contribuições � {{SITENAME}} são consideradas lançadas sobre a GNU Free Documentation License
(veja $1 para detalhes).
-Se você não quer que seu texto esteja sobre estes termos, então não os envie.<br>
+Se você não quer que seu texto esteja sobre estes termos, então não os envie.<br />
Você também promete que está nos enviando um artigo escrito por você mesmo, ou extraindo de uma fonte de domínio público similar.
<strong>NÃO ENVIE TRABALHO SOB COPYRIGHT SEM PERMISSÃO!</strong>",
"longpagewarning" => "CUIDADO: Esta página tem $1 kilobytes ; alguns browsers podem ter problemas ao editar páginas maiores que 32kb.
@@ -486,8 +486,8 @@ e $3 artigos com o texto procurado.",
que não são indexadas, ou pela especificação de mais de um termo (somente as páginas contendo todos os termos aparecerão nos resultados).",
"powersearch" => "Pesquisa",
"powersearchtext" => "
-Procurar nos namespaces :<br>
-$1<br>
+Procurar nos namespaces :<br />
+$1<br />
$2 Lista redireciona &nbsp; Procura por $3 $9",
"blanknamespace" => "(Principal)",
@@ -653,7 +653,7 @@ Por favor, siga este link : ($2) para ir � página de descrição e preencha-
"deleteimgcompletely" => "del",
"imghistlegend" => "Legenda: (cur) = esta é a imagem atual, (del) = deletar
esta versão antiga, (rev) = reverter para esta versão antiga.
-<br><i>Clique em data para ver das imagens carregadas nesta data</i>.",
+<br /><i>Clique em data para ver das imagens carregadas nesta data</i>.",
"imagelinks" => "Links das imagens",
"linkstoimage" => "As páginas seguintes apontam para esta imagem:",
"nolinkstoimage" => "Nenhuma página aponta para esta imagem.",
@@ -679,9 +679,9 @@ Destes, <b>$2</b> são administradores (veja $3).",
"maintenancebacklink" => "Voltar para a página de Manutenção",
"disambiguations" => "Páginas de desambiguamento",
"disambiguationspage" => "{{ns:4}}:Links_para_desambiguar_páginas",
-"disambiguationstext" => "Os artigos a seguir apontam para uma <i>página de desambiguamento</i>. Ao invés disso, eles deveriam apontar para um tópico apropriado.<br> Uma página é tratada como disambiguamento se ela é por $1.<br>Links de outros namespaces <i>não</i> estão listados aqui.",
+"disambiguationstext" => "Os artigos a seguir apontam para uma <i>página de desambiguamento</i>. Ao invés disso, eles deveriam apontar para um tópico apropriado.<br /> Uma página é tratada como disambiguamento se ela é por $1.<br />Links de outros namespaces <i>não</i> estão listados aqui.",
"doubleredirects" => "Double Redirects",
-"doubleredirectstext" => "<b>Atenção:</b> Esta lista pode conter positivos falsos. O que usualmente significa que há texto adicional com links depois do primeiro #REDIRECT.<br>\nCada linha contem links para o primeiro e segundo redirecionamento, bem como a primeira linha do segundo texto redirecionado , geralmente dando o artigo alvo \"real\" , para onde o primeiro redirecionamento deveria apontar.",
+"doubleredirectstext" => "<b>Atenção:</b> Esta lista pode conter positivos falsos. O que usualmente significa que há texto adicional com links depois do primeiro #REDIRECT.<br />\nCada linha contem links para o primeiro e segundo redirecionamento, bem como a primeira linha do segundo texto redirecionado , geralmente dando o artigo alvo \"real\" , para onde o primeiro redirecionamento deveria apontar.",
"brokenredirects" => "Redirecionamentos Quebrados",
"brokenredirectstext" => "Os seguintes redirecionamentos apontam para um artigo inexistente.",
"selflinks" => "Páginas com links próprios",
@@ -869,7 +869,7 @@ Preencha com um motivo específico (por exemplo, citando páginas que sofreram v
"noblockreason" => "Você deve colocar um motivo.",
"blockipsuccesssub" => "Bloqueio bem sucedido",
"blockipsuccesstext" => "O endereço de IP \"$1\" Foi bloqueado.
-<br>Veja [[Special:Ipblocklist|Lista de IP's bloqueados]] para rever os bloqueios.",
+<br />Veja [[Special:Ipblocklist|Lista de IP's bloqueados]] para rever os bloqueios.",
"unblockip" => "Desbloquear endereço de IP",
"unblockiptext" => "Utilize o formulário a seguir para restaurar o acesso a escrita para um endereço de IP previamente bloqueado.",
"ipusubmit" => "Desbloquear este endereço",
@@ -895,7 +895,7 @@ Por favor confirme que você realmente pretende fazer isto, e que você vai desb
"lockdbsuccesssub" => "Tranca bem sucedida",
"unlockdbsuccesssub" => "Destranca bem sucedida",
"lockdbsuccesstext" => "O banco de dados da {{SITENAME}} foi trancado.
-<br>Lembre-se de remover a tranca após a manutenção.",
+<br />Lembre-se de remover a tranca após a manutenção.",
"unlockdbsuccesstext" => "O bando de dados da {{SITENAME}} foi destrancado.",
# SQL query
diff --git a/languages/LanguageRo.php b/languages/LanguageRo.php
index c6fad1516f2d..c408f3b31e7f 100644
--- a/languages/LanguageRo.php
+++ b/languages/LanguageRo.php
@@ -157,19 +157,19 @@ require_once("LanguageUtf8.php");
"tog-highlightbroken" => "Formatează legăturile inexistente <a href=\"\" class=\"new\">în felul acesta</a> (alternativa este aşa<a href=\"\" class=\"internal\">?</a>).",
"tog-justify" => "Aliniază paragrafele",
"tog-hideminor" => "Ascunde schimbările minore în pagina de schimbări recente",
-"tog-usenewrc" => "Îmbunătăţeşte structura paginii de schimbări minore<br>(nu merge în toate browserele)",
+"tog-usenewrc" => "Îmbunătăţeşte structura paginii de schimbări minore<br />(nu merge în toate browserele)",
"tog-numberheadings" => "Auto-numerotează titlurile",
"tog-showtoolbar" => "Show edit toolbar",
"tog-editondblclick" => "Editează paginile cu dublu clic (JavaScript)",
"tog-editsection" => "Permite editarea secţiunilor folosind legături [editează] pe pagină",
-"tog-editsectiononrightclick"=>"Permite editarea secţiunilor la apăsarea<br>butonului din dreapta al mouse-ului pe titlu<br>(necesită JavaScript)",
-"tog-showtoc" => "Arată cuprinsul paginilor<br>(pentru pagini cu cel puţin trei titluri)",
+"tog-editsectiononrightclick"=>"Permite editarea secţiunilor la apăsarea<br />butonului din dreapta al mouse-ului pe titlu<br />(necesită JavaScript)",
+"tog-showtoc" => "Arată cuprinsul paginilor<br />(pentru pagini cu cel puţin trei titluri)",
"tog-rememberpassword" => "Păstrează parola între sesiuni",
"tog-editwidth" => "Lăţime maximă pentru caseta de editare",
"tog-watchdefault" => "Urmăreşte articolele pe care le creezi sau le editezi",
"tog-minordefault" => "Marchează implicit toate editările ca minore",
"tog-previewontop" => "Arată pagina după caseta de editare, nu înainte",
-"tog-nocache" => "Nu folosi cache (conexiunea merge mai greu,<br>dar sunt afişate toate modificările paginilor)",
+"tog-nocache" => "Nu folosi cache (conexiunea merge mai greu,<br />dar sunt afişate toate modificările paginilor)",
# Dates
#
@@ -335,8 +335,8 @@ Administratorul care a blocat-o a oferit această explicaţie:
"badtitletext" => "Titlul căutat a fost invalid, gol sau o legătură invalidă inter-linguală sau inter-wiki.",
"perfdisabled" => "Ne pare rău! Această funcţionalitate a fost dezactivată temporar în timpul orelor de vârf din motive de performanţă. Vă rugăm să reveniţi la altă oră şi încercaţi din nou.", // Didn't provide any off-peak hours because they may differ on the Romanian Wikipedia.
"perfdisabledsub" => "Iată o copie salvată de la $1:",
-"wrong_wfQuery_params" => "Număr incorect de parametri pentru wfQuery()<br>
-Funcţia: $1<br>
+"wrong_wfQuery_params" => "Număr incorect de parametri pentru wfQuery()<br />
+Funcţia: $1<br />
Query: $2
",
"viewsource" => "Vezi sursa",
@@ -359,8 +359,8 @@ Nu uitaţi să vă personalizaţi preferinţele în Wikipedia.",
"yourpasswordagain" => "Repetaţi parola",
"newusersonly" => " (doar pentru utilizatori noi)",
"remembermypassword" => "Reţine-mi parola între sesiuni.",
-"loginproblem" => "<b>A fost o problemă cu autentificarea Dvs.</b><br>Încercaţi din nou!",
-"alreadyloggedin" => "<font color=red><b>Sunteţi deja autentificat ca $1!</b></font><br>\n",
+"loginproblem" => "<b>A fost o problemă cu autentificarea Dvs.</b><br />Încercaţi din nou!",
+"alreadyloggedin" => "<font color=red><b>Sunteţi deja autentificat ca $1!</b></font><br />\n",
"notloggedin" => "Nu sunteţi autentificat",
@@ -407,7 +407,7 @@ Vă rugăm să vă autentificaţi pe Wikipedia după ce o primiţi.",
"showpreview" => "Arată previzualizare",
"blockedtitle" => "Utilizatorul este blocat",
"blockedtext" => "Utilizatorul sau parola Dvs. au fost blocate de $1.
-Motivul oferit pentru blocare a fost:<br>''$2''<p>Puteţi contacta pe $1 sau pe unul dintre ceilalţi
+Motivul oferit pentru blocare a fost:<br />''$2''<p>Puteţi contacta pe $1 sau pe unul dintre ceilalţi
[[Wikipedia:administratori|administratori]] pentru a discuta această blocare.",
"whitelistedittitle" => "Este necesară autentificarea pentru a edita",
"whitelistedittext" => "Trebuie să vă [[Special:Userlogin|autentificaţi]] pentru a edita articole.",
@@ -442,9 +442,9 @@ Va trebui să editaţi manual caseta de sus pentru a reflecta modificările pe c
"storedversion" => "Versiunea curentă",
"editingold" => "<strong>ATENŢIE! Editaţi o variantă mai veche a acestei pagini! Orice modificări care s-au făcut de la această versiune şi până la cea curentă se vor pierde!</strong>\n",
"yourdiff" => "Diferenţe",
-"copyrightwarning" => "Ajutor pentru editare, caractere speciale: ă â î ş ţ Ă Â Î Ş Ţ<br><br>Reţineţi că toate contribuţiile la Wikipedia sunt considerate ca respectând licenţa GNU Free Documentation License
+"copyrightwarning" => "Ajutor pentru editare, caractere speciale: ă â î ş ţ Ă Â Î Ş Ţ<br /><br />Reţineţi că toate contribuţiile la Wikipedia sunt considerate ca respectând licenţa GNU Free Documentation License
(vezi $1 pentru detalii).
-Dacă nu doriţi ca ceea ce scrieţi să fie editat fără milă şi redistribuit în voie, atunci nu trimiteţi materialele respective aici.<br>
+Dacă nu doriţi ca ceea ce scrieţi să fie editat fără milă şi redistribuit în voie, atunci nu trimiteţi materialele respective aici.<br />
De asemenea, trimiţând aceste materiale aici vă angajaţi că le-aţi scris Dvs. sau că sunt copiate dintr-o sursă care permite includerea materialelor sub această licenţă.
<strong>NU TRIMITEÅ¢I MATERIALE PROTEJATE DE DREPTURI DE AUTOR FÄ‚RÄ‚ PERMISIUNE!</strong>",
"longpagewarning" => "ATENŢIE! Conţinutul acestei pagini are $1 KB; unele browsere au probleme la editarea paginilor în jur de 32 KB sau mai mari.
@@ -503,8 +503,8 @@ Vă rugăm să încercaţi o altă căutare.",
"nonefound" => "<strong>Notă</strong>: căutările nereuşite sunt în general datorate căutării unor cuvinte prea comune care nu sunt indexate, sau cautărilor a mai multe cuvinte (numai articolele care conţin ''toate'' cuvintele specificate apar ca rezultate).",
"powersearch" => "Caută",
"powersearchtext" => "
-Caută în secţiunile:<br>
-$1<br>
+Caută în secţiunile:<br />
+$1<br />
$2 Redirecţionări&nbsp; Căutări după $3 $9",
"searchdisabled" => "<p>Ne pare rău! Căutarea după text a fost dezactivată temporar, din motive de performanţă. Între timp puteţi folosi căutarea prin Google mai jos, însă aceasta poate să dea rezultate învechite.</p>
@@ -521,7 +521,7 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Caută pe Google\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br>
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -697,7 +697,7 @@ Vă rugăm să vizitaţi această legătură: ($2) pentru a descrie fişierul ş
"deleteimg" => "ÅŸterg",
"deleteimgcompletely" => "ÅŸterg",
"imghistlegend" => "Legend: (actuală) = versiunea curentă a imaginii, (şterg) = şterge această versiune veche, (rev) = revino la această versiune veche.
-<br><i>Apăsaţi pe dată pentru a vedea versiunea trimisă la data respectivă</i>.",
+<br /><i>Apăsaţi pe dată pentru a vedea versiunea trimisă la data respectivă</i>.",
"imagelinks" => "Legăturile imaginii",
"linkstoimage" => "Următoarele pagini leagă la această imagine:",
"nolinkstoimage" => "Nici o pagină nu se leagă la această imagine.",
@@ -723,9 +723,9 @@ Dintre aceÅŸtia <b>$2</b> sunt administratori (vezi $3).",
"maintenancebacklink" => "Înapoi la pagina administrativă",
"disambiguations" => "Pagini de dezambiguizare",
"disambiguationspage" => "Wikipedia:Legături_către_paginile_de_dezambiguizare",
-"disambiguationstext" => "Următoarele articole conţin legături către cel puţin o <i>pagină de dezambiguizare</i>. Legăturile respective ar trebui făcute către paginile specifice.<br>O pagină este considerată ca fiind de dezambiguizare dacă există o legătură în ea dinspre $1.<br>Legăturile dinspre alte secţiuni Wikipedia <i>nu sunt</i> luate în considerare aici.",
+"disambiguationstext" => "Următoarele articole conţin legături către cel puţin o <i>pagină de dezambiguizare</i>. Legăturile respective ar trebui făcute către paginile specifice.<br />O pagină este considerată ca fiind de dezambiguizare dacă există o legătură în ea dinspre $1.<br />Legăturile dinspre alte secţiuni Wikipedia <i>nu sunt</i> luate în considerare aici.",
"doubleredirects" => "Redirectări duble",
-"doubleredirectstext" => "<b>Atenţie:</b> Această listă poate conţine articole care nu sunt în fapt duble redirectări. Asta înseamnă de obicei că există text adiţional sub primul #REDIRECT.<br>\nFiecare rând care conţine legături către prima sau a doua redirectare, ca şi prima linie din textul celei de-a doua redirectări, de obicei conţinând numele \"real\" al articolului ţintă, către care ar trebui să arate prima redirectare.",
+"doubleredirectstext" => "<b>Atenţie:</b> Această listă poate conţine articole care nu sunt în fapt duble redirectări. Asta înseamnă de obicei că există text adiţional sub primul #REDIRECT.<br />\nFiecare rând care conţine legături către prima sau a doua redirectare, ca şi prima linie din textul celei de-a doua redirectări, de obicei conţinând numele \"real\" al articolului ţintă, către care ar trebui să arate prima redirectare.",
"brokenredirects" => "Redirectări greşite",
"brokenredirectstext" => "Următoarele redirectări arată către articole inexistente.",
"selflinks" => "Pagini cu legături ciclice",
@@ -935,7 +935,7 @@ au fost vandalizate de acest utilizator).",
"noblockreason" => "Trebuie să includeţi un motiv pentru blocare.",
"blockipsuccesssub" => "Utilizatorul a fost blocat",
"blockipsuccesstext" => "Adresa IP \"$1\" a fost blocată.
-<br>Vezi [[Special:Ipblocklist|lista de adrese IP blocate]] pentru a revizui adresele blocate.",
+<br />Vezi [[Special:Ipblocklist|lista de adrese IP blocate]] pentru a revizui adresele blocate.",
"unblockip" => "Deblochează adresă IP",
"unblockiptext" => "Folosiţi chestionarul de mai jos pentru a restaura
drepturile de scriere pentru o adresă IP blocată anterior..",
@@ -977,7 +977,7 @@ Vă rugăm să confirmaţi că intenţionaţi acest lucru.",
"lockdbsuccesssub" => "Baza de date a fost blocată",
"unlockdbsuccesssub" => "Baza de date a fost deblocată",
"lockdbsuccesstext" => "Baza de date Wikipedia a fost blocată la scriere.
-<br>Nu uitaţi să o deblocaţi după ce terminaţi operaţiunile administrative pentru care aţi blocat-o.",
+<br />Nu uitaţi să o deblocaţi după ce terminaţi operaţiunile administrative pentru care aţi blocat-o.",
"unlockdbsuccesstext" => "Baza de date Wikipedia a fost deblocată.",
# SQL query
diff --git a/languages/LanguageRu.php b/languages/LanguageRu.php
index 9902e5db71b3..38b125126430 100644
--- a/languages/LanguageRu.php
+++ b/languages/LanguageRu.php
@@ -125,8 +125,8 @@ if($wgMetaNamespace === FALSE)
"tog-showtoolbar" => "Show edit toolbar",
"tog-editondblclick" => "Редактировать Ñтраницу по двойному щелчку (JavaScript)",
"tog-editsection"=>"Редактирование Ñекций Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ð¸ ÑÑыки [редактировать]",
-"tog-editsectiononrightclick"=>"Редактирование Ñекций по правой кнопке мышки<br> на названии Ñекции (JavaScript)",
-"tog-showtoc"=>"Показывать оглавление<br>(Ð´Ð»Ñ Ñтраниц более чем Ñ 3 заголовками)",
+"tog-editsectiononrightclick"=>"Редактирование Ñекций по правой кнопке мышки<br /> на названии Ñекции (JavaScript)",
+"tog-showtoc"=>"Показывать оглавление<br />(Ð´Ð»Ñ Ñтраниц более чем Ñ 3 заголовками)",
"tog-rememberpassword" => "Запоминать пароль между ÑеанÑами",
"tog-editwidth" => "Окно Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² полную ширину",
"tog-watchdefault" => "Следить за новыми и изменёнными ÑтатьÑми",
@@ -171,7 +171,7 @@ if($wgMetaNamespace === FALSE)
# Bits of text used by many pages:
#
-"linktrail" => "/^([a-z]+)(.*)\$/sD",
+"linktrail" => "/^((?:[a-z]|а|б|в|г|д|е|Ñ‘|ж|з|и|й|к|л|м|н|о|п|Ñ€|Ñ|Ñ‚|у|Ñ„|Ñ…|ц|ч|ш|щ|ÑŠ|Ñ‹|ÑŒ|Ñ|ÑŽ|Ñ)+)(.*)$/sD",
"mainpage" => "Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ð¡Ñ‚Ñ€Ð°Ð½Ð¸Ñ†Ð°",
"mainpagetext" => "Программное обеÑпечение вики уÑтановлено.",
"about" => "ОпиÑание",
@@ -312,8 +312,8 @@ MySQL возвратил ошибку \"$3: $4\".\n",
"yourpasswordagain" => "Повторный набор паролÑ",
"newusersonly" => " (только Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… учаÑтников)",
"remembermypassword" => "Запоминать ваш пароль между ÑеанÑами.",
-"loginproblem" => "<b>Произошла проблема Ñ Ð²Ð°ÑˆÐ¸Ð¼ опознаванием.</b><br>попробуйте ещё раз!",
-"alreadyloggedin" => "<font color=red><b>УчаÑтник $1, вы уже предÑтавилиÑÑŒ ÑиÑтеме!</b></font><br>\n",
+"loginproblem" => "<b>Произошла проблема Ñ Ð²Ð°ÑˆÐ¸Ð¼ опознаванием.</b><br />попробуйте ещё раз!",
+"alreadyloggedin" => "<font color=red><b>УчаÑтник $1, вы уже предÑтавилиÑÑŒ ÑиÑтеме!</b></font><br />\n",
"login" => "ПредÑтавитьÑÑ ÑиÑтеме",
"userlogin" => "ПредÑтавитьÑÑ ÑиÑтеме",
@@ -356,7 +356,7 @@ MySQL возвратил ошибку \"$3: $4\".\n",
"showpreview" => "Показать предварительный вариант",
"blockedtitle" => "УчаÑтник заблокирован",
"blockedtext" => "Ваше Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника или IP-Ð°Ð´Ñ€ÐµÑ Ð±Ñ‹Ð» заблокирован $1.
-УтверждаетÑÑ, что причина такова:<br>''$2''<p>Ð’Ñ‹ можете ÑвÑзатьÑÑ Ñ $1 или одним из других
+УтверждаетÑÑ, что причина такова:<br />''$2''<p>Ð’Ñ‹ можете ÑвÑзатьÑÑ Ñ $1 или одним из других
[[$wgMetaNamespace:админиÑтраторы|админиÑтраторов]] чтобы обÑудить блокировку.",
"newarticle" => "(ÐоваÑ)",
"newarticletext" =>
@@ -388,7 +388,7 @@ MySQL возвратил ошибку \"$3: $4\".\n",
GNU Free Documentation License без неизменÑемых Ñекций
(Ñм. $1, чтобы узнать детали).
ЕÑли вы не желаете, чтобы напиÑанное вами безжалоÑтно редактировалоÑÑŒ
-и раÑпроÑтранÑлоÑÑŒ по чьему-угодно желанию, ничего не пишите здеÑÑŒ.<br>
+и раÑпроÑтранÑлоÑÑŒ по чьему-угодно желанию, ничего не пишите здеÑÑŒ.<br />
Ð’Ñ‹ также обÑзываетеÑÑŒ, что напиÑанное вами здеÑÑŒ принадлежит вам или взÑто из иÑточника,
ÑвлÑющимÑÑ Ð¾Ð±Ñ‰ÐµÑтвенным доÑтоÑнием либо Ñходного Ñвободного иÑточника.
<strong>ÐЕ ПОМЕЩÐЙТЕ ЗДЕСЬ БЕЗ РÐЗРЕШЕÐИЯ ПРОИЗВЕДЕÐИЯ, ЯВЛЯЮЩИЕСЯ ОБЪЕКТОМ ÐВТОРСКОГО ПРÐÐ’Ð,
@@ -451,8 +451,8 @@ GNU Free Documentation License без неизменÑемых Ñекций
, или иÑпользованием более чем одного ключевого Ñлова поиÑка (показываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñтраницы, Ñодержащие вÑе указанные Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка).",
"powersearch" => "ИÑкать",
"powersearchtext" => "
-ИÑкать в проÑтранÑтвах имён :<br>
-$1<br>
+ИÑкать в проÑтранÑтвах имён :<br />
+$1<br />
$2 Показывать Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ &nbsp; ПоиÑк на $3 $9",
"blanknamespace" => "(ЗаглавнаÑ)",
@@ -609,7 +609,7 @@ Cм. [[$wgMetaNamespace:Справка по наÑтройкам]] чтобы Ñ€
"deleteimg" => "удал.",
"deleteimgcompletely" => "удал.",
"imghistlegend" => "ПоÑÑнениÑ: (тек.) = Ñто - текущее изображение, (удал.) = удалить Ñту Ñтарую верÑию, (откат.) = откатитьÑÑ Ð½Ð° Ñту Ñтарую верÑию.
-<br><i>Выберите дату, чтобы поÑмотреть ÑпиÑок изображений, загруженных на Ñту дату</i>.",
+<br /><i>Выберите дату, чтобы поÑмотреть ÑпиÑок изображений, загруженных на Ñту дату</i>.",
"imagelinks" => "СÑылки изображениÑ",
"linkstoimage" => "Следующие Ñтраницы ÑÑылаютÑÑ Ð½Ð° данное изображение:",
"nolinkstoimage" => "Страницы, ÑÑылающиеÑÑ Ð½Ð° данное изображение, отÑутÑтвуют.",
@@ -636,9 +636,9 @@ Cм. [[$wgMetaNamespace:Справка по наÑтройкам]] чтобы Ñ€
"maintenancebacklink" => "Ðазад, на Ñтраницу обÑлуживаниÑ",
"disambiguations" => "Многозначные Ñтраницы",
"disambiguationspage" => "ВикипедиÑ:СÑылки_на_многозначные_Ñтраницы",
-"disambiguationstext" => "Следущие Ñтатьи ÑÑылаютÑÑ Ð½Ð° <i>многозначные Ñтраницы</i>. ВмеÑто Ñтого они должны указывать на ÑоответÑтвующую конкретную Ñтатью.<br>Страница ÑчитаетÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð¹, еÑли на неё указывает $1.<br>СÑылки из других проÑтранÑтв имён здеÑÑŒ <i>не</i> перечиÑлены.",
+"disambiguationstext" => "Следущие Ñтатьи ÑÑылаютÑÑ Ð½Ð° <i>многозначные Ñтраницы</i>. ВмеÑто Ñтого они должны указывать на ÑоответÑтвующую конкретную Ñтатью.<br />Страница ÑчитаетÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð¹, еÑли на неё указывает $1.<br />СÑылки из других проÑтранÑтв имён здеÑÑŒ <i>не</i> перечиÑлены.",
"doubleredirects" => "Двойные перенаправлениÑ",
-"doubleredirectstext" => "<b>Внимание:</b> Этот ÑпиÑок может Ñодержать ложные включениÑ. Обычно Ñто означает, что поÑле первой директивы #REDIRECT идёт дополнительный текÑÑ‚ Ñо ÑÑылками.<br>\nÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока Ñодержит ÑÑылки на первое и второе перенаправлениÑ, а также первую Ñтроку текÑта второго перенаправлениÑ, обычно Ñодержащую \"реальное\" перенаправление на нужную Ñтатью, куда и первое перенаправление должно указывать.",
+"doubleredirectstext" => "<b>Внимание:</b> Этот ÑпиÑок может Ñодержать ложные включениÑ. Обычно Ñто означает, что поÑле первой директивы #REDIRECT идёт дополнительный текÑÑ‚ Ñо ÑÑылками.<br />\nÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока Ñодержит ÑÑылки на первое и второе перенаправлениÑ, а также первую Ñтроку текÑта второго перенаправлениÑ, обычно Ñодержащую \"реальное\" перенаправление на нужную Ñтатью, куда и первое перенаправление должно указывать.",
"brokenredirects" => "Разорванные перенаправлениÑ",
"brokenredirectstext" => "Следующие Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÑŽÑ‚ на неÑущеÑтвующие Ñтатьи.",
"selflinks" => "Страницы, указывающие Ñами на ÑебÑ",
@@ -835,7 +835,7 @@ $3...
"noblockreason" => "Ð’Ñ‹ должны опиÑать причину блокировки.",
"blockipsuccesssub" => "Блокировка произведена",
"blockipsuccesstext" => "IP-Ð°Ð´Ñ€ÐµÑ \"$1\" заблокирован.
-<br>См. [[Специальные:СпиÑок_заблокированных_IP|ÑпиÑок заблокированных IP]] чтобы узнать, какие IP-адреÑа заблокированы.",
+<br />См. [[Специальные:СпиÑок_заблокированных_IP|ÑпиÑок заблокированных IP]] чтобы узнать, какие IP-адреÑа заблокированы.",
"unblockip" => "Разблокировать IP-адреÑ",
"unblockiptext" => "ИÑпользуйте форму ниже, чтобы воÑÑтановить возможноÑÑ‚ÑŒ запиÑьи Ñ Ñ€Ð°Ð½ÐµÐµ заблокированного
IP-адреÑа.",
@@ -868,7 +868,7 @@ IP-адреÑа.",
"lockdbsuccesssub" => "База данных заблокирована",
"unlockdbsuccesssub" => "База данных разблокирована",
"lockdbsuccesstext" => "База данных Википедии была заблокированна.
-<br>Ðе забудьте убрать блокировку поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ обÑлуживаниÑ.",
+<br />Ðе забудьте убрать блокировку поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ обÑлуживаниÑ.",
"unlockdbsuccesstext" => "База данных Википедии была разблокирована.",
# SQL query
diff --git a/languages/LanguageSc.php b/languages/LanguageSc.php
index 926babd99151..57359ae86b9e 100644
--- a/languages/LanguageSc.php
+++ b/languages/LanguageSc.php
@@ -252,7 +252,7 @@ Per favore, segnalate l'accaduto ad un administrator, segnalando la URL e l'ora
"logouttext" => "Logout effettuato.
Ora puoi continuare ad usare Wikipedia come utente anonimo (ma il tuo indirizzo IP resterà riconoscibile), oppure puoi nuovamente richiedere il login con il precedente username, oppure come uno diverso.\n",
-"welcomecreation" => "<h2>Benvenuto, $1!</h2><p>Il tuo account è stato creato con successo.<br>Grazie per aver scelto di far crescere Wikipedia con il tuo aiuto.<br>Per rendere Wikipedia più tua, e per usarla più scorrevolmente, non dimenticare di personalizzare le tue preferenze.",
+"welcomecreation" => "<h2>Benvenuto, $1!</h2><p>Il tuo account è stato creato con successo.<br />Grazie per aver scelto di far crescere Wikipedia con il tuo aiuto.<br />Per rendere Wikipedia più tua, e per usarla più scorrevolmente, non dimenticare di personalizzare le tue preferenze.",
"loginpagetitle" => "Login",
"yourname" => "Il tuo user name",
@@ -260,11 +260,11 @@ Ora puoi continuare ad usare Wikipedia come utente anonimo (ma il tuo indirizzo
"yourpasswordagain" => "Ripeti la password",
"newusersonly" => " (solo per nuovi Utenti)",
"remembermypassword" => "Ricorda la mia password per più sessioni (richiede uso dei cookies).",
-"loginproblem" => "<b>Si è verificato un errore durante il tuo tentativo di login.</b><br>Riprova, sarai più fortunato!",
-"alreadyloggedin" => "<font color=red><b>Ehi, Utente $1, hai già fatto il login, sei già connesso al nostro server!</b></font><br>\n",
+"loginproblem" => "<b>Si è verificato un errore durante il tuo tentativo di login.</b><br />Riprova, sarai più fortunato!",
+"alreadyloggedin" => "<font color=red><b>Ehi, Utente $1, hai già fatto il login, sei già connesso al nostro server!</b></font><br />\n",
-"areyounew" => "Se sei nuovo in Wikipedia e desideri creare un nuovo user account, immetti uno user name (che sarà il tuo nome per Wikipedia, poi digita una password e ripetila nella casella successiva.<br>
-Indicare un indirizzo e-mail non è obbligatorio, solo facoltativo (sebbene consigliato).<br>Se per caso perdessi la tua password, potrai richiedere che ti sia rispedita alla casella di posta elettronica che ci fornirai.<br>\n",
+"areyounew" => "Se sei nuovo in Wikipedia e desideri creare un nuovo user account, immetti uno user name (che sarà il tuo nome per Wikipedia, poi digita una password e ripetila nella casella successiva.<br />
+Indicare un indirizzo e-mail non è obbligatorio, solo facoltativo (sebbene consigliato).<br />Se per caso perdessi la tua password, potrai richiedere che ti sia rispedita alla casella di posta elettronica che ci fornirai.<br />\n",
"login" => "Log in",
"userlogin" => "Log in",
@@ -280,9 +280,9 @@ Indicare un indirizzo e-mail non è obbligatorio, solo facoltativo (sebbene cons
"noname" => "Lo user name indicato non è valido, non è possibile creare un account a questo nome.",
"loginsuccesstitle" => "Login effettuato con successo!",
"loginsuccess" => "Sei stato ammesso alla connessione al server di Wikipedia con il nome utente di \"$1\".",
-"nosuchuser" => "Attenzione<br><br>a seguito di verifica, non ci risulta alcun Utente con il nome di \"$1\".<br><br>
+"nosuchuser" => "Attenzione<br /><br />a seguito di verifica, non ci risulta alcun Utente con il nome di \"$1\".<br /><br />
Controlla per favore il nome digitato, oppure usa il modulo qui sotto per creare un nuovo user account.",
-"wrongpassword" => "La password immessa non è corretta.<br><br>Riprova, per favore.",
+"wrongpassword" => "La password immessa non è corretta.<br /><br />Riprova, per favore.",
"mailmypassword" => "Spediscimi una nuova password in posta elettronica",
"passwordremindertitle" => "Servizio Password Reminder di Wikipedia",
"passwordremindertext" => "Qualcuno (probabilmente tu, con indirizzo IP $1)
@@ -302,8 +302,8 @@ Per favore, fai subito un log in non appena la ricevi.",
"preview" => "Anteprima",
"showpreview" => "Visualizza Anteprima",
"blockedtitle" => "Questo User name corrisponde purtroppo ad un Utente che è stato disabilitato alla modifica degli articoli.",
-"blockedtext" => "Il tuo User name o il tuo indirizzo IP sono stati bloccati da $1.<br>
-La motivazione del blocco è la seguente:<br>:''$2''<p>Se lo desideri, puoi contattare $1, o uno degli altri
+"blockedtext" => "Il tuo User name o il tuo indirizzo IP sono stati bloccati da $1.<br />
+La motivazione del blocco è la seguente:<br />:''$2''<p>Se lo desideri, puoi contattare $1, o uno degli altri
[[Wikipedia:administrators|administrators]] per discutere del blocco.",
"newarticle" => "(Nuovo)",
"newarticletext" => "Scrivi qui il tuo testo.",
@@ -314,7 +314,7 @@ La motivazione del blocco è la seguente:<br>:''$2''<p>Se lo desideri, puoi cont
"previewconflict" => "Questa anteprima rappresenta il testo nella casella di edizione di sopra, l'articolo apparirà n questa forma se sceglierai di salvare la pagina.",
"editing" => "Modifica di $1",
"editconflict" => "Conflitto di edizione: $1",
-"explainconflict" => "Qualcun altro ha salvato una sua versione dell'articolo nel tempo in cui tu stavi preparando la tua versione.<br>
+"explainconflict" => "Qualcun altro ha salvato una sua versione dell'articolo nel tempo in cui tu stavi preparando la tua versione.<br />
La casella di modifica di sopra contiene il testo dell'articolo nella sua forma attuale (cioè il testo attualmente online). Le tue modifiche sono invece contenute nella casella di modifica inferiore.
Dovrai inserire, se lo desideri, le tue modifiche nel testo esistente, e perciò scriverle nella casella di sopra.
<b>Soltanto</b> il testo nella casella di sopra sarà sakvato se premerai il bottone \"Salva\".\n<p>",
@@ -325,7 +325,7 @@ Se la salvi così, tutti i cambiamenti apportati dopo questa revisione verranno
"yourdiff" => "Differenze",
"copyrightwarning" => "Nota, per favore, che tutti i contributi a Wikipedia si considerano rilasciati sotto licenza di tipo GNU Free Documentation License
(vedi $1 per maggiori dettagli).
-Se non vuoi che il tuo testo possa essere modificato e ridistribuito da chiunque senza pietà e senza altri limiti, allora non inviarlo a Wikipedia, ma realizza piuttosto un tuo sito web personale.<br>
+Se non vuoi che il tuo testo possa essere modificato e ridistribuito da chiunque senza pietà e senza altri limiti, allora non inviarlo a Wikipedia, ma realizza piuttosto un tuo sito web personale.<br />
Con l'invio di questo testo stai garantendo, a tua responsabilità, che il testo è stato scritto da te personalmente ed originalmente, oppure che è stato copiato da una fonte di publico dominio, o una simile fonte, oppure che hai ottenuto espressa autorizzazione ad usare questo testo e che puoi dimostrarlo.
<strong>NON USARE MATERIALE COPERTO DA DIRITTO DI AUTORE (COPYRIGHT - (c)) IN MANCANZA DI ESPRESSA AUTORIZZAZIONE!!!</strong>",
@@ -364,7 +364,7 @@ Controlla per favore la URL che hai usato per accedere a questa pagina.\n",
Questo potrebbe dipendere dall'aver ricercato una parola di meno di tre caratteri.
Oppure potresti aver scritto male la richiesta, per esempio \"pesce and and azzurro\".
Per favore, riprova.",
-"matchtotals" => "La ricerca per la voce \"$1\" ha trovato<br>$2 riscontri nei titoli degli articoli e<br>$3 riscontri nei testi degli articoli.",
+"matchtotals" => "La ricerca per la voce \"$1\" ha trovato<br />$2 riscontri nei titoli degli articoli e<br />$3 riscontri nei testi degli articoli.",
"titlematches" => "Nei titoli degli articoli",
"notitlematches" => "Voce richiesta non trovata in titoli di articolo",
"textmatches" => "Nel testo degli articoli ",
@@ -376,8 +376,8 @@ Per favore, riprova.",
"nonefound" => "<strong>Nota</strong>: la ricerca di parole troppo comuni, come \"avere\" o \"essere\", che non sono indicizzate, può causare un esito negativo, così come indicare più di un termine da ricercare (solo le pagine che contengano tutti i termini ricercati verrebbero infatti visualizzate fra i risultati).",
"powersearch" => "Ricerca",
"powersearchtext" => "
-Cerca fra i campi :<br>
-$1<br>
+Cerca fra i campi :<br />
+$1<br />
$2 Elenca i redirects &nbsp; cerca per $3 $9",
@@ -526,7 +526,7 @@ Segui questo link: ($2) per modificare la pagina di descrizione del file che hai
"deleteimg" => "canc",
"deleteimgcompletely" => "canc",
"imghistlegend" => "Legenda: (cur) = immagine corrente, (canc) = cancella questa vecchia versione, (ripr) = ripristina questa vecchia versione come versione attuale.
-<br><i>Clicca su una data per vedere tutte le immagini che sono state caricate in quella data </i>.",
+<br /><i>Clicca su una data per vedere tutte le immagini che sono state caricate in quella data </i>.",
"imagelinks" => "Link alle immagini",
"linkstoimage" => "Le pagine seguenti linkano questa immagine:",
"nolinkstoimage" => "Nessuna pagina linka questa immagine.",
@@ -551,9 +551,9 @@ Questa media rivela che ci sono state una media di <b>$5</b> modifiche per cias
"maintenancebacklink" => "Torna alla pagina manutenzione",
"disambiguations" => "Disambiguation pages",
"disambiguationspage" => "Wikipedia:Links_to_disambiguating_pages",
-"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "Doppi Redirects",
-"doubleredirectstext" => "<b>Attenzione:</b> Questa lista può talvolta contenere dei risultati non corretti. Ciò potrebbe magari accadere perchè vi sono del testo aggiuntivo o dei link dopo il tag #REDIRECT.<br>\nOgni riga contiene i link al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene il \"reale\" articolo di destinazione, quello al quale anche il primo redirect dovrebbe puntare.",
+"doubleredirectstext" => "<b>Attenzione:</b> Questa lista può talvolta contenere dei risultati non corretti. Ciò potrebbe magari accadere perchè vi sono del testo aggiuntivo o dei link dopo il tag #REDIRECT.<br />\nOgni riga contiene i link al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene il \"reale\" articolo di destinazione, quello al quale anche il primo redirect dovrebbe puntare.",
"brokenredirects" => "Redirects errati",
"brokenredirectstext" => "I seguenti redirects puntano ad articoli non ancora creati.",
"selflinks" => "Pagine con Auto-Links",
@@ -717,7 +717,7 @@ Scrivi un motivo specifico per il quale questo indirizzo IP dovrebbe a tuo avvis
"noblockreason" => "Devi obbligatoriamente fornire una motivazione per il blocco.",
"blockipsuccesssub" => "Blocco eseguito",
"blockipsuccesstext" => " L'indirizzo IP \"$1\" è stato bloccato.
-<br>Vedi [[Special:Ipblocklist|lista IP bloccati]].",
+<br />Vedi [[Special:Ipblocklist|lista IP bloccati]].",
"unblockip" => " Sblocca indirizzo IP",
"unblockiptext" => "Usa il modulo sottostante per restituire il diritto di scrittura ad un indirizzo IP precedentemente bloccato.",
"ipusubmit" => "Sblocca questo indirizzo IP",
@@ -732,7 +732,7 @@ Scrivi un motivo specifico per il quale questo indirizzo IP dovrebbe a tuo avvis
#
"lockdb" => "Blocca il database",
"unlockdb" => "Sblocca il database",
-"lockdbtext" => "Bloccare il database sospenderà la possibilità per tutti gli Utenti di modificare le pagine o di crearne di nuove, di cambiare le loro preferenze, di modificare le loro liste di Osservati Speciali, ed in genere non consentirà a nessuno di eseguire operazioni che richiedano modifiche del database.<br><br>
+"lockdbtext" => "Bloccare il database sospenderà la possibilità per tutti gli Utenti di modificare le pagine o di crearne di nuove, di cambiare le loro preferenze, di modificare le loro liste di Osservati Speciali, ed in genere non consentirà a nessuno di eseguire operazioni che richiedano modifiche del database.<br /><br />
Per cortesia, conferma che questo è effettivamente quanto tu intendi ora effettuare e, soprattutto, che il prima possibile sbloccherai nuovamente il database, ripristinandone la corretta funzionalità, non appena avrai terminato le tue manutenzioni.",
"unlockdbtext" => "Sbloccare il database ripristinerà la possibilità per tutti gli Utenti di modificare le pagine o di crearne di nuove, di cambiare le loro preferenze, di modificare le loro liste di Osservati Speciali, ed in genere di eseguire operazioni che richiedano modifiche del database.
Per cortesia, conferma che questo è effettivamente quanto tu intendi ora effettuare.",
@@ -744,7 +744,7 @@ Per cortesia, conferma che questo è effettivamente quanto tu intendi ora effett
"lockdbsuccesssub" => "Blocco del database eseguito",
"unlockdbsuccesssub" => "Sblocco del database eseguito, rimosso blocco",
"lockdbsuccesstext" => "Il database di Wikipedia è stato bloccato.
-<br>Ricordati di rimuovere il blocco non appena avrai terminatoi le tue manutenzioni.",
+<br />Ricordati di rimuovere il blocco non appena avrai terminatoi le tue manutenzioni.",
"unlockdbsuccesstext" => " Il database di Wikipedia è stato sbloccato.",
# SQL query
@@ -785,7 +785,7 @@ per poter spostare una pagina.",
"movepagebtn" => "Sposta questa pagina",
"pagemovedsub" => "Spostamento effettuato con successo",
"pagemovedtext" => "Pagina \"[[$1]]\" rinominata in \"[[$2]]\".",
-"articleexists" => "Una pagina con questo nome esiste già, oppure il nome che hai scelto non è valido.<br>
+"articleexists" => "Una pagina con questo nome esiste già, oppure il nome che hai scelto non è valido.<br />
Scegli, per cortesia, un titolo diverso per l'articolo.",
"talkexists" => "La pagina è stata spostata correttamente, ma la pagina di dicussione non poteva essere spostata perché ne esiste già un'altra con il nuovo titolo. Per favore, modifica manualmente i contenuti delle due pagine discussione, così da mantenerle entrambe per non perdere potenzialmente interessanti riflessioni.",
"movedto" => "spostata a ",
diff --git a/languages/LanguageSk.php b/languages/LanguageSk.php
index 6a0c9aac405a..a9bd863931cf 100644
--- a/languages/LanguageSk.php
+++ b/languages/LanguageSk.php
@@ -276,8 +276,8 @@ Nezabudnite si nastaviť užívateľské nastavenia.",
"yourpasswordagain" => "Zopakujte heslo",
"newusersonly" => " (iba noví užívatelia)",
"remembermypassword" => "PamätaÅ¥ si heslo aj po vypnutí poÄítaÄa.",
-"loginproblem" => "<b>Nastal problém pri prihlasovaní.</b><br>Skúste znova!",
-"alreadyloggedin" => "<font color=red><b>Užívateľ $1, vy už ste prihlásený!</b></font><br>\n",
+"loginproblem" => "<b>Nastal problém pri prihlasovaní.</b><br />Skúste znova!",
+"alreadyloggedin" => "<font color=red><b>Užívateľ $1, vy už ste prihlásený!</b></font><br />\n",
"login" => "Log in",
"userlogin" => "Log in",
@@ -317,7 +317,7 @@ Please log in again after you receive it.",
"showpreview" => "Show preview",
"blockedtitle" => "User is blocked",
"blockedtext" => "Your user name or IP address has been blocked by $1.
-The reason given is this:<br>''$2''<p>You may contact $1 or one of the other
+The reason given is this:<br />''$2''<p>You may contact $1 or one of the other
[[Wikipedia:administrators|administrators]] to discuss the block.",
"newarticle" => "(New)",
"newarticletext" =>
@@ -351,7 +351,7 @@ If you save it, any changes made since this revision will be lost.</strong>\n",
considered to be released under the GNU Free Documentation License
(see $1 for details).
If you don't want your writing to be edited mercilessly and redistributed
-at will, then don't submit it here.<br>
+at will, then don't submit it here.<br />
You are also promising us that you wrote this yourself, or copied it from a
public domain or similar free resource.
<strong>DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!</strong>",
@@ -412,8 +412,8 @@ 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).",
"powersearch" => "Search",
"powersearchtext" => "
-Search in namespaces :<br>
-$1<br>
+Search in namespaces :<br />
+$1<br />
$2 List redirects &nbsp; Search for $3 $9",
@@ -554,7 +554,7 @@ created and by whom, and anything else you may know about it.",
"deleteimgcompletely" => "del",
"imghistlegend" => "Legend: (cur) = this is the current image, (del) = delete
this old version, (rev) = revert to this old version.
-<br><i>Click on date to see image uploaded on that date</i>.",
+<br /><i>Click on date to see image uploaded on that date</i>.",
"imagelinks" => "Image links",
"linkstoimage" => "The following pages link to this image:",
"nolinkstoimage" => "There are no pages that link to this image.",
@@ -582,9 +582,9 @@ That comes to <b>$5</b> average edits per page, and <b>$6</b> views per edit.",
"maintenancebacklink" => "Back to Maintenance Page",
"disambiguations" => "Disambiguation pages",
"disambiguationspage" => "Wikipedia:Links_to_disambiguating_pages",
-"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "Double Redirects",
-"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br>\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
+"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br />\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
"brokenredirects" => "Broken Redirects",
"brokenredirectstext" => "The following redirects link to a non-existing article.",
"selflinks" => "Pages with Self Links",
@@ -767,7 +767,7 @@ pages that were vandalized).",
"noblockreason" => "You must supply a reason for the block.",
"blockipsuccesssub" => "Block succeeded",
"blockipsuccesstext" => "The IP address \"$1\" has been blocked.
-<br>See [[Special:Ipblocklist|IP block list]] to review blocks.",
+<br />See [[Special:Ipblocklist|IP block list]] to review blocks.",
"unblockip" => "Unblock IP address",
"unblockiptext" => "Use the form below to restore write access
to a previously blocked IP address.",
@@ -800,7 +800,7 @@ Please confirm that this is what you intend to do.",
"lockdbsuccesssub" => "Database lock succeeded",
"unlockdbsuccesssub" => "Database lock removed",
"lockdbsuccesstext" => "The Wikipedia database has been locked.
-<br>Remember to remove the lock after your maintenance is complete.",
+<br />Remember to remove the lock after your maintenance is complete.",
"unlockdbsuccesstext" => "The Wikipedia database has been unlocked.",
# SQL query
diff --git a/languages/LanguageSl.php b/languages/LanguageSl.php
index b52b2f6e46dc..a5850b9aa4a5 100644
--- a/languages/LanguageSl.php
+++ b/languages/LanguageSl.php
@@ -115,6 +115,15 @@ require_once( "LanguageUtf8.php" );
"Unlockdb" => "Obnovi zapisovalni dostop podatkovne baze",
);
+/* private */ $wgDateFormatsSl = array(
+ 'No preference',
+ 'januar 15, 2001',
+ '15 januar 2001',
+ '2001 januar 15',
+ '2001-01-15'
+);
+
+
/* private */ $wgAllMessagesSl = array(
'special_version_prefix' => '',
'special_version_postfix' => '',
@@ -293,8 +302,8 @@ Lahko nadaljujete z uporabo Wikipedije nepodpisani, ali pa se lahko ponovno vpiÅ
"yourpasswordagain" => "Ponovno vpišite geslo",
"newusersonly" => " (Samo novi uporabniki)",
"remembermypassword" => "Zapomni si moje geslo vseskozi.",
-"loginproblem" => "<b>Nastala je tažava z vašim vpisom.</b><br>Poskusite znova!",
-"alreadyloggedin" => "<font color=red><b>Uporabnik $1, ste že vpisani!</b></font><br>\n",
+"loginproblem" => "<b>Nastala je tažava z vašim vpisom.</b><br />Poskusite znova!",
+"alreadyloggedin" => "<font color=red><b>Uporabnik $1, ste že vpisani!</b></font><br />\n",
"login" => "Vpis",
"userlogin" => "Vpis",
@@ -331,7 +340,7 @@ Sedaj se lahko vpišete in spremenite vaše geslo.",
"showpreview" => "Pokaži predpregled",
"blockedtitle" => "Uporabnik je zaprt",
"blockedtext" => "Vaše uporabniško ime ali IP naslov je zaprl $1.
-Vzrok za to je naslednji:<br>''$2''<p>Lahko pokliÄete $1 ali katerega drugega
+Vzrok za to je naslednji:<br />''$2''<p>Lahko pokliÄete $1 ali katerega drugega
[[Wikipedija:Administratorji|administratorja]] za pogovor o zaprtju.",
"newarticle" => "(Nov)",
"newarticletext" =>
@@ -358,7 +367,7 @@ Morali boste spojiti vaÅ¡e spremembe v obstojeÄe besedilo.
ÄŒe jo boste shranili, bodo vse spremembe, narejene od tedaj, izgubljene.</strong>\n",
"yourdiff" => "Razlike",
"copyrightwarning" => "Prosimo upoštevajte, da se vsi doprinosi k Wikipediji smatrajo kot objave pod GNU licenco proste dokumentacije (glej $1 za podrobnosti).
-Če ne želite, da se vaša pisanja neusmiljeno urejujejo ali ponovno razdeljujejo prostovoljno, potem jih ne predlagajte tukaj.<br>
+Če ne želite, da se vaša pisanja neusmiljeno urejujejo ali ponovno razdeljujejo prostovoljno, potem jih ne predlagajte tukaj.<br />
Poleg tega nam obljubljate, da ste to napisali samo ali pa prepisali iz javno dostopnega ali podobnega prostega vira.
<strong>NE PREDLAGAJTE AVTORSKO ZAÅ ÄŒITENEGA DELA BREZ DOVOLJENJA!</strong>",
"longpagewarning" => "OPOZORILO: Ta stran je dolga $1 kilobitov; nekateri brskalniki s težavo urejujejo strani, ki so daljše kot 32 kB. Prosimo, da upoštevate delitev strani na manjše dele.",
@@ -413,8 +422,8 @@ Prosimo poskusite z drugim povpraševanjem.",
"nonefound" => "<strong>Opomba</strong>: neuspeÅ¡na iskanja velikokrat povzroÄijo iskanja vsakdanjih besed kot sta \"imeti\" in \"iz\", katera niso vneÅ¡ena v seznam, ali navajanja veÄ iskalnih izrazov (v izidu se bodo pojavile samo strani, ki vsebujejo iskalne izraze).",
"powersearch" => "Iskanje",
"powersearchtext" => "
-Iskanje v imenskem prostoru :<br>
-$1<br>
+Iskanje v imenskem prostoru :<br />
+$1<br />
$2 Seznam se preusmerja Iskanje za $3 $9",
"searchdisabled" => "<p>Oprostite! Iskanje po celotni bazi je zaradi hitrejÅ¡ega delovanja Wikipedije trenutno onomogoÄena. Lahko pa se poslužite z Googlovim iskalnikom.</p>
@@ -433,7 +442,7 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Iskanje z Googlom\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br>
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br />
</font>
</td></tr></TABLE>
</FORM>
@@ -607,7 +616,7 @@ izdelana in kdo jo je izdelal ali karkoli bi Å¡e vedeli o njej.",
"deleteimgcompletely" => "bri",
"imghistlegend" => "Napotek: (tre) = trenutna slika, (bri) = briši
zadnjo inaÄico, (vrn) = vrni sliko na to zadnjo inaÄico.
-<br><i>Klikni na datum, da vidiš katera slika je bila tedaj naložena</i>.",
+<br /><i>Klikni na datum, da vidiš katera slika je bila tedaj naložena</i>.",
"imagelinks" => "Povezave slike",
"linkstoimage" => "Naslednje strani so vezane s to sliko:",
"nolinkstoimage" => "Nobena stran ni vezana s to sliko.",
@@ -634,9 +643,9 @@ na eno urejevanje.",
"maintenancebacklink" => "Nazaj na vzdrževalno stran",
"disambiguations" => "Razjasnjevalne strani",
"disambiguationspage" => "Wikipedija:Povezave_na_razjasnjevalne_strani",
-"disambiguationstext" => "Naslednji Älanki so povezani na <i>razjasnjevalno stran</i>. Morajo biti povezani na pripadajoÄo vsebino.<br>Stran je razjasnjevalna, Äe je povezana iz $1.<br>Povezave iz drugih imenskih podroÄij tukaj <i>niso</i> prikazane.",
+"disambiguationstext" => "Naslednji Älanki so povezani na <i>razjasnjevalno stran</i>. Morajo biti povezani na pripadajoÄo vsebino.<br />Stran je razjasnjevalna, Äe je povezana iz $1.<br />Povezave iz drugih imenskih podroÄij tukaj <i>niso</i> prikazane.",
"doubleredirects" => "Dvojne preusmeritve",
-"doubleredirectstext" => "<b>Pozor:</b> ta seznam lahko vsebuje nepravilne Älene. To ponavadi pomeni, da obstaja dodatno besedilo s povezavami pod prvim ukazom #REDIRECT.<br>\nVsaka vrsta vsebuje povezave k prvi in drugi preusmeritvi, kot tudi prvo vrstico drugega preusmerjenega besedila, kar ponavadi da \"resniÄni\" ciljni Älanek, na katerega mora kazati prva preusmeritev.",
+"doubleredirectstext" => "<b>Pozor:</b> ta seznam lahko vsebuje nepravilne Älene. To ponavadi pomeni, da obstaja dodatno besedilo s povezavami pod prvim ukazom #REDIRECT.<br />\nVsaka vrsta vsebuje povezave k prvi in drugi preusmeritvi, kot tudi prvo vrstico drugega preusmerjenega besedila, kar ponavadi da \"resniÄni\" ciljni Älanek, na katerega mora kazati prva preusmeritev.",
"brokenredirects" => "Polomljene preusmeritve",
"brokenredirectstext" => "Naslednje preusmeritve kažejo na neobstojeÄe Älanke.",
"selflinks" => "strani z lastnimi povezavami",
@@ -808,7 +817,7 @@ Vnesi razloge spodaj (na primer z navedbo doloÄenih strani, ki so jih po nepotr
"noblockreason" => "Morate navesti razlog prekinitve.",
"blockipsuccesssub" => "Prekinitev je uspela",
"blockipsuccesstext" => "IP naslov \"$1\" je prekinjen.
-<br>Glej [[Posebno:Ipseznamprekinitev|seznam prekinitev IP]] za pregled prekinitev.",
+<br />Glej [[Posebno:Ipseznamprekinitev|seznam prekinitev IP]] za pregled prekinitev.",
"unblockip" => "Poveži IP naslov",
"unblockiptext" => "Uporabi spodnjo obliko za obnovitev dostopa zapisa prejšnjega prekinjenega IP naslova.",
"ipusubmit" => "Poveži ta naslov",
@@ -837,7 +846,7 @@ Prosimo potrdite vaÅ¡ resniÄni namen.",
"lockdbsuccesssub" => "Zaklenitev podatkovne baze je uspela",
"unlockdbsuccesssub" => "Podatkovna baza je odklenjena",
"lockdbsuccesstext" => "Podatkovna baza Wikipedije je bila zaklenjena.
-<br>Ne pozabite odkleniti, ko boste konÄali z vzdrževanjem.",
+<br />Ne pozabite odkleniti, ko boste konÄali z vzdrževanjem.",
"unlockdbsuccesstext" => "Podatkovna baza Wikipedije je bila odklenjena.",
# SQL query
diff --git a/languages/LanguageSq.php b/languages/LanguageSq.php
index d9a856eaf5bc..7a300fa6cde2 100644
--- a/languages/LanguageSq.php
+++ b/languages/LanguageSq.php
@@ -23,8 +23,11 @@ require_once("LanguageUtf8.php");
7 => "Figura_diskutim",
8 => "MediaWiki",
9 => "MediaWiki_diskutim",
- 10 => "Template",
- 11 => "Template_talk"
+ 10 => "Stampa",
+ 11 => "Stampa_diskutim",
+ NS_HELP => 'Ndihmë',
+ NS_HELP_TALK => 'Ndihmë_diskutim',
+
) + $wgNamespaceNamesEn;
@@ -122,8 +125,8 @@ require_once("LanguageUtf8.php");
"tog-showtoolbar" => "Show edit toolbar",
"tog-editondblclick" => "Redakto faqet me dopjo-shtypje (JavaScript)",
"tog-editsection"=>"Lejo redaktimin e seksioneve me [redakto] lidhje",
-"tog-editsectiononrightclick"=>"Lejo redaktimin e seksioneve me djathtas-shtypje<br> mbi emrin e seksionit (JavaScript)",
-"tog-showtoc"=>"Trego tabelën e përmbajtjeve<br>(për faqet me më shume se 3 tituj)",
+"tog-editsectiononrightclick"=>"Lejo redaktimin e seksioneve me djathtas-shtypje<br /> mbi emrin e seksionit (JavaScript)",
+"tog-showtoc"=>"Trego tabelën e përmbajtjeve<br />(për faqet me më shume se 3 tituj)",
"tog-rememberpassword" => "Mbaj mënd fjalëkalimin për vizitën e ardhshme",
"tog-editwidth" => "Kutija e redaktimit ka gjerësi te plotë",
"tog-watchdefault" => "Shto faqet që redakton tek lista mbikqyrëse",
@@ -324,13 +327,13 @@ Mos harro të vendosësh preferimet e tua të uikipedias.",
"yourpasswordagain" => "Fut fjalëkalimin përsëri",
"newusersonly" => " (përdoruesit e rinj vetëm)",
"remembermypassword" => "Mbaj mënd fjalëkalimin tim për tërë vizitat e ardhshme.",
-"loginproblem" => "<b>Kishte një problem me hyrjen tënde.</b><br>Provoje përsëri!",
-"alreadyloggedin" => "<font color=red><b>Përdorues $1, ti ke hyrë brënda më parë!</b></font><br>\n",
+"loginproblem" => "<b>Kishte një problem me hyrjen tënde.</b><br />Provoje përsëri!",
+"alreadyloggedin" => "<font color=red><b>Përdorues $1, ti ke hyrë brënda më parë!</b></font><br />\n",
"areyounew" => "N.q.s. je një përdorues i ri i $wgSitename dhe do të hapësh një llogari,
fut një emër, pastaj fut një fjalëkalim dy herë.
Adresa jote e email-it nuk është e detyrueshme; n.q.s. ti harron fjalëkalimin mund të kërkosh që
-ta dergojme tek adresa që na dhe.<br>\n",
+ta dergojme tek adresa që na dhe.<br />\n",
"login" => "Hyrje",
"userlogin" => "Hyrje",
@@ -373,7 +376,7 @@ Hyni përsëri mbasi ta kesh marrë.",
"showpreview" => "Trego parashikimin",
"blockedtitle" => "Përdoruesi është bllokuar",
"blockedtext" => "Emri yt ose adresa e IP-së është bllokuar nga $1.
-Arsyeja e dhënë është kjo:<br>''$2''<p>Mund të kontaktosh $1 ose një nga
+Arsyeja e dhënë është kjo:<br />''$2''<p>Mund të kontaktosh $1 ose një nga
[[$wgMetaNamespace:Administruesit|administruesit]] e tjerë për të diskutuar bllokimin.
Vë re, nuk mund të përdorësh \"dërgoji email këtij përdoruesi\" n.q.s. nuk ke një adresë të saktë
@@ -420,7 +423,7 @@ Në qoftë se e ruan, çdo ndryshim i bërë deri tani do të humbet.</strong>\n
të konsideruara të dhëna nën liçensën GNU Free Documentation License
(shiko $1 për detaje).
Në qoftë se nuk dëshiron që kontributet e tua të redaktohen pa mëshirë dhe të jepen
-kudo, atëherë mos i jep këtu.<br>
+kudo, atëherë mos i jep këtu.<br />
Gjithashtu, ti po na premton që i ke shkruajtur vetë këto, ose i ke kopjuar nga një
vënd public (public domain) ose diçka e ngjashme e lirë.
<strong>MOS JEPNI PUNIME QE JANE NEN COPYRIGHT PA PASUR LEJE!</strong>",
@@ -490,8 +493,8 @@ të cilat nuk janë të futura në rregjistër, ose duke dhënë më shumë se n
që i kanë të gjitha ato fjalë do të tregohen si rezultate).",
"powersearch" => "Kërko",
"powersearchtext" => "
-Kërko në hapësirën:<br>
-$1<br>
+Kërko në hapësirën:<br />
+$1<br />
$2 Lidhje ridrejtuese &nbsp; Kërko për $3 $9",
"searchdisabled" => "<p>Kërkim me tekst të plotë është bllokuar tani për tani ngaqë
shërbyesi është shumë i ngarkuar; shpresojmë ta nxjerrim prapë në gjëndje normale mbas disa punimeve.
@@ -509,9 +512,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Kërkim me Google\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio
name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch
-value=\"{$wgServer}\" checked> {$wgServer} <br>
+value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -684,7 +687,7 @@ tjetër që na duhet të dimë për të.",
"deleteimgcompletely" => "gris",
"imghistlegend" => "Legjendë: (tani) = ky është skedari i tanishëm, (gris) = grise
këtë version të vjetër, (ktheje) = ktheje në këtë version të vjetër.
-<br><i>Shtyp datën për të parë skedarin e dhënë në atë ditë</i>.",
+<br /><i>Shtyp datën për të parë skedarin e dhënë në atë ditë</i>.",
"imagelinks" => "Lidhje skedarësh",
"linkstoimage" => "Këto faqe lidhen tek ky skedar:",
"nolinkstoimage" => "Nuk ka asnjë faqe që të lidhet tek ky skedar.",
@@ -715,11 +718,11 @@ rregjistrin, kështuqë mos e fresko faqen mbas çdo ndryshimi ;-)",
"disambiguationspage" => "$wgMetaNamespace:Lidhje_tek_faqe_qartësuese",
"disambiguationstext" => "Artikujt që vijojnë lidhen tek një <i>faqe qartësuese</i>. Ato duhet të lidhen tek tema e përshtatshme
-<br>Një faqe trajtohet si qartësuese lidhet nga $1.<br>Lidhje nga hapësira të tjera <i>nuk</i> jepen këtu.",
+<br />Një faqe trajtohet si qartësuese lidhet nga $1.<br />Lidhje nga hapësira të tjera <i>nuk</i> jepen këtu.",
"doubleredirects" => "Dopjo ridrejtime",
"doubleredirectstext" => "<b>Kujdes:</b> Kjo listë mund të ketë lidhje gabim. D.m.th. ka tekst dhe lidhje mbas #REDIRECT-it të parë.
-<br>\nÇdo rresht ka lidhje tek ridrejtimi i parë dhe i dytë, gjithashtu ka edhe rreshtin e parë të tekstit të ridrejtimit të dytë,
+<br />\nÇdo rresht ka lidhje tek ridrejtimi i parë dhe i dytë, gjithashtu ka edhe rreshtin e parë të tekstit të ridrejtimit të dytë,
duke dhënë dhe artikullin e \"vërtetë\", me të cilin ridrejtimi i parë duhet të lidhet.",
"brokenredirects" => "Ridrejtime të prishura",
@@ -938,7 +941,7 @@ vandalizuan).",
"noblockreason" => "Duhet të japësh një arsye për bllokimin.",
"blockipsuccesssub" => "Bllokimi u bë me sukses",
"blockipsuccesstext" => "\"$1\" është bllokuar.
-<br>Shiko [[Speciale:Ipblocklist|IP blloko listë]] për të parë bllokimet.",
+<br />Shiko [[Speciale:Ipblocklist|IP blloko listë]] për të parë bllokimet.",
"unblockip" => "Ç'blloko përdoruesin",
"unblockiptext" => "Përdor formularin e më poshtëm për t'i ridhënë leje shkrimi
një përdoruesi ose IP adreseje të bllokuar.",
@@ -972,7 +975,7 @@ Të lutem konfirmo që me vërte do të kryesh këtë veprim.",
"lockdbsuccesssub" => "Rregjistri u bllokua me sukses",
"unlockdbsuccesssub" => "Rregjistri u ç'bllokua me sukses",
"lockdbsuccesstext" => "Rregjistri i $wgSitename është bllokuar.
-<br>Kujtohu ta ç'bllokosh mbasi të kesh mbaruar mirëmbajtjen.",
+<br />Kujtohu ta ç'bllokosh mbasi të kesh mbaruar mirëmbajtjen.",
"unlockdbsuccesstext" => "Rregjistri i $wgSitename është ç'bllokuar.",
# SQL query
diff --git a/languages/LanguageSr.php b/languages/LanguageSr.php
index 369bdd6d2769..5ed09caa7981 100644
--- a/languages/LanguageSr.php
+++ b/languages/LanguageSr.php
@@ -128,8 +128,8 @@ require_once( "LanguageUtf8.php" );
"tog-showtoolbar" => "Show edit toolbar",
"tog-editondblclick" => "Мењај Ñтранице двоÑтруким кликом (захтева JavaScript)",
"tog-editsection"=>"Омогући измену делова [мењај] везама",
-"tog-editsectiononrightclick"=>"Омогући измену делова деÑним кликом<br> на њихове наÑлове (захтева JavaScript)",
-"tog-showtoc"=>"Прикажи Ñадржај<br>(у Ñвим чланцима Ñа више од три поднаÑлова)",
+"tog-editsectiononrightclick"=>"Омогући измену делова деÑним кликом<br /> на њихове наÑлове (захтева JavaScript)",
+"tog-showtoc"=>"Прикажи Ñадржај<br />(у Ñвим чланцима Ñа више од три поднаÑлова)",
"tog-rememberpassword" => "Памти шифру кроз више ÑеанÑи",
"tog-editwidth" => "Поље за измене има пуну ширину",
"tog-watchdefault" => "Додај Ñтранице које мењам у мој ÑпиÑак гледања",
@@ -335,8 +335,8 @@ MySQL је вратио грешку \"$3: $4\".\n",
"yourpasswordagain" => "Поново укуцајте шифру",
"newusersonly" => " (Ñамо за нове кориÑнике)",
"remembermypassword" => "Запамти моју шифру током више ÑеанÑи.",
-"loginproblem" => "<b>Било је проблема Ñа вашим пријављивањем.</b><br>Пробајте поново!",
-"alreadyloggedin" => "<font color=red><b>КориÑниче $1, већ Ñте пријављени!</b></font><br>\n",
+"loginproblem" => "<b>Било је проблема Ñа вашим пријављивањем.</b><br />Пробајте поново!",
+"alreadyloggedin" => "<font color=red><b>КориÑниче $1, већ Ñте пријављени!</b></font><br />\n",
"login" => "Пријави Ñе",
"userlogin" => "Пријави Ñе",
@@ -382,7 +382,7 @@ Sada biste trebali da se ulogujete i promenite svoju sifru.",
"showpreview" => "Прикажи предпреглед",
"blockedtitle" => "КориÑник је блокиран",
"blockedtext" => "Ваше кориÑничко име или ИП адреÑа је блокирана од Ñтране $1.
-Дати разлог је Ñледећи:<br>''$2''<p>Можете Ñе обратити $1 или неком другом
+Дати разлог је Ñледећи:<br />''$2''<p>Можете Ñе обратити $1 или неком другом
[[Википедија:админиÑтратори|админиÑтратору]] да биÑте разговарали о блокади.",
"whitelistedittitle" => "Обавезно је пријављивање за мењање",
"whitelistedittext" => "Морате да Ñе [[ПоÑебно:Пријављивање|пријавите]] да биÑте мењали чланке.",
@@ -425,7 +425,7 @@ Sada biste trebali da se ulogujete i promenite svoju sifru.",
Ñматра да је објављен под ГÐУ лиценцом за Ñлободну документацију
(погледајте $1 за детаље).
Ðко не желите да Ñе ваше пиÑање мења и редиÑтрибуира
-без ограничења, онда га немојте Ñлати овде.<br>
+без ограничења, онда га немојте Ñлати овде.<br />
Такође нам обећавате да Ñте га Ñами напиÑали, или иÑкопирали из
извора који је у јавном влаÑништву или Ñличног Ñлободног извора.
<strong>ÐЕ ШÐЉИТЕ РÐД ЗÐШТИЋЕРÐУТОРСКИМ ПРÐВИМРБЕЗ ДОЗВОЛЕ!</strong>",
@@ -493,8 +493,8 @@ Sada biste trebali da se ulogujete i promenite svoju sifru.",
које Ñадрже Ñве изразе који Ñе траже ће Ñе појавити у резултату).",
"powersearch" => "Тражи",
"powersearchtext" => "
-Претрага и уменÑким проÑторима:<br>
-$1<br>
+Претрага и уменÑким проÑторима:<br />
+$1<br />
$2 ИзлиÑтај преуÑмерења &nbsp; Тражи $3 $9",
"searchdisabled" => "<p>Жалимо! Пуна претрага текÑта је привремено онемогућена, због бржег рада Википедије. Умеђувремену, можете кориÑтити Гугле претрагу иÑпод, која може бити заÑтарела.</p>
@@ -513,7 +513,7 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"\">
<INPUT type=submit name=btnG VALUE=\"Гугле претрага\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br>
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br />
</font>
</td></tr></TABLE>
</FORM>
@@ -702,7 +702,7 @@ or '''<nowiki>[[media:file.ogg]]</nowiki>''' за звукове.
"deleteimgcompletely" => "обр",
"imghistlegend" => "Објашњење: (трен) = ово је тренутна Ñлика, (обр) = обриши
ову Ñтару верзију, (врт) = врати на ову Ñтару верзију.
-<br><i>Кликните на датум давидите Ñлику поÑлату тог датума</i>.",
+<br /><i>Кликните на датум давидите Ñлику поÑлату тог датума</i>.",
"imagelinks" => "Употреба Ñлике",
"linkstoimage" => "Следеће Ñтранице кориÑте на ову Ñлику:",
"nolinkstoimage" => "Ðема Ñтраница које кориÑте ову Ñлику.",
@@ -730,9 +730,9 @@ or '''<nowiki>[[media:file.ogg]]</nowiki>''' за звукове.
"maintenancebacklink" => "Ðазад на Ñтраницу за одржавање",
"disambiguations" => "Странице за обездвоÑмишљење",
"disambiguationspage" => "Википедија:Линкови_на_Ñтранице_за_обезвоÑмишљење",
-"disambiguationstext" => "Следећи чланци Ñе повезују Ñа <i>Ñтраницом за обездвоÑмишљење</i>. УмеÑто тога, они би требали да Ñе повезују Ñа одговарајућом темом.<br>Страница Ñе третира као обездвоÑмишљенÑка ако је повезана Ñа $1.<br>Линкови из оÑталих именÑких проÑтора <i>ниÑу</i> наведени овде.",
+"disambiguationstext" => "Следећи чланци Ñе повезују Ñа <i>Ñтраницом за обездвоÑмишљење</i>. УмеÑто тога, они би требали да Ñе повезују Ñа одговарајућом темом.<br />Страница Ñе третира као обездвоÑмишљенÑка ако је повезана Ñа $1.<br />Линкови из оÑталих именÑких проÑтора <i>ниÑу</i> наведени овде.",
"doubleredirects" => "ДвоÑтрука преуÑмерења",
-"doubleredirectstext" => "<b>Пажња:</b> Овај ÑпиÑак може да Ñадржи лажне резултате. То обично значи да поÑтоји додатни текÑÑ‚ Ñа везама иÑпод првог #REDIRECT.<br>\nСваки ред Ñадржи везе на прво и друго преуÑмерење, као и на прву линију текÑта другог преуÑмерења, што обично даје \"прави\" циљни чланак, на који би прво преуÑмерење и требало да показује.",
+"doubleredirectstext" => "<b>Пажња:</b> Овај ÑпиÑак може да Ñадржи лажне резултате. То обично значи да поÑтоји додатни текÑÑ‚ Ñа везама иÑпод првог #REDIRECT.<br />\nСваки ред Ñадржи везе на прво и друго преуÑмерење, као и на прву линију текÑта другог преуÑмерења, што обично даје \"прави\" циљни чланак, на који би прво преуÑмерење и требало да показује.",
"brokenredirects" => "Покварена преуÑмерења",
"brokenredirectstext" => "Следећа преуÑмерења Ñу повезана на непоÑтојећи чланак.",
"selflinks" => "Странице Ñа Ñамовезама",
@@ -948,7 +948,7 @@ $3...
"noblockreason" => "Морате дати разлог за обуздавање.",
"blockipsuccesssub" => "Обуздавање је уÑпело",
"blockipsuccesstext" => "\"$1\" је обуздан.
-<br>Погледајте [[ПоÑебно:ИПÑпиÑакаобузданих|ИП ÑпиÑак обузданих]] за преглед обуздавања.",
+<br />Погледајте [[ПоÑебно:ИПÑпиÑакаобузданих|ИП ÑпиÑак обузданих]] за преглед обуздавања.",
"unblockip" => "ОтпуÑти кориÑника",
"unblockiptext" => "Употребите доњи упитник да биÑÑ‚ вратили право пиÑања
раније обузданој ИП адреÑи или кориÑничком имену.",
@@ -987,7 +987,7 @@ $3...
"lockdbsuccesssub" => "База је закључана",
"unlockdbsuccesssub" => "База је откључана",
"lockdbsuccesstext" => "Википедијина база података је закључана.
-<br>Сетите Ñе да је откључате када завршите Ñа одржавањем.",
+<br />Сетите Ñе да је откључате када завршите Ñа одржавањем.",
"unlockdbsuccesstext" => "Википедијина база података је откључана.",
# SQL query
diff --git a/languages/LanguageSv.php b/languages/LanguageSv.php
index 3883071e6e3b..cd5ee973bf58 100644
--- a/languages/LanguageSv.php
+++ b/languages/LanguageSv.php
@@ -362,8 +362,8 @@ igen som samma eller annan användare.\n",
"yourpasswordagain" => "Upprepa lösenord",
"newusersonly" => " (bara för nya användare)",
"remembermypassword" => "Kom ihåg mitt lösenord till nästa gång.",
-"loginproblem" => "<b>Det var svårt att logga in dig .</b><br>Pröva igen!",
-"alreadyloggedin" => "<font color=red><b>Användare $1, du är redan inloggad !</b></font><br>\n",
+"loginproblem" => "<b>Det var svårt att logga in dig .</b><br />Pröva igen!",
+"alreadyloggedin" => "<font color=red><b>Användare $1, du är redan inloggad !</b></font><br />\n",
"login" => "Logga in",
"userlogin" => "Logga in",
@@ -404,7 +404,7 @@ Var snäll och logga in igen när du fått meddelandet.",
"showpreview" => "Visa förhandgranskning",
"blockedtitle" => "Användaren är spärrad",
"blockedtext" => "Ditt användarnamn har blivit spärrat av $1.
-Anledning är att:<br>''$2''<p>Ta kontakt med $1 eller en av de andra
+Anledning är att:<br />''$2''<p>Ta kontakt med $1 eller en av de andra
[[Wikipedia:Administratörer|administratörerna]] för att diskutera varför du blivit spärrad", // "
"newarticle" => "(Ny)",
"newarticletext" => "Du har klickat på en röd länk, en sida som inte finns ännu. Du kan hjälpa till genom att själv skriva vad du vet om ämnet i fältet nedan. Om du inte vill skriva något kan du bara trycka på \"tillbaka\" i din webbläsare.",
@@ -431,7 +431,7 @@ av den här sidan. Om du sparar den, kommer alla ändringar på denns sida före
"copyrightwarning" => "Observera att alla bidrag till Wikipedia är
att betrakta som utgivna under GNU Free Documentation License
(se $1 för detaljer).
-Om du inte vill ha din text redigerad och kopierad efter andras gottfinnade så skall du inte skriva någon text här.<br>
+Om du inte vill ha din text redigerad och kopierad efter andras gottfinnade så skall du inte skriva någon text här.<br />
Du lovar oss också att du skrev texten själv, eller kopierade från public domain eller liknande fri resurs.<BR>
<strong>LÄGG ALDRIG UT UPPHOVSRÄTTSSKYDDAT MATERIAL HÄR UTAN FÖRFATTARENS TILLÅTELSE!</strong>",
@@ -493,8 +493,8 @@ vilka inte indexeras, eller att specificera flera sökord (bara
sidor som innehåller alla sökorden hittas).",
"powersearch" => "Sök",
"powersearchtext" => "
-Sök i namnutrymme :<br>
-$1<br>
+Sök i namnutrymme :<br />
+$1<br />
$2 List redirects &nbsp; Sök efter $3 $9",
@@ -640,7 +640,7 @@ när den skapades och vem som gjort den och allt annat du vet om den.",
"deleteimgcompletely" => "radera",
"imghistlegend" => "Legend: (nuvarande) = detta är den nuvarande bilden,
(ta bort) = ta bort den gamla version, (återgå) = återgå till en gammal version.
-<br><i>Klicka på ett datum för att se bilden som laddades upp den dagen</i>.", //"
+<br /><i>Klicka på ett datum för att se bilden som laddades upp den dagen</i>.", //"
"imagelinks" => "Bildlänk",
"linkstoimage" => "De följande sidorna länkar till den här bilden:",
"nolinkstoimage" => "Det finns ingen sida som länkar till den här bilden.",
@@ -668,9 +668,9 @@ och <b>$6</b> sidvisningar per ändring.",
"maintenancebacklink" => "Tillbaka till underhållssidorna",
"disambiguations" => "Sidor med tvetydiga länkar",
"disambiguationspage" => "Wikipedia:Länkar till sidor med tvetydiga titlar",
-"disambiguationstext" => "Följande artiklar länkar till en <i>sidor med tvetydliga titlar</i>. De ska länka till en sidor med en korrekt titel.<br>En sida behandlar som tvetydig om den länkar från $1. <br>Länkar från andra namngrupper är <i>inte</i> listade här.",
+"disambiguationstext" => "Följande artiklar länkar till en <i>sidor med tvetydliga titlar</i>. De ska länka till en sidor med en korrekt titel.<br />En sida behandlar som tvetydig om den länkar från $1. <br />Länkar från andra namngrupper är <i>inte</i> listade här.",
"doubleredirects" => "Dubbla omdirigeringar",
-"doubleredirectstext" => "<b>OBS:</b> Den här listan kan innehålla falska resultat. Detta betyder normalt att det finns ytterligare text under den första #REDIRECT.<br>\n Varje rad innehåller en länk till den första och andra omdirigering och den första raden av den andra omdirigeringen ger oftast den \"riktiga\" artikeln, vilket egentligen den första omdirigeringen ska peka på.",
+"doubleredirectstext" => "<b>OBS:</b> Den här listan kan innehålla falska resultat. Detta betyder normalt att det finns ytterligare text under den första #REDIRECT.<br />\n Varje rad innehåller en länk till den första och andra omdirigering och den första raden av den andra omdirigeringen ger oftast den \"riktiga\" artikeln, vilket egentligen den första omdirigeringen ska peka på.",
"brokenredirects" => "DÃ¥liga omdirigeringar",
"brokenredirectstext" => "Följande länkar omdirigerar till en artikel som inte existerar.",
"selflinks" => "Sidor med länkar till sig själva",
@@ -851,7 +851,7 @@ Fyll i anledningen till blockering nedan (till exempel vilka artiklar som klottr
"noblockreason" => "Du måste ange en anledning till varför du blockerar.",
"blockipsuccesssub" => "Blockeringen lyckades",
"blockipsuccesstext" => "IP-adressen \"$1\" har blockerats.
-<br>Se [[Speciel:Ipblocklist|IP blockeringslistan]] för alla blockeringar.",
+<br />Se [[Speciel:Ipblocklist|IP blockeringslistan]] för alla blockeringar.",
"unblockip" => "Ta bort blockering av IP-adress",
"unblockiptext" => "Använd nedanstående formulär för att återställa skrivrättigheten för en tidigare blockerad IP-adress.",
"ipusubmit" => "Ta bort blockering för den här adressen",
@@ -879,7 +879,7 @@ Bekräfta att du vill göra detta.",
"lockdbsuccesssub" => "Databasen har låsts",
"unlockdbsuccesssub" => "Databasen har låsts upp",
"lockdbsuccesstext" => "Wikipediadatabasen är låst.
-<br>Kom ihåg att ta bort låsningen när du är färdig med ditt underhåll.",
+<br />Kom ihåg att ta bort låsningen när du är färdig med ditt underhåll.",
"unlockdbsuccesstext" => "Wikipediadatabasen är upplåst.",
// SQL query
diff --git a/languages/LanguageTa.php b/languages/LanguageTa.php
index 7e97ff88c70a..33355942fa97 100644
--- a/languages/LanguageTa.php
+++ b/languages/LanguageTa.php
@@ -148,7 +148,7 @@ require_once( "LanguageUtf8.php" );
"tog-editondblclick" => "இரடà¯à®Ÿà¯ˆà®šà¯ சொடà¯à®•à¯à®•à®¿à®²à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தொக௠(ஜாவாஸà¯à®•à®¿à®°à®¿à®ªà¯à®Ÿà¯)",
"tog-editsection"=>"இணைபà¯à®ªà¯à®µà®´à®¿ (தொகà¯à®ªà¯à®ªà¯) பிரிவà¯à®¤à¯ தொகà¯à®ªà¯à®ªà¯ˆ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯",
"tog-editsectiononrightclick"=>"வலச௠சொடà¯à®•à¯à®•à¯à®µà®´à®¿ பிரிவà¯à®¤à¯ தலைபà¯à®ªà¯ தொகà¯à®ªà¯à®ªà®¤à¯ˆ செயல௠படà¯à®¤à¯à®¤à¯ (ஜாவாஸà¯à®•à®¿à®°à®¿à®ªà¯à®Ÿà¯)",
-"tog-showtoc"=>"உளà¯à®³à®Ÿà®•à¯à®• அடà¯à®Ÿà®µà®£à¯ˆà®¯à¯ˆà®•à¯ காணà¯à®ªà®¿<br>(மூனà¯à®±à¯à®•à¯à®•à¯ மேறà¯à®ªà®Ÿà¯à®Ÿ தலைபà¯à®ªà¯à®•à®³à¯ˆà®¯à¯à®Ÿà¯ˆà®¯ கடà¯à®Ÿà¯à®°à¯ˆà®•à®³à¯à®•à¯à®•à¯)",
+"tog-showtoc"=>"உளà¯à®³à®Ÿà®•à¯à®• அடà¯à®Ÿà®µà®£à¯ˆà®¯à¯ˆà®•à¯ காணà¯à®ªà®¿<br />(மூனà¯à®±à¯à®•à¯à®•à¯ மேறà¯à®ªà®Ÿà¯à®Ÿ தலைபà¯à®ªà¯à®•à®³à¯ˆà®¯à¯à®Ÿà¯ˆà®¯ கடà¯à®Ÿà¯à®°à¯ˆà®•à®³à¯à®•à¯à®•à¯)",
"tog-rememberpassword" => "அமரà¯à®µà¯à®•à®³à¯à®•à¯à®•à¯ இடையே கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ ஞாபகதà¯à®¤à®¿à®²à¯ வைதà¯à®¤à¯à®•à¯à®•à¯Šà®³à¯",
"tog-editwidth" => "தொகà¯à®ªà¯à®ªà¯à®•à¯ கடà¯à®Ÿà®®à¯ à®®à¯à®´à¯ அகலதà¯à®¤à¯ˆà®•à¯ கொணà¯à®Ÿà®¤à¯",
"tog-watchdefault" => "நீஙà¯à®•à®³à¯ தொகà¯à®¤à¯à®¤ பகà¯à®•à®™à¯à®•à®³à¯ˆ, உஙà¯à®•à®³à¯ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯(watchlist) சேரà¯à®™à¯à®•à®³à¯",
@@ -321,8 +321,8 @@ MySQL returned error \"$3: $4\".\n",
"badtitletext" => "கோரபà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ தலைபà¯à®ªà¯ செலà¯à®²à®¾à®¤à¯, வெறà¯à®®à¯ˆ, அலà¯à®²à®¤à¯ பிழையாக இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ மொழிகளிடை அலà¯à®²à®¤à¯ விகà¯à®•à®¿à®¯à®¿à®Ÿà¯ˆà®¤à¯ தலைபà¯à®ªà®¾à®•à¯à®®à¯.",
"perfdisabled" => "மனà¯à®©à®¿à®•à¯à®•à®µà¯à®®à¯! இநà¯à®¤ வசதி தறà¯à®•à®¾à®²à®¿à®•à®®à®¾à®• செயலறà¯à®±à®¤à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. à®à®©à¯†à®©à®¿à®²à¯ இத௠விகà¯à®•à®¿à®¯à¯ˆ à®’à®°à¯à®µà®°à¯à®®à¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®¾à®¤ அளவà¯à®•à¯à®•à¯ வேகதà¯à®¤à¯ˆà®•à¯ கà¯à®±à¯ˆà®¤à¯à®¤à¯à®³à¯à®³à®¤à¯.",
"perfdisabledsub" => "இதோ $1: இலிரà¯à®¨à¯à®¤à¯ ஒர௠சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ ஒர௠நகலà¯",
-"wrong_wfQuery_params" => "பிழையான அளபà¯à®°à¯à®•à¯à®•à®³à¯(parameters) wfQuery()<br>
-செயல௠(Function): $1<br>
+"wrong_wfQuery_params" => "பிழையான அளபà¯à®°à¯à®•à¯à®•à®³à¯(parameters) wfQuery()<br />
+செயல௠(Function): $1<br />
வினவல௠(Query): $2
",
"viewsource" => "மூலதà¯à®¤à¯ˆà®ªà¯ பாரà¯",
@@ -417,7 +417,7 @@ Note to AOL users
"yourdiff" => "விதà¯à®¤à®¿à®¯à®¾à®šà®™à¯à®•à®³à¯",
"copyrightwarning" => "விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾à®µà¯à®•à¯à®•à®¾à®© ஆகà¯à®•à®™à¯à®•à®³à¯ அனைதà¯à®¤à¯à®®à¯ ஜிஎனà¯à®¯à¯‚ விடà¯à®¤à®²à¯ˆ மனபà¯à®ªà®¾à®™à¯à®•à¯Šà®Ÿà¯ உரà¯à®µà®¾à®© ஆவண அனà¯à®®à®¤à®¿ (GNU Free Documentation License) à®®à¯à®±à¯ˆà®¯à®¿à®©à¯ கீழ௠வழஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®¾à®•à®µà¯‡ கரà¯à®¤à®ªà¯à®ªà®Ÿà¯à®®à¯ எனà¯à®ªà®¤à¯ˆà®¤à¯ தயவ௠செயà¯à®¤à¯ கவனிகà¯à®•à®µà¯à®®à¯. (விபரஙà¯à®•à®³à¯à®•à¯à®•à¯ $1 à®à®ªà¯ பாரà¯à®•à¯à®•).
-உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ கடà¯à®®à¯ˆà®¯à®¾à®•à®¤à¯ தொகà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à¯ˆà®¯à¯‹, விரà¯à®®à¯à®ªà®¿à®¯à®ªà®Ÿà®¿ விநியோகிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à¯ˆà®¯à¯‹ நீஙà¯à®•à®³à¯ விரà¯à®®à¯à®ªà®¾à®µà®¿à®Ÿà®¿à®²à¯ இஙà¯à®•à¯‡ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•à®¾à®¤à¯€à®°à¯.<br>
+உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ கடà¯à®®à¯ˆà®¯à®¾à®•à®¤à¯ தொகà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à¯ˆà®¯à¯‹, விரà¯à®®à¯à®ªà®¿à®¯à®ªà®Ÿà®¿ விநியோகிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à¯ˆà®¯à¯‹ நீஙà¯à®•à®³à¯ விரà¯à®®à¯à®ªà®¾à®µà®¿à®Ÿà®¿à®²à¯ இஙà¯à®•à¯‡ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•à®¾à®¤à¯€à®°à¯.<br />
அதà¯à®¤à¯à®Ÿà®©à¯ நீஙà¯à®•à®³à¯‡ இதை எழà¯à®¤à®¿à®¯à®¤à®¾à®•à®µà¯‹, அலà¯à®²à®¤à¯ வேற௠பொதà¯à®•à¯ களம௠(domain) அலà¯à®²à®¤à¯ அத௠போனà¯à®± விடà¯à®¤à®²à¯ˆà®¯à®³à®¿à®•à¯à®•à¯à®®à¯ மூலஙà¯à®•à®³à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ பிரதி பணà¯à®£à®¿à®¯à®¿à®°à¯à®ªà¯à®ªà®¤à®¾à®•à®µà¯‹ உறà¯à®¤à®¿ கூறà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯.
<strong>பதிபà¯à®ªà¯à®°à®¿à®®à¯ˆà®¯à¯à®³à¯à®³ ஆகà¯à®•à®™à¯à®•à®³à¯ˆ அனà¯à®®à®¤à®¿à®¯à®¿à®©à¯à®±à®¿ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®• வேணà¯à®Ÿà®¾à®®à¯!</strong>",
"longpagewarning" => "எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: இநà¯à®¤à®ªà¯ பகà¯à®•à®®à¯ $1 கிலோபைடà¯à®¸à¯ நீளமானதà¯; 32kb யை அணà¯à®®à®¿à®•à¯à®•à¯à®®à¯ அலà¯à®²à®¤à¯ அதிலà¯à®®à¯ கூடிய அளவà¯à®³à¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தொகà¯à®ªà¯à®ªà®¤à®¿à®²à¯ சில உலாவிகளà¯à®•à¯à®•à¯ (browsers) பிரசà¯à®šà®¿à®©à¯ˆ உணà¯à®Ÿà¯.
@@ -474,8 +474,8 @@ Note to AOL users
"nonefound" => "<strong>கà¯à®±à®¿à®ªà¯à®ªà¯</strong>: \"have\", \"from\" போனà¯à®± பொதà¯à®µà®¾à®©, அடà¯à®Ÿà®µà®£à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤, சொறà¯à®•à®³à¯ˆà®¤à¯ தேடà¯à®®à¯à®ªà¯‹à®¤à¯‹ அலà¯à®²à®¤à¯ ஒனà¯à®±à¯à®•à¯à®•à¯ மேறà¯à®ªà®Ÿà¯à®Ÿ தேடலà¯à®•à¯à®•à®¾à®© சொறà¯à®•à®³à¯ˆà®•à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®®à¯ போதோதான௠(எலà¯à®²à®¾à®¤à¯ தேடà¯à®¤à®²à¯à®•à¯à®•à®¾à®© சொறà¯à®•à®³à¯ˆà®¯à¯à®®à¯ கொணà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯ மடà¯à®Ÿà¯à®®à¯‡ தேடல௠மà¯à®Ÿà®¿à®µà®¿à®²à¯ காணபà¯à®ªà®Ÿà¯à®®à¯) தேடல௠அடிகà¯à®•à®Ÿà®¿ தோலà¯à®µà®¿à®¯à®¿à®²à¯ à®®à¯à®Ÿà®¿à®•à®¿à®©à¯à®±à®¤à¯.",
"powersearch" => "தேடà¯",
-"powersearchtext" => "பெயரà¯à®µà¯†à®³à®¿à®•à®³à®¿à®²à¯ (namespaces) இல௠தேடà¯à®•:<br>
-$1<br>
+"powersearchtext" => "பெயரà¯à®µà¯†à®³à®¿à®•à®³à®¿à®²à¯ (namespaces) இல௠தேடà¯à®•:<br />
+$1<br />
$2 படà¯à®Ÿà®¿à®¯à®²à¯ &nbsp; $3 $9 கà¯à®•à®¾à®© தேடலை மீளà¯à®µà®´à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•à®¿à®±à®¤à¯",
"searchdisabled" => "<p>மனà¯à®©à®¿à®•à¯à®•à®µà¯à®®à¯! செயறà¯à®¤à®¿à®±à®©à¯ காரணஙà¯à®•à®³à¯à®•à¯à®•à®¾à®• à®®à¯à®´à¯ அளவ௠உரை தேடல௠தறà¯à®•à®¾à®²à®¿à®•à®®à®¾à®• à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. அதà¯à®µà®°à¯ˆ நீஙà¯à®•à®³à¯ கீழேயà¯à®³à¯à®³ கூகிள௠(Google) தேடலைப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à®¾à®®à¯. இத௠சில சமயம௠இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤à®¤à®¾à®¯à¯ இரà¯à®•à¯à®•à®•à¯à®•à¯‚டà¯à®®à¯.</p>
@@ -491,7 +491,7 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"\">
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br>
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -549,7 +549,7 @@ border=\"0\" ALT=\"Google\"></A>
"changes" => "மாறà¯à®±à®™à¯à®•à®³à¯",
"recentchanges" => "அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à¯",
"recentchangestext" =>
-"விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾à®µà¯à®•à¯à®•à¯, மிக அணà¯à®®à¯ˆà®¯à®¿à®²à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ மாறà¯à®±à®™à¯à®•à®³à¯ˆ, இநà¯à®¤à®ªà¯ பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ கணà¯à®Ÿà¯à®ªà®¿à®Ÿà®¿à®•à¯à®•à®µà¯à®®à¯.<br>[[Wikipedia:Welcome,_newcomers|வரà¯à®•, பà¯à®¤à¯ வரà¯à®©à®°à¯à®•à®³à¯‡]]!
+"விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾à®µà¯à®•à¯à®•à¯, மிக அணà¯à®®à¯ˆà®¯à®¿à®²à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ மாறà¯à®±à®™à¯à®•à®³à¯ˆ, இநà¯à®¤à®ªà¯ பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ கணà¯à®Ÿà¯à®ªà®¿à®Ÿà®¿à®•à¯à®•à®µà¯à®®à¯.<br />[[Wikipedia:Welcome,_newcomers|வரà¯à®•, பà¯à®¤à¯ வரà¯à®©à®°à¯à®•à®³à¯‡]]!
தயவà¯à®šà¯†à®¯à¯à®¤à¯ பினà¯à®µà®°à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆ à®’à®°à¯à®®à¯à®±à¯ˆ பாரà¯à®™à¯à®•à®³à¯: [[wikipedia:FAQ|விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾ அடிகà¯à®•à®Ÿà®¿ கேடà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯ கேளà¯à®µà®¿à®•à®³à¯( FAQ)]],
[[Wikipedia:Policies and guidelines|விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾ கொளà¯à®•à¯ˆ]]
(விசேடமாக [[wikipedia:Naming conventions|பெயரிடல௠மரபà¯]],
@@ -646,7 +646,7 @@ border=\"0\" ALT=\"Google\"></A>
"deleteimg" => "நீகà¯à®•à¯",
"deleteimgcompletely" => "நீகà¯à®•à¯",
"imghistlegend" => "கà¯à®±à®¿à®¯à¯€à®Ÿà¯à®Ÿà¯ அடà¯à®Ÿà®µà®£à¯ˆ: (நடபà¯à®ªà¯) = இத௠நடபà¯à®ªà®¿à®²à¯à®³à¯à®³ (current) படிமமà¯, (நீகà¯à®•à¯) = இநà¯à®¤ பழைய பதிபà¯à®ªà¯ˆ நீகà¯à®•à¯, (திரà¯à®®à¯à®ªà¯) = இப௠பழைய பதிபà¯à®ªà¯à®•à¯à®•à¯à®¤à¯ திரà¯à®®à¯à®ªà¯.
-<br><i>அநà¯à®¤à®¤à¯ திகதியில௠பதிவேறà¯à®±à®®à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ படிமஙà¯à®•à®³à¯ˆà®ªà¯ பாரà¯à®ªà¯à®ªà®¤à®±à¯à®•à¯, திகதி மீத௠சொடà¯à®•à¯à®•à®µà¯à®®à¯</i>.",
+<br /><i>அநà¯à®¤à®¤à¯ திகதியில௠பதிவேறà¯à®±à®®à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ படிமஙà¯à®•à®³à¯ˆà®ªà¯ பாரà¯à®ªà¯à®ªà®¤à®±à¯à®•à¯, திகதி மீத௠சொடà¯à®•à¯à®•à®µà¯à®®à¯</i>.",
"imagelinks" => "படிம இணைபà¯à®ªà¯à®•à®³à¯",
"linkstoimage" => "பினà¯à®µà®°à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯ இப௠படிமதà¯à®¤à¯à®•à¯à®•à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©:",
"nolinkstoimage" => "இப௠படிமதà¯à®¤à¯à®•à¯à®•à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ எதà¯à®µà¯à®®à¯ இலà¯à®²à¯ˆ.",
@@ -670,9 +670,9 @@ border=\"0\" ALT=\"Google\"></A>
"maintenancebacklink" => "மீளவà¯à®®à¯ பராமரிபà¯à®ªà¯à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯",
"disambiguations" => "கவரà¯à®ªà®Ÿà¯à®¨à®¿à®²à¯ˆà®¤à¯€à®°à¯ (Disambiguation) பகà¯à®•à®™à¯à®•à®³à¯",
"disambiguationspage" => "விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾:கவரà¯à®ªà®Ÿà¯à®¨à®¿à®²à¯ˆà®¤à¯€à®°à¯_பகà¯à®•_இணைபà¯à®ªà¯à®•à®³à¯",
-"disambiguationstext" => "இக௠கடà¯à®Ÿà¯à®°à¯ˆà®•à®³à¯ ஒர௠<i>கவரà¯à®ªà®Ÿà¯à®¨à®¿à®²à¯ˆà®¤à¯€à®°à¯ (disambiguation) பகà¯à®•à®¤à¯à®¤à¯</i>கà¯à®•à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©. பதிலாக இவை பொரà¯à®¤à¯à®¤à®®à®¾à®© தலைபà¯à®ªà¯à®•à¯à®•à®³à¯à®•à¯à®•à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿ வேணà¯à®Ÿà¯à®®à¯.<br>ஒர௠பகà¯à®•à®®à¯ $1 இலிரà¯à®¨à¯à®¤à¯ இணைபà¯à®ªà¯à®•à¯ கொடà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯ கவரà¯à®ªà®Ÿà¯à®¨à®¿à®²à¯ˆà®¤à¯ தீரà¯à®µà®¾à®•à®•à¯ (disambiguation) கரà¯à®¤à®ªà¯à®ªà®Ÿà¯à®®à¯.<br> à®à®©à¯ˆà®¯ பெயரà¯à®µà¯†à®³à®¿à®•à®³à®¿à®²à®¿à®°à¯à®¨à¯à®¤à®¾à®© இணைபà¯à®ªà¯à®•à¯à®•à®³à¯ இஙà¯à®•à¯‡ படà¯à®Ÿà®¿à®¯à®²à®¿à®Ÿà®ªà¯<i>படவிலà¯à®²à¯ˆ</i>.",
+"disambiguationstext" => "இக௠கடà¯à®Ÿà¯à®°à¯ˆà®•à®³à¯ ஒர௠<i>கவரà¯à®ªà®Ÿà¯à®¨à®¿à®²à¯ˆà®¤à¯€à®°à¯ (disambiguation) பகà¯à®•à®¤à¯à®¤à¯</i>கà¯à®•à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©. பதிலாக இவை பொரà¯à®¤à¯à®¤à®®à®¾à®© தலைபà¯à®ªà¯à®•à¯à®•à®³à¯à®•à¯à®•à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿ வேணà¯à®Ÿà¯à®®à¯.<br />ஒர௠பகà¯à®•à®®à¯ $1 இலிரà¯à®¨à¯à®¤à¯ இணைபà¯à®ªà¯à®•à¯ கொடà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯ கவரà¯à®ªà®Ÿà¯à®¨à®¿à®²à¯ˆà®¤à¯ தீரà¯à®µà®¾à®•à®•à¯ (disambiguation) கரà¯à®¤à®ªà¯à®ªà®Ÿà¯à®®à¯.<br /> à®à®©à¯ˆà®¯ பெயரà¯à®µà¯†à®³à®¿à®•à®³à®¿à®²à®¿à®°à¯à®¨à¯à®¤à®¾à®© இணைபà¯à®ªà¯à®•à¯à®•à®³à¯ இஙà¯à®•à¯‡ படà¯à®Ÿà®¿à®¯à®²à®¿à®Ÿà®ªà¯<i>படவிலà¯à®²à¯ˆ</i>.",
"doubleredirects" => "இரடà¯à®Ÿà¯ˆ வழிமாறà¯à®±à¯à®•à®³à¯ (Redirects)",
-"doubleredirectstext" => "<b>கவனிகà¯à®•à®µà¯à®®à¯:</b> இநà¯à®¤à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯ போலியான நேரà¯à®®à®¤à®¿à®ªà¯à®ªà¯ (positives) களைக௠கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®•à¯à®•à¯‚டà¯à®®à¯. இத௠வழகà¯à®•à®®à®¾à®•, இணைபà¯à®ªà¯à®Ÿà®©à¯ கூடிய மேலதிக உரை à®®à¯à®¤à®²à®¾à®µà®¤à¯ #வழிமாறà¯à®±à¯à®•à¯à®•à¯à®•à¯ கீழ௠இரà¯à®ªà¯à®ªà®¤à¯ˆà®•à¯ கà¯à®±à®¿à®•à¯à®•à¯à®®à¯.<br>\nஒவà¯à®µà¯Šà®°à¯ வரியà¯à®®à¯, à®®à¯à®¤à®²à®¾à®®à¯ இரணà¯à®Ÿà®¾à®®à¯ வழிமாறà¯à®±à¯à®•à®³à¯à®•à¯à®•à¯ இணைபà¯à®ªà¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®ªà¯à®ªà®¤à¯à®Ÿà®©à¯, இரணà¯à®Ÿà®¾à®µà®¤à¯ வழிமாறà¯à®±à¯ உரையின௠மà¯à®¤à®²à¯ வரிகà¯à®•à¯à®®à¯ இணைபà¯à®ªà¯ˆà®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à¯à®®à¯, இத௠வழகà¯à®•à®®à®¾à®• à®®à¯à®¤à®²à®¾à®µà®¤à¯ வழிமாறà¯à®±à¯ கà¯à®±à®¿à®¤à¯à®¤à¯à®•à¯ காடà¯à®Ÿ வேணà¯à®Ÿà®¿à®¯ \"real\" இலகà¯à®•à¯à®•à¯ கடà¯à®Ÿà¯à®°à¯ˆà®¯à¯ˆà®•à¯ (taget article) கொடà¯à®•à¯à®•à¯à®®à¯.",
+"doubleredirectstext" => "<b>கவனிகà¯à®•à®µà¯à®®à¯:</b> இநà¯à®¤à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯ போலியான நேரà¯à®®à®¤à®¿à®ªà¯à®ªà¯ (positives) களைக௠கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®•à¯à®•à¯‚டà¯à®®à¯. இத௠வழகà¯à®•à®®à®¾à®•, இணைபà¯à®ªà¯à®Ÿà®©à¯ கூடிய மேலதிக உரை à®®à¯à®¤à®²à®¾à®µà®¤à¯ #வழிமாறà¯à®±à¯à®•à¯à®•à¯à®•à¯ கீழ௠இரà¯à®ªà¯à®ªà®¤à¯ˆà®•à¯ கà¯à®±à®¿à®•à¯à®•à¯à®®à¯.<br />\nஒவà¯à®µà¯Šà®°à¯ வரியà¯à®®à¯, à®®à¯à®¤à®²à®¾à®®à¯ இரணà¯à®Ÿà®¾à®®à¯ வழிமாறà¯à®±à¯à®•à®³à¯à®•à¯à®•à¯ இணைபà¯à®ªà¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®ªà¯à®ªà®¤à¯à®Ÿà®©à¯, இரணà¯à®Ÿà®¾à®µà®¤à¯ வழிமாறà¯à®±à¯ உரையின௠மà¯à®¤à®²à¯ வரிகà¯à®•à¯à®®à¯ இணைபà¯à®ªà¯ˆà®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à¯à®®à¯, இத௠வழகà¯à®•à®®à®¾à®• à®®à¯à®¤à®²à®¾à®µà®¤à¯ வழிமாறà¯à®±à¯ கà¯à®±à®¿à®¤à¯à®¤à¯à®•à¯ காடà¯à®Ÿ வேணà¯à®Ÿà®¿à®¯ \"real\" இலகà¯à®•à¯à®•à¯ கடà¯à®Ÿà¯à®°à¯ˆà®¯à¯ˆà®•à¯ (taget article) கொடà¯à®•à¯à®•à¯à®®à¯.",
"brokenredirects" => "à®®à¯à®±à®¿à®¨à¯à®¤ வழிமாறà¯à®±à¯à®•à®³à¯(Redirects)",
"brokenredirectstext" => "பினà¯à®µà®°à¯à®®à¯ வழிமாறà¯à®±à¯à®•à®³à¯ ஒர௠இலà¯à®²à®¾à®¤ கடà¯à®Ÿà¯à®°à¯ˆà®•à¯ இணைபà¯à®ªà¯à®•à¯ கொடà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.",
"selflinks" => "தனà¯à®©à®¿à®£à¯ˆà®ªà¯à®ªà¯à®•à®³à¯‹à®Ÿà¯ (Self Links) கூடிய பகà¯à®•à®™à¯à®•à®³à¯",
@@ -844,7 +844,7 @@ border=\"0\" ALT=\"Google\"></A>
"noblockreason" => "தடà¯à®ªà¯à®ªà¯à®•à¯à®•à®¾à®© காரணஙà¯à®•à®³à¯ˆ நீஙà¯à®•à®³à¯ கொடà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯.",
"blockipsuccesssub" => "தடà¯à®ªà¯à®ªà¯ வெறà¯à®±à®¿",
"blockipsuccesstext" => "\"$1\" தடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¾à®°à¯.
-<br>தடà¯à®ªà¯à®ªà¯ˆ மீளாயà¯à®µà¯ செயà¯à®¯ [[Special:Ipblocklist|IP block list]] à®à®ªà¯ பாரà¯à®•à¯à®•à®µà¯à®®à¯.",
+<br />தடà¯à®ªà¯à®ªà¯ˆ மீளாயà¯à®µà¯ செயà¯à®¯ [[Special:Ipblocklist|IP block list]] à®à®ªà¯ பாரà¯à®•à¯à®•à®µà¯à®®à¯.",
"unblockip" => "பயனர௠தடை நீகà¯à®•à¯",
"unblockiptext" => "à®®à¯à®©à¯à®©à®°à¯ தடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ à®à®ªà®¿ à®®à¯à®•à®µà®°à®¿ அலà¯à®²à®¤à¯ பயனரà¯à®ªà¯†à®¯à®°à®¿à®©à¯ எழà¯à®¤à¯à®¤à¯ அணà¯à®•à¯à®•à®¤à¯à®¤à¯ˆ மீழà¯à®µà®¿à®ªà¯à®ªà®¤à®±à¯à®•à¯ கீழேயà¯à®³à¯à®³ படிவதà¯à®¤à¯ˆ உபயோகிகà¯à®•à®µà¯à®®à¯.",
"ipusubmit" => "இம௠மà¯à®•à®µà®°à®¿à®¯à¯ˆà®¤à¯ தடை நீகà¯à®•à¯",
@@ -874,7 +874,7 @@ border=\"0\" ALT=\"Google\"></A>
"lockdbsuccesssub" => "தரவà¯à®¤à¯à®¤à®³à®ªà¯ பூடà¯à®Ÿà®²à¯ வெறà¯à®±à®¿",
"unlockdbsuccesssub" => "தரவà¯à®¤à¯à®¤à®³à®ªà¯ பூடà¯à®Ÿà¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯",
"lockdbsuccesstext" => "விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾ தரவà¯à®¤à¯à®¤à®³à®®à¯ பூடà¯à®Ÿà®ªà¯ படà¯à®Ÿà®¤à¯.
-<br>பராமரிபà¯à®ªà¯ à®®à¯à®Ÿà®¿à®µà®Ÿà¯ˆà®¨à¯à®¤à®¤à¯à®®à¯ பூடà¯à®Ÿà¯ˆ நீகà¯à®• மறவாதீரà¯.",
+<br />பராமரிபà¯à®ªà¯ à®®à¯à®Ÿà®¿à®µà®Ÿà¯ˆà®¨à¯à®¤à®¤à¯à®®à¯ பூடà¯à®Ÿà¯ˆ நீகà¯à®• மறவாதீரà¯.",
"unlockdbsuccesstext" => "விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾ தரவà¯à®¤à¯à®¤à®³à®®à¯ திறகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.",
# SQL query
@@ -891,7 +891,7 @@ border=\"0\" ALT=\"Google\"></A>
# Move page
#
"movepage" => "பகà¯à®•à®¤à¯à®¤à¯ˆ நகரà¯à®¤à¯à®¤à¯",
-"movepagetext" => "பினà¯à®µà®°à¯à®®à¯ படிவதà¯à®¤à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®µà®¤à¯, பகà¯à®•à®®à¯Šà®©à¯à®±à®¿à®©à¯ பெயரை மாறà¯à®±à®¿, இதனà¯à®Ÿà¯ˆà®¯ à®®à¯à®´à¯ வரலாறà¯à®±à¯ˆà®¯à¯à®®à¯ பà¯à®¤à®¿à®¯ பெயரà¯à®•à¯à®•à¯ நகரà¯à®¤à¯à®¤à¯à®®à¯. பழைய தலைபà¯à®ªà¯, பà¯à®¤à®¿à®¯ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© ஒர௠வழிகாடà¯à®Ÿà¯à®®à¯ பகà¯à®•à®®à®¾à®• ஆகà¯à®®à¯. பழைய பகà¯à®•à®¤à¯ தலைபà¯à®ªà¯à®•à¯à®•à¯ உளà¯à®³ இணைபà¯à®ªà¯à®•à¯à®•à®³à¯ மாறமாடà¯à®Ÿà®¾; இரடà¯à®Ÿà¯ˆ அலà¯à®²à®¤à¯ à®®à¯à®±à®¿à®¨à¯à®¤ வழிமாறà¯à®±à¯à®•à®³à¯ உளà¯à®³à®©à®µà®¾ எனà¯à®ªà®¤à¯ˆà®šà¯[[Special:Maintenance|சரி பாரà¯à®¤à¯à®¤à¯]] உறà¯à®¤à®¿à®šà¯†à®¯à¯à®¯à®µà¯à®®à¯. இணைபà¯à®ªà¯à®•à®³à¯ எவà¯à®µà®¿à®Ÿà®¤à¯à®¤à¯à®•à¯à®•à¯à®šà¯ செனà¯à®±à®Ÿà¯ˆà®¯ வேணà¯à®Ÿà¯à®®à¯‹ அவà¯à®µà®¿à®Ÿà®¤à¯à®¤à¯ˆà®¤à¯ தொடரà¯à®¨à¯à®¤à¯à®®à¯ கà¯à®±à®¿à®ªà¯à®ªà®¤à¯ˆ உறà¯à®¤à®¿ செயà¯à®¤à¯ கொளà¯à®µà®¤à¯ உஙà¯à®•à®³à¯ பொறà¯à®ªà¯à®ªà®¾à®•à¯à®®à¯.<br>
+"movepagetext" => "பினà¯à®µà®°à¯à®®à¯ படிவதà¯à®¤à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®µà®¤à¯, பகà¯à®•à®®à¯Šà®©à¯à®±à®¿à®©à¯ பெயரை மாறà¯à®±à®¿, இதனà¯à®Ÿà¯ˆà®¯ à®®à¯à®´à¯ வரலாறà¯à®±à¯ˆà®¯à¯à®®à¯ பà¯à®¤à®¿à®¯ பெயரà¯à®•à¯à®•à¯ நகரà¯à®¤à¯à®¤à¯à®®à¯. பழைய தலைபà¯à®ªà¯, பà¯à®¤à®¿à®¯ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© ஒர௠வழிகாடà¯à®Ÿà¯à®®à¯ பகà¯à®•à®®à®¾à®• ஆகà¯à®®à¯. பழைய பகà¯à®•à®¤à¯ தலைபà¯à®ªà¯à®•à¯à®•à¯ உளà¯à®³ இணைபà¯à®ªà¯à®•à¯à®•à®³à¯ மாறமாடà¯à®Ÿà®¾; இரடà¯à®Ÿà¯ˆ அலà¯à®²à®¤à¯ à®®à¯à®±à®¿à®¨à¯à®¤ வழிமாறà¯à®±à¯à®•à®³à¯ உளà¯à®³à®©à®µà®¾ எனà¯à®ªà®¤à¯ˆà®šà¯[[Special:Maintenance|சரி பாரà¯à®¤à¯à®¤à¯]] உறà¯à®¤à®¿à®šà¯†à®¯à¯à®¯à®µà¯à®®à¯. இணைபà¯à®ªà¯à®•à®³à¯ எவà¯à®µà®¿à®Ÿà®¤à¯à®¤à¯à®•à¯à®•à¯à®šà¯ செனà¯à®±à®Ÿà¯ˆà®¯ வேணà¯à®Ÿà¯à®®à¯‹ அவà¯à®µà®¿à®Ÿà®¤à¯à®¤à¯ˆà®¤à¯ தொடரà¯à®¨à¯à®¤à¯à®®à¯ கà¯à®±à®¿à®ªà¯à®ªà®¤à¯ˆ உறà¯à®¤à®¿ செயà¯à®¤à¯ கொளà¯à®µà®¤à¯ உஙà¯à®•à®³à¯ பொறà¯à®ªà¯à®ªà®¾à®•à¯à®®à¯.<br />
à®à®±à¯à®•à¯†à®©à®µà¯‡ பà¯à®¤à®¿à®¯ தலைபà¯à®ªà®¿à®²à¯ ஒர௠பகà¯à®•à®®à¯ இரà¯à®¨à¯à®¤à®¾à®²à¯, இநà¯à®¤à®ªà¯ பகà¯à®•à®®à¯ வெறà¯à®®à¯ˆà®¯à®¾à®•à®µà¯‹ அலà¯à®²à®¤à¯ ஒர௠வழிமாறà¯à®±à¯à®ªà¯ பகà¯à®•à®®à®¾à®•à®µà¯‹ இரà¯à®ªà¯à®ªà®¤à¯à®Ÿà®©à¯ பழைய தொகà¯à®ªà¯à®ªà¯ வரலாறà¯à®®à¯ இலà¯à®²à®¾à®¤à®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯à®¤à®¾à®©à¯, இப௠பகà¯à®•à®®à¯ நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®®à¯ எனà¯à®ªà®¤à¯ˆà®•à¯ கவனிகà¯à®•à®µà¯à®®à¯. தறà¯à®šà¯†à®¯à®²à®¾à®•, நீஙà¯à®•à®³à¯ தவற௠செயà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®¾à®²à¯, எநà¯à®¤à®ªà¯ பெயரிலிரà¯à®¨à¯à®¤à¯ பெயர௠மாறà¯à®±à®®à¯ செயà¯à®¤à¯€à®°à¯à®•à®³à¯‹ அதே பெயரà¯à®•à¯à®•à¯ மீணà¯à®Ÿà¯à®®à¯ மாறà¯à®±à®®à¯à®Ÿà®¿à®¯à¯à®®à¯ எனà¯à®ªà®¤à¯à®Ÿà®©à¯ à®à®±à¯à®•à¯†à®©à®µà¯‡ இரà¯à®•à¯à®•à¯à®®à¯ பகà¯à®•à®®à¯Šà®©à¯à®±à¯ˆ மேலெழà¯à®¤ (overwrite) à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯ எனà¯à®ªà®¤à¯ˆà®¯à¯à®®à¯ இத௠கà¯à®±à®¿à®•à¯à®•à®¿à®©à¯à®±à®¤à¯.
<b>எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ!</b>
இத௠பிரபலமான ஒர௠பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®šà¯ செயà¯à®¯à¯à®®à¯ கடà¯à®®à¯ˆà®¯à®¾à®©à®¤à¯à®®à¯, எதிரà¯à®ªà®¾à®°à®¾à®¤à®¤à¯à®®à®¾à®© மாறà¯à®±à®®à®¾à®• இரà¯à®•à¯à®•à®•à¯à®•à¯‚டà¯à®®à¯; தொடரà¯à®µà®¤à®±à¯à®•à¯ à®®à¯à®©à¯ இதன௠விளைவà¯à®•à®³à¯ˆ விளஙà¯à®•à®¿à®•à¯à®•à¯Šà®£à¯à®Ÿà®¿à®°à¯à®•à¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯ எனà¯à®ªà®¤à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®•à¯ கொளà¯à®³à®µà¯à®®à¯.",
diff --git a/languages/LanguageTh.php b/languages/LanguageTh.php
index 9444fab52e29..b3db4418e071 100644
--- a/languages/LanguageTh.php
+++ b/languages/LanguageTh.php
@@ -125,8 +125,8 @@
"tog-showtoolbar" => "Show edit toolbar",
"tog-editondblclick" => "à¹à¸à¹‰à¹„ขหน้าโดยใช้ double click (ผ่าน JavaScript)",
"tog-editsection"=>"สามารถà¹à¸à¹‰à¹„ขเฉพาะส่วนโดยใช้ลิงà¸à¹Œ [à¹à¸à¹‰à¹„ข]",
-"tog-editsectiononrightclick"=>"สามารถà¹à¸à¹‰à¹„ขเฉพาะส่วนโดยใช้ right click<br> บนชื่อส่วนย่อย (ผ่าน JavaScript)",
-"tog-showtoc"=>"à¹à¸ªà¸”งสารบัà¸<br>(สำหรับบทความที่มีมาà¸à¸à¸§à¹ˆà¸² 3 หัวข้อ)",
+"tog-editsectiononrightclick"=>"สามารถà¹à¸à¹‰à¹„ขเฉพาะส่วนโดยใช้ right click<br /> บนชื่อส่วนย่อย (ผ่าน JavaScript)",
+"tog-showtoc"=>"à¹à¸ªà¸”งสารบัà¸<br />(สำหรับบทความที่มีมาà¸à¸à¸§à¹ˆà¸² 3 หัวข้อ)",
"tog-rememberpassword" => "จำ password ระหว่าง session",
"tog-editwidth" => "à¸à¸¥à¹ˆà¸­à¸‡à¸ªà¸³à¸«à¸£à¸±à¸šà¸à¸²à¸£à¹à¸à¹‰à¹„ขà¸à¸§à¹‰à¸²à¸‡à¹€à¸•à¹‡à¸¡à¸«à¸™à¹‰à¸²à¸ˆà¸­",
"tog-watchdefault" => "นำหน้าที่à¹à¸à¹‰à¹„ขไปใส่ watchlist",
@@ -313,8 +313,8 @@ an incorrectly linked inter-language or inter-wiki title.",
because it slows the database down to the point that no one can use
the wiki.",
"perfdisabledsub" => "Here's a saved copy from $1:",
-"wrong_wfQuery_params" => "Incorrect parameters to wfQuery()<br>
-Function: $1<br>
+"wrong_wfQuery_params" => "Incorrect parameters to wfQuery()<br />
+Function: $1<br />
Query: $2
",
"viewsource" => "View source",
@@ -342,8 +342,8 @@ Don't forget to personalize your wikipedia preferences.",
"yourpasswordagain" => "พิมพ์รหัสผ่านอีà¸à¸„รั้ง",
"newusersonly" => " (เฉพาะผู้ใช้ใหม่)",
"remembermypassword" => "Remember my password across sessions.",
-"loginproblem" => "<b>There has been a problem with your login.</b><br>Try again!",
-"alreadyloggedin" => "<font color=red><b>User $1, you are already logged in!</b></font><br>\n",
+"loginproblem" => "<b>There has been a problem with your login.</b><br />Try again!",
+"alreadyloggedin" => "<font color=red><b>User $1, you are already logged in!</b></font><br />\n",
"login" => "ล็อà¸à¸­à¸´à¸™",
"loginprompt" => "ต้อง enable cookie เพื่อล็อà¸à¸­à¸´à¸™à¸ªà¸¹à¹ˆ $wgSitename ได้",
@@ -392,7 +392,7 @@ Please log in again after you receive it.",
"showpreview" => "Show preview",
"blockedtitle" => "User is blocked",
"blockedtext" => "Your user name or IP address has been blocked by $1.
-The reason given is this:<br>''$2''<p>You may contact $1 or one of the other
+The reason given is this:<br />''$2''<p>You may contact $1 or one of the other
[[$wgMetaNamespace:Administrators|administrators]] to discuss the block.
Note that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]].
@@ -447,7 +447,7 @@ If you save it, any changes made since this revision will be lost.</strong>\n",
considered to be released under the GNU Free Documentation License
(see $1 for details).
If you don't want your writing to be edited mercilessly and redistributed
-at will, then don't submit it here.<br>
+at will, then don't submit it here.<br />
You are also promising us that you wrote this yourself, or copied it from a
public domain or similar free resource.
<strong>DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!</strong>",
@@ -516,8 +516,8 @@ 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).",
"powersearch" => "Search",
"powersearchtext" => "
-Search in namespaces :<br>
-$1<br>
+Search in namespaces :<br />
+$1<br />
$2 List redirects &nbsp; Search for $3 $9",
"searchdisabled" => "<p>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.</p>
@@ -533,7 +533,7 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br>
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -680,7 +680,7 @@ created and by whom, and anything else you may know about it.",
"deleteimgcompletely" => "del",
"imghistlegend" => "Legend: (cur) = this is the current image, (del) = delete
this old version, (rev) = revert to this old version.
-<br><i>Click on date to see image uploaded on that date</i>.",
+<br /><i>Click on date to see image uploaded on that date</i>.",
"imagelinks" => "Image links",
"linkstoimage" => "The following pages link to this image:",
"nolinkstoimage" => "There are no pages that link to this image.",
@@ -708,9 +708,9 @@ That comes to <b>$5</b> average edits per page, and <b>$6</b> views per edit.",
"maintenancebacklink" => "Back to Maintenance Page",
"disambiguations" => "Disambiguation pages",
"disambiguationspage" => "$wgMetaNamespace:Links_to_disambiguating_pages",
-"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br>A page is treated as dismbiguation if it is linked from $1.<br>Links from other namespaces are <i>not</i> listed here.",
+"disambiguationstext" => "The following articles link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as dismbiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
"doubleredirects" => "Double Redirects",
-"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br>\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
+"doubleredirectstext" => "<b>Attention:</b> This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.<br />\nEach row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" taget article, which the first redirect should point to.",
"brokenredirects" => "Broken Redirects",
"brokenredirectstext" => "The following redirects link to a non-existing article.",
"selflinks" => "Pages with Self Links",
@@ -932,7 +932,7 @@ pages that were vandalized).",
"noblockreason" => "You must supply a reason for the block.",
"blockipsuccesssub" => "Block succeeded",
"blockipsuccesstext" => "\"$1\" has been blocked.
-<br>See [[Special:Ipblocklist|IP block list]] to review blocks.",
+<br />See [[Special:Ipblocklist|IP block list]] to review blocks.",
"unblockip" => "Unblock user",
"unblockiptext" => "Use the form below to restore write access
to a previously blocked IP address or username.",
@@ -972,7 +972,7 @@ Please confirm that this is what you intend to do.",
"lockdbsuccesssub" => "Database lock succeeded",
"unlockdbsuccesssub" => "Database lock removed",
"lockdbsuccesstext" => "The database has been locked.
-<br>Remember to remove the lock after your maintenance is complete.",
+<br />Remember to remove the lock after your maintenance is complete.",
"unlockdbsuccesstext" => "The database has been unlocked.",
# SQL query
diff --git a/languages/LanguageTt.php b/languages/LanguageTt.php
index 0cc2d13d8a49..ddbaaa68b53a 100644
--- a/languages/LanguageTt.php
+++ b/languages/LanguageTt.php
@@ -180,8 +180,8 @@ $wgLanguageNamesTt =& $wgLanguageNames;
"tog-showtoolbar" =>"Show edit toolbar",
"tog-editondblclick" => "Edit pages on double click (JavaScript)",
"tog-editsection" =>"Enable section editing via [edit] links",
-"tog-editsectiononrightclick"=>"Enable section editing by right clicking<br> on section titles (JavaScript)",
-"tog-showtoc" =>"Show table of contents<br>(for articles with more than 3 headings)",
+"tog-editsectiononrightclick"=>"Enable section editing by right clicking<br /> on section titles (JavaScript)",
+"tog-showtoc" =>"Show table of contents<br />(for articles with more than 3 headings)",
"tog-rememberpassword" => "Remember password across sessions",
"tog-editwidth" => "Edit box has full width",
"tog-watchdefault" => "Add pages you edit to your watchlist",
diff --git a/languages/LanguageUk.php b/languages/LanguageUk.php
index 4924907fb46b..7ad6f06b4185 100755
--- a/languages/LanguageUk.php
+++ b/languages/LanguageUk.php
@@ -307,12 +307,12 @@ You can view and copy the source of this page:",
"yourpasswordagain" => "Повторний набір паролÑ",
"newusersonly" => " (тільки Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… кориÑтувачів)",
"remembermypassword" => "Запам'Ñтовувати ваш пароль між ÑеанÑами.",
-"loginproblem" => "<b>Проблема при вході в ÑиÑтему.</b><br>попробуйте ще раз!",
-"alreadyloggedin" => "<font color=red><b>КориÑтувач $1, ви вже ввійшли в ÑиÑтему!</b></font><br>\n",
+"loginproblem" => "<b>Проблема при вході в ÑиÑтему.</b><br />попробуйте ще раз!",
+"alreadyloggedin" => "<font color=red><b>КориÑтувач $1, ви вже ввійшли в ÑиÑтему!</b></font><br />\n",
"areyounew" => "Якщо ви новачок в технології Вікіпедії й хочете Ñтати кориÑтувачем,
введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, а потім введіть Ñ– повторіть пароль.
-Заповніть поле Ñ Ð°Ð´Ñ€ÐµÑою вашої електронної пошти; Ñкщо ви забудете ваш пароль, ви зможете зробити запит, щоб новий пароль був відправлений вам на вказану вами адреÑу.<br>\n",
+Заповніть поле Ñ Ð°Ð´Ñ€ÐµÑою вашої електронної пошти; Ñкщо ви забудете ваш пароль, ви зможете зробити запит, щоб новий пароль був відправлений вам на вказану вами адреÑу.<br />\n",
"login" => "Вхід в ÑиÑтему",
"userlogin" => "Вхід в ÑиÑтему",
@@ -355,7 +355,7 @@ You can view and copy the source of this page:",
"showpreview" => "Показати попередній варіант",
"blockedtitle" => "КориÑтувача заблоковано",
"blockedtext" => "Ваш кориÑтувач чи IP-адреÑа заблоковані $1.
-Причина блокуваннÑ:<br>''$2''<p>Ви можете зв'ÑзатиÑÑ Ð· $1 чи іншим
+Причина блокуваннÑ:<br />''$2''<p>Ви можете зв'ÑзатиÑÑ Ð· $1 чи іншим
[[$wgMetaNamespace:ÐдминиÑтратори|админиÑтратором]] що обговорити блокуваннÑ.
Зверніть увагу, що ви не можете викориÑтовувати функцію \"ÐадіÑлати електронного лиÑта кориÑтувачу\", Ñкщо ви не вказали адреÑу вашої електронної пошти в Ваших [[Спеціальні:ÐаÑтройки|наÑтройках]]
Ваша IP-адреÑа - $3. Будь-лаÑка, вказуйте, Ñкщо будете запитувати про блокуваннÑ.
@@ -391,7 +391,7 @@ You can view and copy the source of this page:",
GNU Free Documentation License без незмінюваних Ñекцій
(див. $1, щоб взнати подробиці).
Якщо ви не бажаєте, щоб напиÑане вами безжаліÑно редагувалоÑÑŒ
-Ñ– розповÑюджувалоÑÑ Ð·Ð° бажаннÑм будь-кого, - не пишіть тут.<br>
+Ñ– розповÑюджувалоÑÑ Ð·Ð° бажаннÑм будь-кого, - не пишіть тут.<br />
Ви також зобов'ÑзуєтеÑÑŒ, що напиÑане вами тут належить вам чи взÑто з джерела,
що Ñ” ÑуÑпільною влаÑніÑÑ‚ÑŽ чи подібним вільним джерелом.
@@ -454,8 +454,8 @@ GNU Free Documentation License без незмінюваних Ñекцій
"nonefound" => "<strong>ЗауваженнÑ:</strong>: До невдалого пошуку чаÑто може приводити Ñпроба знайти загальні Ñлова, Ñкі не підлÑгають індекÑації, наприклад - \"також\" and \"що\", або викориÑÑ‚Ð°Ð½Ð½Ñ Ð±Ñ–Ð»ÑŒÑˆ ніж одного ключового Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ Ñлова (показуютьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ Ñтатті, що міÑÑ‚ÑÑ‚ÑŒ вÑÑ– вказані Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ Ñлова).",
"powersearch" => "Пошук",
"powersearchtext" => "
-Пошук в проÑторі імен :<br>
-$1<br>
+Пошук в проÑторі імен :<br />
+$1<br />
$2 Показувати Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐŸÐ¾ÑˆÑƒÐº на $3 $9",
"searchdisabled" => "<p>ПовнотекÑтовий пошук тимчаÑово недоÑтупний через Ð¿ÐµÑ€ÐµÐ²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñервера; передбачаєтьÑÑ, що Ñ†Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð±ÑƒÐ´Ðµ знову включена піÑÐ»Ñ ÑƒÑтановки нового обладнаннÑ. Поки що ми пропонуємо вам ÑкориÑтатиÑÑ Ð¿Ð¾ÑˆÑƒÐºÐ¾Ð²Ð¾ÑŽ машиною google:</p>
@@ -470,9 +470,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Google Search\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br><input type=radio
+<input type=hidden name=domains value=\"{$wgServer}\"><br /><input type=radio
name=sitesearch value=\"\"> WWW <input type=radio name=sitesearch
-value=\"{$wgServer}\" checked> {$wgServer} <br>
+value=\"{$wgServer}\" checked> {$wgServer} <br />
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
</font>
@@ -643,7 +643,7 @@ value=\"{$wgServer}\" checked> {$wgServer} <br>
"deleteimg" => "вилуч.",
"deleteimgcompletely" => "вилуч.",
"imghistlegend" => "ПоÑÑненнÑ: (поточ.) = це - поточне зображеннÑ, (вилуч.) = вилучити цю Ñтару верÑÑ–ÑŽ, (відкот.) = відкотитиÑÑ Ð´Ð¾ цієї Ñтарої верÑÑ–Ñ—.
-<br><i>Виберіть дату, щоб переглÑнути ÑпиÑок зображень, звантажених на цю дату</i>.",
+<br /><i>Виберіть дату, щоб переглÑнути ÑпиÑок зображень, звантажених на цю дату</i>.",
"imagelinks" => "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ",
"linkstoimage" => "ÐаÑтупні Ñтатті поÑилаютьÑÑ Ð½Ð° дане зображеннÑ:",
"nolinkstoimage" => "Статті, що поÑилаютьÑÑ Ð½Ð° дане зображеннÑ, відÑутні.",
@@ -669,9 +669,9 @@ value=\"{$wgServer}\" checked> {$wgServer} <br>
"maintenancebacklink" => "ПовернутиÑÑ Ð½Ð° Ñторінку обÑлуговуваннÑ",
"disambiguations" => "Багатозначні Ñтатті",
"disambiguationspage" => "ВікіпедіÑ:ПоÑиланнÑ_на_багатозначні_Ñтатті",
-"disambiguationstext" => "ÐаÑтупна Ñтатті поÑилаютьÑÑ Ð½Ð° <i>багатозначні Ñтатті</i>. ЗаміÑÑ‚ÑŒ цього вони повинні вказувати на відповідну конкретну Ñтаттю.<br>Ð¡Ñ‚Ð°Ñ‚Ñ‚Ñ Ð²Ð²Ð°Ð¶Ð°Ñ”Ñ‚ÑŒÑÑ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾ÑŽ, Ñкщо на неї вказує $1.<br>ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð· інших проÑторів імен тут <i>не</i> вказані.",
+"disambiguationstext" => "ÐаÑтупна Ñтатті поÑилаютьÑÑ Ð½Ð° <i>багатозначні Ñтатті</i>. ЗаміÑÑ‚ÑŒ цього вони повинні вказувати на відповідну конкретну Ñтаттю.<br />Ð¡Ñ‚Ð°Ñ‚Ñ‚Ñ Ð²Ð²Ð°Ð¶Ð°Ñ”Ñ‚ÑŒÑÑ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾ÑŽ, Ñкщо на неї вказує $1.<br />ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð· інших проÑторів імен тут <i>не</i> вказані.",
"doubleredirects" => "Подвійні перенаправленнÑ",
-"doubleredirectstext" => "<b>Увага:</b> Цей ÑпиÑок може міÑтити невірні елементи. Це значить, що піÑÐ»Ñ Ð¿ÐµÑ€ÑˆÐ¾Ñ— директиви #REDIRECT йде додатковий текÑÑ‚ з поÑиланнÑми.<br>\nКожен Ñ€Ñдок міÑтить поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° перше та друге перенаправленнÑ, а також перший Ñ€Ñдок текÑту другого перенаправленнÑ, що, звичайно, міÑтить \"реальне\" перенаправленне на необхідну Ñтаттю, куди повинно вказувати й перше перенаправленне.",
+"doubleredirectstext" => "<b>Увага:</b> Цей ÑпиÑок може міÑтити невірні елементи. Це значить, що піÑÐ»Ñ Ð¿ÐµÑ€ÑˆÐ¾Ñ— директиви #REDIRECT йде додатковий текÑÑ‚ з поÑиланнÑми.<br />\nКожен Ñ€Ñдок міÑтить поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° перше та друге перенаправленнÑ, а також перший Ñ€Ñдок текÑту другого перенаправленнÑ, що, звичайно, міÑтить \"реальне\" перенаправленне на необхідну Ñтаттю, куди повинно вказувати й перше перенаправленне.",
"brokenredirects" => "Розірвані перенаправленнÑ",
"brokenredirectstext" => "ÐаÑтупні Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·ÑƒÑŽÑ‚ÑŒ на неіÑнуючі Ñтатті.",
"selflinks" => "Статті, що вказують Ñамі на Ñебе",
@@ -872,7 +872,7 @@ $3...
"noblockreason" => "Ви повинні опиÑати причину блокуваннÑ.",
"blockipsuccesssub" => "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð¾",
"blockipsuccesstext" => "\"$1\" заблоковано.
-<br>См. [[Спеціальні:СпиÑок_заблокованих_IP|ÑпиÑок заблокованих IP]] щоб взнати, Ñкі IP-адреÑи заблоковані.",
+<br />См. [[Спеціальні:СпиÑок_заблокованих_IP|ÑпиÑок заблокованих IP]] щоб взнати, Ñкі IP-адреÑи заблоковані.",
"unblockip" => "Розблокувати IP-адреÑу",
"unblockiptext" => "ВикориÑтовуйте форму що нижче, щоб відновити можливіÑÑ‚ÑŒ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ€Ð°Ð½Ñ–ÑˆÐµ заблокованої
IP-адреÑи.",
@@ -903,7 +903,7 @@ IP-адреÑи.",
"lockdbsuccesssub" => "Базу даних заблоковано",
"unlockdbsuccesssub" => "Базу даних розблоковано",
"lockdbsuccesstext" => "Базу даних Вікіпедії заблоковано.
-<br>Ðе забудьте Ñ—Ñ— розблокувати піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð±ÑлуговуваннÑ.",
+<br />Ðе забудьте Ñ—Ñ— розблокувати піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð±ÑлуговуваннÑ.",
"unlockdbsuccesstext" => "Базу даних Вікіпедії розблоковано.",
# SQL query
diff --git a/languages/LanguageWa.php b/languages/LanguageWa.php
index 91b018f65eb9..b8f5ddc6b569 100644
--- a/languages/LanguageWa.php
+++ b/languages/LanguageWa.php
@@ -123,7 +123,7 @@ require_once( "LanguageUtf8.php" );
"tog-hover" => "Racsegnes cwand on passe so les loyéns",
"tog-underline" => "Sorlignî les loyéns",
-"tog-highlightbroken" => "Håyner les vudes loyéns <a href=\"\" class=\"new\">come çouchal</a><br> &nbsp;&nbsp;&nbsp; (oudonbén: come çouchal<a href=\"\" class=\"internal\">?</a>).",
+"tog-highlightbroken" => "Håyner les vudes loyéns <a href=\"\" class=\"new\">come çouchal</a><br /> &nbsp;&nbsp;&nbsp; (oudonbén: come çouchal<a href=\"\" class=\"internal\">?</a>).",
"tog-justify" => "Djustifyî les hagnons",
"tog-hideminor" => "Èn nén moster les <i>dierins candjmints</i> mineurs",
"tog-usenewrc" => "Ramidrés <i>dierins candjmints</i> (nén tos les betchteus)",
@@ -131,7 +131,7 @@ require_once( "LanguageUtf8.php" );
"tog-editondblclick" => "Candjî les pådjes avou on dobe-clitch (JavaScript)",
"tog-editsection" => "Eployî les loyéns «[candjî]» po candjî rén k'&nbsp;ene seccion",
"tog-editsectiononrightclick" => "Candjî les seccions avou on dobe-clitch sol tite (JavaScript)",
-"tog-showtoc" => "Mostrer l'&nbsp;tåvlea d'&nbsp;ådvins<br>(po ls årtikes avou pus di 3 seccions)",
+"tog-showtoc" => "Mostrer l'&nbsp;tåvlea d'&nbsp;ådvins<br />(po ls årtikes avou pus di 3 seccions)",
"tog-rememberpassword" => "Rimimbrer li scret inte les sessions",
"tog-editwidth" => "Li boesse d'&nbsp;aspougnaedje prind tote li lårdjeu",
"tog-watchdefault" => "Shuve les årtikes ki dj'&nbsp;fwai ou ki dj'&nbsp;candje",
@@ -352,7 +352,7 @@ on conte d'&nbsp;uzeu, tapez on no no d'&nbsp;uzeu ki vos vloz eployî,
et poy deus côps on on scret (li minme, on côp dins tchake boesse).
Come rawete vos ploz (mins c'&nbsp;est nén oblidjî) dner voste adresse
emile; ça vént a pont si vos rovyîz vosse sicret, po dmander k'&nbsp;on
-vs evoye èn ôte pa emile.<br>\n",
+vs evoye èn ôte pa emile.<br />\n",
"login" => "S'&nbsp;elodjî",
"loginprompt" => "Vos dvoz permete les coûkes po vs elodjî so Wikipedia.",
@@ -406,7 +406,7 @@ Relodjîz vs avou ç'&nbsp;noû scret on côp ki vos l'&nbsp;åroz rçuvou s'&nb
"showpreview" => "Vey divant",
"blockedtitle" => "L'&nbsp;uzeu est bloké",
"blockedtext" => "Your user name or IP address has been blocked by $1.
-The reason given is this:<br>''$2''<p>You may contact $1 or one of the other
+The reason given is this:<br />''$2''<p>You may contact $1 or one of the other
[[Wikipedia:Manaedjeus|administrators]] to discuss the block.
Note that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Sipeciås:Preferences|user preferences]].
@@ -475,11 +475,11 @@ dvèt esse dizo li licince di documintåcion libe di GNU
(GFDL, loukîz $1 po pus di racsegnes).
Si&nbsp;vos n'&nbsp;voloz nén ki vosse tecse poye esse candjî eyet spårdou
pa tot l'&nbsp;minme kî, adon nel evoyîz nén chal.
-<br>
+<br />
Vos nos acertinez eto ki vos avoz scrît l'&nbsp;tecse vos minme, oudonbén
l'&nbsp;avoz copyî d'&nbsp;on sourdant libe (dominne publik ou on sourdant
pareymint libe).
-<br>
+<br />
<strong>N'&nbsp;EVOYÎZ NÉN DES TECSES DIZO ABONDROETS SINS PERMISSION&nbsp;!</strong>",
"longpagewarning" => "ASTEME: Cisse pådje fwait $1 kilo-octets; des
betchteus waibes k'&nbsp;i gn a polèt aveut des rujhes po-z aspougnî
@@ -544,8 +544,8 @@ ki corespond eyet $3 årtikes avou l'&nbsp;tecse ki corespond.",
"nonefound" => "<strong>Note</strong>: des cweraedjes ki n'&nbsp;dinèt nou rzultat c'&nbsp;est sovint li cweraedje di ptits mots trop corants (come «les», «des») ki n'&nbsp;sont nén indecsés, oudonbén des cweraedjes di pus d'&nbsp;on mot (seulmint les pådjes avou tos les mots dmandés sront håynêyes dins l'&nbsp;rizultat do cweraedje).",
"powersearch" => "Cweri",
"powersearchtext" => "
-Cweraedje ezès espåces di nos&nbsp;:<br>
-$1<br>
+Cweraedje ezès espåces di nos&nbsp;:<br />
+$1<br />
$2 Håyner les redjiblaedjes &nbsp; Cweri après $3 $9",
"searchdisabled" => "<p>Mande escuzes! Li cweraedje å dvins des årtikes a stî dismetou
pol moumint, cåze ki l'&nbsp;sierveu est fortcherdjî.
@@ -563,9 +563,9 @@ border=\"0\" ALT=\"Google\"></A>
<INPUT TYPE=text name=q size=31 maxlength=255 value=\"$1\">
<INPUT type=submit name=btnG VALUE=\"Cweri avou Google\">
<font size=-1>
-<input type=hidden name=domains value=\"{$wgServer}\"><br>
+<input type=hidden name=domains value=\"{$wgServer}\"><br />
<input type=radio name=sitesearch value=\"\"> sol waibe
-<input type=radio name=sitesearch value=\"{$wgServer}\" checked> so {$wgServer} <br>
+<input type=radio name=sitesearch value=\"{$wgServer}\" checked> so {$wgServer} <br />
<input type='hidden' name='hl' value='wa'>
<input type='hidden' name='ie' value='$2'>
<input type='hidden' name='oe' value='$2'>
@@ -758,7 +758,7 @@ saveur å dfait do fitchî.",
"deleteimgcompletely" => "oist.",
"imghistlegend" => "Ledjinde: (ast.) = c'&nbsp;est l'&nbsp;imådje k'&nbsp;i gn a asteure, (oist.) = oister (disfacer)
cisse viye modêye la, (mod.) = rivni a cisse viye modêye la.
-<br><i>Clitchîz sol date po vey l'&nbsp;imådje evoyeye a cisse date la.</i>",
+<br /><i>Clitchîz sol date po vey l'&nbsp;imådje evoyeye a cisse date la.</i>",
"imagelinks" => "Loyéns viè ciste imådje chal",
"linkstoimage" => "Les pådjes shuvantes eployèt ciste imådje chal:",
"nolinkstoimage" => "I n'&nbsp;a nole pådje k'&nbsp;eploye ciste imådje chal.",
@@ -797,11 +797,11 @@ ki vos fjhoz on ptit candjmint ;-)",
"maintenancebacklink" => "Rivni al pådje di manaedjmint",
"disambiguations" => "PÃ¥djes d'&nbsp;omonimeye",
"disambiguationspage" => "Wikipedia:Loyéns_viè_les_pådjes_d'_omonimeye",
-"disambiguationstext" => "Les årtikes shuvants ont des loyéns viè en <i>pådje d'&nbsp;omonimeye</i>. I dvrént purade loyî viè l'&nbsp;bon årtike.<br>
-Ene pådje est considerêye come pådje d'&nbsp;omonimeye si elle aparexhe e $1.<br>
+"disambiguationstext" => "Les årtikes shuvants ont des loyéns viè en <i>pådje d'&nbsp;omonimeye</i>. I dvrént purade loyî viè l'&nbsp;bon årtike.<br />
+Ene pådje est considerêye come pådje d'&nbsp;omonimeye si elle aparexhe e $1.<br />
Les loyéns a pårti d'&nbsp;ôtes espåces di lomaedje èn sont <i>nén</i> håynés chal.",
"doubleredirects" => "Dobes redjiblaedjes",
-"doubleredirectstext" => "<b>Asteme:</b> Cisse djivêye chal pout aveur des fås pôzitifs. Dj'&nbsp;ô bén k'&nbsp;i pout aveur do tecse di pus, avou des loyéns, après li prumî «#REDIRECT».<br>\n
+"doubleredirectstext" => "<b>Asteme:</b> Cisse djivêye chal pout aveur des fås pôzitifs. Dj'&nbsp;ô bén k'&nbsp;i pout aveur do tecse di pus, avou des loyéns, après li prumî «#REDIRECT».<br />\n
Tchaeke roye a-st on loyén viè l'&nbsp;prumî eyet l'&nbsp;deujhinme redjiblaedje, avou on mostraedje del prumire roye do tecse do deujhinme redjiblaedje, çou ki å pus sovint dene li «vraiy» årtike såme, ki l'&nbsp;prumî redjiblaedje dvreut evoyî viè lu.",
"brokenredirects" => "Pierdous redjiblaedjes",
"brokenredirectstext" => "Les redjiblaedjes shuvants evoyèt so ene pådje ki n'&nbsp;egzistêye nén.",
@@ -1031,7 +1031,7 @@ pages that were vandalized).", # co a fé
"noblockreason" => "Vos dvoz dner ene råjhon pol blocaedje.",
"blockipsuccesssub" => "Li blocaedje a stî comifåt",
"blockipsuccesstext" => "«$1» a stî bloké.
-<br>Loukîz li [[Sipeciås:Ipblocklist|Djivêye des blocaedjes]] po candjî on blocaedje.",
+<br />Loukîz li [[Sipeciås:Ipblocklist|Djivêye des blocaedjes]] po candjî on blocaedje.",
"unblockip" => "Disbloker èn uzeu",
"unblockiptext" => "Use the form below to restore write access
to a previously blocked IP address.", # co a fé
@@ -1071,7 +1071,7 @@ Please confirm that this is what you intend to do.", # co a fé
"lockdbsuccesssub" => "Database lock succeeded", # co a fé
"unlockdbsuccesssub" => "Database lock removed", # co a fé
"lockdbsuccesstext" => "The database has been locked.
-<br>Remember to remove the lock after your maintenance is complete.", # co a fé
+<br />Remember to remove the lock after your maintenance is complete.", # co a fé
"unlockdbsuccesstext" => "The database has been unlocked.", # co a fé
# SQL query
diff --git a/languages/LanguageZh.php b/languages/LanguageZh.php
index c27036b26bb0..3cb206ec437b 100644
--- a/languages/LanguageZh.php
+++ b/languages/LanguageZh.php
@@ -1,10 +1,34 @@
<?php
-require_once( "includes/ZhClient.php" );
require_once( "LanguageZh_cn.php");
require_once( "LanguageZh_tw.php");
require_once( "LanguageZh_sg.php");
require_once( "LanguageZh_hk.php");
+/*
+ hook to refresh the cache of conversion tables when
+ MediaWiki:zhconversiontable* is updated
+*/
+function zhOnArticleSaveComplete($article, $user, $text, $summary, $isminor, $iswatch, $section) {
+ $titleobj = $article->getTitle();
+ if($titleobj->getNamespace() == NS_MEDIAWIKI) {
+ global $wgContLang; // should be an LanguageZh.
+ if(get_class($wgContLang) != 'languagezh')
+ return true;
+
+ $title = $titleobj->getDBkey();
+ $t = explode('/', $title, 3);
+ $c = count($t);
+ if( $c > 1 && $t[0] == 'Zhconversiontable' ) {
+ if(in_array($t[1], array('zh-cn', 'zh-tw', 'zh-sg', 'zh-hk'))) {
+ $wgContLang->reloadTables();
+ }
+ }
+ }
+ return true;
+}
+
+$wgHooks['ArticleSaveComplete'][] = 'zhOnArticleSaveComplete';
+
/* class that handles both Traditional and Simplified Chinese
right now it only distinguish zh_cn and zh_tw (actuall, zh_cn and
non-zh_cn), will add support for zh_sg, zh_hk, etc, later.
@@ -12,40 +36,198 @@ require_once( "LanguageZh_hk.php");
class LanguageZh extends LanguageZh_cn {
var $mZhLanguageCode=false;
- var $mZhClient=false;
+ var $mTables=false; //the mapping tables
+ var $mTablesLoaded = false;
+ var $mCacheKey;
+ var $mDoTitleConvert = true, $mDoContentConvert = true;
function LanguageZh() {
- global $wgUseZhdaemon, $wgZhdaemonHost, $wgZhdaemonPort;
- global $wgDisableLangConversion;
+ global $wgDBname;
+ $this->mCacheKey = $wgDBname . ":zhtables";
+ }
+
+ // a write lock
+ function lockCache() {
+ global $wgMemc;
+ $success = false;
+ for($i=0; $i<30; $i++) {
+ if($success = $wgMemc->add($this->mCacheKey . "lock", 1, 10))
+ break;
+ sleep(1);
+ }
+ return $success;
+ }
- $this->mZhLanguageCode = $this->getPreferredVariant();
- if($wgUseZhdaemon) {
- $this->mZhClient=new ZhClient($wgZhdaemonHost, $wgZhdaemonPort);
- if(!$this->mZhClient->isconnected())
- $this->mZhClient = false;
+ function unlockCache() {
+ global $wgMemc;
+ $wgMemc->delete($this->mCacheKey . "lock");
+ }
+
+ function updateTable($code, $table) {
+ global $wgMemc;
+ if(!$this->mTablesLoaded)
+ $this->loadTables();
+
+ $this->mTables[$code] = array_merge($this->mTables[$code], $table);
+ if($this->lockCache()) {
+ $wgMemc->delete($this->mCacheKey);
+ $wgMemc->set($this->mCacheKey, $this->mTables, 43200);
+ $this->unlockCache();
+ }
+ }
+
+ function reloadTables() {
+ if($this->mTables)
+ unset($this->mTables);
+ $this->mTablesLoaded = false;
+ $this->loadTables(false);
+ }
+
+ // load conversion tables either from the cache or the disk
+ function loadTables($fromcache=true) {
+ global $wgMemc;
+ if( $this->mTablesLoaded )
+ return;
+ $this->mTablesLoaded = true;
+ if($fromcache) {
+ $this->mTables = $wgMemc->get( $this->mCacheKey );
+ if( !empty( $this->mTables ) ) //all done
+ return;
+ }
+ // not in cache, or we need a fresh reload.
+ // we will first load the tables from file
+ // then update them using things in MediaWiki:Zhconversiontable/*
+ global $wgMessageCache;
+ require( "includes/ZhConversion.php" );
+ $this->mTables = array();
+ $this->mTables['zh-cn'] = $zh2CN;
+ $this->mTables['zh-tw'] = $zh2TW;
+ $this->mTables['zh-sg'] = $zh2SG;
+ $this->mTables['zh-hk'] = $zh2HK;
+
+ $cached = $this->parseCachedTable('zh-cn');
+ $this->mTables['zh-cn'] = array_merge($this->mTables['zh-cn'], $cached);
+
+ $cached = $this->parseCachedTable('zh-tw');
+ $this->mTables['zh-tw'] = array_merge($this->mTables['zh-tw'], $cached);
+
+ $cached = $this->parseCachedTable('zh-sg');
+ $this->mTables['zh-sg'] = array_merge($this->mTables['zh-sg'], $cached);
+
+ $cached = $this->parseCachedTable('zh-hk');
+ $this->mTables['zh-hk'] = array_merge($this->mTables['zh-hk'], $cached);
+
+ if($this->lockCache()) {
+ $wgMemc->set($this->mCacheKey, $this->mTables, 43200);
+ $this->unlockCache();
}
- // fallback to fake client
- if($this->mZhClient == false)
- $this->mZhClient=new ZhClientFake();
}
+ /*
+ parse the conversion table stored in the cache
+
+ the tables should be in blocks of the following form:
+
+ -{
+ word => word ;
+ word => word ;
+ ...
+ }-
+
+ to make the tables more manageable, subpages are allowed
+ and will be parsed recursively if $recursive=true
+
+ */
+ function parseCachedTable($code, $subpage='', $recursive=true) {
+ global $wgMessageCache;
+ static $parsed = array();
+
+ if(!is_object($wgMessageCache))
+ return array();
+
+ $key = 'zhconversiontable/'.$code;
+ if($subpage)
+ $key .= '/' . $subpage;
+
+ if(array_key_exists($key, $parsed))
+ return array();
+
+
+ $txt = $wgMessageCache->get( $key, true, true, true );
+
+ // get all subpage links of the form
+ // [[MediaWiki:Zhconversiontable/zh-xx/...|...]]
+ $linkhead = $this->getNsText(NS_MEDIAWIKI) . ':Zhconversiontable';
+ $subs = explode('[[', $txt);
+ $sublinks = array();
+ foreach( $subs as $sub ) {
+ $link = explode(']]', $sub, 2);
+ if(count($link) != 2)
+ continue;
+ $b = explode('|', $link[0]);
+ $b = explode('/', trim($b[0]), 3);
+ if(count($b)==3)
+ $sublink = $b[2];
+ else
+ $sublink = '';
+
+ if($b[0] == $linkhead && $b[1] == $code) {
+ $sublinks[] = $sublink;
+ }
+ }
+
+
+ // parse the mappings in this page
+ $blocks = explode('-{', $txt);
+ array_shift($blocks);
+ $ret = array();
+ foreach($blocks as $block) {
+ $mappings = explode('}-', $block, 2);
+ $stripped = str_replace(array("'", '"', '*','#'), '', $mappings[0]);
+ $table = explode( ';', $stripped );
+ foreach( $table as $t ) {
+ $m = explode( '=>', $t );
+ if( count( $m ) != 2)
+ continue;
+ $ret[trim($m[0])] = trim($m[1]);
+ }
+ }
+ $parsed[$key] = true;
+
+
+ // recursively parse the subpages
+ if($recursive) {
+ foreach($sublinks as $link) {
+ $s = $this->parseCachedTable($code, $link, $recursive);
+ $ret = array_merge($ret, $s);
+ }
+ }
+ return $ret;
+ }
+
/*
- get preferred language variants. eventually this will check the
- user's preference setting as well, once the language option in
- the setting pages is finalized.
+ get preferred language variants.
*/
function getPreferredVariant() {
- global $wgUser;
+ global $wgUser, $wgRequest;
if($this->mZhLanguageCode)
return $this->mZhLanguageCode;
-
- // get language variant preference for logged in users
+
+ // see if the preference is set in the request
+ $zhreq = $wgRequest->getText( 'variant' );
+ if( in_array( $zhreq, $this->getVariants() ) ) {
+ $this->mZhLanguageCode = $zhreq;
+ return $zhreq;
+ }
+
+ // get language variant preference from logged in users
if($wgUser->getID()!=0) {
$this->mZhLanguageCode = $wgUser->getOption('variant');
}
- else {
+
+ if( !$this->mZhLanguageCode ) {
// see if some zh- variant is set in the http header,
- $this->mZhLanguageCode="zh-cn";
+ $this->mZhLanguageCode="zh";
$header = str_replace( '_', '-', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]));
$zh = strstr($header, 'zh-');
if($zh) {
@@ -55,47 +237,153 @@ class LanguageZh extends LanguageZh_cn {
return $this->mZhLanguageCode;
}
-
-
+ # this should give much better diff info
+ function segmentForDiff( $text ) {
+ return preg_replace(
+ "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
+ "' ' .\"$1\"", $text);
+ }
+
+ function unsegmentForDiff( $text ) {
+ return preg_replace(
+ "/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
+ "\"$1\"", $text);
+ }
+
function autoConvert($text, $toVariant=false) {
+ $fname="LanguageZh::autoConvert";
+ wfProfileIn( $fname );
+
+ if(!$this->mTablesLoaded)
+ $this->loadTables();
+
if(!$toVariant)
$toVariant = $this->getPreferredVariant();
- $fname="zhautoConvert";
- wfProfileIn( $fname );
- $t = $this->mZhClient->convert($text, $toVariant);
+ $ret = '';
+ switch( $toVariant ) {
+ case 'zh-cn': $ret = strtr($text, $this->mTables['zh-cn']);break;
+ case 'zh-tw': $ret = strtr($text, $this->mTables['zh-tw']);break;
+ case 'zh-sg': $ret = strtr(strtr($text, $this->mTables['zh-cn']), $this->mTables['zh-sg']);break;
+ case 'zh-hk': $ret = strtr(strtr($text, $this->mTables['zh-tw']), $this->mTables['zh-hk']);break;
+ default: $ret = $text;
+ }
wfProfileOut( $fname );
- return $t;
+ return $ret;
}
function autoConvertToAllVariants($text) {
- $fname="zhautoConvertToAll";
+ $fname="LanguageZh::autoConvertToAllVariants";
wfProfileIn( $fname );
- $ret = $this->mZhClient->convertToAllVariants($text);
- if($ret == false) {//fall back...
- $ret = Language::autoConvertToAllVariants($text);
- }
+ if( !$this->mTablesLoaded )
+ $this->loadTables();
+
+ $ret = array();
+ $ret['zh-cn'] = strtr($text, $this->mTables['zh-cn']);
+ $ret['zh-tw'] = strtr($text, $this->mTables['zh-tw']);
+ $ret['zh-sg'] = strtr(strtr($text, $this->mTables['zh-cn']), $this->mTables['zh-sg']);
+ $ret['zh-hk'] = strtr(strtr($text, $this->mTables['zh-tw']), $this->mTables['zh-hk']);
wfProfileOut( $fname );
return $ret;
}
- # only convert titles having more than one character
- function convertTitle($text) {
- $len=0;
- if( function_exists( 'mb_strlen' ) )
- $len = mb_strlen($text);
- else
- $len = strlen($text)/3;
- if($len>1)
- return $this->autoConvert( $text);
+ # convert text to different variants of a language. the automatic
+ # conversion is done in autoConvert(). here we parse the text
+ # marked with -{}-, which specifies special conversions of the
+ # text that can not be accomplished in autoConvert()
+ #
+ # syntax of the markup:
+ # -{code1:text1;code2:text2;...}- or
+ # -{text}- in which case no conversion should take place for text
+ function convert( $text , $isTitle=false) {
+ global $wgDisableLangConversion;
+ if($wgDisableLangConversion)
+ return $text;
+
+ $mw =& MagicWord::get( MAG_NOTITLECONVERT );
+ if( $mw->matchAndRemove( $text ) )
+ $this->mDoTitleConvert = false;
+
+ $mw =& MagicWord::get( MAG_NOCONTENTCONVERT );
+ if( $mw->matchAndRemove( $text ) ) {
+ $this->mDoContentConvert = false;
+ }
+
+ // no conversion if redirecting
+ $mw =& MagicWord::get( MAG_REDIRECT );
+ if( $mw->matchStart( $text ))
+ return $text;
+
+ if( $isTitle ) {
+ if( !$this->mDoTitleConvert )
+ return $text;
+
+ global $wgRequest;
+ $isredir = $wgRequest->getText( 'redirect', 'yes' );
+ $action = $wgRequest->getText( 'action' );
+ if ( $isredir == 'no' || $action == 'edit' ) {
+ return $text;
+ }
+ else {
+ return $this->autoConvert($text);
+ }
+ }
+
+ if( !$this->mDoContentConvert )
+ return $text;
+
+ $plang = $this->getPreferredVariant();
+ $fallback = $this->getVariantFallback($plang);
+
+ $tarray = explode("-{", $text);
+ $tfirst = array_shift($tarray);
+ $text = $this->autoConvert($tfirst);
+ foreach($tarray as $txt) {
+ $marked = explode("}-", $txt);
+
+ $choice = explode(";", $marked{0});
+ if(!array_key_exists(1, $choice)) {
+ /* a single choice */
+ $text .= $choice{0};
+ } else {
+ $choice1=false;
+ $choice2=false;
+ foreach($choice as $c) {
+ $v = explode(":", $c);
+ if(!array_key_exists(1, $v)) {
+ //syntax error in the markup, give up
+ break;
+ }
+ $code = trim($v{0});
+ $content = trim($v{1});
+ if($code == $plang) {
+ $choice1 = $content;
+ break;
+ }
+ if($code == $fallback)
+ $choice2 = $content;
+ }
+ if ( $choice1 )
+ $text .= $choice1;
+ elseif ( $choice2 )
+ $text .= $choice2;
+ else
+ $text .= $marked{0};
+ }
+ if(array_key_exists(1, $marked))
+ $text .= $this->autoConvert($marked{1});
+ }
+
return $text;
}
+
function getVariants() {
- return array("zh-cn", "zh-tw", "zh-sg", "zh-hk");
+ return array("zh", "zh-cn", "zh-tw", "zh-sg", "zh-hk");
}
function getVariantFallback($v) {
switch ($v) {
+ case 'zh': return 'zh-cn'; break;
case 'zh-cn': return 'zh-sg'; break;
case 'zh-sg': return 'zh-cn'; break;
case 'zh-tw': return 'zh-hk'; break;
@@ -104,16 +392,23 @@ class LanguageZh extends LanguageZh_cn {
return false;
}
- // word segmentation through ZhClient
+ // word segmentation
function stripForSearch( $string ) {
- $fname="zhsegment";
+ $fname="LanguageZh::stripForSearch";
wfProfileIn( $fname );
+
+ // eventually this should be a word segmentation
+ // for now just treat each character as a word
+ $t = preg_replace(
+ "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
+ "' ' .\"$1\"", $string);
+
//always convert to zh-cn before indexing. it should be
//better to use zh-cn for search, since conversion from
//Traditional to Simplified is less ambiguous than the
//other way around
- $string = $this->autoConvert($string, 'zh-cn');
- $t = $this->mZhClient->segment($string);
+
+ $t = $this->autoConvert($t, 'zh-cn');
$t = LanguageUtf8::stripForSearch( $t );
wfProfileOut( $fname );
return $t;
@@ -126,5 +421,35 @@ class LanguageZh extends LanguageZh_cn {
$ret = array_unique( explode('|', $terms) );
return $ret;
}
+
+ function findVariantLink( &$link, &$nt ) {
+ static $count=0; //used to limit this operation
+ static $cache=array();
+ global $wgDisableLangConversion;
+ $pref = $this->getPreferredVariant();
+ if( $wgDisableLangConversion || $pref == 'zh' || $count > 50)
+ return;
+ $count++;
+ $variants = $this->autoConvertToAllVariants($link);
+ if($variants == false) //give up
+ return;
+ foreach( $variants as $v ) {
+ if(isset($cache[$v]))
+ continue;
+ $cache[$v] = 1;
+ $varnt = Title::newFromText( $v );
+ if( $varnt && $varnt->getArticleID() > 0 ) {
+ $nt = $varnt;
+ $link = $v;
+ break;
+ }
+ }
+ }
+
+ function getExtraHashOptions() {
+ global $wgUser;
+ $variant = $this->getPreferredVariant();
+ return '!' . $variant ;
+ }
}
?>
diff --git a/languages/LanguageZh_cn.php b/languages/LanguageZh_cn.php
index 1be021375155..7c88b3c1c4e2 100644
--- a/languages/LanguageZh_cn.php
+++ b/languages/LanguageZh_cn.php
@@ -140,14 +140,13 @@ require_once( "LanguageUtf8.php" );
"tog-editondblclick" => "åŒå‡»é¡µé¢ç¼–辑(JavaScript)",
"tog-editsection"=>"å…许通过点击[编辑]链接编辑段è½",
"tog-editsectiononrightclick"=>"å…许å³å‡»æ ‡é¢˜ç¼–辑段è½(JavaScript)",
-"tog-showtoc"=>"显示目录<br>(针对一页超过3个标题的文章)",
+"tog-showtoc"=>"显示目录<br />(针对一页超过3个标题的文章)",
"tog-rememberpassword" => "下次登陆记ä½å¯†ç ", /* "Remember password across sessions", */
"tog-editwidth" => "编辑æ ä½å®½åº¦", /* "Edit box has full width", */
"tog-editondblclick" => "åŒå‡»ç¼–辑页é¢ï¼ˆJavascript)", /* "Edit pages on double click (JavaScript)", */
"tog-watchdefault" => "监视新的以åŠæ›´æ”¹è¿‡çš„文章", /* "Watch new and modified articles", */
"tog-minordefault" => "细微编辑为默认设置", /* "Mark all edits minor by default", */
"tog-previewontop" => "在编辑框上方显示预览", /* "Show preview before edit box and not after it" */
-
# Dates
'sunday' => "星期日",
@@ -322,8 +321,8 @@ MySQL返回错误 \"<tt>$3: $4</tt>\"。",
"yourpasswordagain" => "å†æ¬¡è¾“入密ç ",
"newusersonly" => "(仅é™æ–°ç”¨æˆ·ï¼‰",
"remembermypassword" => "下次登录记ä½å¯†ç ã€‚",
-"loginproblem" => "<b>登录有问题。</b><br>å†è¯•ä¸€æ¬¡ï¼",
-"alreadyloggedin" => "<font color=red><b>用户$1,您已ç»ç™»å½•äº†!</b></font><br>\n",
+"loginproblem" => "<b>登录有问题。</b><br />å†è¯•ä¸€æ¬¡ï¼",
+"alreadyloggedin" => "<font color=red><b>用户$1,您已ç»ç™»å½•äº†!</b></font><br />\n",
"login" => "登录",
"userlogin" => "用户登录",
@@ -363,7 +362,7 @@ MySQL返回错误 \"<tt>$3: $4</tt>\"。",
"showpreview" => "显示预览",
"blockedtitle" => "用户被å°",
"blockedtext" => "您的用户å或IP地å€å·²è¢«$1å°ã€‚
-ç†ç”±æ˜¯ï¼š<br>'''$2'''<p>您å¯ä»¥ä¸Ž$1å‘其他任何[[Wikipedia:管ç†å‘˜|管ç†å‘˜]]询问。",
+ç†ç”±æ˜¯ï¼š<br />'''$2'''<p>您å¯ä»¥ä¸Ž$1å‘其他任何[[Wikipedia:管ç†å‘˜|管ç†å‘˜]]询问。",
"whitelistedittitle" => "登录åŽæ‰å¯ç¼–辑",
"whitelistedittext" => "您必须先[[Special:Userlogin|登录]]æ‰å¯ç¼–辑页é¢ã€‚",
"whitelistreadtitle" => "登录åŽæ‰å¯é˜…读",
@@ -400,7 +399,7 @@ MySQL返回错误 \"<tt>$3: $4</tt>\"。",
"yourdiff" => "差别",
"copyrightwarning" => "请注æ„对Wikipedia的任何贡献都将被认为是在GNU自由文档åè®®è¯ä¹¦ä¸‹å‘布。
(细节请è§$1).
-如果您ä¸å¸Œæœ›æ‚¨çš„文字被任æ„修改和å†æ•£å¸ƒï¼Œè¯·ä¸è¦æ交。<br>
+如果您ä¸å¸Œæœ›æ‚¨çš„文字被任æ„修改和å†æ•£å¸ƒï¼Œè¯·ä¸è¦æ交。<br />
您åŒæ—¶ä¹Ÿå‘我们ä¿è¯ä½ æ‰€æ交的内容是你自己所作,或得自一个ä¸å—版æƒä¿æŠ¤æˆ–相似自由的æ¥æºã€‚
<strong>ä¸è¦åœ¨æœªèŽ·æŽˆæƒçš„情况下å‘表ï¼</strong>",
@@ -458,7 +457,7 @@ MySQL返回错误 \"<tt>$3: $4</tt>\"。",
"nonefound" => "<strong>注æ„:</strong>失败的æœç´¢å¾€å¾€æ˜¯ç”±äºŽè¯•å›¾æœç´¢è¯¸å¦‚“的â€æˆ–“和â€ä¹‹ç±»çš„常è§å­—所引起。",
"powersearch" => "æœç´¢",
"powersearchtext" => "
-æœç´¢å字空间:<br>$1<br>$2列出é‡å®šå‘页é¢ï¼›æœç´¢$3 $9",
+æœç´¢å字空间:<br />$1<br />$2列出é‡å®šå‘页é¢ï¼›æœç´¢$3 $9",
"searchdisabled" => "<p>Wikipedia内部æœç´¢åŠŸèƒ½ç”±äºŽé«˜å³°æ—¶æ®µæœåŠ¡å™¨è¶…载而åœæ­¢ä½¿ç”¨ã€‚
您å¯ä»¥æš‚时通过
@@ -476,9 +475,9 @@ alt=\"Google\" align=\"middle\"></a>
<input type=text name=\"q\" size=31 maxlength=255 value=\"$1\">
<input type=submit name=\"sa\" value=\"Googleæœç´¢\">
<input type=hidden name=\"cof\" value=\"LW:135;L:http://zh.wikipedia.org/upload/wiki.png;LH:133;AH:left;S:http://www.wikiped<font face=arial,sans-serif size=-1>
-<input type=hidden name=\"domains\" value=\"zh.wikipedia.org\"><br>
+<input type=hidden name=\"domains\" value=\"zh.wikipedia.org\"><br />
<input type=radio name=\"sitesearch\" value=\"\"> æœç´¢WWW
-<input type=radio name=\"sitesearch\" value=\"zh.wikipedia.org\" checked> æœç´¢zh.wikipedia.org </font><br>
+<input type=radio name=\"sitesearch\" value=\"zh.wikipedia.org\" checked> æœç´¢zh.wikipedia.org </font><br />
</td></tr></table></form>
<!-- Search Google -->\n",
@@ -541,8 +540,7 @@ alt=\"Google\" align=\"middle\"></a>
"rcnote" => "下é¢æ˜¯æœ€è¿‘<strong>$2</strong>天内最新的<strong>$1</strong>次改动。",
"rcnotefrom" => "下é¢æ˜¯è‡ª<b>$2</b>(最多显示<b>$1</b>)。",
"rclistfrom" => "显示自$1以æ¥çš„新更改",
-# "rclinks" => "显示最åŽ$2å°æ—¶ï¼$3天内的$1此修改",
-"rclinks" => "显示最近 $2 天内最新的 $1 次改动。",
+"rclinks" => "显示最近 $2 天内最新的 $1 次改动。<br />$3",
"rchide" => "以$4å½¢å¼ï¼›$1个å°ä¿®æ”¹ï¼›$2个二级å字空间;$3个多é‡ä¿®æ”¹",
"diff" => "差异",
"hist" => "历å²",
@@ -639,7 +637,7 @@ alt=\"Google\" align=\"middle\"></a>
"deleteimgcompletely" => "删",
"imghistlegend" => "egend: (现) = ç›®å‰çš„图åƒï¼Œ(删) = 删除旧版本,
(å¤) = æ¢å¤åˆ°æ—§ç‰ˆæœ¬ã€‚
-<br><i>点击日期查看当天上载的图åƒ</i>.",
+<br /><i>点击日期查看当天上载的图åƒ</i>.",
"imagelinks" => "图åƒé“¾æŽ¥",
"linkstoimage" => "以下页é¢è¿žæŽ¥åˆ°æœ¬å›¾åƒï¼š",
@@ -666,10 +664,10 @@ alt=\"Google\" align=\"middle\"></a>
"maintenancebacklink" => "返回维护页",
"disambiguations" => "消å«ç³Šé¡µ",
"disambiguationspage" => "Wikipedia:Links_to_disambiguating_pages",
-"disambiguationstext" => "以下的æ¡ç›®éƒ½æœ‰åˆ°æ¶ˆå«ç³Šé¡µçš„链接,但它们应该是链到适当的题目。<br>一个页é¢ä¼šè¢«è§†ä¸ºæ¶ˆå«ç³Šé¡µå¦‚果它是链自$1.<br>由其它他å字空间æ¥çš„链接<i>ä¸ä¼š</i>在这儿被列出æ¥ã€‚",
+"disambiguationstext" => "以下的æ¡ç›®éƒ½æœ‰åˆ°æ¶ˆå«ç³Šé¡µçš„链接,但它们应该是链到适当的题目。<br />一个页é¢ä¼šè¢«è§†ä¸ºæ¶ˆå«ç³Šé¡µå¦‚果它是链自$1.<br />由其它他å字空间æ¥çš„链接<i>ä¸ä¼š</i>在这儿被列出æ¥ã€‚",
"doubleredirects" => "åŒé‡é‡å®šå‘",
"doubleredirectstext" => "<b>请注æ„:</b> 这列表å¯èƒ½åŒ…括ä¸æ­£ç¡®çš„å应。
-这通常表示在那页é¢ç¬¬ä¸€ä¸ª#REDIRECT之下还有文字。<br>\n
+这通常表示在那页é¢ç¬¬ä¸€ä¸ª#REDIRECT之下还有文字。<br />\n
æ¯ä¸€è¡Œéƒ½åŒ…å«åˆ°ç¬¬ä¸€è·Ÿç¬¬äºŒä¸ªé‡å®šå‘页的链接,以åŠç¬¬äºŒä¸ªé‡å®šå‘页的第一行文字,
通常显示的都会是\“真正\†的目标页é¢ï¼Œä¹Ÿå°±æ˜¯ç¬¬ä¸€ä¸ªé‡å®šå‘页应该指å‘çš„æ¡ç›®ã€‚",
"brokenredirects" => "æŸåçš„é‡å®šå‘页",
@@ -859,7 +857,7 @@ Wikipedia与这些公å¸å¹¶æ²¡æœ‰ä»»ä½•å•†ä¸šå…³ç³»ï¼Œå› æ­¤æœ¬è¡¨ä¸åº”该
"noblockreason" => "您必须说明查å°çš„具体ç†ç”±ã€‚",
"blockipsuccesssub" => "查å°æˆåŠŸ",
"blockipsuccesstext" => "IP地å€â€œ$1â€å·²ç»è¢«æŸ¥å°ã€‚
-<br>å‚看[[Special:被å°IP地å€åˆ—表|被å°IP地å€åˆ—表]]以å¤å®¡æŸ¥å°ã€‚",
+<br />å‚看[[Special:被å°IP地å€åˆ—表|被å°IP地å€åˆ—表]]以å¤å®¡æŸ¥å°ã€‚",
"unblockip" => "解除ç¦å°IP地å€",
"unblockiptext" => "用下é¢çš„表å•æ¥æ¢å¤å…ˆå‰è¢«ç¦å°çš„IP地å€çš„书写æƒã€‚",
"ipusubmit" => "解除ç¦å°",
@@ -887,7 +885,7 @@ Wikipedia与这些公å¸å¹¶æ²¡æœ‰ä»»ä½•å•†ä¸šå…³ç³»ï¼Œå› æ­¤æœ¬è¡¨ä¸åº”该
"unlockdbsuccesssub" => "æ•°æ®åº“开放",
"lockdbsuccesstext" => "Wikipediaæ•°æ®åº“å·²ç»ä¸Šé”。
-<br>请记ä½åœ¨ç»´æŠ¤å®ŒæˆåŽé‡æ–°å¼€æ”¾æ•°æ®åº“。",
+<br />请记ä½åœ¨ç»´æŠ¤å®ŒæˆåŽé‡æ–°å¼€æ”¾æ•°æ®åº“。",
"unlockdbsuccesstext" => "Wikipediaæ•°æ®åº“é‡æ–°å¼€æ”¾ã€‚",
# SQL query
@@ -949,6 +947,69 @@ Wikipedia与这些公å¸å¹¶æ²¡æœ‰ä»»ä½•å•†ä¸šå…³ç³»ï¼Œå› æ­¤æœ¬è¡¨ä¸åº”该
'mw_math_source' => "显示为TeX代ç (使用文字æµè§ˆå™¨æ—¶)", /* "Leave it as TeX (for text browsers)" */
'mw_math_modern' => "推è为新版æµè§ˆå™¨ä½¿ç”¨", /* "Recommended for modern browsers" */
+# some untranslated messages as of 1.4 beta1
+'1movedto2' => "$1移动到$2", //"$1 moved to $2",
+'1movedto2_redir' => "$1é‡å®šå‘到$2", //"$1 moved to $2 over redirect",
+'acct_creation_throttle_hit' => "对ä¸èµ·ï¼Œæ‚¨å·²ç»æ³¨å†Œäº†$1è´¦å·ã€‚ä½ ä¸èƒ½å†æ³¨å†Œäº†ã€‚", //"Sorry, you have already created $1 accounts. You can't make any more.",
+'addgroup' => "增加新的组", //"Add Group",
+'allarticles' => "所有æ¡ç›®", //"All articles",
+'allmessages' => "系统界é¢", //"All system messages",
+'allmessagesnotsupportedDB' => "系统界é¢åŠŸèƒ½å¤„äºŽå…³é—­çŠ¶æ€ (wgUseDatabaseMessages)。", //"Special:AllMessages not supported because wgUseDatabaseMessages is off.",
+'allmessagestext' => "这里列出所有å¯å®šåˆ¶çš„系统界é¢ã€‚", //"This is a list of all system messages available in the MediaWiki: namespace.",
+'allpagesformtext1' => "列出从 $1 èµ·çš„æ¡ç›®", //"Display pages starting at: $1",
+'allpagesformtext2' => "选定å字空间: $1 $1", //"Choose namespace: $1 $2",
+'allpagesnamespace' => "所有 $1 å字空间的æ¡ç›®", //"All pages ($1 namespace)",
+'allpagesnext' => "下一页", //"Next",
+'allpagesprev' => "上一页", //"Previous",
+'allpagessubmit' => "æ交", //"Go",
+'ancientpages' => "è€æ¡ç›®", //"Oldest pages",
+'and' => "和", //"and",
+'anontalk' => "该IP的对è¯é¡µ", //"Talk for this IP",
+'anonymous' => "匿å用户", //"Anonymous user(s) of 1.4",
+'article' => "æ¡ç›®", //"Content page",
+'autoblocker' => "ä½ çš„IP和被å°äº†çš„ \"$1\" 是一样的。å°é”原因: \"$2\".",//"Autoblocked because you share an IP address with \"$1\". Reason \"$2\".",
+'blocklogentry' => "å°é” $1, $2",//"blocked \"$1\" with an expiry time of $2",
+'blocklogpage' => "å°é”记录", //"Block_log",
+'categoriespagetext' => "以下列出所有的页é¢åˆ†ç±»ã€‚", //"The following categories exists in the wiki.",
+'categoryarticlecount' => "该类页é¢å…±æœ‰ $1 æ¡ç›®", //There are $1 articles in this category.",
+'clearyourcache' => "'''注æ„:''' ä¿å­˜è®¾ç½®åŽï¼Œè¦æ¸…掉æµè§ˆå™¨çš„缓存æ‰èƒ½ç”Ÿæ•ˆï¼š'''Mozilla:''' 点''刷新'' (或用快键''Ctrl-R''),'''IE / Opera:''' ''Ctrl-F5'', '''Safari:''' ''Cmd-R'', '''Konqueror''' ''Ctrl-R''。",//"'''Note:''' After saving, you have to clear your browser cache to see the changes: '''Mozilla:''' click ''Reload'' (or ''Ctrl-R''), '''IE / Opera:''' ''Ctrl-F5'', '''Safari:''' ''Cmd-R'', '''Konqueror''' ''Ctrl-R''.",
+'edit' => "编辑", //"Edit",
+'navigation' => "导航", //"Navigation",
+'nstab-category' => "分类", //"Category",
+'nstab-help' => "帮助",//"Help",
+'nstab-image' => "图åƒ",//"Image",
+'nstab-main' => "æ¡ç›®", //"Article",
+'nstab-mediawiki' => "ç•Œé¢",//"Message",
+'nstab-special' => "特殊",//"Special",
+'nstab-template' => "模æ¿", //"Template",
+'nstab-user' => "用户页é¢", //"User page",
+'nstab-wp' => "关于", //"About",
+'portal' => "社区",//"Community portal",
+'prefs-help-userdata' => "*<strong>真实姓å</strong>(å¯é€‰ï¼‰ï¼šç”¨ä»¥å¯¹æ‚¨çš„贡献署å。<br />*<strong>点å­é‚®ä»¶</strong>(å¯é€‰ï¼‰ï¼šè®©ä»–人通过网站在ä¸çŸ¥é“您的电å­é‚®ä»¶åœ°å€çš„情况下通过电å­é‚®ä»¶ä¸Žæ‚¨è”络,以åŠé€šè¿‡ç”µå­é‚®ä»¶å–å¾—é—忘的密ç ã€‚", /*"* <strong>Real name</strong> (optional): if you choose to provide it this will be used for giving you attribution for your work.<br />
+* <strong>Email</strong> (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.", */
+'prefs-misc' => "æ‚项", //"Misc settings",
+'prefs-personal' => "用户数æ®",//"User data",
+'prefs-rc' => "最近更新", //"Recent changes and stub display",
+'showhideminor' => "$1 å°ä¿®æ”¹ | $2 bots | $3 登录用户 | $4 检查过的", //"$1 minor edits | $2 bots | $3 logged in users | $4 patrolled edits ",
+'skin' => "皮肤", //"Skin",
+'talk' => "讨论",//"Discussion",
+'timezonelegend' => "时区", //"Time zone",
+'toolbox' => "工具",//"Toolbox",
+'watch' => "监视",//"Watch",
+'yourlanguage' => "ç•Œé¢è¯­è¨€", //"Your language"
+'yourrealname' => "真实姓å*", //"Your real name"
+'yourvariant' => "中文字体", //"language variant"
+
+# short names for language variants used for language conversion links.
+# to disable showing a particular link, set it to 'disable', e.g.
+# 'variantname-zh-sg' => 'disable',
+'variantname-zh-cn' => '大陆简体',
+'variantname-zh-tw' => 'å°æ¹¾ç¹ä½“',
+'variantname-zh-hk' => '香港ç¹ä½“',
+'variantname-zh-sg' => '新加å¡ç®€ä½“',
+'variantname-zh' => 'ä¸è½¬æ¢',
+
);
class LanguageZh_cn extends LanguageUtf8 {
diff --git a/languages/LanguageZh_tw.php b/languages/LanguageZh_tw.php
index eb50fad1d73d..0fa99a81d488 100644
--- a/languages/LanguageZh_tw.php
+++ b/languages/LanguageZh_tw.php
@@ -137,7 +137,7 @@ require_once( "LanguageZh_cn.php" );
"tog-editondblclick" => "雙擊é é¢ç·¨è¼¯(JavaScript)",
"tog-editsection"=>"å…許通éŽé»žæ“Š[編輯]éˆçµç·¨è¼¯æ®µè½",
"tog-editsectiononrightclick"=>"å…許å³æ“Šæ¨™é¡Œç·¨è¼¯æ®µè½(JavaScript)",
- "tog-showtoc"=>"顯示目錄<br>(é‡å°ä¸€é è¶…éŽ3個標題的文章)",
+ "tog-showtoc"=>"顯示目錄<br />(é‡å°ä¸€é è¶…éŽ3個標題的文章)",
"tog-rememberpassword" => "下次登陸記ä½å¯†ç¢¼",/* "Remember password across sessions", */
"tog-editwidth" => "編輯欄ä½å¯¬åº¦",/* "Edit box has full width", */
"tog-editondblclick" => "雙擊編輯é é¢ï¼ˆJavascript)",/* "Edit pages on double click (JavaScript)", */
@@ -322,8 +322,8 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"yourpasswordagain" => "å†æ¬¡è¼¸å…¥å¯†ç¢¼",
"newusersonly" => "(僅é™æ–°ç”¨æˆ¶ï¼‰",
"remembermypassword" => "下次登錄記ä½å¯†ç¢¼ã€‚",
-"loginproblem" => "<b>登錄有å•é¡Œã€‚</b><br>å†è©¦ä¸€æ¬¡ï¼",
-"alreadyloggedin" => "<font color=red><b>用戶$1,您已經登錄了!</b></font><br>\n",
+"loginproblem" => "<b>登錄有å•é¡Œã€‚</b><br />å†è©¦ä¸€æ¬¡ï¼",
+"alreadyloggedin" => "<font color=red><b>用戶$1,您已經登錄了!</b></font><br />\n",
"login" => "登錄",
"userlogin" => "用戶登錄",
@@ -363,7 +363,7 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"showpreview" => "顯示é è¦½",
"blockedtitle" => "用戶被å°",
"blockedtext" => "您的用戶å或網å€å·²è¢«$1å°ã€‚
-ç†ç”±æ˜¯ï¼š<br>'''$2'''<p>您å¯ä»¥èˆ‡$1å‘其他任何[[維基百科:管ç†å“¡|管ç†å“¡]]è©¢å•ã€‚",
+ç†ç”±æ˜¯ï¼š<br />'''$2'''<p>您å¯ä»¥èˆ‡$1å‘其他任何[[維基百科:管ç†å“¡|管ç†å“¡]]è©¢å•ã€‚",
"whitelistedittitle" => "登錄後æ‰å¯ç·¨è¼¯",
"whitelistedittext" => "您必須先[[特殊:登錄]]æ‰å¯ç·¨è¼¯é é¢ã€‚",
"whitelistreadtitle" => "登錄後æ‰å¯é–±è®€",
@@ -400,7 +400,7 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"yourdiff" => "差別",
"copyrightwarning" => "請注æ„å°W維基百科的任何貢ç»éƒ½å°‡è¢«èªç‚ºæ˜¯åœ¨GNU自由文檔å”議證書下發佈。
(細節請見$1).
-如果您ä¸å¸Œæœ›æ‚¨çš„文字被任æ„修改和å†æ•£ä½ˆï¼Œè«‹ä¸è¦æ交。<br>
+如果您ä¸å¸Œæœ›æ‚¨çš„文字被任æ„修改和å†æ•£ä½ˆï¼Œè«‹ä¸è¦æ交。<br />
您åŒæ™‚也å‘我們ä¿è­‰ä½ æ‰€æ交的內容是你自己所作,或得自一個ä¸å—版權ä¿è­·æˆ–相似自由的來æºã€‚
<strong>ä¸è¦åœ¨æœªç²æŽˆæ¬Šçš„情æ³ä¸‹ç™¼è¡¨ï¼</strong>",
@@ -460,7 +460,7 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"nonefound" => "<strong>注æ„:</strong>失敗的æœç´¢å¾€å¾€æ˜¯ç”±æ–¼è©¦åœ–æœç´¢è«¸å¦‚“的â€æˆ–“和â€ä¹‹é¡žçš„常見字所引起。",
"powersearch" => "æœç´¢",
"powersearchtext" => "
-æœç´¢å字空間:<br>$1<br>$2列出é‡å®šå‘é é¢ï¼›æœç´¢$3 $9",
+æœç´¢å字空間:<br />$1<br />$2列出é‡å®šå‘é é¢ï¼›æœç´¢$3 $9",
"searchdisabled" => "<p>維基百科內部æœç´¢åŠŸèƒ½ç”±æ–¼é«˜å³°æ™‚段æœå‹™å™¨è¶…載而åœæ­¢ä½¿ç”¨ã€‚
您å¯ä»¥æš«æ™‚通éŽ
@@ -478,9 +478,9 @@ alt=\"Google\" align=\"middle\"></a>
<input type=text name=\"q\" size=31 maxlength=255 value=\"$1\">
<input type=submit name=\"sa\" value=\"Googleæœç´¢\">
<input type=hidden name=\"cof\" value=\"LW:135;L:http://zh-tw.wikipedia.org/upload/wiki.png;LH:133;AH:left;S:http://www.wikiped<font face=arial,sans-serif size=-1>
-<input type=hidden name=\"domains\" value=\"zh-tw.wikipedia.org\"><br>
+<input type=hidden name=\"domains\" value=\"zh-tw.wikipedia.org\"><br />
<input type=radio name=\"sitesearch\" value=\"\"> æœç´¢WWW
-<input type=radio name=\"sitesearch\" value=\"zh-tw.wikipedia.org\" checked> æœç´¢zh-tw.wikipedia.org </font><br>
+<input type=radio name=\"sitesearch\" value=\"zh-tw.wikipedia.org\" checked> æœç´¢zh-tw.wikipedia.org </font><br />
</td></tr></table></form>
<!-- Search Google -->\n",
@@ -543,8 +543,7 @@ alt=\"Google\" align=\"middle\"></a>
"rcnote" => "下é¢æ˜¯æœ€è¿‘<strong>$2</strong>天內最新的<strong>$1</strong>次改動。",
"rcnotefrom" => "下é¢æ˜¯è‡ª<b>$2</b>(最多顯示<b>$1</b>)。",
"rclistfrom" => "顯示自$1以來的新更改",
-# "rclinks" => "顯示最後$2å°æ™‚ï¼$3天內的$1此修改",
-"rclinks" => "顯示最近 $2 天內最新的 $1 次改動。",
+"rclinks" => "顯示最近 $2 天內最新的 $1 次改動。<br />$3",
"rchide" => "以$4å½¢å¼ï¼›$1個å°ä¿®æ”¹ï¼›$2個二級å字空間;$3個多é‡ä¿®æ”¹",
"diff" => "差異",
"hist" => "æ­·å²",
@@ -636,7 +635,7 @@ alt=\"Google\" align=\"middle\"></a>
"deleteimg" => "刪",
"imghistlegend" => "題跋: (ç¾) = ç›®å‰çš„圖åƒï¼Œ(刪) = 刪除舊版本,
(複) = æ¢å¾©åˆ°èˆŠç‰ˆæœ¬ã€‚
-<br><i>點擊日期查看當天上載的圖åƒ</i>.",
+<br /><i>點擊日期查看當天上載的圖åƒ</i>.",
"imagelinks" => "圖åƒéˆæŽ¥",
"linkstoimage" => "以下é é¢é€£æŽ¥åˆ°æœ¬åœ–åƒï¼š",
@@ -663,10 +662,10 @@ alt=\"Google\" align=\"middle\"></a>
"maintenancebacklink" => "返回維護é ",
"disambiguations" => "消å«ç³Šé ",
"disambiguationspage" => "維基百科:éˆæŽ¥åˆ°æ¶ˆæ­§ç¾©çš„é é¢",
-"disambiguationstext" => "以下的æ¢ç›®éƒ½æœ‰åˆ°æ¶ˆå«ç³Šé çš„éˆæŽ¥ï¼Œä½†å®ƒå€‘應該是éˆåˆ°é©ç•¶çš„題目。<br>一個é é¢æœƒè¢«è¦–為消å«ç³Šé å¦‚果它是éˆè‡ª$1.<br>由其它他å字空間來的éˆæŽ¥<i>ä¸æœƒ</i>在這兒被列出來。",
+"disambiguationstext" => "以下的æ¢ç›®éƒ½æœ‰åˆ°æ¶ˆå«ç³Šé çš„éˆæŽ¥ï¼Œä½†å®ƒå€‘應該是éˆåˆ°é©ç•¶çš„題目。<br />一個é é¢æœƒè¢«è¦–為消å«ç³Šé å¦‚果它是éˆè‡ª$1.<br />由其它他å字空間來的éˆæŽ¥<i>ä¸æœƒ</i>在這兒被列出來。",
"doubleredirects" => "é›™é‡é‡å®šå‘",
"doubleredirectstext" => "<b>請注æ„:</b> 這列表å¯èƒ½åŒ…括ä¸æ­£ç¢ºçš„å應。
-這通常表示在那é é¢ç¬¬ä¸€å€‹#REDIRECT之下還有文字。<br>\n
+這通常表示在那é é¢ç¬¬ä¸€å€‹#REDIRECT之下還有文字。<br />\n
æ¯ä¸€è¡Œéƒ½åŒ…å«åˆ°ç¬¬ä¸€è·Ÿç¬¬äºŒå€‹é‡å®šå‘é çš„éˆæŽ¥ï¼Œä»¥åŠç¬¬äºŒå€‹é‡å®šå‘é çš„第一行文字,
通常顯示的都會是\“真正\†的目標é é¢ï¼Œä¹Ÿå°±æ˜¯ç¬¬ä¸€å€‹é‡å®šå‘é æ‡‰è©²æŒ‡å‘çš„æ¢ç›®ã€‚",
"brokenredirects" => "æ壞的é‡å®šå‘é ",
@@ -855,7 +854,7 @@ alt=\"Google\" align=\"middle\"></a>
"noblockreason" => "您必須說明查å°çš„å…·é«”ç†ç”±ã€‚",
"blockipsuccesssub" => "查å°æˆåŠŸ",
"blockipsuccesstext" => "網å€â€œ$1â€å·²ç¶“被查å°ã€‚
-<br>åƒçœ‹[[特殊:被å°ç¶²å€åˆ—表|被å°ç¶²å€åˆ—表]]以復審查å°ã€‚",
+<br />åƒçœ‹[[特殊:被å°ç¶²å€åˆ—表|被å°ç¶²å€åˆ—表]]以復審查å°ã€‚",
"unblockip" => "解除ç¦å°ç¶²å€",
"unblockiptext" => "用下é¢çš„表單來æ¢å¾©å…ˆå‰è¢«ç¦å°çš„網å€çš„書寫權。",
"ipusubmit" => "解除ç¦å°",
@@ -883,7 +882,7 @@ alt=\"Google\" align=\"middle\"></a>
"unlockdbsuccesssub" => "數據庫開放",
"lockdbsuccesstext" => "維基百科數據庫已經上鎖。
-<br>請記ä½åœ¨ç¶­è­·å®Œæˆå¾Œé‡æ–°é–‹æ”¾æ•¸æ“šåº«ã€‚",
+<br />請記ä½åœ¨ç¶­è­·å®Œæˆå¾Œé‡æ–°é–‹æ”¾æ•¸æ“šåº«ã€‚",
"unlockdbsuccesstext" => "維基百科數據庫é‡æ–°é–‹æ”¾ã€‚",
# SQL query
@@ -937,6 +936,61 @@ alt=\"Google\" align=\"middle\"></a>
"talkpagemoved" => "相應的å°è©±é ä¹Ÿå·²ç¶“移動。",
"talkpagenotmoved" => "相應的å°è©±é <strong>沒有</strong>被移動。",
+
+# some untranslated messages as of 1.4 beta1
+'1movedto2' => "$1移動到$2", //"$1 moved to $2",
+'1movedto2_redir' => "$1é‡å®šå‘到$2", //"$1 moved to $2 over redirect",
+'acct_creation_throttle_hit' => "å°ä¸èµ·ï¼Œæ‚¨å·²ç¶“註冊了$1賬號。你ä¸èƒ½å†è¨»å†Šäº†ã€‚", //"Sorry, you have already created $1 accounts. You can't make any more.",
+'addgroup' => "增加新的組", //"Add Group",
+'allarticles' => "所有æ¢ç›®", //"All articles",
+'allmessages' => "系統界é¢", //"All system messages",
+'allmessagesnotsupportedDB' => "系統界é¢åŠŸèƒ½è™•æ–¼é—œé–‰ç‹€æ…‹ (wgUseDatabaseMessages)。", //"Special:AllMessages not supported because wgUseDatabaseMessages is off.",
+'allmessagestext' => "這裡列出所有å¯å®šè£½çš„系統界é¢ã€‚", //"This is a list of all system messages available in the MediaWiki: namespace.",
+'allpagesformtext1' => "列出從 $1 èµ·çš„æ¢ç›®", //"Display pages starting at: $1",
+'allpagesformtext2' => "é¸å®šå字空間: $1 $1", //"Choose namespace: $1 $2",
+'allpagesnamespace' => "所有 $1 å字空間的æ¢ç›®", //"All pages ($1 namespace)",
+'allpagesnext' => "下一é ", //"Next",
+'allpagesprev' => "上一é ", //"Previous",
+'allpagessubmit' => "æ交", //"Go",
+'ancientpages' => "è€æ¢ç›®", //"Oldest pages",
+'and' => "和", //"and",
+'anontalk' => "該IPçš„å°è©±é ", //"Talk for this IP",
+'anonymous' => "匿å用戶", //"Anonymous user(s) of 1.4",
+'article' => "æ¢ç›®", //"Content page",
+'autoblocker' => "ä½ çš„IP和被å°äº†çš„ \"$1\" 是一樣的。å°éŽ–原因: \"$2\".",//"Autoblocked because you share an IP address with \"$1\". Reason \"$2\".",
+'blocklogentry' => "å°éŽ– $1, $2",//"blocked \"$1\" with an expiry time of $2",
+'blocklogpage' => "å°éŽ–記錄", //"Block_log",
+'categoriespagetext' => "以下列出所有的é é¢åˆ†é¡žã€‚", //"The following categories exists in the wiki.",
+'categoryarticlecount' => "該類é é¢å…±æœ‰ $1 æ¢ç›®", //There are $1 articles in this category.",
+'clearyourcache' => "'''註æ„:''' ä¿å­˜è¨­ç½®å¾Œï¼Œè¦æ¸…掉ç€è¦½å™¨çš„ç·©å­˜æ‰èƒ½ç”Ÿæ•ˆï¼š'''Mozilla:''' 點''刷新'' (或用快éµ''Ctrl-R''),'''IE / Opera:''' ''Ctrl-F5'', '''Safari:''' ''Cmd-R'', '''Konqueror''' ''Ctrl-R''。",//"'''Note:''' After saving, you have to clear your browser cache to see the changes: '''Mozilla:''' click ''Reload'' (or ''Ctrl-R''), '''IE / Opera:''' ''Ctrl-F5'', '''Safari:''' ''Cmd-R'', '''Konqueror''' ''Ctrl-R''.",
+'edit' => "編輯", //"Edit",
+'navigation' => "導航", //"Navigation",
+'nstab-category' => "分類", //"Category",
+'nstab-help' => "幫助",//"Help",
+'nstab-image' => "圖åƒ",//"Image",
+'nstab-main' => "æ¢ç›®", //"Article",
+'nstab-mediawiki' => "ç•Œé¢",//"Message",
+'nstab-special' => "特殊",//"Special",
+'nstab-template' => "模æ¿", //"Template",
+'nstab-user' => "用戶é é¢", //"User page",
+'nstab-wp' => "關於", //"About",
+'portal' => "社å€",//"Community portal",
+'prefs-help-userdata' => "*<strong>真實姓å</strong>(å¯é¸ï¼‰ï¼šç”¨ä»¥å°æ‚¨çš„è²¢ç»ç½²å。<br />*<strong>點å­éƒµä»¶</strong>(å¯é¸ï¼‰ï¼šè®“他人通éŽç¶²ç«™åœ¨ä¸çŸ¥é“您的電å­éƒµä»¶åœ°å€çš„情æ³ä¸‹é€šéŽé›»å­éƒµä»¶èˆ‡æ‚¨è¯çµ¡ï¼Œä»¥åŠé€šéŽé›»å­éƒµä»¶å–å¾—éºå¿˜çš„密碼。", /*"* <strong>Real name</strong> (optional): if you choose to provide it this will be used for giving you attribution for your work.<br />
+* <strong>Email</strong> (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.", */
+'prefs-misc' => "雜項", //"Misc settings",
+'prefs-personal' => "用戶數據",//"User data",
+'prefs-rc' => "最近更新", //"Recent changes and stub display",
+'showhideminor' => "$1 å°ä¿®æ”¹ | $2 bots | $3 登錄用戶 | $4 檢查éŽçš„", //"$1 minor edits | $2 bots | $3 logged in users | $4 patrolled edits ",
+'skin' => "皮膚", //"Skin",
+'talk' => "討論",//"Discussion",
+'timezonelegend' => "時å€", //"Time zone",
+'toolbox' => "工具",//"Toolbox",
+'watch' => "監視",//"Watch",
+'yourlanguage' => "ç•Œé¢èªžè¨€", //"Your language"
+'yourrealname' => "真實姓å*", //"Your real name"
+'yourvariant' => "中文字體", //"language variant"
+
);
class LanguageZh_tw extends LanguageZh_cn {
diff --git a/languages/Names.php b/languages/Names.php
index d6fa2b154873..e7a94ab9bd01 100644
--- a/languages/Names.php
+++ b/languages/Names.php
@@ -84,6 +84,7 @@
'it' => 'Italiano', # Italian
'iu' => '&#5123;&#5316;&#5251;&#5198;&#5200;&#5222;', # Inuktitut
'ja' => '&#26085;&#26412;&#35486;', # Japanese
+ 'jbo' => 'Lojban',
'jv' => 'Bahasa Jawa', # Javanese
'ka' => '&#4325;&#4304;&#4320;&#4311;&#4323;&#4314;&#4312;', # Georgian
'kg' => 'Kongo', # Kongo (FIXME!)
@@ -111,7 +112,7 @@
'mg' => 'Malagasy', # Malagasy - FIXME
'mh' => 'Ebon', # Marshallese
'mi' => 'M&#257;ori', # Maori
- 'minnan' => '&#38313;&#21335;&#35486;', # Min-nan
+ 'minnan' => 'B&#226;n-l&#226;m-g&#250;', # Min-nan (also zh-min-nan)
'mk' => '&#1052;&#1072;&#1082;&#1077;&#1076;&#1086;&#1085;&#1089;&#1082;&#1080;', # Macedonian
'ml' => '&#3374;&#3378;&#3375;&#3390;&#3379;&#3330;', # Malayalam
'mn' => '&#1052;&#1086;&#1085;&#1075;&#1086;&#1083;', # Mongoloian
@@ -122,14 +123,14 @@
'mus' => 'Muscogee',
'my' => 'Myanmasa', # Burmese
'na' => 'Ekakair&#361; Naoero', # Nauruan
- 'nb' => 'Bokm&aring;l', # Norwegian (Bokmal)
+ 'nb' => 'Norsk (bokm&aring;l)', # Norwegian (Bokmal)
'nah' => 'Nahuatl',
'nds' => 'Plattd&uuml;&uuml;tsch', # Low German ''or'' Low Saxon
'ne' => '&#2344;&#2375;&#2346;&#2366;&#2354;&#2368;', # Nepali
'ng' => 'Ndonga',
'nl' => 'Nederlands', # Dutch
'ne' => '&#2344;&#2375;&#2346;&#2366;&#2354;&#2368;', # Nepali
- 'nn' => 'Nynorsk' , # (Norwegian) Nynorsk
+ 'nn' => 'Norsk (nynorsk)' , # (Norwegian) Nynorsk
'no' => 'Norsk', # Norwegian
'nv' => 'Din&eacute; bizaad', # Navajo
'ny' => 'Chi-Chewa', # Chichewa
@@ -185,6 +186,7 @@
'tr' => 'T&uuml;rk&ccedil;e', # Turkish
'ts' => 'Xitsonga', # Tsonga
'tt' => 'Tatar&ccedil;a', # Tatar
+ 'tum' => 'chiTumbuka', # Tumbuka
'tw' => 'Twi', # Twi -- FIXME
'ty' => 'Reo M&#257;`ohi', # Tahitian
'ug' => 'Oyghurque', # Uyghur
@@ -203,6 +205,7 @@
'zh' => '&#20013;&#25991;', # (Zh&#333;ng Wén) - Chinese
'zh-cfr' => '&#38313;&#21335;&#35486;', # Min-nan alias (site is at minnan)
'zh-cn' => '&#20013;&#25991;(&#31616;&#20307;)', # Simplified
+ 'zh-min-nan' => 'B&#226;n-l&#226;m-g&#250;', # Min-nan
'zh-tw' => '&#20013;&#25991;(&#32321;&#39636;)', # Traditional
'zh-sg' => '&#20013;&#25991;(&#31616;&#20307;)', # Simplified (Singapore)
'zh-hk' => '&#20013;&#25991;(&#32321;&#39636;)', # Traditional (Hong Kong)
diff --git a/maintenance/InitialiseMessages.inc b/maintenance/InitialiseMessages.inc
index f3e3623824c7..3df10393e8e3 100755
--- a/maintenance/InitialiseMessages.inc
+++ b/maintenance/InitialiseMessages.inc
@@ -11,18 +11,17 @@
*/
-
function initialiseMessages( $overwrite = false, $messageArray = false ) {
global $wgContLang, $wgContLanguageCode;
global $wgContLangClass, $wgAllMessagesEn;
- global $IP;
+ global $wgDisableLangConversion;
+ global $wgForceUIMsgAsContentMsg;
+ global $wgLanguageNames;
+ global $IP, $wgUseLatin1;
- $langclass = 'Language'. str_replace( '-', '_', ucfirst( $wgContLanguageCode ) );
- require_once("$IP/languages/$langclass.php");
-
- $variants = $wgContLang->getVariants();
- if(!in_array($wgContLanguageCode, $variants))
- $variants[]=$wgContLanguageCode;
+ # overwrite language conversion option so that all variants
+ # of the messages are initialised
+ $wgDisableLangConversion = false;
if ( $messageArray ) {
$sortedArray = $messageArray;
@@ -31,14 +30,24 @@ function initialiseMessages( $overwrite = false, $messageArray = false ) {
}
ksort( $sortedArray );
-
$messages=array();
+
+ $variants = $wgContLang->getVariants();
+ if(!in_array($wgContLanguageCode, $variants))
+ $variants[]=$wgContLanguageCode;
+
foreach ($variants as $v) {
$langclass = 'Language'. str_replace( '-', '_', ucfirst( $v ) );
- $lang = new $langclass;
- if(!is_object($lang)) {
+ if( !class_exists($langclass) ) {
die ("class $langclass not defined. perhaps you need to include the file $langclass.php in $wgContLangClass.php?");
}
+ $lang = new $langclass;
+ if($wgUseLatin1) {
+ require_once( "$IP/languages/LanguageLatin1.php" );
+ $latin1 = new LanguageLatin1( $lang );
+ unset($lang);
+ $lang = $latin1;
+ }
if($v==$wgContLanguageCode)
$suffix='';
else
@@ -46,7 +55,25 @@ function initialiseMessages( $overwrite = false, $messageArray = false ) {
foreach ($sortedArray as $key => $msg) {
$messages[$key.$suffix] = $lang->getMessage($key);
}
- }
+ }
+
+ require_once('languages/Names.php');
+
+ /*
+ initialize all messages in $wgForceUIMsgAsContentMsg for all
+ languages in Names.php
+ */
+ if( is_array( $wgForceUIMsgAsContentMsg ) ) {
+ foreach( $wgForceUIMsgAsContentMsg as $uikey ) {
+ foreach( $wgLanguageNames as $code => $name) {
+ if( $code == $wgContLanguageCode )
+ continue;
+ $msg = $wgContLang->getMessage( $uikey );
+ if( $msg )
+ $messages[$uikey. '/' . $code] = $msg;
+ }
+ }
+ }
initialiseMessagesReal( $overwrite, $messages );
}
@@ -115,7 +142,7 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
} else {
$sql .= ',';
}
- $titleObj = Title::newFromText( $key );
+ $titleObj = Title::newFromText( $wgContLang->ucfirst( $key ) );
$enctitle = $dbr->strencode($titleObj->getDBkey());
$sql .= "'$enctitle'";
}
@@ -153,7 +180,7 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
} else {
$message = wfMsgNoDBForContent( $key );
}
- $titleObj = Title::newFromText( $key );
+ $titleObj = Title::newFromText( $wgContLang->ucfirst( $key ) );
$title = $titleObj->getDBkey();
# Update messages which already exist
@@ -180,7 +207,7 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
}
}
- $dbw->insert( $cur, $arr, $fname );
+ $dbw->insert( 'cur', $arr, $fname );
# Clear the relevant memcached key
print 'Clearing message cache...';
diff --git a/maintenance/archives/importTests.php b/maintenance/archives/importTests.php
deleted file mode 100644
index ec9e6f9bd878..000000000000
--- a/maintenance/archives/importTests.php
+++ /dev/null
@@ -1,275 +0,0 @@
-<?php
-/**
- * @deprecated
- * @package MediaWiki
- * @subpackage MaintenanceArchive
- */
-
-/** */
-print "This script is obsolete!";
-print "It is retained in the source here in case some of its
-code might be useful for ad-hoc conversion tasks, but it is
-not maintained and probably won't even work as is.";
-exit();
-
-?><html>
-<head>
-<title>Unit tests for UseMod-to-PediaWiki import script</title>
-<meta http-equiv="Refresh" content="10;URL=importTests.php">
-<style>
-.pass { color: green }
-.fail { color: red }
-</style>
-</head>
-<body>
-
-<?php
-
-# Unit tests for importUseModWiki
-# Well, more or less ;)
-
-$testingonly = true;
-
-setlocale( LC_ALL, "C" );
-
-include_once( "importUseModWiki.php" );
-
-$wgRootDirectory = "./testconvert";
-runTests();
-
-function runTests() {
- $success =
- testTimestamp()
- && testRecode()
- && testFreeToNormal()
- && testTransformTitle()
- && testMediaLinks()
- && testRemoveTalkLink()
- && testSubPages()
- ;
- if( $success ) {
- echo "\n<h1 class='pass'>** Passed all tests! **</h1>\n";
- } else {
- echo "\n<h1 class='fail'>-- FAILED ONE OR MORE TESTS --</h1>\n";
- }
- return $success;
-}
-
-function passTest( $testname, $note = "" ) {
- if( $notes != "" ) $notes = " -- $notes";
- echo "<span class='pass'>.. passed test $testname $notes</span><br />\n";
- return true;
-}
-
-function failTest( $testname, $notes = "" ) {
- if ( $notes != "" ) $notes = " -- $notes";
- echo "<span class='fail'>** FAILED TEST $testname **$notes</span><br />\n";
- return false;
-}
-
-function testTimestamp() {
- $tn = "Timestamp";
- $x = wfUnix2Timestamp( 0 );
- if( $x != "19700101000000" ) {
- return failTest( $tn, "wfUnix2Timestamp for epoch returned unexpected $x" );
- }
-
- $x = wfTimestamp2Unix( "19700101000000" );
- if( $x != 0 ) {
- return failTest( $tn, "wfTimestamp2Unix for epoch returned unexpected $x" );
- }
-
- return passTest( $tn );
-}
-
-function testRecode() {
- $tn = "Recode";
-
- # These functions are dummies for now
- $a = "abcd";
- $x = recodeInput( $a );
- if( $a != $x ) return failTest( $tn, "eo test returned different value" );
-
- $a = "ĉeÄ¥a ÅaÅ­mmanÄaĵo";
- $x = recodeInput( $a );
- if( $a != $x ) return failTest( $tn, "eo test returned different value" );
-
- return passTest( $tn );
-}
-
-function testFreeToNormal() {
- $tn = "FreeToNormal";
- $a = "WikiName"; $x = FreeToNormal( $a );
- if( $a != $x ) return failTest( $tn, "$a -> $a != $x" );
-
- $a = "With_Underscore"; $x = FreeToNormal( $a );
- if( $a != $x ) return failTest( $tn, "$a -> $a != $x" );
-
- $a = "With Space"; $x = FreeToNormal( $a );
- if( "With_Space" != $x ) return failTest( $tn, "$a -> With_Space != $x" );
-
- $a = "Mixed case"; $x = FreeToNormal( $a );
- if( "Mixed_Case" != $x ) return failTest( $tn, "$a -> Mixed_Case != $x" );
-
- $a = "\xe9cole"; $x = FreeToNormal( $a );
- if( $a != $x ) return failTest( $tn, "$a -> $a != $x (must replicate high caps bug)" );
-
- return passTest( $tn );
-}
-
-function testTransformTitle() {
- global $talkending;
- $oldtalkending = $talkending;
- $tn = "TransformTitle";
-
- $a = "WikiName"; $x = transformTitle( $a );
- if( $x->namespace != 0 or $x->title != "WikiName" ) return failTest( $tn, "$a -> 0, WikiName instead -> $x->namespace , $x->title" );
-
- $talkending = "Talk";
- $a = "WikiName/Talk"; $x = transformTitle( $a );
- if( $x->namespace != 1 or $x->title != "WikiName" ) return failTest( $tn, "$a -> 1, WikiName instead -> $x->namespace , $x->title" );
-
- $a = "WikiName/talk"; $x = transformTitle( $a );
- if( $x->namespace != 1 or $x->title != "WikiName" ) return failTest( $tn, "$a -> 1, WikiName instead -> $x->namespace , $x->title" );
-
- $talkending = "Diskuto";
- $a = "WikiName/Diskuto"; $x = transformTitle( $a );
- if( $x->namespace != 1 or $x->title != "WikiName" ) return failTest( $tn, "$a -> 1, WikiName instead -> $x->namespace , $x->title" );
-
- $talkending = $oldtalkending;
- return passTest( $tn );
-}
-
-function testMediaLinks() {
- $tn = "MediaLinks";
-
- # Fetch
- $a = "magic.gif";
- $x = fetchMediaFile( "???", "magic.gif" );
-
-
- # Media links
- $a = "[http://www.wikipedia.org/upload/magic.gif]";
- $b = "[[Media:Magic.gif]]"; # Or should it?
- $x = fixMediaLinks( $a );
- if( $x != $b ) return failTest( $tn, "$a should be $b, is $x" );
-
- $a = "[http://www.wikipedia.org/upload/magic.gif Click image]";
- $b = "[[Media:Magic.gif|Click image]]";
- $x = fixMediaLinks( $a );
- if( $x != $b ) return failTest( $tn, "$a should be $b, is $x" );
-
- # Image links:
- $a = "http://www.wikipedia.org/upload/magic.gif";
- $b = "[[Image:Magic.gif]]";
- $x = fixImageLinks( $a );
- if( $x != $b ) return failTest( $tn, "$a should be $b, is $x" );
-
- $a = "http://www.wikipedia.org/upload/a/a4/magic.gif";
- $b = "[[Image:Magic.gif]]";
- $x = fixImageLinks( $a );
- if( $x != $b ) return failTest( $tn, "$a should be $b, is $x" );
-
- return passTest( $tn );
-}
-
-function testRemoveTalkLink() {
- global $talkending;
- $tn = "RemoveTalkLink";
- $oldtalkending = $talkending;
- $talkending = "Talk";
-
- $a = "Blah blah blah blah\nFoo bar baz.\n/Talk";
- $b = "Blah blah blah blah\nFoo bar baz.";
- $x = removeTalkLink( $a );
- if( $x != $b ) return failTest( $tn, "removing talk link: '$a' -> '$x', should be '$b'" );
-
- $a = "Blah blah blah blah\nFoo bar baz.\n[[/Talk]]";
- $b = "Blah blah blah blah\nFoo bar baz.";
- $x = removeTalkLink( $a );
- if( $x != $b ) return failTest( $tn, "removing talk link: '$a' -> '$x', should be '$b'" );
-
- $a = "Blah blah blah blah\nFoo bar baz.\n/talk"; # wait... should this not work?
- $b = "Blah blah blah blah\nFoo bar baz.";
- $x = removeTalkLink( $a );
- if( $x != $b ) return failTest( $tn, "removing talk link: '$a' -> '$x', should be '$b'" );
-
- $talkending = "Priparolu";
- $a = "Blah blah blah blah\nFoo bar baz.\n/Priparolu";
- $b = "Blah blah blah blah\nFoo bar baz.";
- $x = removeTalkLink( $a );
- if( $x != $b ) return failTest( $tn, "removing talk link: '$a' -> '$x', should be '$b'" );
-
- $talkending = $oldtalkending;
- return passTest( $tn );
-}
-
-function testSubPages() {
- $tn = "SubPages";
-
- $t = "TopPage";
- $a = "Blah /Subpage blah";
- $b = "Blah [[TopPage/Subpage|/Subpage]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah /subpage blah";
- $b = $a;
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah [[/Subpage]] blah";
- $b = "Blah [[TopPage/Subpage|/Subpage]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah [[/subpage]] blah";
- $b = "Blah [[TopPage/Subpage|/subpage]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah [[/Subpage|Fizzle]] blah";
- $b = "Blah [[TopPage/Subpage|Fizzle]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah [[/subpage|Fizzle]] blah";
- $b = "Blah [[TopPage/Subpage|Fizzle]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah /\xc9cole blah";
- $b = "Blah [[TopPage/\xc9cole|/\xc9cole]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah /\xe9cole blah";
- $b = $a;
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah [[/\xc9cole]] blah";
- $b = "Blah [[TopPage/\xc9cole|/\xc9cole]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah [[/\xe9cole]] blah";
- $b = "Blah [[TopPage/\xe9cole|/\xe9cole]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah [[/xe9cole|Fizzle]] blah";
- $b = "Blah [[TopPage/\xe9cole|Fizzle]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
-
- $a = "Blah [[/subpage|Fizzle]] blah";
- $b = "Blah [[TopPage/\xe9cole|Fizzle]] blah";
- $x = fixSubPages( $a, $t );
- if ( $x != $b ) return failTest( "'$a' -> '$x', should be '$b'" );
- return passTest( $tn );
-}
-
-?>
-</body>
-</html>
diff --git a/maintenance/archives/importUseModWiki.php b/maintenance/archives/importUseModWiki.php
deleted file mode 100644
index 755acc14068e..000000000000
--- a/maintenance/archives/importUseModWiki.php
+++ /dev/null
@@ -1,486 +0,0 @@
-<?php
-/**
- * @deprecated
- * @package MediaWiki
- * @subpackage MaintenanceArchive
- */
-
-/** */
-print "This script is obsolete!";
-print "It is retained in the source here in case some of its
-code might be useful for ad-hoc conversion tasks, but it is
-not maintained and probably won't even work as is.";
-exit();
-
-/*
- Import data from a UseModWiki into a PediaWiki wiki
- 2003-02-09 Brion VIBBER <brion@pobox.com>
- Based loosely on Magnus's code from 2001-2002
-
- Pass one: collect data on links & title case, users
- Pass two: spit out SQL for
- Separately, be sure to run the link & index rebuilding scripts!
-
- */
-
-/* globals
- */
-$wgRootDirectory = "/home/brion/vikio/wiki-ca/lib-http/db/wiki";
-$wgFieldSeparator = "\xb3"; # Some wikis may use different char
- $FS = $wgFieldSeparator ;
- $FS1 = $FS."1" ;
- $FS2 = $FS."2" ;
- $FS3 = $FS."3" ;
-
-# Images to import
-$imageimport = '(http:\/\/(?:www\.|meta\.|)wikipedia\.(?:com|org)\/upload\/(?:[a-z]\/[a-z][0-9]\/)?(.*\.(?:gif|jpg|jpeg|png)))';
-
-# Number of *seconds to add* to timestamp to get UTC/GMT
-#$wgTimezoneCorrection = 0; # GMT
-$wgTimezoneCorrection = 8*3600; # PST - California
-
-# Other options...
-$historyonly = false; # Don't add converted revisions to cur table; just get old histories
-$lasthistoryonly = false; # Only add the _original_ form of the _current_ revision
-
-/* Vary by language */
-$namespaces = array( 0 => "", 1 => "Talk:", 2 => "User:", 3 => "User_talk:", 4
-=> "Wikipedia:", 5 => "Wikipedia_talk:", 6 => "Image:", 7 => "Image_talk:" );
-$talkending = "Talk";
-$mediatext = "Media";
-$conversionscript = "Conversion script";
-$conversioncomment = "Automatic conversion";
-$redirectcomment = "Automatic converion, moved to \$1";
-$conversiontime = gmdate( "YmdHis" ); # Conversions will be marked with this timestamp
-
-# Stats and caches
-$oldtitles = array();
-$usercache = array();
-$titlecache = array();
-$linkcache = array();
-
-/**
- * Some oversimplified test types
- *
- * @deprecated
- * @package MediaWiki
- * @subpackage MaintenanceArchive
- */
-class Title {
- var $title, $namespace;
- function fromData( $namespace, $title ) {
- $x = new Title;
- $x->namespace = $namespace;
- $x->title = $title;
- return $x;
- }
-}
-
-# See tests in importTests.php
-if( ! $testingonly ) {
- firstPass();
- secondPass();
-}
-
-# ------------------------------------------------------------------------------
-
-/* First pass:
- Information please!
- */
-function firstPass()
-{
- global $wgRootDirectory, $oldtitles;
-
- $letters = array(
- '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', 'other' );
- foreach( $letters as $letter ) {
- firstPassDirectory( "$wgRootDirectory/page/$letter" );
- }
-}
-
-function firstPassDirectory( $dir )
-{
- global $titlecache;
-
- $mydir = opendir( $dir );
- while( $entry = readdir( $mydir ) ) {
- if( $entry != '.' && $entry != '..' ) {
- if( is_dir( "$dir/$entry" ) ) {
- firstPassDirectory( "$dir/$entry" );
- }
- } elseif( preg_match( '/$(.+)\.db$/', $entry, $m ) ) {
- $titlecache[$title] = transformTitle( $m[1] );
- countLinksFrom( $title );
- } else {
- echo "-- File '$entry' doesn't seem to contain an article. Skipping.\n";
- }
- }
-}
-
-/* Second pass:
- make the dang SQL
- */
-function secondPass()
-{
- global $titlecache, $usercache, $redirects;
-
- foreach( $usercache as $oldname => $user ) {
- echo importUser( $oldname );
- }
- foreach( $titlecache as $oldtitle => $newtitle ) {
- echo importPage( $oldtitle );
- }
-
- echo "\n-- Done!\n";
-}
-
-
-# ------------------------------------------------------------------------------
-
-/* fetch_ functions
- Grab a given item from the database
- */
-function fetchUser( $uid )
-{
- global $FS,$FS2,$FS3, $wgRootDirectory;
-
- $fname = $wgRootDirectory . "/pages/" . $title;
- if( !file_exists( $fname ) ) return false;
-
- $data = splitHash( implode( "", file( $fname ) ) );
- # enough?
-
- return $data;
-}
-
-function fetchPage( $title )
-{
- global $FS,$FS2,$FS3, $wgRootDirectory;
-
- $fname = $wgRootDirectory . "/pages/" . $title;
- if( !file_exists( $fname ) ) return false;
-
- $page = splitHash( implode( "", file( $fname ) ) );
- $section = splitHash( $FS2, $page["text_default"] );
- $text = splitHash( $FS3, $section["data"] );
-
- return array ( "text" => $text["text"] , "summary" => $text["summary"] ,
- "minor" => $text["minor"] , "ts" => $section["ts"] ,
- "username" => $section["username"] , "host" => $section["host"] ) ;
-}
-
-function fetchKeptPages( $title )
-{
- global $FS,$FS2,$FS3, $wgRootDirectory, $wgTimezoneCorrection;
-
- $fname = $wgRootDirectory . "/keep/" . $title . ".kp";
- if( !file_exists( $fname ) ) return array();
-
- $keptlist = explode( $FS1, implode( "", file( $fname ) ) );
- array_shift( $keptlist ); # Drop the junk at beginning of file
-
- $revisions = array();
- foreach( $keptlist as $rev ) {
- $section = splitHash( $FS2, $rev );
- $text = splitHash( $FS3, $section["data"] );
- if ( $text["text"] && $text["minor"] != "" && ( $section["ts"]*1 > 0 ) ) {
- array_push( $revisions, array ( "text" => $text["text"] , "summary" => $text["summary"] ,
- "minor" => $text["minor"] , "ts" => $section["ts"] ,
- "username" => $section["username"] , "host" => $section["host"] ) );
- } else {
- echo "-- skipped a bad old revision\n";
- }
- }
- return $revisions;
-}
-
-function splitHash ( $sep , $str ) {
- $temp = explode ( $sep , $str ) ;
- $ret = array () ;
- for ( $i = 0; $i+1 < count ( $temp ) ; $i++ ) {
- $ret[$temp[$i]] = $temp[++$i] ;
- }
- return $ret ;
- }
-
-
-/* import_ functions
- Take a fetched item and produce SQL
- */
-
-/* importUser
- $uid is the UseMod user id number.
- The new ones will be assigned arbitrarily and are for internal use only.
-
- THIS IS DELAYED SINCE PUBLIC DUMPS DONT INCLUDE USER DIR
- */
-function importUser( $uid )
-{
- global $last_uid, $user_list, $wgTimestampCorrection;
-
- return "";
-
- $stuff = fetchUser( $uid );
- $last_uid++;
-
- $name = wfStrencode( $stuff->username );
- $hash = md5hash( $stuff->password ); # Doable?
- $tzoffset = $stuff['tzoffset'] - ($wgTimestampCorrection / 3600); # -8 to 0; +9 to +1
- $hideminor = ($stuff['rcall'] ? 0 : 1);
- $options = "cols={$stuff['editcols']}
-rows={$stuff['editrows']}
-rcdays={$stuff['rcdays']}
-timecorrection={$tzoffset}
-hideminor={$hideminor}
- ";
-
- $sql = "INSERT
- INTO user (user_id,user_name,user_password,user_options)
- VALUES ({$last_uid},'{$name}','{$hash}','{$options}');\n";
- return $sql;
-}
-
-function checkUserCache( $name, $host )
-{
- global $usercache;
-
- if( $name ) {
- if( in_array( $name, $usercache ) ) {
- $userid = $usercache[$name];
- } else {
- # If we haven't imported user accounts
- $userid = 0;
- }
- $username = wfStrencode( $name );
- } else {
- $userid = 0;
- $username = wfStrencode( $host );
- }
- return array( $userid, $username );
-}
-
-function importPage( $title )
-{
- global $wgTimezoneCorrection, $titlecache, $usercache;
- global $conversionscript, $conversioncomment, $conversiontime;
- global $historyonly, $lasthistoryonly;
-
- $page = fetchPage( $title );
-
- $newtext = wfStrencode( rewritePage( $title, $page->text ) );
- $t = renamePage( $title );
- $newtitle = wfStrencode( $t->title );
- $namespace = $t->namespace;
-
- # Current revision:
- $text = wfStrencode( $page->text );
- $minor = ($page->minor ? 1 : 0);
- list( $userid, $username ) = checkUserCache( $page->username, $page->host );
- $timestamp = wfUnix2Timestamp( $page->timestamp + $wgTimezoneCorrection );
- $redirect = ( preg_match( '/^#REDIRECT/', $page->text ) ? 1 : 0 );
- $sql = "\n";
- if( !$historyonly ) {
- $sql .= "INSERT
- INTO cur (cur_namespace,cur_title,cur_text,cur_comment,cur_user,cur_user_text,cur_timestamp,cur_is_redirect,cur_minor_edit)
- VALUES ($namespace,'$newtitle','$newtext','$conversioncomment',0,'$conversionscript','$conversiontime',$redirect,$minor);\n";
- }
- $sql .= "INSERT
- INTO old (old_namespace,old_title,old_text,old_comment,old_user,old_user_text,old_timestamp,old_minor_edit)
- VALUES";
- $sqlfinal = "\t\t($namespace,'$newtitle','$text','$comment',$userid,'$username','$timestamp',$minor)\n";
-
- # History
- if( !$lasthistoryonly ) {
- $revisions = fetchKeptPages( $title );
- foreach( $revisions as $rev ) {
- $text = wfStrencode( $rev->text );
- $minor = ($rev->minor ? 1 : 0);
- list( $userid, $username ) = checkUserCache( $rev->username, $rev->host );
- $timestamp = wfUnix2Timestamp( $rev->timestamp + $wgTimezoneCorrection );
- $sql .= "\t\t($namespace,'$newtitle','$text','$comment',$userid,'$username','$timestamp',$redirect,$minor),\n";
- }
- }
- return $sql . $sqlfinal;
-}
-
-
-# Count up basic links
-function countLinksFrom( $title )
-{
- $page = fetchPage( $title );
- $page->text = preg_replace(
- '/<nowiki>.*<\/nowiki>/sDU',
- '',
- $page->text );
- $page->text = preg_replace(
- '/\[\[\s*([0-9a-zA-Z_ \x80-\xff]+)\s*(?:\|\s*([^]]+))?\s*\]\]/e',
- 'countLinkTo( ucfirst( "$1" ) )',
- $page->text );
-}
-
-function countLinkTo( $title )
-{
- global $linkcache;
- $t = transformTitle( $title );
- $linkform = FreeToNormal( $t->title );
- $x = $linkcache[$title];
- if ( count ( $x ) ) {
- $y = $x[$linkform] ;
- if ( $y ) $y++; else $y = 1 ;
- $x[$linkform] = $y ;
- } else {
- $x = array ( $linkform => 1 ) ;
- }
- $linkcache[$title] = $x;
-}
-
-# Preferentially change case
-function renamePage( $title )
-{
- global $linkcache;
- $t = transformTitle( $title );
-
- # We want to use the most frequently linked-to form as the title
- $maxcount = 0 ; $maxform = $t->title ;
- foreach ( $linkcache[$title] as $linkform => $count ) {
- if ( $count > $maxcount ) {
- $maxcount = $count ;
- $maxform = $linkform ;
- }
- }
- if( $maxform != $t->title) {
- doRenamePage( $t, $maxform );
- }
-}
-
-function doRenamePage( $title, $maxform )
-{
- global $linkcache, $redirectcomment, $conversionscript, $conversiontime;
- $sql = "INSERT INTO cur (cur_namespace,cur_title,cur_text,cur_comment,cur_user,cur_user_text,cur_timestamp,cur_is_redirect,cur_minor_edit)
- VALUES ";
- $redirsql = array();
- foreach( $linkcache[$title] as $linkform => $count ) {
- if( $linkform != $maxform ) {
- $comment = wfStrencode( str_replace( "$1", $maxform, $redirectcomment ) );
- array_push( $redirsql, "($namespace,'$redirtitle','$comment',0,'$conversionscript','$conversiontime',1,1)" );
- }
- }
- $sql .= implode( ",\n\t", $redirsql ) . ";\n";
- return $sql;
-}
-
-# Account for syntax changes
-function rewritePage( $title, $text )
-{
- # ...
- $text = removeTalkLink( $text );
- $text = preg_replace( '/(^|<nowiki>).+?(<\/nowiki>|$)/esD',
- 'rewritePageBits( $title, "$1")',
- $text );
- return $text;
-}
-
-function rewritePageBits( $title, $text ) {
- $text = fixSubpages( $title, $text );
- $text = fixMedialinks( $text );
- $text = fixImagelinks( $text );
- return $text;
-}
-
-function removeTalkLink( &$text ) {
- global $talkending;
- return preg_replace( "[\\n*(?:\[\[)?/{$talkending}(?:\]\])?\\s*]sDi", '', $text );
-}
-
-function fixSubpages( $text, &$title ) {
- $old = preg_quote( $text );
- $text = preg_replace( "<(^|\s)/([A-Z\xc0-\xdf].*?)\b>",
- "$1[[$title/$2|/$2]]", $text );
- $text = preg_replace( "<\[\[/([^|]*?)\]\]>e",
- "\"[[$title/\" . ucfirst( \"$1|/$1]]\" )", $text );
- $text = preg_replace( "<\[\[/(.*?)\]\]>e",
- "\"[[$title/\" . ucfirst( \"$1]]\" )", $text );
- return $text;
-}
-
-function fixImagelinks( &$text ) {
- global $imageimport, $namespaces;
- return preg_replace( "/$imageimport/e",
- '"[[{$namespaces[6]}" . fetchMediaFile( "$1", "$2" ) . "]]"',
- $text );
-}
-
-function fixMedialinks( &$text ) {
- global $imageimport, $mediatext;
- $text = preg_replace( "/\[$imageimport\]/e",
- '"[[$mediatext:" . fetchMediaFile( "$1", "$2" ) . "]]"',
- $text );
- return preg_replace( "/\[$imageimport (.+?)\]/e",
- '"[[$mediatext:" . fetchMediaFile( "$1", "$2" ) . "|$3]]"',
- $text );
-}
-
-function fetchMediaFile( $url, $filename )
-{
- # Copy an image file into local upload space
- # FIXME
- return ucfirst( $filename );
-}
-
-# Simple move of talk pages, etc
-function transformTitle( $title, $dorename = false )
-{
- global $talkending;
- if( preg_match( "/^(.+)[ _]?\\/[ _]?($talkending)/i", $title, $m ) ) {
- $thetitle = $m[1];
- $namespace = 1;
- } else {
- $thetitle = $title;
- $namespace = 0;
- }
- return Title::fromData( $namespace, $thetitle );
-}
-
-# Translated out of old usemod wiki...
-function FreeToNormal ( $id , $FreeUpper = true ) {
- $id = str_replace ( " ", "_", $id ) ;
- $id = ucfirst($id);
- if (strstr($id, '_') != false) { # Quick check for any space/underscores
- $id = preg_replace ( '/__+/' , "_" , $id ) ;
- $id = preg_replace ( '/^_/' , "", $id ) ;
- $id = preg_replace ( '/_$/' , "", $id ) ;
- #if ($UseSubpage) {
- $id = preg_replace ( '|_/|', "/" , $id ) ;
- $id = preg_replace ( '|/_|', "/" , $id ) ;
- #}
- }
- if ($FreeUpper) {
- # Note that letters after ' are *not* capitalized
- if (preg_match ( '|[-_.,\(\)/][a-z]|' , $id ) ) { # Quick check for non-canon
- $id = preg_replace ( '|([-_.,\(\)/])([a-z])|e' , '"$1" . strtoupper("$2")' , $id ) ;
- }
- }
- return $id;
-}
-
-# Whee!
-function recodeInput( $text )
-{
- return $text;
-}
-
-function wfUnix2Timestamp( $unixtime ) {
- return gmdate( "YmdHis", $timestamp );
-}
-
-function wfTimestamp2Unix( $ts )
-{
- return gmmktime( ( (int)substr( $ts, 8, 2) ),
- (int)substr( $ts, 10, 2 ), (int)substr( $ts, 12, 2 ),
- (int)substr( $ts, 4, 2 ), (int)substr( $ts, 6, 2 ),
- (int)substr( $ts, 0, 4 ) );
-}
-
-?>
diff --git a/maintenance/archives/moveCustomMessages.inc b/maintenance/archives/moveCustomMessages.inc
index 2aa6dd2f8483..5fb0d7ccbde4 100644
--- a/maintenance/archives/moveCustomMessages.inc
+++ b/maintenance/archives/moveCustomMessages.inc
@@ -16,7 +16,7 @@ function isTemplateInitialised() {
}
function moveCustomMessages( $phase ) {
- global $wgUser, $wgAllMessagesEn, $wgDeferredUpdateList, $wgLang;
+ global $wgUser, $wgAllMessagesEn, $wgDeferredUpdateList, $wgLang, $wgContLang;
global $targets, $template, $replaceCount;
$wgUser = new User;
@@ -32,7 +32,7 @@ function moveCustomMessages( $phase ) {
$dbkeys = array();
foreach ( $wgAllMessagesEn as $key => $enValue ) {
- $title = Title::newFromText( $key );
+ $title = Title::newFromText( $wgContLang->ucfirst( $key ) );
$dbkeys[$title->getDBkey()] = 1;
}
diff --git a/maintenance/archives/patch-group-sysopfix.sql b/maintenance/archives/patch-group-sysopfix.sql
deleted file mode 100644
index c3152c7b9021..000000000000
--- a/maintenance/archives/patch-group-sysopfix.sql
+++ /dev/null
@@ -1,7 +0,0 @@
--- Fix to alpha versions that had incorrect rights assignments
--- breaking protected page edits by sysops.
--- 2004-10-27
-
-UPDATE `group`
- SET group_rights=CONCAT(group_rights,',sysop')
- WHERE group_name IN('Sysops','Bureaucrat');
diff --git a/maintenance/archives/patch-rename-user_groups-and_rights.sql b/maintenance/archives/patch-rename-user_groups-and_rights.sql
deleted file mode 100644
index 4845d3c6d702..000000000000
--- a/maintenance/archives/patch-rename-user_groups-and_rights.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-
-ALTER TABLE user_groups
- CHANGE user_id ug_user INT(5) UNSIGNED NOT NULL DEFAULT '0',
- CHANGE group_id ug_group INT(5) UNSIGNED NOT NULL DEFAULT '0';
-
-ALTER TABLE user_rights
- CHANGE user_id ur_user INT(5) UNSIGNED NOT NULL,
- CHANGE user_rights ur_rights TINYBLOB NOT NULL DEFAULT '';
-
diff --git a/maintenance/archives/patch-rename-user_rights.sql b/maintenance/archives/patch-rename-user_rights.sql
new file mode 100644
index 000000000000..679d85c286ec
--- /dev/null
+++ b/maintenance/archives/patch-rename-user_rights.sql
@@ -0,0 +1,5 @@
+
+ALTER TABLE user_rights
+ CHANGE user_id ur_user INT(5) UNSIGNED NOT NULL,
+ CHANGE user_rights ur_rights TINYBLOB NOT NULL DEFAULT '';
+
diff --git a/maintenance/archives/patch-userlevels-defaultgroups.sql b/maintenance/archives/patch-userlevels-defaultgroups.sql
deleted file mode 100644
index 0871cdb8347c..000000000000
--- a/maintenance/archives/patch-userlevels-defaultgroups.sql
+++ /dev/null
@@ -1,13 +0,0 @@
---
--- Provide default groups
--- Should probably be inserted when someone create a new database
---
-
-INSERT INTO `group` (group_id,group_name,group_description,group_rights)
- VALUES (1,'Anonymous','Anonymous users','read,edit,createaccount');
-INSERT INTO `group` (group_id,group_name,group_description,group_rights)
- VALUES (2,'Loggedin','General logged in users','read,edit,move,upload');
-INSERT INTO `group` (group_id,group_name,group_description,group_rights)
- VALUES (3,'Sysops','Operators of this site','read,edit,move,delete,undelete,protect,block,upload,asksql,rollback,patrol,editinterface,sysop');
-INSERT INTO `group` (group_id,group_name,group_description,group_rights)
- VALUES (4,'Bureaucrat','The bureaucrat group is able to make sysops for example. They have no other rights.','read,edit,move,delete,undelete,protect,block,userrights,createaccount,upload,asksql,rollback,patrol,editinterface,siteadmin,sysop');
diff --git a/maintenance/archives/patch-userlevels-rights.sql b/maintenance/archives/patch-userlevels-rights.sql
deleted file mode 100644
index 9082c2855b07..000000000000
--- a/maintenance/archives/patch-userlevels-rights.sql
+++ /dev/null
@@ -1,5 +0,0 @@
--- Oct. 24 2004
--- Adds the group_rights field missing from early dev work
-
--- Hold group name and description
-ALTER TABLE `group` ADD group_rights tinyblob;
diff --git a/maintenance/archives/patch-userlevels.sql b/maintenance/archives/patch-userlevels.sql
deleted file mode 100644
index ccaa2665e105..000000000000
--- a/maintenance/archives/patch-userlevels.sql
+++ /dev/null
@@ -1,20 +0,0 @@
--- Oct. 1st 2004 - Ashar Voultoiz
--- Implement the new sitelevels
---
--- This is under development to provide a showcase in HEAD :o)
-
--- Hold group name and description
-CREATE TABLE `group` (
- group_id int(5) unsigned NOT NULL auto_increment,
- group_name varchar(50) NOT NULL default '',
- group_description varchar(255) NOT NULL default '',
- group_rights tinyblob,
- PRIMARY KEY (group_id)
-);
-
--- Relation table between user and groups
-CREATE TABLE user_groups (
- ug_user int(5) unsigned NOT NULL default '0',
- ug_group int(5) unsigned NOT NULL default '0',
- PRIMARY KEY (ug_user,ug_group)
-);
diff --git a/maintenance/changeuser.sql b/maintenance/changeuser.sql
index f6e5cf892175..ad1c6da6fff7 100644
--- a/maintenance/changeuser.sql
+++ b/maintenance/changeuser.sql
@@ -1,12 +1,12 @@
set @oldname = 'At18';
set @newname = 'Alfio';
-update low_priority user set user_name=@newname where user_name=@oldname;
-update low_priority user_newtalk set user_ip=@newname where user_ip=@oldname;
-update low_priority cur set cur_user_text=@newname where cur_user_text=@oldname;
-update low_priority old set old_user_text=@newname where old_user_text=@oldname;
-update low_priority archive set ar_user_text=@newname where ar_user_text=@oldname;
-update low_priority ipblocks set ipb_address=@newname where ipb_address=@oldname;
-update low_priority oldimage set oi_user_text=@newname where oi_user_text=@oldname;
-update low_priority recentchanges set rc_user_text=@newname where rc_user_text=@oldname;
+update low_priority /*$wgDBprefix*/user set user_name=@newname where user_name=@oldname;
+update low_priority /*$wgDBprefix*/user_newtalk set user_ip=@newname where user_ip=@oldname;
+update low_priority /*$wgDBprefix*/cur set cur_user_text=@newname where cur_user_text=@oldname;
+update low_priority /*$wgDBprefix*/old set old_user_text=@newname where old_user_text=@oldname;
+update low_priority /*$wgDBprefix*/archive set ar_user_text=@newname where ar_user_text=@oldname;
+update low_priority /*$wgDBprefix*/ipblocks set ipb_address=@newname where ipb_address=@oldname;
+update low_priority /*$wgDBprefix*/oldimage set oi_user_text=@newname where oi_user_text=@oldname;
+update low_priority /*$wgDBprefix*/recentchanges set rc_user_text=@newname where rc_user_text=@oldname;
diff --git a/maintenance/cleanupDupes.php b/maintenance/cleanupDupes.php
index af85e7b4aaa2..c4e41fa5a4b1 100644
--- a/maintenance/cleanupDupes.php
+++ b/maintenance/cleanupDupes.php
@@ -25,19 +25,20 @@
* @subpackage Maintenance
*/
+$options = array( 'fix' );
+
require_once( "commandLine.inc" );
-require_once( "rebuildtextindex.inc" );
-$wgTitle = Title::newFromText( "Rebuild text index script" );
+$wgTitle = Title::newFromText( "Dupe cur entry cleanup script" );
-checkDupes();
+checkDupes( isset( $options['fix'] ) );
-function fixDupes() {
+function fixDupes( $fixthem = false) {
$dbw =& wfGetDB( DB_MASTER );
$cur = $dbw->tableName( 'cur' );
$dbw->query( "LOCK TABLES $cur 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,max(cur_id) as id
+SELECT cur_namespace,cur_title,count(*) as c,min(cur_id) as id
FROM $cur
GROUP BY cur_namespace,cur_title
HAVING c > 1
@@ -46,33 +47,44 @@ END
$n = $dbw->numRows( $res );
echo "Found $n titles with duplicate entries.\n";
if( $n > 0 ) {
- echo "Correcting...\n";
+ if( $fixthem ) {
+ echo "Correcting...\n";
+ } else {
+ echo "Just a demo...\n";
+ }
while( $row = $dbw->fetchObject( $res ) ) {
$ns = IntVal( $row->cur_namespace );
$title = $dbw->addQuotes( $row->cur_title );
$id = IntVal( $row->id );
- $dbw->query( <<<END
+ echo "$ns:$row->cur_title (canonical ID $id)\n";
+ if( $fixthem ) {
+ $dbw->query( <<<END
DELETE
FROM $cur
WHERE cur_namespace=$ns
AND cur_title=$title
- AND cur_id<$id
+ AND cur_id>$id
END
- );
+ );
+ }
}
}
$dbw->query( 'UNLOCK TABLES' );
- echo "Done.\n";
+ if( $fixthem ) {
+ echo "Done.\n";
+ } else {
+ echo "Run again with --fix option to delete the duplicates.\n";
+ }
}
-function checkDupes() {
+function checkDupes( $fixthem = false ) {
$dbw =& wfGetDB( DB_MASTER );
if( $dbw->indexExists( 'cur', 'name_title' ) &&
$dbw->indexUnique( 'cur', 'name_title' ) ) {
echo "Your cur table has the current unique index; no duplicate entries.\n";
} else {
echo "Your cur table has the old non-unique index and may have duplicate entries.\n";
- fixDupes();
+ fixDupes( $fixthem );
}
}
diff --git a/maintenance/clear_interwiki_cache.php b/maintenance/clear_interwiki_cache.php
new file mode 100644
index 000000000000..a16ba87fa605
--- /dev/null
+++ b/maintenance/clear_interwiki_cache.php
@@ -0,0 +1,11 @@
+<?php
+require_once('commandLine.inc');
+
+foreach ( $wgLocalDatabases as $db ) {
+ print "$db ";
+ foreach ( $wgLanguageNamesEn as $prefix => $name ) {
+ $wgMemc->delete("$db:interwiki:$prefix");
+ }
+}
+print "\n";
+?>
diff --git a/maintenance/clear_pcache_stats.php b/maintenance/clear_pcache_stats.php
new file mode 100644
index 000000000000..6d5e1f3e1088
--- /dev/null
+++ b/maintenance/clear_pcache_stats.php
@@ -0,0 +1,22 @@
+<?php
+require_once('commandLine.inc');
+
+foreach ( $wgLocalDatabases as $db ) {
+ noisyDelete("$db:stats:pcache_hit");
+ noisyDelete("$db:stats:pcache_miss_invalid");
+ noisyDelete("$db:stats:pcache_miss_expired");
+ noisyDelete("$db:stats:pcache_miss_absent");
+}
+
+function noisyDelete( $key ) {
+ global $wgMemc;
+ /*
+ print "$key ";
+ if ( $wgMemc->delete($key) ) {
+ print "deleted\n";
+ } else {
+ print "FAILED\n";
+ }*/
+ $wgMemc->delete($key);
+}
+?>
diff --git a/maintenance/commandLine.inc b/maintenance/commandLine.inc
index ce22a41ac0ac..84748691065e 100644
--- a/maintenance/commandLine.inc
+++ b/maintenance/commandLine.inc
@@ -114,7 +114,7 @@ if ( $sep == ":" && strpos( `hostname`, "wikimedia.org" ) !== false ) {
ini_set( "include_path", ".:$IP:$IP/includes:$IP/languages:$IP/maintenance" );
require_once( "$IP/includes/Defines.php" );
- require_once( "/home/wikipedia/common/php-new/CommonSettings.php" );
+ require_once( "/home/wikipedia/common/php-1.4/CommonSettings.php" );
} else {
$wgWikiFarm = false;
$settingsFile = "$IP/LocalSettings.php";
diff --git a/maintenance/compressOld.inc b/maintenance/compressOld.inc
index d5159baf29a3..0d6a3086df17 100644
--- a/maintenance/compressOld.inc
+++ b/maintenance/compressOld.inc
@@ -65,7 +65,8 @@ function compressWithConcat( $startId, $maxChunkSize, $maxChunkFactor, $factorTh
$pageRes = $dbw->select( 'cur', array('cur_namespace', 'cur_title'), false, $fname );
# For each of those, get a list of revisions which fit the criteria
- $conds = array();
+ # No recompression, use a condition on old_flags
+ $conds = array("old_flags NOT LIKE '%object%'");
if ( $beginDate ) {
$conds[] = "old_timestamp>'" . $beginDate . "'";
}
@@ -146,19 +147,12 @@ function compressWithConcat( $startId, $maxChunkSize, $maxChunkFactor, $factorTh
$chunk->setText( $text );
print '.';
} else {
- # Don't make a stub if it's going to be longer than the article
- # Stubs are typically about 100 bytes
- if ( strlen( $text ) < 120 ) {
- $stub = false;
- print 'x';
- } else {
- $stub = $chunk->addItem( $text );
- $stub->setLocation( $primaryOldid );
- $hash = $stub->getHash();
- $stub = serialize( $stub );
- print '.';
- $usedChunk = true;
- }
+ $stub = $chunk->addItem( $text );
+ $stub->setLocation( $primaryOldid );
+ $hash = $stub->getHash();
+ $stub = serialize( $stub );
+ print '.';
+ $usedChunk = true;
$stubs[$j] = $stub;
}
}
diff --git a/maintenance/compressOld.php b/maintenance/compressOld.php
index 865fcebd9ca5..93e2154caac8 100644
--- a/maintenance/compressOld.php
+++ b/maintenance/compressOld.php
@@ -42,21 +42,19 @@ if( !function_exists( "gzdeflate" ) ) {
print "Please see http://www.php.net/manual/en/ref.zlib.php\n\n";
die();
}
-
$defaults = array(
't' => 'concat',
'c' => 20,
's' => 0,
'f' => 3,
- 'h' => 100,
+ 'h' => 1024,
'b' => '',
'e' => '',
);
-$args = $args + $defaults;
-
-if ( $args['t'] != 'concat' && $args['t'] != 'gzip' ) {
- print "Type \"{$args['t']}\" not supported\n";
+$options = $options + $defaults;
+if ( $options['t'] != 'concat' && $options['t'] != 'gzip' ) {
+ print "Type \"{$options['t']}\" not supported\n";
}
print "Depending on the size of your database this may take a while!\n";
@@ -66,10 +64,10 @@ print "Press control-c to abort first (will proceed automatically in 5 seconds)\
#sleep(5);
$success = true;
-if ( $args['t'] == 'concat' ) {
- $success = compressWithConcat( $args['s'], $args['c'], $args['f'], $args['h'], $args['b'], $args['e'] );
+if ( $options['t'] == 'concat' ) {
+ $success = compressWithConcat( $options['s'], $options['c'], $options['f'], $options['h'], $options['b'], $options['e'] );
} else {
- compressOldPages( $args['s'] );
+ compressOldPages( $options['s'] );
}
if ( $success ) {
diff --git a/maintenance/convertUtf8.php b/maintenance/convertUtf8.php
deleted file mode 100644
index def49e99094a..000000000000
--- a/maintenance/convertUtf8.php
+++ /dev/null
@@ -1,203 +0,0 @@
-<?php
-/**
- * @package MediaWiki
- * @subpackage Maintenance
- */
-
-die("This file is not complete; it's checked in so I don't forget it.");
-
-/*
-UTF-8 conversion of DOOOOOOOM
-
-1. Lock the wiki
-2. Make a convertlist of all pages
-3. Enable CONVERTLOCK mode and switch to UTF-8
-4. As quick as possible, convert the cur, images, *links, user, etc tables. Clear cache tables.
-5. Unlock the wiki. Attempts to access pages on the convertlist will be trapped to read-only.
-6. Go through the list, fixing up old revisions. Remove pages from the convertlist.
-*/
-
-
-if(function_exists("iconv")) {
- # There are likely to be Windows code page 1252 chars in there.
- # Convert them to the proper UTF-8 chars if possible.
- function toUtf8($string) {
- return wfStrencode(iconv("CP1252", "UTF-8", $string));
- }
-} else {
- # Will work from plain iso 8859-1 and may corrupt these chars
- function toUtf8($string) {
- return wfStrencode(utf8_encode($string));
- }
-}
-
-
-
-# user table
-$sql = "SELECT user_id,user_name,user_real_name,user_options FROM user";
-$res = wfQuery( $sql, DB_WRITE );
-print "Converting " . wfNumResults( $res ) . " user accounts:\n";
-$n = 0;
-while( $s = wfFetchObject( $res ) ) {
- $uname = toUtf8( $s->user_name );
- $ureal = toUtf8( $s->user_real_name );
- $uoptions = toUtf8( $s->user_options );
- if( $uname != wfStrencode( $s->user_name ) ||
- $ureal != wfStrencode( $s->user_real_name ) ||
- $uoptions != wfStrencode( $s->user_options ) ) {
- $now = wfTimestampNow();
- $sql = "UPDATE user
- SET user_name='$uname',user_real_name='$ureal',
- user_options='$uoptions',user_touched='$now'
- WHERE user_id={$s->user_id}";
- wfQuery( $sql, DB_WRITE );
- $wgMemc->delete( "$wgDBname:user:id:{$s->user_id}" );
- $u++;
- }
- if( ++$n % 100 == 0 ) print "$n\n";
-}
-wfFreeResult( $res );
-if( $n ) {
- printf("%2.02%% required conversion.\n\n", $u / $n);
-} else {
- print "None?\n\n";
-}
-
-# ipblocks
-$sql = "SELECT DISTINCT ipb_reason FROM ipblocks";
-$res = wfQuery( $sql, DB_WRITE );
-print "Converting " . wfNumResults( $res ) . " IP block comments:\n";
-$n = 0;
-while( $s = wfFetchObject( $res ) ) {
- $ucomment = toUtf8($s->ipb_reason);
- $ocomment = wfStrencode( $s->ipb_reason );
- if( $u != $o ) {
- $sql = "UPDATE ipblocks SET ipb_reason='$ucomment' WHERE ipb_reason='$ocomment'";
- wfQuery( $sql, DB_WRITE );
- $u++;
- }
- if( ++$n % 100 == 0 ) print "$n\n";
-}
-wfFreeResult( $res );
-if( $n ) {
- printf("%2.02%% required conversion.\n\n", $u / $n);
-} else {
- print "None?\n\n";
-}
-
-# image
-$sql = "SELECT img_name,img_description,img_user_text FROM image";
- img_name --> also need to rename files
- img_description
- img_user_text
-
-oldimage
- oi_name
- oi_archive_name --> also need to rename files
- oi_user_text
-
-recentchanges
- rc_user_text
- rc_title
- rc_comment
-
-# searchindex
-print "Clearing searchindex... don't forget to rebuild it.\n";
-$sql = "DELETE FROM searchindex";
-wfQuery( $sql, DB_WRITE );
-
-# linkscc
-print "Clearing linkscc...\n";
-$sql = "DELETE FROM linkscc";
-wfQuery( $sql, DB_WRITE );
-
-# querycache: just rebuild these
-print "Clearing querycache...\n";
-$sql = "DELETE FROM querycache";
-wfQuery( $sql, DB_WRITE );
-
-# objectcache
-print "Clearing objectcache...\n";
-$sql = "DELETE FROM objectcache";
-wfQuery( $sql, DB_WRITE );
-
-
-function unicodeLinks( $table, $field ) {
- $sql = "SELECT DISTINCT $field FROM $table WHERE $field RLIKE '[\x80-\xff]'";
- $res = wfQuery( $sql, DB_WRITE );
- print "Converting " . wfNumResults( $res ) . " from $table:\n";
- $n = 0;
- while( $s = wfFetchObject( $res ) ) {
- $ulink = toUtf8( $s->$field );
- $olink = wfStrencode( $s->$field );
- $sql = "UPDATE $table SET $field='$ulink' WHERE $field='$olink'";
- wfQuery( $sql, DB_WRITE );
- if( ++$n % 100 == 0 ) print "$n\n";
- }
- wfFreeResult( $res );
- print "Done.\n\n";
-}
-unicodeLinks( "brokenlinks", "bl_to" );
-unicodeLinks( "imagelinks", "il_to" );
-unicodeLinks( "categorylinks", "cl_to" );
-
-
-# The big guys...
-$sql = "SELECT cur_id,cur_namespace,cur_title,cur_text,cur_user_text FROM cur
-WHERE cur_title rlike '[\x80-\xff]' OR cur_comment rlike '[\x80-\xff]'
-OR cur_user_text rlike '[\x80-\xff]' OR cur_text rlike '[\x80-\xff]'";
-$res = wfQuery( $sql, DB_WRITE );
-print "Converting " . wfNumResults( $res ) . " cur pages:\n";
-$n = 0;
-while( $s = wfFetchObject( $res ) ) {
- $utitle = toUtf8( $s->cur_title );
- $uuser = toUtf8( $s->cur_user_text );
- $ucomment = toUtf8( $s->cur_comment );
- $utext = toUtf8( $s->cur_text );
- $now = wfTimestampNow();
-
- $sql = "UPDATE cur
- SET cur_title='$utitle',cur_user_text='$uuser',
- cur_comment='$ucomment',cur_text='$utext'
- WHERE cur_id={$s->cur_id}";
- wfQuery( $sql, DB_WRITE );
- #$wgMemc->delete( "$wgDBname:user:id:{$s->user_id}" );
-
- $otitle = wfStrencode( $s->cur_title );
- if( $otitle != $utitle ) {
- # Also update titles in watchlist and old
- $sql = "UPDATE old SET old_title='$utitle'
- WHERE old_namespace={$s->cur_namespace} AND old_title='$otitle'";
- wfQuery( $sql, DB_WRITE );
-
- $ns = IntVal( $s->cur_namespace) & ~1;
- $sql = "UPDATE watchlist SET wl_title='$utitle'
- WHERE wl_namespace=$ns AND wl_title='$otitle'";
- wfQuery( $sql, DB_WRITE );
- $u++;
- }
-
- if( ++$n % 100 == 0 ) print "$n\n";
-}
-wfFreeResult( $res );
-if( $n ) {
- printf("Updated old/watchlist titles on %2.02%%.\n\n", $u / $n);
-} else {
- print "Didn't update any old/watchlist titles.\n\n";
-}
-
-/*
-old
- old_title
- old_text -> may be gzipped
- old_comment
- old_user_text
-
-archive
- ar_title
- ar_text -> may be gzipped
- ar_comment
- ar_user_text
-*/
-
-?>
diff --git a/maintenance/dumpRev.php b/maintenance/dumpRev.php
new file mode 100644
index 000000000000..1ae8e3028ba6
--- /dev/null
+++ b/maintenance/dumpRev.php
@@ -0,0 +1,8 @@
+<?
+require_once( 'commandLine.inc' );
+$dbr =& wfGetDB( DB_SLAVE );
+$row = $dbr->selectRow( 'old', array( 'old_flags', 'old_text' ), array( 'old_id' => $args[0] ) );
+$obj = unserialize( $row->old_text );
+print_r( array_keys( $obj->mItems ) );
+
+?>
diff --git a/maintenance/importUseModWiki.php b/maintenance/importUseModWiki.php
index 318483e71242..720e4ab8f396 100644
--- a/maintenance/importUseModWiki.php
+++ b/maintenance/importUseModWiki.php
@@ -21,6 +21,9 @@
* @subpackage Maintenance
*/
+if( php_sapi_name() != 'cli' ) {
+ die( "Please customize the settings and run me from the command line." );
+}
/** Set these correctly! */
$wgImportEncoding = "CP1252"; /* We convert all to UTF-8 */
diff --git a/maintenance/initialdata.sql b/maintenance/initialdata.sql
deleted file mode 100644
index 141c71a85478..000000000000
--- a/maintenance/initialdata.sql
+++ /dev/null
@@ -1,18 +0,0 @@
--- SQL to load database with initial values for testing.
--- Most will be overwritten by install script.
---
-
-INSERT INTO user (user_name,user_rights,user_password)
- VALUES ('WikiSysop','sysop','d41d8cd98f00b204e9800998ecf8427e'),
- ('WikiDeveloper','sysop,developer','d41d8cd98f00b204e9800998ecf8427e');
-
-INSERT INTO cur (cur_namespace,cur_title,cur_text,cur_restrictions)
- VALUES (4,'Upload_log','Below is a list of the most recent file uploads.\nAll times shown are server time (UTC).\n<ul>\n</ul>\n','sysop'),
- (4,'Deletion_log','Below is a list of the most recent deletions.\nAll times shown are server time (UTC).\n<ul>\n</ul>\n','sysop'),
- (0,'Main_Page','Wiki software successfully installed!',''),
- (4,'Block log', 'This is a log of user blocking and unblocking actions. Automatically
-blocked IP addresses are not be listed. See the [[Special:Ipblocklist|IP block list]] for
-the list of currently operational bans and blocks.', 'sysop');
-
-INSERT INTO site_stats VALUES (1,0,0,0);
-
diff --git a/maintenance/interwiki.sql b/maintenance/interwiki.sql
index e625552ee3ca..1b04ee976fc9 100644
--- a/maintenance/interwiki.sql
+++ b/maintenance/interwiki.sql
@@ -1,7 +1,7 @@
-- Based more or less on the public interwiki map from MeatballWiki
-- Default interwiki prefixes...
-REPLACE INTO interwiki (iw_prefix,iw_url,iw_local) VALUES
+REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
('AbbeNormal','http://www.ourpla.net/cgi-bin/pikie.cgi?$1',0),
('AcadWiki','http://xarch.tu-graz.ac.at/autocad/wiki/$1',0),
('Acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1',0),
diff --git a/maintenance/parserTests.php b/maintenance/parserTests.php
index 284b94107584..fa5312cbbba2 100644
--- a/maintenance/parserTests.php
+++ b/maintenance/parserTests.php
@@ -297,6 +297,7 @@ class ParserTest {
'wgContLang' => new LanguageUtf8(),
'wgNamespacesWithSubpages' => array( 0 => preg_match('/\\bsubpage\\b/i', $opts)),
'wgMaxTocLevel' => 999,
+ 'wgCapitalLinks' => true,
);
$this->savedGlobals = array();
foreach( $settings as $var => $val ) {
diff --git a/maintenance/parserTests.txt b/maintenance/parserTests.txt
index 23bf77b44f40..47abe9be3238 100644
--- a/maintenance/parserTests.txt
+++ b/maintenance/parserTests.txt
@@ -1767,6 +1767,25 @@ title=[[Parser test script]]
!! end
+
+!! test
+Bug 1219 URL next to image (good)
+!! input
+http://example.com [[Image:foobar.jpg]]
+!! result
+<p><a href="http://example.com" class='external'>http://example.com</a> <a href="/wiki/Image:Foobar.jpg" class="image" title="Image:foobar.jpg"><img src="/images/3/3a/Foobar.jpg" alt="Image:foobar.jpg" longdesc="/wiki/Image:Foobar.jpg" /></a>
+</p>
+!!end
+
+!! test
+Bug 1219 URL next to image (broken)
+!! input
+http://example.com[[Image:foobar.jpg]]
+!! result
+<p><a href="http://example.com" class='external'>http://example.com</a><a href="/wiki/Image:Foobar.jpg" class="image" title="Image:foobar.jpg"><img src="/images/3/3a/Foobar.jpg" alt="Image:foobar.jpg" longdesc="/wiki/Image:Foobar.jpg" /></a>
+</p>
+!!end
+
TODO:
more images
more tables
diff --git a/maintenance/pcache_stats.php b/maintenance/pcache_stats.php
new file mode 100644
index 000000000000..0f7c454db116
--- /dev/null
+++ b/maintenance/pcache_stats.php
@@ -0,0 +1,14 @@
+<?php
+require_once('commandLine.inc');
+
+$hits = intval($wgMemc->get("$wgDBname:stats:pcache_hit"));
+$invalid = intval($wgMemc->get("$wgDBname:stats:pcache_miss_invalid"));
+$expired = intval($wgMemc->get("$wgDBname:stats:pcache_miss_expired"));
+$absent = intval($wgMemc->get("$wgDBname:stats:pcache_miss_absent"));
+$total = $hits + $invalid + $expired + $absent;
+printf( "hits: %-10d %6.2f%%\n", $hits, $hits/$total*100 );
+printf( "invalid: %-10d %6.2f%%\n", $invalid, $invalid/$total*100 );
+printf( "expired: %-10d %6.2f%%\n", $expired, $expired/$total*100 );
+printf( "absent: %-10d %6.2f%%\n", $absent, $absent/$total*100 );
+printf( "total: %-10d %6.2f%%\n", $total, 100 );
+?>
diff --git a/maintenance/recount.sql b/maintenance/recount.sql
index 93e1024b4f0e..2bf4a7fba806 100644
--- a/maintenance/recount.sql
+++ b/maintenance/recount.sql
@@ -2,7 +2,7 @@
-- Recalculate the article count
--
-SELECT @foo:=COUNT(*) FROM cur
+SELECT @foo:=COUNT(*) FROM /*$wgDBprefix*/cur
WHERE cur_namespace=0 AND cur_is_redirect=0 AND cur_text like '%[[%';
-UPDATE site_stats SET ss_good_articles=@foo;
+UPDATE /*$wgDBprefix*/site_stats SET ss_good_articles=@foo;
diff --git a/maintenance/tables.sql b/maintenance/tables.sql
index db2c0704ce9f..eb1035fd2ffe 100644
--- a/maintenance/tables.sql
+++ b/maintenance/tables.sql
@@ -4,7 +4,7 @@
--
-- Indexes should be defined here; please import the rest from indexes.sql.
-CREATE TABLE user (
+CREATE TABLE /*$wgDBprefix*/user (
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 '',
@@ -19,20 +19,20 @@ CREATE TABLE user (
);
-- TODO: de-blob this; it should be a property table
-CREATE TABLE user_rights (
+CREATE TABLE /*$wgDBprefix*/user_rights (
ur_user int(5) unsigned NOT NULL,
ur_rights tinyblob NOT NULL default '',
UNIQUE KEY ur_user (ur_user)
);
-CREATE TABLE user_newtalk (
+CREATE TABLE /*$wgDBprefix*/user_newtalk (
user_id int(5) NOT NULL default '0',
user_ip varchar(40) NOT NULL default '',
INDEX user_id (user_id),
INDEX user_ip (user_ip)
);
-CREATE TABLE cur (
+CREATE TABLE /*$wgDBprefix*/cur (
cur_id int(8) unsigned NOT NULL auto_increment,
cur_namespace tinyint(2) unsigned NOT NULL default '0',
cur_title varchar(255) binary NOT NULL default '',
@@ -63,7 +63,7 @@ CREATE TABLE cur (
INDEX namespace_redirect_timestamp(cur_namespace,cur_is_redirect,cur_timestamp)
);
-CREATE TABLE old (
+CREATE TABLE /*$wgDBprefix*/old (
old_id int(8) unsigned NOT NULL auto_increment,
old_namespace tinyint(2) unsigned NOT NULL default '0',
old_title varchar(255) binary NOT NULL default '',
@@ -83,7 +83,7 @@ CREATE TABLE old (
INDEX usertext_timestamp (old_user_text,inverse_timestamp)
);
-CREATE TABLE archive (
+CREATE TABLE /*$wgDBprefix*/archive (
ar_namespace tinyint(2) unsigned NOT NULL default '0',
ar_title varchar(255) binary NOT NULL default '',
ar_text mediumtext NOT NULL default '',
@@ -101,7 +101,7 @@ CREATE TABLE archive (
-- Track links that do exist
-- l_from and l_to key to cur_id
--
-CREATE TABLE links (
+CREATE TABLE /*$wgDBprefix*/links (
l_from int(8) unsigned NOT NULL default '0',
l_to int(8) unsigned NOT NULL default '0',
UNIQUE KEY l_from(l_from,l_to),
@@ -113,7 +113,7 @@ CREATE TABLE links (
-- bl_from keys to cur_id
-- bl_to is a text link (namespace:title)
--
-CREATE TABLE brokenlinks (
+CREATE TABLE /*$wgDBprefix*/brokenlinks (
bl_from int(8) unsigned NOT NULL default '0',
bl_to varchar(255) binary NOT NULL default '',
UNIQUE KEY bl_from(bl_from,bl_to),
@@ -125,7 +125,7 @@ CREATE TABLE brokenlinks (
-- il_from keys to cur_id, il_to keys to image_name.
-- We don't distinguish live from broken links.
--
-CREATE TABLE imagelinks (
+CREATE TABLE /*$wgDBprefix*/imagelinks (
il_from int(8) unsigned NOT NULL default '0',
il_to varchar(255) binary NOT NULL default '',
UNIQUE KEY il_from(il_from,il_to),
@@ -138,7 +138,7 @@ CREATE TABLE imagelinks (
-- cl_sortkey is the title of the linking page or an optional override
-- cl_timestamp marks when the link was last added
--
-CREATE TABLE categorylinks (
+CREATE TABLE /*$wgDBprefix*/categorylinks (
cl_from int(8) unsigned NOT NULL default '0',
cl_to varchar(255) binary NOT NULL default '',
cl_sortkey varchar(255) binary NOT NULL default '',
@@ -153,12 +153,12 @@ CREATE TABLE categorylinks (
-- cache arrays to reduce database load slurping up
-- from links and brokenlinks.
--
-CREATE TABLE linkscc (
+CREATE TABLE /*$wgDBprefix*/linkscc (
lcc_pageid INT UNSIGNED NOT NULL UNIQUE KEY,
lcc_cacheobj MEDIUMBLOB NOT NULL
);
-CREATE TABLE site_stats (
+CREATE TABLE /*$wgDBprefix*/site_stats (
ss_row_id int(8) unsigned NOT NULL,
ss_total_views bigint(20) unsigned default '0',
ss_total_edits bigint(20) unsigned default '0',
@@ -166,11 +166,11 @@ CREATE TABLE site_stats (
UNIQUE KEY ss_row_id (ss_row_id)
);
-CREATE TABLE hitcounter (
+CREATE TABLE /*$wgDBprefix*/hitcounter (
hc_id INTEGER UNSIGNED NOT NULL
) TYPE=HEAP MAX_ROWS=25000;
-CREATE TABLE ipblocks (
+CREATE TABLE /*$wgDBprefix*/ipblocks (
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',
@@ -185,7 +185,7 @@ CREATE TABLE ipblocks (
INDEX ipb_user (ipb_user)
);
-CREATE TABLE image (
+CREATE TABLE /*$wgDBprefix*/image (
img_name varchar(255) binary NOT NULL default '',
img_size int(8) unsigned NOT NULL default '0',
img_description tinyblob NOT NULL default '',
@@ -197,7 +197,7 @@ CREATE TABLE image (
INDEX img_timestamp (img_timestamp)
);
-CREATE TABLE oldimage (
+CREATE TABLE /*$wgDBprefix*/oldimage (
oi_name varchar(255) binary NOT NULL default '',
oi_archive_name varchar(255) binary NOT NULL default '',
oi_size int(8) unsigned NOT NULL default 0,
@@ -208,7 +208,7 @@ CREATE TABLE oldimage (
INDEX oi_name (oi_name(10))
);
-CREATE TABLE recentchanges (
+CREATE TABLE /*$wgDBprefix*/recentchanges (
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 '',
@@ -237,7 +237,7 @@ CREATE TABLE recentchanges (
INDEX rc_ip (rc_ip)
);
-CREATE TABLE watchlist (
+CREATE TABLE /*$wgDBprefix*/watchlist (
wl_user int(5) unsigned NOT NULL,
wl_namespace tinyint(2) unsigned NOT NULL default '0',
wl_title varchar(255) binary NOT NULL default '',
@@ -245,7 +245,7 @@ CREATE TABLE watchlist (
KEY namespace_title (wl_namespace,wl_title)
);
-CREATE TABLE math (
+CREATE TABLE /*$wgDBprefix*/math (
math_inputhash varchar(16) NOT NULL,
math_outputhash varchar(16) NOT NULL,
math_html_conservativeness tinyint(1) NOT NULL,
@@ -257,7 +257,7 @@ CREATE TABLE math (
-- Table searchindex must be MyISAM for fulltext support
-CREATE TABLE searchindex (
+CREATE TABLE /*$wgDBprefix*/searchindex (
si_page int(8) unsigned NOT NULL,
si_title varchar(255) NOT NULL default '',
si_text mediumtext NOT NULL default '',
@@ -267,7 +267,7 @@ CREATE TABLE searchindex (
) TYPE=MyISAM;
-CREATE TABLE interwiki (
+CREATE TABLE /*$wgDBprefix*/interwiki (
iw_prefix char(32) NOT NULL,
iw_url char(127) NOT NULL,
iw_local BOOL NOT NULL,
@@ -275,7 +275,7 @@ CREATE TABLE interwiki (
);
-- Used for caching expensive grouped queries
-CREATE TABLE querycache (
+CREATE TABLE /*$wgDBprefix*/querycache (
qc_type char(32) NOT NULL,
qc_value int(5) unsigned NOT NULL default '0',
qc_namespace tinyint(2) unsigned NOT NULL default '0',
@@ -284,7 +284,7 @@ CREATE TABLE querycache (
);
-- For a few generic cache operations if not using Memcached
-CREATE TABLE objectcache (
+CREATE TABLE /*$wgDBprefix*/objectcache (
keyname char(255) binary not null default '',
value mediumblob,
exptime datetime,
@@ -293,7 +293,7 @@ CREATE TABLE objectcache (
);
-- For storing revision text
-CREATE TABLE blobs (
+CREATE TABLE /*$wgDBprefix*/blobs (
blob_index char(255) binary NOT NULL default '',
blob_data longblob NOT NULL default '',
UNIQUE key blob_index (blob_index)
@@ -301,7 +301,7 @@ CREATE TABLE blobs (
-- For article validation
-CREATE TABLE `validate` (
+CREATE TABLE /*$wgDBprefix*/validate (
`val_user` int(11) NOT NULL default '0',
`val_title` varchar(255) binary NOT NULL default '',
`val_timestamp` varchar(14) binary NOT NULL default '',
@@ -312,7 +312,7 @@ CREATE TABLE `validate` (
);
-CREATE TABLE logging (
+CREATE TABLE /*$wgDBprefix*/logging (
-- 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.
@@ -338,22 +338,3 @@ CREATE TABLE logging (
KEY page_time (log_namespace, log_title, log_timestamp)
);
-
-
-
-
--- Hold group name and description
-CREATE TABLE `group` (
- group_id int(5) unsigned NOT NULL auto_increment,
- group_name varchar(50) NOT NULL default '',
- group_description varchar(255) NOT NULL default '',
- group_rights tinyblob,
- PRIMARY KEY (group_id)
-);
-
--- Relation table between user and groups
-CREATE TABLE user_groups (
- ug_user int(5) unsigned NOT NULL default '0',
- ug_group int(5) unsigned NOT NULL default '0',
- PRIMARY KEY (ug_user,ug_group)
-);
diff --git a/maintenance/update.php b/maintenance/update.php
index 955be7ddc6ca..1bd6cb26a2c1 100644
--- a/maintenance/update.php
+++ b/maintenance/update.php
@@ -13,6 +13,12 @@ require_once( "updaters.inc" );
$wgTitle = Title::newFromText( "MediaWiki database updater" );
$wgDatabase = Database::newFromParams( $wgDBserver, $wgDBadminuser, $wgDBadminpassword, $wgDBname );
+print "Going to run database updates for $wgDBname\n";
+print "Depending on the size of your database this may take a while!\n";
+print "Abort with control-c in the next five seconds or...\n";
+sleep(5);
+
+
do_all_updates();
print "Done.\n";
diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc
index 8f83a480b599..0448522314e7 100644
--- a/maintenance/updaters.inc
+++ b/maintenance/updaters.inc
@@ -19,7 +19,6 @@ $wgNewTables = array(
array( 'categorylinks', 'patch-categorylinks.sql' ),
array( 'logging', 'patch-logging.sql' ),
array( 'user_rights', 'patch-user_rights.sql' ),
- array( 'user_groups', 'patch-userlevels.sql' ),
);
$wgNewFields = array(
@@ -32,8 +31,7 @@ $wgNewFields = array(
array( 'recentchanges', 'rc_patrolled', 'patch-rc-patrol.sql' ),
array( 'user', 'user_real_name', 'patch-user-realname.sql' ),
array( 'user', 'user_token', 'patch-user_token.sql' ),
- array( 'user_rights', 'ur_user', 'patch-rename-user_groups-and_rights.sql' ),
- array( 'group', 'group_rights', 'patch-userlevels-rights.sql' ),
+ array( 'user_rights', 'ur_user', 'patch-rename-user_rights.sql' ),
);
function add_table( $name, $patch ) {
@@ -66,6 +64,8 @@ function do_revision_updates() {
}
function update_passwords() {
+ wfDebugDieBacktrace( "This function needs to be updated or removed.\n" );
+
global $wgDatabase;
$fname = "Update script: update_passwords()";
print "\nIt appears that you need to update the user passwords in your\n" .
@@ -123,7 +123,7 @@ function do_index_update() {
function do_linkscc_1_3_update() {
// Update linkscc table to 1.3 schema if necessary
global $wgDatabase, $wgVersion;
- if( ( strpos( "1.3", $wgVersion ) === 0 ) && $wgDatabase->tableExists( "linkscc" )
+ if( $wgDatabase->tableExists( "linkscc" )
&& $wgDatabase->fieldExists( "linkscc", "lcc_title" ) ) {
echo "Altering lcc_title field from linkscc table... ";
dbsource( "maintenance/archives/patch-linkscc-1.3.sql", $wgDatabase );
@@ -144,35 +144,6 @@ function do_image_name_unique_update() {
}
}
-# Assumes that the group table has been added.
-function do_group_update() {
- global $wgDatabase;
- $res = $wgDatabase->safeQuery( 'SELECT COUNT(*) AS c FROM !',
- $wgDatabase->tableName( 'group' ) );
- $row = $wgDatabase->fetchObject( $res );
- $wgDatabase->freeResult( $res );
- if( $row->c == 0 ) {
- echo "Adding default group definitions... ";
- dbsource( "maintenance/archives/patch-userlevels-defaultgroups.sql", $wgDatabase );
- echo "ok\n";
- } else {
- echo "...group definitions already in place.\n";
- $res = $wgDatabase->safeQuery( "SELECT COUNT(*) AS n FROM !
- WHERE group_name IN ('Sysops','Bureaucrat')
- AND group_rights NOT LIKE 'sysop'",
- $wgDatabase->tableName( 'group' ) );
- $row = $wgDatabase->fetchObject( $res );
- $wgDatabase->freeResult( $res );
- if( $row->n ) {
- echo "Fixing sysops group permissions... ";
- dbsource( "maintenance/archives/patch-group-sysopfix.sql", $wgDatabase );
- echo "ok\n";
- } else {
- echo "...sysop group permissions look ok.\n";
- }
- }
-}
-
function do_all_updates() {
global $wgNewTables, $wgNewFields;
@@ -188,9 +159,6 @@ function do_all_updates() {
flush();
}
- # Add default group data
- do_group_update(); flush();
-
# Do schema updates which require special handling
do_interwiki_update(); flush();
do_index_update(); flush();
diff --git a/maintenance/users.sql b/maintenance/users.sql
index dc23ed356f33..4d74987b3159 100644
--- a/maintenance/users.sql
+++ b/maintenance/users.sql
@@ -17,99 +17,3 @@ GRANT DELETE,INSERT,SELECT,UPDATE ON `{$wgDBname}`.*
TO {$wgDBuser}@localhost IDENTIFIED BY '{$wgDBpassword}';
GRANT DELETE,INSERT,SELECT,UPDATE ON `{$wgDBname}`.*
TO {$wgDBuser}@localhost.localdomain IDENTIFIED BY '{$wgDBpassword}';
-
-GRANT SELECT (user_id,user_name,user_options) ON `{$wgDBname}`.user
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.user_rights
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.cur
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.old
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.archive
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.links
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.brokenlinks
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.imagelinks
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.site_stats
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.ipblocks
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.image
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.oldimage
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.recentchanges
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.watchlist
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.math
- TO {$wgDBsqluser}@'%' IDENTIFIED BY '{$wgDBsqlpassword}';
-
-GRANT SELECT (user_id,user_name,user_options)
- ON `{$wgDBname}`.user
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.user_rights
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.cur
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.old
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.archive
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.links
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.brokenlinks
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.imagelinks
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.site_stats
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.ipblocks
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.image
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.oldimage
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.recentchanges
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.watchlist
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.math
- TO {$wgDBsqluser}@localhost IDENTIFIED BY '{$wgDBsqlpassword}';
-
-GRANT SELECT (user_id,user_name,user_options)
- ON `{$wgDBname}`.user
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.user_rights
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.cur
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.old
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.archive
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.links
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.brokenlinks
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.imagelinks
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.site_stats
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.ipblocks
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.image
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.oldimage
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.recentchanges
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.watchlist
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-GRANT SELECT ON `{$wgDBname}`.math
- TO {$wgDBsqluser}@localhost.localdomain IDENTIFIED BY '{$wgDBsqlpassword}';
-
diff --git a/maintenance/wikipedia-interwiki.sql b/maintenance/wikipedia-interwiki.sql
index c42b47d8f681..77ab327b1cbb 100644
--- a/maintenance/wikipedia-interwiki.sql
+++ b/maintenance/wikipedia-interwiki.sql
@@ -1,7 +1,7 @@
-- For convenience, here are the *in-project* interwiki prefixes
-- for Wikipedia.
-REPLACE INTO interwiki (iw_prefix,iw_url,iw_local) VALUES
+REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
('w','http://www.wikipedia.org/wiki/$1',1),
('m','http://meta.wikipedia.org/wiki/$1',1),
('meta','http://meta.wikipedia.org/wiki/$1',1),
diff --git a/maintenance/wiktionary-interwiki.sql b/maintenance/wiktionary-interwiki.sql
index a2863a87ccd3..787962d5b7a4 100644
--- a/maintenance/wiktionary-interwiki.sql
+++ b/maintenance/wiktionary-interwiki.sql
@@ -1,7 +1,7 @@
-- For convenience, here are the *in-project* interwiki prefixes
-- for Wikipedia.
-REPLACE INTO interwiki (iw_prefix,iw_url,iw_local) VALUES
+REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
('w','http://www.wikipedia.org/wiki/$1',1),
('m','http://meta.wikipedia.org/wiki/$1',1),
('meta','http://meta.wikipedia.org/wiki/$1',1),
diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php
index 729739b27697..50072c452c77 100644
--- a/skins/CologneBlue.php
+++ b/skins/CologneBlue.php
@@ -7,6 +7,9 @@
* @subpackage Skins
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/**
* @todo document
* @package MediaWiki
@@ -147,6 +150,21 @@ class SkinCologneBlue extends Skin {
$s .= $this->makeKnownLink( $li, wfMsg( "login" ), $q );
}
+ /* show links to different language variants */
+ global $wgDisableLangConversion;
+ $variants = $wgContLang->getVariants();
+ if( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) {
+ $actstr = '';
+ foreach( $variants as $code ) {
+ $varname = $wgContLang->getVariantname( $code );
+ if( $varname == 'disable' )
+ continue;
+ $s .= ' | <a href="' . $wgTitle->getLocalUrl( 'variant=' . $code ) . '">' . $varname . '</a>';
+ }
+ }
+
+
+
return $s;
}
@@ -170,9 +188,10 @@ class SkinCologneBlue extends Skin {
foreach ( $wgNavigationLinks as $link ) {
$msg = wfMsgForContent( $link['href'] );
- if ( $msg != '-' ) {
+ $text = wfMsg( $link['text'] );
+ if ( $msg != '-' && $text != '-' ) {
$s .= '<a href="' . $this->makeInternalOrExternalUrl( $msg ) . '">' .
- wfMsg( $link['text'] ) . '</a>' . $sep;
+ htmlspecialchars( $text ) . '</a>' . $sep;
}
}
diff --git a/skins/MonoBook.php b/skins/MonoBook.php
index 978ce43860ae..b38f0866e485 100644
--- a/skins/MonoBook.php
+++ b/skins/MonoBook.php
@@ -10,6 +10,9 @@
* @subpackage Skins
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/** */
require_once('includes/SkinTemplate.php');
@@ -125,7 +128,9 @@ class MonoBookTemplate extends QuickTemplate {
<form name="searchform" action="<?php $this->text('searchaction') ?>" id="searchform">
<input id="searchInput" name="search" type="text"
<?php if($this->haveMsg('accesskey-search')) {
- ?>accesskey="<?php $this->msg('accesskey-search') ?>"<?php } ?> />
+ ?>accesskey="<?php $this->msg('accesskey-search') ?>"<?php }
+ if( isset( $this->data['search'] ) ) {
+ ?>value="<?php $this->text('search') ?>"<?php } ?> />
<input type='submit' name="go" class="searchButton"
value="<?php $this->msg('go') ?>"
/>&nbsp;<input type='submit' name="fulltext"
@@ -145,7 +150,7 @@ class MonoBookTemplate extends QuickTemplate {
<?php } } ?>
<?php if($this->data['feeds']) { ?><li id="feedlinks"><?php foreach($this->data['feeds'] as $key => $feed) {
?><span id="feed-<?php echo htmlspecialchars($key) ?>"><a href="<?php
- echo htmlspecialchars($feed['href']) ?>"><?php echo htmlspecialchars($feed['text'])?>&nbsp;</span>
+ echo htmlspecialchars($feed['href']) ?>"><?php echo htmlspecialchars($feed['text'])?></a>&nbsp;</span>
<?php } ?></li><?php } ?>
<?php foreach( array('contributions', 'emailuser', 'upload', 'specialpages') as $special ) { ?>
<?php if($this->data['nav_urls'][$special]) {?><li id="t-<?php echo $special ?>"><a href="<?php
@@ -191,4 +196,4 @@ class MonoBookTemplate extends QuickTemplate {
}
}
-?> \ No newline at end of file
+?>
diff --git a/skins/MySkin.php b/skins/MySkin.php
index 22fd1e97a6d5..2f551b4606d7 100644
--- a/skins/MySkin.php
+++ b/skins/MySkin.php
@@ -7,6 +7,9 @@
* @subpackage Skins
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/** */
require_once('MonoBook.php');
diff --git a/skins/Nostalgia.php b/skins/Nostalgia.php
index 0b914bdc86e4..d29aaf8f65b0 100644
--- a/skins/Nostalgia.php
+++ b/skins/Nostalgia.php
@@ -7,6 +7,9 @@
* @subpackage Skins
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/**
* @todo document
* @package MediaWiki
diff --git a/skins/Standard.php b/skins/Standard.php
index 6698cf2a4d77..1bc379ff5da9 100644
--- a/skins/Standard.php
+++ b/skins/Standard.php
@@ -7,6 +7,9 @@
* @subpackage Skins
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/**
* @todo document
* @package MediaWiki
@@ -145,9 +148,10 @@ class SkinStandard extends Skin {
foreach ( $wgNavigationLinks as $link ) {
$msg = wfMsgForContent( $link['href'] );
- if ( $msg != '-' ) {
+ $text = wfMsg( $link['text'] );
+ if ( $msg != '-' && $text != '-' ) {
$s .= '<a href="' . $this->makeInternalOrExternalUrl( $msg ) . '">' .
- wfMsg( $link['text'] ) . '</a>' . $sep;
+ htmlspecialchars( $text ) . '</a>' . $sep;
}
}
diff --git a/skins/amethyst/main.css b/skins/amethyst/main.css
index 3e3925b7a38d..1f6949b96b34 100644
--- a/skins/amethyst/main.css
+++ b/skins/amethyst/main.css
@@ -967,3 +967,46 @@ span.newpage, span.minor, span.searchmatch {
span.searchmatch {
color: red;
}
+
+span.updatedmarker {
+ color:black;
+ background-color:#00FF00;
+}
+span.newpageletter {
+ font-weight:bold
+ color:black;
+ background-color:yellow;
+}
+span.minoreditletter {
+ color:black;
+ background-color:#C5FFE6;
+}
+
+table.gallery {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ padding: 2px;
+ background-color:#ffffff;
+}
+
+table.gallery tr {
+ vertical-align:top;
+}
+
+div.gallerybox {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ background-color:#f9f9f9;
+ width: 150px;
+}
+
+div.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #cccccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ font-size: 94%;
+ padding: 2px 4px;
+}
diff --git a/skins/chick/main.css b/skins/chick/main.css
index 294f8d1862e2..71eb312b8602 100755
--- a/skins/chick/main.css
+++ b/skins/chick/main.css
@@ -430,3 +430,46 @@ div.patrollink {
span.newpage, span.minor {
font-weight: bold;
}
+
+span.updatedmarker {
+ color:black;
+ background-color:#00FF00;
+}
+span.newpageletter {
+ font-weight:bold
+ color:black;
+ background-color:yellow;
+}
+span.minoreditletter {
+ color:black;
+ background-color:#C5FFE6;
+}
+
+table.gallery {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ padding: 2px;
+ background-color:#ffffff;
+}
+
+table.gallery tr {
+ vertical-align:top;
+}
+
+div.gallerybox {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ background-color:#f9f9f9;
+ width: 150px;
+}
+
+div.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #cccccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ font-size: 94%;
+ padding: 2px 4px;
+}
diff --git a/skins/common/cologneblue.css b/skins/common/cologneblue.css
index 237b1de62d94..674ff6240059 100644
--- a/skins/common/cologneblue.css
+++ b/skins/common/cologneblue.css
@@ -86,16 +86,12 @@ h1.pagetitle { padding-bottom: 0; margin-bottom: 0; }
padding-top: 0; margin-top: 0; padding-bottom: 1ex;
}
-a { color: #0000FF; }
-a:visited { color: #000080; }
-a.external { color: #00C000; }
-a.external:visited { color: #008000; }
-a.stub { color:#800080; }
-a.stub:visited { color:#600060; }
-a.new, #quickbar a.new { color:#FF0000; }
-a.new:visited , #quickbar a.new:visited { color:#800000; }
-
+a { color: #223366; }
+a.external { color: #336644; }
+a:visited { color: #8D0749; }
a.printable { text-decoration: underline; }
+a.stub, #quickbar a.stub { color:#772233; text-decoration:none; }
+a.new, #quickbar a.new { color: #CC2200; }
h2, h3, h4, h5, h6 { margin-bottom: 0; }
small { font-size: 75%; }
diff --git a/skins/common/common.css b/skins/common/common.css
index 97063f205dac..1cfddddea91f 100644
--- a/skins/common/common.css
+++ b/skins/common/common.css
@@ -212,3 +212,45 @@ span.unpatrolled {
color:red;
}
+span.updatedmarker {
+ color:black;
+ background-color:#00FF00;
+}
+span.newpageletter {
+ font-weight:bold
+ color:black;
+ background-color:yellow;
+}
+span.minoreditletter {
+ color:black;
+ background-color:#C5FFE6;
+}
+
+table.gallery {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ padding: 2px;
+ background-color:#ffffff;
+}
+
+table.gallery tr {
+ vertical-align:top;
+}
+
+div.gallerybox {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ background-color:#f9f9f9;
+ width: 150px;
+}
+
+div.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #cccccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ font-size: 94%;
+ padding: 2px 4px;
+}
diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css
index 491d9e70d3ff..ce4b35de12ca 100644
--- a/skins/common/commonPrint.css
+++ b/skins/common/commonPrint.css
@@ -229,3 +229,33 @@ div.townBox dl dd {
}
#siteNotice { display: none; }
+
+table.gallery {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ padding: 2px;
+ background-color:#ffffff;
+}
+
+table.gallery tr {
+ vertical-align:top;
+}
+
+div.gallerybox {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ background-color:#f9f9f9;
+ width: 150px;
+}
+
+div.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #cccccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ font-size: 94%;
+ padding: 2px 4px;
+}
+
diff --git a/skins/common/images/fileicon-ogg.png b/skins/common/images/fileicon-ogg.png
new file mode 100644
index 000000000000..aa82607029a4
--- /dev/null
+++ b/skins/common/images/fileicon-ogg.png
Binary files differ
diff --git a/skins/common/images/fileicon-ogg.xcf b/skins/common/images/fileicon-ogg.xcf
new file mode 100644
index 000000000000..a91024bf219a
--- /dev/null
+++ b/skins/common/images/fileicon-ogg.xcf
Binary files differ
diff --git a/skins/common/images/fileicon.png b/skins/common/images/fileicon.png
new file mode 100644
index 000000000000..2271faeb7d62
--- /dev/null
+++ b/skins/common/images/fileicon.png
Binary files differ
diff --git a/skins/common/images/fileicon.xcf b/skins/common/images/fileicon.xcf
new file mode 100644
index 000000000000..45135def948e
--- /dev/null
+++ b/skins/common/images/fileicon.xcf
Binary files differ
diff --git a/skins/common/images/redirect.png b/skins/common/images/redirect.png
index 5b72c43c3b57..7b2b071f8c96 100644
--- a/skins/common/images/redirect.png
+++ b/skins/common/images/redirect.png
Binary files differ
diff --git a/skins/disabled/Amethyst.php b/skins/disabled/Amethyst.php
index 3bfaa18f99a2..f387f2077982 100644
--- a/skins/disabled/Amethyst.php
+++ b/skins/disabled/Amethyst.php
@@ -12,6 +12,9 @@
* @subpackage Skins
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/** */
require_once('includes/SkinPHPTal.php');
if( class_exists( 'SkinPHPTal' ) ) {
diff --git a/skins/disabled/Chick.php b/skins/disabled/Chick.php
index ee28850a109c..205feb67008d 100644
--- a/skins/disabled/Chick.php
+++ b/skins/disabled/Chick.php
@@ -7,6 +7,9 @@
* @subpackage Skins
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/** */
require_once('includes/SkinPHPTal.php');
if( class_exists( 'SkinPHPTal' ) ) {
diff --git a/skins/disabled/MonoBookTal.php b/skins/disabled/MonoBookTal.php
index bc0f1215c77b..876150ce2222 100644
--- a/skins/disabled/MonoBookTal.php
+++ b/skins/disabled/MonoBookTal.php
@@ -14,6 +14,9 @@
* @subpackage Skins
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/** */
require_once('includes/SkinPHPTal.php');
diff --git a/skins/disabled/WikimediaWiki.php b/skins/disabled/WikimediaWiki.php
index 608c8b80ec11..87564df04f1e 100644
--- a/skins/disabled/WikimediaWiki.php
+++ b/skins/disabled/WikimediaWiki.php
@@ -6,6 +6,9 @@
* @subpackage Skins
*/
+if( !defined( 'MEDIAWIKI' ) )
+ die();
+
/** */
require_once('includes/SkinPHPTal.php');
diff --git a/skins/monobook/main.css b/skins/monobook/main.css
index 8f15bc01ce96..15b39d18d12d 100644
--- a/skins/monobook/main.css
+++ b/skins/monobook/main.css
@@ -185,7 +185,8 @@ input[type="checkbox"] { border:none; }
select {
border: 1px solid #2f6fab;
color: Black;
- vertical-align: top;
+ background: White;
+ vertical-align: top;
}
abbr, acronym, .explain {
border-bottom: 1px dotted Black;
@@ -790,7 +791,7 @@ li#pt-login {
}
/* offsets to distinguish the tab groups */
li#ca-talk { margin-right: 1.6em; }
-li#ca-watch, li#ca-watch { margin-left: 1.6em; }
+li#ca-watch, li#ca-watch, li#ca-varlang-0 { margin-left: 1.6em; }
/*
@@ -935,3 +936,46 @@ span.searchmatch {
.sharedUploadNotice {
font-style: italic;
}
+
+span.updatedmarker {
+ color:black;
+ background-color:#00FF00;
+}
+span.newpageletter {
+ font-weight:bold
+ color:black;
+ background-color:yellow;
+}
+span.minoreditletter {
+ color:black;
+ background-color:#C5FFE6;
+}
+
+table.gallery {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ padding: 2px;
+ background-color:#ffffff;
+}
+
+table.gallery tr {
+ vertical-align:top;
+}
+
+div.gallerybox {
+ border: 1px solid #cccccc;
+ margin: 2px;
+ background-color:#f9f9f9;
+ width: 150px;
+}
+
+div.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #cccccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ font-size: 94%;
+ padding: 2px 4px;
+}
diff --git a/soap/client.php b/soap/client.php
deleted file mode 100644
index b9d75cfd2a1f..000000000000
--- a/soap/client.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) {
- print "This script must be run from the command line\n";
- exit();
-}
-
-
-require_once('nusoap.php');
-
-$t = 'Hello, World!';
-
-$s = new soapclient( 'http://mediawiki.mormo.org:80/soap/' );
-print "==echoString==\n";
-$r = $s->call( 'echoString', array( $t ) );
-
-print( $r . "\n" );
-print( "Error: ".$s->getError() . "\n" );
-
-print "\n\n==getArticle==\n";
-$r = $s->call( 'getArticle', array( 'Frankfurt' ) );
-
-print_r( $r );
-print( "Error: ".$s->getError() . "\n" );
-
-print "\n\n==getArticleByVersion==\n";
-$r = $s->call( 'getArticleByVersion', array( 'Frankfurt am Main', 0 ) );
-
-print_r( $r );
-print( "Error: ".$s->getError() . "\n" );
-
-print "\n\n==getArticleRevisions==\n";
-$r = $s->call( 'getArticleRevisions', array( 'Frankfurt am Main' ) );
-
-print_r( $r );
-print( "Error: ".$s->getError() . "\n" );
-
-print "\n\n==searchTitles==\n";
-$r = $s->call( 'searchTitles', array( 'Frankfurt', 0 ) );
-
-print_r( $r );
-print( "Error: ".$s->getError() . "\n" );
-
-?>
-
diff --git a/soap/index.php b/soap/index.php
deleted file mode 100644
index 71d4b0c1004f..000000000000
--- a/soap/index.php
+++ /dev/null
@@ -1,362 +0,0 @@
-<?php
-# SOAP remote API for MediaWiki
-#
-# Copyright (C) 2004 Jens Frank, jeluf@gmx.de
-# 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.,
-# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-require_once('nusoap.php');
-
-#
-# Initialize the environment
-#
-unset( $wgEnableSOAP );
-unset( $IP );
-@ini_set( "allow_url_fopen", 0 ); # For security...
-
-if(!file_exists("../LocalSettings.php")) {
- die( "You'll have to <a href='../config/index.php'>set the wiki up</a> first!" );
-}
-
-define( "MEDIAWIKI", true );
-
-require_once( '../includes/Defines.php' );
-require_once( '../LocalSettings.php' );
-
-ini_set( "include_path", "$IP:" . ini_get("include_path") );
-
-require_once( '../includes/Setup.php' );
-
-#
-# SOAP must be activated in the Configuration. Else, exit.
-#
-if ( ! $wgEnableSOAP ) {
- print "You have to enable SOAP by setting \$wgEnableSoap=true; in LocalSettings.php\n";
- exit;
-}
-
-#
-# Set up server and register methods.
-#
-
-$s = new soap_server;
-
-$s->register('echoString'); # For testing
-$s->register('getArticle'); # For testing
-$s->register('getArticleByVersion');
-$s->register('getArticleRevisions');
-$s->register('searchTitles');
-
-# Convert decimal to ASCII-encoded
-#
-function decasc( $n ) {
- return strtoupper(base_convert( $n, 10, 36));
-}
-# Test function
-# Return the string.
-#
-function echoString( $in ) {
- if ( is_string( $in ) ) {
- return $in;
- } else {
- return new soap_fault('Client', 'The parameter to this service must be a string');
- }
-}
-
-# Test function
-# Return an array:
-# name IN name of the page to get, e.g. Wikipedia talk:Village Pump
-# title OUT Title of the page, DB form, e.g. Village_Pump
-# namespace OUT Namespace of the article, e.g. 3 for Wikipedia_talk.
-# text OUT Wikitext of the requested page
-#
-function getArticle( $name ) {
- global $wgWhitelistEdit, $wgWhitelistRead;
-
- if ( $wgWhitelistEdit || $wgWhitelistRead ) {
- return new soap_fault('Client', 'SOAP not available in whitelist mode.');
- }
-
- if ( ! is_string( $name ) ) {
- return new soap_fault('Client', 'The parameter to this service must be a string');
- }
- require_once('Title.php');
- if( $name == '' ) {
- $name = wfMsg( "mainpage" );
- }
- $wgTitle = Title::newFromText( $name );
- $dbr =& wfGetDB( DB_SLAVE );
- $text = $dbr->selectField( 'cur', 'cur_text',
- "cur_title='".$wgTitle->getDBkey()."' AND cur_namespace=".$wgTitle->getNamespace(),
- 'SOAP::getArticle' );
- if ( false === $text ) {
- return new soap_fault('Client', 'Page does not exist.');
- }
- return array(
- 'title' => $wgTitle->getDBkey(),
- 'namespace' => $wgTitle->getNamespace(),
- 'text' => $text
- );
-}
-
-# getArticleByVersion
-# Returns the wikitext and metadata of an article, either current or old revision.
-# title IN title of the page, including namespace prefix
-# version IN version number of the page, or 0 for cur.
-#
-# title OUT title of the page, without namespace prefix
-# namespace OUT namespace number of that article
-# id OUT ID number of this page
-# timestamp OUT timestamp of this page
-# text OUT wikitext of this page
-#
-function getArticleByVersion( $title, $version ) {
- global $wgWhitelistEdit, $wgWhitelistRead;
- $fname = 'SOAP::getArticleByVersion';
-
- # Check parameters
- #
- if ( $wgWhitelistEdit || $wgWhitelistRead ) {
- return new soap_fault('Client', 'SOAP not available in whitelist mode.');
- }
- if ( ! is_string( $title ) ) {
- return new soap_fault('Client', 'The first parameter to this service must be a string');
- }
- if ( intval( $version ) != $version ) {
- return new soap_fault('Client', 'The second parameter to this service must be an integer');
- }
-
- # Instantiate a title object
- #
- require_once('Title.php');
- if( $title == '' ) {
- $title = wfMsg( "mainpage" );
- }
- $wgTitle = Title::newFromText( $title );
-
- $dbr =& wfGetDB( DB_SLAVE );
-
- # set up SQL query
- #
- if ( $version == 0 ) {
- # Get current revision
- #
- $sql = "SELECT cur_title AS title, cur_namespace AS namespace, cur_id AS id,
- cur_timestamp AS timestamp, cur_text as text FROM cur
- WHERE cur_title = '" . $wgTitle->getDBkey()."' AND cur_namespace=".$wgTitle->getNamespace();
- } else {
- $sql = "SELECT old_title AS title, old_namespace AS namespace, old_id AS id,
- old_timestamp AS timestamp, old_text AS text FROM old
- WHERE old_title = '" . $wgTitle->getDBkey()."' AND old_id=".intval( $version );
- }
-
- $res = $dbr->query( $sql, $fname, true );
-
- if ( ! $res ) {
- return new soap_fault( 'Server', $dbr->lastError() );
- }
-
- if ( ! ( $line = $dbr->fetchObject( $res ) ) ) {
- return new soap_fault( 'Client', 'That page or revision does not exist.' );
- }
-
- $answer['title'] = $line->title;
- $answer['namespace'] = $line->namespace;
- $answer['id'] = $line->id;
- $answer['timestamp'] = $line->timestamp;
- $answer['text'] = $line->text;
-
- return $answer;
-}
-
-# getArticleRevisions
-# Return a list of all revisions of a page.
-# title IN title of the page, including namespace prefix
-#
-# title OUT title of the page, without namespace prefix
-# namespace OUT namespace number of that article
-# id OUT ID number of this page
-# revisions OUT list of revisions of this page. Array consisting of elements with
-# the following fields:
-# id OUT revision id of this revision
-# comment OUT edit comment of this revision
-# user OUT user name of the user adding this revision
-# timestamp OUT timestamp of this revision
-# minor OUT is this change a minor change
-# unique OUT unique ID of this revision. built from (curid,timestamp,hash(text))
-#
-function getArticleRevisions( $title ) {
- global $wgWhitelistEdit, $wgWhitelistRead;
- $fname = 'SOAP::getArticleRevisions';
-
- # Check parameters
- #
- if ( $wgWhitelistEdit || $wgWhitelistRead ) {
- return new soap_fault('Client', 'SOAP not available in whitelist mode.');
- }
- if ( ! is_string( $title ) ) {
- return new soap_fault('Client', 'The first parameter to this service must be a string');
- }
-
- # Instantiate a title object
- #
- require_once('Title.php');
- if( $title == '' ) {
- $title = wfMsg( "mainpage" );
- }
- $wgTitle = Title::newFromText( $title );
-
- $dbr =& wfGetDB( DB_SLAVE );
-
- # set up SQL query
- #
- $sql1 = "SELECT cur_id, cur_comment, cur_user_text, cur_timestamp, cur_minor_edit, cur_text
- FROM cur
- WHERE cur_title = '" . $wgTitle->getDBkey()."' AND cur_namespace=".$wgTitle->getNamespace();
-
- $sql2 = "SELECT old_id, old_comment, old_user_text, old_timestamp, old_minor_edit, old_text
- FROM old
- WHERE old_title = '" . $wgTitle->getDBkey()."' AND old_namespace=".$wgTitle->getNamespace();
-
- $res = $dbr->query( $sql1, $fname, true );
-
- if ( ! $res ) {
- return new soap_fault( 'Server', $dbr->lastError() );
- }
-
- if ( ! ( $line = $dbr->fetchObject( $res ) ) ) {
- return new soap_fault( 'Client', 'That page or revision does not exist.' );
- }
-
- $curid = $line->cur_id;
-
- $revisions[] = array(
- 'id' => 0,
- 'comment' => $line->cur_comment,
- 'user' => $line->cur_user_text,
- 'timestamp' => $line->cur_timestamp,
- 'minor' => $line->cur_minor_edit,
- 'unique' => decasc($curid).'-'.
- decasc(wfTimestamp2Unix($line->cur_timestamp)).'-'.
- decasc(crc32($line->cur_text))
- );
-
- $answer = array(
- 'title' => $wgTitle->getDBkey(),
- 'namespace' => $wgTitle->getNamespace(),
- 'id' => $curid
- );
-
-
- $res = $dbr->query( $sql2, $fname, true );
- $answer['count'] = 1;
-
- if ( $res ) {
- while ( $line = $dbr->fetchObject( $res ) ) {
- $revisions[] = array(
- 'id' => $line->old_id,
- 'comment' => $line->old_comment,
- 'user' => $line->old_user_text,
- 'timestamp' => $line->old_timestamp,
- 'minor' => $line->old_minor_edit,
- 'unique' => decasc($curid).'-'.
- decasc(wfTimestamp2Unix($line->old_timestamp)).'-'.
- decasc(crc32($line->old_text))
- );
- $answer['count'] ++;
- }
- }
- $answer['revisions'] = $revisions;
-
- return $answer;
-}
-
-# searchTitles
-# Returns a list of article titles matching a search string
-# pattern IN search pattern
-# main_only IN if 1, search only the main namespace, if 0, search all namespaces
-#
-# count OUT number of results
-# base OUT base URL of the hits. Concatenate with title_url to get full url.
-# hits OUT list of hits. Array consisting of elements with the following fields:
-# title OUT title of the hit. "Display style". Does not include namespace.
-# title_ns OUT title of the hit. "Display style". Includes namespace.
-# title_url OUT title of the hit. URL escaped. Includes namespace prefix.
-# namespace OUT numerical namespace ID
-#
-function searchTitles( $pattern, $main_only ) {
- global $wgWhitelistEdit, $wgWhitelistRead, $wgLang, $wgServer, $wgArticlePath;
- $fname = 'SOAP::getArticleRevisions';
-
- # Check parameters
- #
- if ( $wgWhitelistEdit || $wgWhitelistRead ) {
- return new soap_fault('Client', 'SOAP not available in whitelist mode.');
- }
- if ( ! is_string( $pattern ) ) {
- return new soap_fault('Client', 'The first parameter to this service must be a string');
- }
- if ( $main_only != 0 && $main_only != 1 ) {
- return new soap_fault('Client', 'The second parameter to this service must be 0 or 1');
- }
-
-
- # Connect to the DB
- $dbr =& wfGetDB( DB_SLAVE );
-
- # Normalize the search pattern
- $pattern = $dbr->strencode( $wgLang->stripForSearch( $pattern ) );
-
- # Prepare the query
-
- $sql = 'SELECT cur_id, cur_namespace, cur_title FROM cur, searchindex WHERE '
- . ( $main_only ? 'cur_namespace=0 AND ' :'' )
- . "cur_id=si_page AND MATCH(si_title) AGAINST('{$pattern}' IN BOOLEAN MODE)";
-
- $res = $dbr->query( $sql, $fname, true );
-
- if ( ! $res ) {
- return new soap_fault( 'Server', $dbr->lastError() );
- }
-
- $answer = array(
- 'count' => 0,
- 'base' => $wgServer.$wgArticlePath,
- 'hits' => array(),
- );
- while ( ($line = $dbr->fetchObject( $res )) && $answer['count'] < 200 ) {
- $nt = Title::newFromDBkey( $wgLang->getNsText( $line->cur_namespace ) . ':' . $line->cur_title );
- $answer['hits'][] = array(
- 'title' => $nt->getText(),
- 'title_ns' => $nt->getPrefixedText(),
- 'title_url' => $nt->getPartialURL(),
- 'namespace' => $line->cur_namespace
- );
- $answer['count']++;
- }
-
- return $answer;
-}
-
-# SOAP uses POST, if POST data is available, process it. Else produce an error.
-if ( isset( $HTTP_RAW_POST_DATA ) ) {
- $s->service( $HTTP_RAW_POST_DATA );
-} else {
- print( "You need a SOAP client to access SOAP services." );
-}
-
-?>
diff --git a/soap/nusoap.php b/soap/nusoap.php
deleted file mode 100644
index a973cf10dce7..000000000000
--- a/soap/nusoap.php
+++ /dev/null
@@ -1,5574 +0,0 @@
-<?php
-
-/*
-
-NuSOAP - Web Services Toolkit for PHP
-
-Copyright (c) 2002 NuSphere Corporation
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-If you have any questions or comments, please email:
-
-Dietrich Ayala
-dietrich@ganx4.com
-http://dietrich.ganx4.com/nusoap
-
-NuSphere Corporation
-http://www.nusphere.com
-
-*/
-
-/* load classes
-
-// necessary classes
-require_once('class.soapclient.php');
-require_once('class.soap_val.php');
-require_once('class.soap_parser.php');
-require_once('class.soap_fault.php');
-
-// transport classes
-require_once('class.soap_transport_http.php');
-
-// optional add-on classes
-require_once('class.xmlschema.php');
-require_once('class.wsdl.php');
-
-// server class
-require_once('class.soap_server.php');*/
-
-/**
-*
-* nusoap_base
-*
-* @author Dietrich Ayala <dietrich@ganx4.com>
-* @access public
-*/
-class nusoap_base {
-
- var $title = 'NuSOAP';
- var $version = '0.6.7';
- var $revision = '1.1';
- var $error_str = false;
- var $debug_str = '';
- // toggles automatic encoding of special characters as entities
- // (should always be true, I think)
- var $charencoding = true;
-
- /**
- * set schema version
- *
- * @var XMLSchemaVersion
- * @access public
- */
- var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema';
-
- /**
- * set charset encoding for outgoing messages
- *
- * @var soap_defencoding
- * @access public
- */
- //var $soap_defencoding = 'UTF-8';
- var $soap_defencoding = 'ISO-8859-1';
-
- /**
- * load namespace uris into an array of uri => prefix
- *
- * @var namespaces
- * @access public
- */
- var $namespaces = array(
- 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
- 'xsd' => 'http://www.w3.org/2001/XMLSchema',
- 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
- 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/',
- 'si' => 'http://soapinterop.org/xsd');
- var $usedNamespaces = array();
-
- /**
- * load types into typemap array
- * is this legacy yet?
- * no, this is used by the xmlschema class to verify type => namespace mappings.
- * @var typemap
- * @access public
- */
- var $typemap = array(
- 'http://www.w3.org/2001/XMLSchema' => array(
- 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double',
- 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'',
- 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string',
- // derived datatypes
- 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'',
- 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer',
- 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer',
- 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''),
- 'http://www.w3.org/1999/XMLSchema' => array(
- 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double',
- 'float'=>'double','dateTime'=>'string',
- 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'),
- 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'),
- 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'),
- 'http://xml.apache.org/xml-soap' => array('Map')
- );
-
- /**
- * entities to convert
- *
- * @var xmlEntities
- * @access public
- */
- var $xmlEntities = array('quot' => '"','amp' => '&',
- 'lt' => '<','gt' => '>','apos' => "'");
-
- /**
- * adds debug data to the class level debug string
- *
- * @param string $string debug data
- * @access private
- */
- function debug($string){
- $this->debug_str .= get_class($this).": $string\n";
- }
-
- /**
- * expands entities, e.g. changes '<' to '&lt;'.
- *
- * @param string $val The string in which to expand entities.
- * @access private
- */
- function expandEntities($val) {
- if ($this->charencoding) {
- $val = str_replace('&', '&amp;', $val);
- $val = str_replace("'", '&apos;', $val);
- $val = str_replace('"', '&quot;', $val);
- $val = str_replace('<', '&lt;', $val);
- $val = str_replace('>', '&gt;', $val);
- }
- return $val;
- }
-
- /**
- * returns error string if present
- *
- * @return boolean $string error string
- * @access public
- */
- function getError(){
- if($this->error_str != ''){
- return $this->error_str;
- }
- return false;
- }
-
- /**
- * sets error string
- *
- * @return boolean $string error string
- * @access private
- */
- function setError($str){
- $this->error_str = $str;
- }
-
- /**
- * detect if array is a simple array or a struct (associative array)
- *
- * @param $val The PHP array
- * @return string (arraySimple|arrayStruct)
- * @access private
- */
- function isArraySimpleOrStruct($val) {
- $keyList = array_keys($val);
- foreach ($keyList as $keyListValue) {
- if (!is_int($keyListValue)) {
- return 'arrayStruct';
- }
- }
- return 'arraySimple';
- }
-
- /**
- * serializes PHP values in accordance w/ section 5. Type information is
- * not serialized if $use == 'literal'.
- *
- * @return string
- * @access public
- */
- function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded'){
- if(is_object($val) && get_class($val) == 'soapval'){
- return $val->serialize($use);
- }
- $this->debug( "in serialize_val: $val, $name, $type, $name_ns, $type_ns, $attributes, $use");
- // if no name, use item
- $name = (!$name|| is_numeric($name)) ? 'soapVal' : $name;
- // if name has ns, add ns prefix to name
- $xmlns = '';
- if($name_ns){
- $prefix = 'nu'.rand(1000,9999);
- $name = $prefix.':'.$name;
- $xmlns .= " xmlns:$prefix=\"$name_ns\"";
- }
- // if type is prefixed, create type prefix
- if($type_ns != '' && $type_ns == $this->namespaces['xsd']){
- // need to fix this. shouldn't default to xsd if no ns specified
- // w/o checking against typemap
- $type_prefix = 'xsd';
- } elseif($type_ns){
- $type_prefix = 'ns'.rand(1000,9999);
- $xmlns .= " xmlns:$type_prefix=\"$type_ns\"";
- }
- // serialize attributes if present
- $atts = '';
- if($attributes){
- foreach($attributes as $k => $v){
- $atts .= " $k=\"$v\"";
- }
- }
- // serialize if an xsd built-in primitive type
- if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){
- if (is_bool($val)) {
- if ($type == 'boolean') {
- $val = $val ? 'true' : 'false';
- } elseif (! $val) {
- $val = 0;
- }
- } else if (is_string($val)) {
- $val = $this->expandEntities($val);
- }
- if ($use == 'literal') {
- return "<$name$xmlns>$val</$name>";
- } else {
- return "<$name$xmlns xsi:type=\"xsd:$type\">$val</$name>";
- }
- }
- // detect type and serialize
- $xml = '';
- switch(true) {
- case ($type == '' && is_null($val)):
- if ($use == 'literal') {
- // TODO: depends on nillable
- $xml .= "<$name$xmlns/>";
- } else {
- $xml .= "<$name$xmlns xsi:nil=\"true\"/>";
- }
- break;
- case (is_bool($val) || $type == 'boolean'):
- if ($type == 'boolean') {
- $val = $val ? 'true' : 'false';
- } elseif (! $val) {
- $val = 0;
- }
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>$val</$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val</$name>";
- }
- break;
- case (is_int($val) || is_long($val) || $type == 'int'):
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>$val</$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val</$name>";
- }
- break;
- case (is_float($val)|| is_double($val) || $type == 'float'):
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>$val</$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val</$name>";
- }
- break;
- case (is_string($val) || $type == 'string'):
- $val = $this->expandEntities($val);
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>$val</$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val</$name>";
- }
- break;
- case is_object($val):
- $name = get_class($val);
- foreach(get_object_vars($val) as $k => $v){
- $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use);
- }
- $xml .= '<'.$name.'>'.$pXml.'</'.$name.'>';
- break;
- break;
- case (is_array($val) || $type):
- // detect if struct or array
- $valueType = $this->isArraySimpleOrStruct($val);
- if($valueType=='arraySimple' || ereg('^ArrayOf',$type)){
- $i = 0;
- if(is_array($val) && count($val)> 0){
- foreach($val as $v){
- if(is_object($v) && get_class($v) == 'soapval'){
- $tt_ns = $v->type_ns;
- $tt = $v->type;
- } elseif (is_array($v)) {
- $tt = $this->isArraySimpleOrStruct($v);
- } else {
- $tt = gettype($v);
- }
- $array_types[$tt] = 1;
- $xml .= $this->serialize_val($v,'item',false,false,false,false,$use);
- ++$i;
- }
- if(count($array_types) > 1){
- $array_typename = 'xsd:ur-type';
- } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) {
- if ($tt == 'integer') {
- $tt = 'int';
- }
- $array_typename = 'xsd:'.$tt;
- } elseif(isset($tt) && $tt == 'arraySimple'){
- $array_typename = 'SOAP-ENC:Array';
- } elseif(isset($tt) && $tt == 'arrayStruct'){
- $array_typename = 'unnamed_struct_use_soapval';
- } else {
- // if type is prefixed, create type prefix
- if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){
- $array_typename = 'xsd:' . $tt;
- } elseif ($tt_ns) {
- $tt_prefix = 'ns' . rand(1000, 9999);
- $array_typename = "$tt_prefix:$tt";
- $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\"";
- } else {
- $array_typename = $tt;
- }
- }
- $array_type = $i;
- if ($use == 'literal') {
- $type_str = '';
- } else if (isset($type) && isset($type_prefix)) {
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\"";
- }
- // empty array
- } else {
- if ($use == 'literal') {
- $type_str = '';
- } else if (isset($type) && isset($type_prefix)) {
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = " xsi:type=\"SOAP-ENC:Array\"";
- }
- }
- $xml = "<$name$xmlns$type_str$atts>".$xml."</$name>";
- } else {
- // got a struct
- if(isset($type) && isset($type_prefix)){
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = '';
- }
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>";
- } else {
- $xml .= "<$name$xmlns$type_str$atts>";
- }
- foreach($val as $k => $v){
- // Apache Map
- if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') {
- $xml .= '<item>';
- $xml .= $this->serialize_val($k,'key',false,false,false,false,$use);
- $xml .= $this->serialize_val($v,'value',false,false,false,false,$use);
- $xml .= '</item>';
- } else {
- $xml .= $this->serialize_val($v,$k,false,false,false,false,$use);
- }
- }
- $xml .= "</$name>";
- }
- break;
- default:
- $xml .= 'not detected, got '.gettype($val).' for '.$val;
- break;
- }
- return $xml;
- }
-
- /**
- * serialize message
- *
- * @param string body
- * @param string headers optional
- * @param array namespaces optional
- * @param string style optional (rpc|document)
- * @param string use optional (encoded|literal)
- * @return string message
- * @access public
- */
- function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded'){
- // TODO: add an option to automatically run utf8_encode on $body and $headers
- // if $this->soap_defencoding is UTF-8. Not doing this automatically allows
- // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1
-
- // serialize namespaces
- $ns_string = '';
- foreach(array_merge($this->namespaces,$namespaces) as $k => $v){
- $ns_string .= " xmlns:$k=\"$v\"";
- }
- if($style == 'rpc' && $use == 'encoded') {
- $ns_string = ' SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"' . $ns_string;
- }
-
- // serialize headers
- if($headers){
- $headers = "<SOAP-ENV:Header>".$headers."</SOAP-ENV:Header>";
- }
- // serialize envelope
- return
- '<?xml version="1.0" encoding="'.$this->soap_defencoding .'"?'.">".
- '<SOAP-ENV:Envelope'.$ns_string.">".
- $headers.
- "<SOAP-ENV:Body>".
- $body.
- "</SOAP-ENV:Body>".
- "</SOAP-ENV:Envelope>";
- }
-
- function formatDump($str){
- $str = htmlspecialchars($str);
- return nl2br($str);
- }
-
- /**
- * contracts a qualified name
- *
- * @param string $string qname
- * @return string contracted qname
- * @access private
- */
- function contractQname($qname){
- // get element namespace
- //$this->xdebug("Contract $qname");
- if (strrpos($qname, ':')) {
- // get unqualified name
- $name = substr($qname, strrpos($qname, ':') + 1);
- // get ns
- $ns = substr($qname, 0, strrpos($qname, ':'));
- $p = $this->getPrefixFromNamespace($ns);
- if ($p) {
- return $p . ':' . $name;
- }
- return $qname;
- } else {
- return $qname;
- }
- }
-
- /**
- * expands a qualified name
- *
- * @param string $string qname
- * @return string expanded qname
- * @access private
- */
- function expandQname($qname){
- // get element prefix
- if(strpos($qname,':') && !ereg('^http://',$qname)){
- // get unqualified name
- $name = substr(strstr($qname,':'),1);
- // get ns prefix
- $prefix = substr($qname,0,strpos($qname,':'));
- if(isset($this->namespaces[$prefix])){
- return $this->namespaces[$prefix].':'.$name;
- } else {
- return $qname;
- }
- } else {
- return $qname;
- }
- }
-
- /**
- * returns the local part of a prefixed string
- * returns the original string, if not prefixed
- *
- * @param string
- * @return string
- * @access public
- */
- function getLocalPart($str){
- if($sstr = strrchr($str,':')){
- // get unqualified name
- return substr( $sstr, 1 );
- } else {
- return $str;
- }
- }
-
- /**
- * returns the prefix part of a prefixed string
- * returns false, if not prefixed
- *
- * @param string
- * @return mixed
- * @access public
- */
- function getPrefix($str){
- if($pos = strrpos($str,':')){
- // get prefix
- return substr($str,0,$pos);
- }
- return false;
- }
-
- /**
- * pass it a prefix, it returns a namespace
- * returns false if no namespace registered with the given prefix
- *
- * @param string
- * @return mixed
- * @access public
- */
- function getNamespaceFromPrefix($prefix){
- if (isset($this->namespaces[$prefix])) {
- return $this->namespaces[$prefix];
- }
- //$this->setError("No namespace registered for prefix '$prefix'");
- return false;
- }
-
- /**
- * returns the prefix for a given namespace (or prefix)
- * or false if no prefixes registered for the given namespace
- *
- * @param string
- * @return mixed
- * @access public
- */
- function getPrefixFromNamespace($ns) {
- foreach ($this->namespaces as $p => $n) {
- if ($ns == $n || $ns == $p) {
- $this->usedNamespaces[$p] = $n;
- return $p;
- }
- }
- return false;
- }
-
- function varDump($data) {
- ob_start();
- var_dump($data);
- $ret_val = ob_get_contents();
- ob_end_clean();
- return $ret_val;
- }
-}
-
-// XML Schema Datatype Helper Functions
-
-//xsd:dateTime helpers
-
-/**
-* convert unix timestamp to ISO 8601 compliant date string
-*
-* @param string $timestamp Unix time stamp
-* @access public
-*/
-function timestamp_to_iso8601($timestamp,$utc=true){
- $datestr = date('Y-m-d\TH:i:sO',$timestamp);
- if($utc){
- $eregStr =
- '([0-9]{4})-'. // centuries & years CCYY-
- '([0-9]{2})-'. // months MM-
- '([0-9]{2})'. // days DD
- 'T'. // separator T
- '([0-9]{2}):'. // hours hh:
- '([0-9]{2}):'. // minutes mm:
- '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss...
- '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's
-
- if(ereg($eregStr,$datestr,$regs)){
- return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]);
- }
- return false;
- } else {
- return $datestr;
- }
-}
-
-/**
-* convert ISO 8601 compliant date string to unix timestamp
-*
-* @param string $datestr ISO 8601 compliant date string
-* @access public
-*/
-function iso8601_to_timestamp($datestr){
- $eregStr =
- '([0-9]{4})-'. // centuries & years CCYY-
- '([0-9]{2})-'. // months MM-
- '([0-9]{2})'. // days DD
- 'T'. // separator T
- '([0-9]{2}):'. // hours hh:
- '([0-9]{2}):'. // minutes mm:
- '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss...
- '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's
- if(ereg($eregStr,$datestr,$regs)){
- // not utc
- if($regs[8] != 'Z'){
- $op = substr($regs[8],0,1);
- $h = substr($regs[8],1,2);
- $m = substr($regs[8],strlen($regs[8])-2,2);
- if($op == '-'){
- $regs[4] = $regs[4] + $h;
- $regs[5] = $regs[5] + $m;
- } elseif($op == '+'){
- $regs[4] = $regs[4] - $h;
- $regs[5] = $regs[5] - $m;
- }
- }
- return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z");
- } else {
- return false;
- }
-}
-
-function usleepWindows($usec)
-{
- $start = gettimeofday();
-
- do
- {
- $stop = gettimeofday();
- $timePassed = 1000000 * ($stop['sec'] - $start['sec'])
- + $stop['usec'] - $start['usec'];
- }
- while ($timePassed < $usec);
-}
-
-?><?php
-
-
-
-/**
-* soap_fault class, allows for creation of faults
-* mainly used for returning faults from deployed functions
-* in a server instance.
-* @author Dietrich Ayala <dietrich@ganx4.com>
-* @access public
-*/
-class soap_fault extends nusoap_base {
-
- var $faultcode;
- var $faultactor;
- var $faultstring;
- var $faultdetail;
-
- /**
- * constructor
- *
- * @param string $faultcode (client | server)
- * @param string $faultactor only used when msg routed between multiple actors
- * @param string $faultstring human readable error message
- * @param string $faultdetail
- */
- function soap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){
- $this->faultcode = $faultcode;
- $this->faultactor = $faultactor;
- $this->faultstring = $faultstring;
- $this->faultdetail = $faultdetail;
- }
-
- /**
- * serialize a fault
- *
- * @access public
- */
- function serialize(){
- $ns_string = '';
- foreach($this->namespaces as $k => $v){
- $ns_string .= "\n xmlns:$k=\"$v\"";
- }
- $return_msg =
- '<?xml version="1.0" encoding="'.$this->soap_defencoding.'"?>'.
- '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"'.$ns_string.">\n".
- '<SOAP-ENV:Body>'.
- '<SOAP-ENV:Fault>'.
- '<faultcode>'.$this->expandEntities($this->faultcode).'</faultcode>'.
- '<faultactor>'.$this->expandEntities($this->faultactor).'</faultactor>'.
- '<faultstring>'.$this->expandEntities($this->faultstring).'</faultstring>'.
- '<detail>'.$this->serialize_val($this->faultdetail).'</detail>'.
- '</SOAP-ENV:Fault>'.
- '</SOAP-ENV:Body>'.
- '</SOAP-ENV:Envelope>';
- return $return_msg;
- }
-}
-
-
-
-?><?php
-
-
-
-/**
-* parses an XML Schema, allows access to it's data, other utility methods
-* no validation... yet.
-* very experimental and limited. As is discussed on XML-DEV, I'm one of the people
-* that just doesn't have time to read the spec(s) thoroughly, and just have a couple of trusty
-* tutorials I refer to :)
-*
-* @author Dietrich Ayala <dietrich@ganx4.com>
-* @access public
-*/
-class XMLSchema extends nusoap_base {
-
- // files
- var $schema = '';
- var $xml = '';
- // namespaces
- var $enclosingNamespaces;
- // schema info
- var $schemaInfo = array();
- var $schemaTargetNamespace = '';
- // types, elements, attributes defined by the schema
- var $attributes = array();
- var $complexTypes = array();
- var $currentComplexType = false;
- var $elements = array();
- var $currentElement = false;
- var $simpleTypes = array();
- var $currentSimpleType = false;
- // imports
- var $imports = array();
- // parser vars
- var $parser;
- var $position = 0;
- var $depth = 0;
- var $depth_array = array();
- var $message = array();
- var $defaultNamespace = array();
-
- /**
- * constructor
- *
- * @param string $schema schema document URI
- * @param string $xml xml document URI
- * @param string $namespaces namespaces defined in enclosing XML
- * @access public
- */
- function XMLSchema($schema='',$xml='',$namespaces=array()){
-
- $this->debug('xmlschema class instantiated, inside constructor');
- // files
- $this->schema = $schema;
- $this->xml = $xml;
-
- // namespaces
- $this->enclosingNamespaces = $namespaces;
- $this->namespaces = array_merge($this->namespaces, $namespaces);
-
- // parse schema file
- if($schema != ''){
- $this->debug('initial schema file: '.$schema);
- $this->parseFile($schema, 'schema');
- }
-
- // parse xml file
- if($xml != ''){
- $this->debug('initial xml file: '.$xml);
- $this->parseFile($xml, 'xml');
- }
-
- }
-
- /**
- * parse an XML file
- *
- * @param string $xml, path/URL to XML file
- * @param string $type, (schema | xml)
- * @return boolean
- * @access public
- */
- function parseFile($xml,$type){
- // parse xml file
- if($xml != ""){
- $xmlStr = @join("",@file($xml));
- if($xmlStr == ""){
- $msg = 'Error reading XML from '.$xml;
- $this->setError($msg);
- $this->debug($msg);
- return false;
- } else {
- $this->debug("parsing $xml");
- $this->parseString($xmlStr,$type);
- $this->debug("done parsing $xml");
- return true;
- }
- }
- return false;
- }
-
- /**
- * parse an XML string
- *
- * @param string $xml path or URL
- * @param string $type, (schema|xml)
- * @access private
- */
- function parseString($xml,$type){
- // parse xml string
- if($xml != ""){
-
- // Create an XML parser.
- $this->parser = xml_parser_create();
- // Set the options for parsing the XML data.
- xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
-
- // Set the object for the parser.
- xml_set_object($this->parser, $this);
-
- // Set the element handlers for the parser.
- if($type == "schema"){
- xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement');
- xml_set_character_data_handler($this->parser,'schemaCharacterData');
- } elseif($type == "xml"){
- xml_set_element_handler($this->parser, 'xmlStartElement','xmlEndElement');
- xml_set_character_data_handler($this->parser,'xmlCharacterData');
- }
-
- // Parse the XML file.
- if(!xml_parse($this->parser,$xml,true)){
- // Display an error message.
- $errstr = sprintf('XML error parsing XML schema on line %d: %s',
- xml_get_current_line_number($this->parser),
- xml_error_string(xml_get_error_code($this->parser))
- );
- $this->debug($errstr);
- $this->debug("XML payload:\n" . $xml);
- $this->setError($errstr);
- }
-
- xml_parser_free($this->parser);
- } else{
- $this->debug('no xml passed to parseString()!!');
- $this->setError('no xml passed to parseString()!!');
- }
- }
-
- /**
- * start-element handler
- *
- * @param string $parser XML parser object
- * @param string $name element name
- * @param string $attrs associative array of attributes
- * @access private
- */
- function schemaStartElement($parser, $name, $attrs) {
-
- // position in the total number of elements, starting from 0
- $pos = $this->position++;
- $depth = $this->depth++;
- // set self as current value for this depth
- $this->depth_array[$depth] = $pos;
- $this->message[$pos] = array('cdata' => '');
- if ($depth > 0) {
- $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[$depth - 1]];
- } else {
- $this->defaultNamespace[$pos] = false;
- }
-
- // get element prefix
- if($prefix = $this->getPrefix($name)){
- // get unqualified name
- $name = $this->getLocalPart($name);
- } else {
- $prefix = '';
- }
-
- // loop thru attributes, expanding, and registering namespace declarations
- if(count($attrs) > 0){
- foreach($attrs as $k => $v){
- // if ns declarations, add to class level array of valid namespaces
- if(ereg("^xmlns",$k)){
- //$this->xdebug("$k: $v");
- //$this->xdebug('ns_prefix: '.$this->getPrefix($k));
- if($ns_prefix = substr(strrchr($k,':'),1)){
- //$this->xdebug("Add namespace[$ns_prefix] = $v");
- $this->namespaces[$ns_prefix] = $v;
- } else {
- $this->defaultNamespace[$pos] = $v;
- if (! $this->getPrefixFromNamespace($v)) {
- $this->namespaces['ns'.(count($this->namespaces)+1)] = $v;
- }
- }
- if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema'){
- $this->XMLSchemaVersion = $v;
- $this->namespaces['xsi'] = $v.'-instance';
- }
- }
- }
- foreach($attrs as $k => $v){
- // expand each attribute
- $k = strpos($k,':') ? $this->expandQname($k) : $k;
- $v = strpos($v,':') ? $this->expandQname($v) : $v;
- $eAttrs[$k] = $v;
- }
- $attrs = $eAttrs;
- } else {
- $attrs = array();
- }
- // find status, register data
- switch($name){
- case 'all':
- case 'choice':
- case 'sequence':
- //$this->xdebug("compositor $name for currentComplexType: $this->currentComplexType and currentElement: $this->currentElement");
- $this->complexTypes[$this->currentComplexType]['compositor'] = $name;
- if($name == 'all' || $name == 'sequence'){
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct';
- }
- break;
- case 'attribute':
- //$this->xdebug("parsing attribute $attrs[name] $attrs[ref] of value: ".$attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']);
- $this->xdebug("parsing attribute " . $this->varDump($attrs));
- if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
- $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
- if (!strpos($v, ':')) {
- // no namespace in arrayType attribute value...
- if ($this->defaultNamespace[$pos]) {
- // ...so use the default
- $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
- }
- }
- }
- if(isset($attrs['name'])){
- $this->attributes[$attrs['name']] = $attrs;
- $aname = $attrs['name'];
- } elseif(isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType'){
- if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
- $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
- } else {
- $aname = '';
- }
- } elseif(isset($attrs['ref'])){
- $aname = $attrs['ref'];
- $this->attributes[$attrs['ref']] = $attrs;
- }
-
- if(isset($this->currentComplexType)){
- $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs;
- } elseif(isset($this->currentElement)){
- $this->elements[$this->currentElement]['attrs'][$aname] = $attrs;
- }
- // arrayType attribute
- if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->getLocalPart($aname) == 'arrayType'){
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'array';
- $prefix = $this->getPrefix($aname);
- if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){
- $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
- } else {
- $v = '';
- }
- if(strpos($v,'[,]')){
- $this->complexTypes[$this->currentComplexType]['multidimensional'] = true;
- }
- $v = substr($v,0,strpos($v,'[')); // clip the []
- if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){
- $v = $this->XMLSchemaVersion.':'.$v;
- }
- $this->complexTypes[$this->currentComplexType]['arrayType'] = $v;
- }
- break;
- case 'complexType':
- if(isset($attrs['name'])){
- $this->xdebug('processing named complexType '.$attrs['name']);
- $this->currentElement = false;
- $this->currentComplexType = $attrs['name'];
- $this->complexTypes[$this->currentComplexType] = $attrs;
- $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType';
- if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'array';
- } else {
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct';
- }
- }else{
- $this->xdebug('processing unnamed complexType for element '.$this->currentElement);
- $this->currentComplexType = $this->currentElement . '_ContainedType';
- $this->currentElement = false;
- $this->complexTypes[$this->currentComplexType] = $attrs;
- $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType';
- if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'array';
- } else {
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct';
- }
- }
- break;
- case 'element':
- // elements defined as part of a complex type should
- // not really be added to $this->elements, but for some
- // reason, they are
- if(isset($attrs['type'])){
- $this->xdebug("processing typed element ".$attrs['name']." of type ".$attrs['type']);
- $this->currentElement = $attrs['name'];
- $this->elements[ $attrs['name'] ] = $attrs;
- $this->elements[ $attrs['name'] ]['typeClass'] = 'element';
- if (!isset($this->elements[ $attrs['name'] ]['form'])) {
- $this->elements[ $attrs['name'] ]['form'] = $this->schemaInfo['elementFormDefault'];
- }
- $ename = $attrs['name'];
- } elseif(isset($attrs['ref'])){
- $ename = $attrs['ref'];
- } else {
- $this->xdebug("processing untyped element ".$attrs['name']);
- $this->currentElement = $attrs['name'];
- $this->elements[ $attrs['name'] ] = $attrs;
- $this->elements[ $attrs['name'] ]['typeClass'] = 'element';
- $this->elements[ $attrs['name'] ]['type'] = $this->schemaTargetNamespace . ':' . $attrs['name'] . '_ContainedType';
- if (!isset($this->elements[ $attrs['name'] ]['form'])) {
- $this->elements[ $attrs['name'] ]['form'] = $this->schemaInfo['elementFormDefault'];
- }
- }
- if(isset($ename) && $this->currentComplexType){
- $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs;
- }
- break;
- // we ignore enumeration values
- //case 'enumeration':
- //break;
- case 'import':
- if (isset($attrs['schemaLocation'])) {
- //$this->xdebug('import namespace ' . $attrs['namespace'] . ' from ' . $attrs['schemaLocation']);
- $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false);
- } else {
- //$this->xdebug('import namespace ' . $attrs['namespace']);
- $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true);
- if (! $this->getPrefixFromNamespace($attrs['namespace'])) {
- $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace'];
- }
- }
- break;
- case 'restriction':
- //$this->xdebug("in restriction for currentComplexType: $this->currentComplexType and currentElement: $this->currentElement");
- if($this->currentElement){
- $this->elements[$this->currentElement]['type'] = $attrs['base'];
- } elseif($this->currentSimpleType){
- $this->simpleTypes[$this->currentSimpleType]['type'] = $attrs['base'];
- } elseif($this->currentComplexType){
- $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base'];
- if(strstr($attrs['base'],':') == ':Array'){
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'array';
- }
- }
- break;
- case 'schema':
- $this->schemaInfo = $attrs;
- $this->schemaInfo['schemaVersion'] = $this->getNamespaceFromPrefix($prefix);
- if (isset($attrs['targetNamespace'])) {
- $this->schemaTargetNamespace = $attrs['targetNamespace'];
- }
- if (!isset($attrs['elementFormDefault'])) {
- $this->schemaInfo['elementFormDefault'] = 'unqualified';
- }
- break;
- case 'simpleType':
- if(isset($attrs['name'])){
- $this->xdebug("processing simpleType for name " . $attrs['name']);
- $this->currentSimpleType = $attrs['name'];
- $this->simpleTypes[ $attrs['name'] ] = $attrs;
- $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType';
- $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar';
- } else {
- //echo 'not parsing: '.$name;
- //var_dump($attrs);
- }
- break;
- default:
- //$this->xdebug("do not have anything to do for element $name");
- }
- }
-
- /**
- * end-element handler
- *
- * @param string $parser XML parser object
- * @param string $name element name
- * @access private
- */
- function schemaEndElement($parser, $name) {
- // bring depth down a notch
- $this->depth--;
- // position of current element is equal to the last value left in depth_array for my depth
- if(isset($this->depth_array[$this->depth])){
- $pos = $this->depth_array[$this->depth];
- }
- // move on...
- if($name == 'complexType'){
- $this->currentComplexType = false;
- $this->currentElement = false;
- }
- if($name == 'element'){
- $this->currentElement = false;
- }
- if($name == 'simpleType'){
- $this->currentSimpleType = false;
- }
- }
-
- /**
- * element content handler
- *
- * @param string $parser XML parser object
- * @param string $data element content
- * @access private
- */
- function schemaCharacterData($parser, $data){
- $pos = $this->depth_array[$this->depth - 1];
- $this->message[$pos]['cdata'] .= $data;
- }
-
- /**
- * serialize the schema
- *
- * @access public
- */
- function serializeSchema(){
-
- $schemaPrefix = $this->getPrefixFromNamespace($this->XMLSchemaVersion);
- $xml = '';
- // imports
- if (sizeof($this->imports) > 0) {
- foreach($this->imports as $ns => $list) {
- foreach ($list as $ii) {
- if ($ii['location'] != '') {
- $xml .= " <$schemaPrefix:import location=\"" . $ii['location'] . '" namespace="' . $ns . "\" />\n";
- } else {
- $xml .= " <$schemaPrefix:import namespace=\"" . $ns . "\" />\n";
- }
- }
- }
- }
- // complex types
- foreach($this->complexTypes as $typeName => $attrs){
- $contentStr = '';
- // serialize child elements
- if(isset($attrs['elements']) && (count($attrs['elements']) > 0)){
- foreach($attrs['elements'] as $element => $eParts){
- if(isset($eParts['ref'])){
- $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n";
- } else {
- $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\"/>\n";
- }
- }
- }
- // attributes
- if(isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)){
- foreach($attrs['attrs'] as $attr => $aParts){
- $contentStr .= " <$schemaPrefix:attribute ref=\"".$this->contractQName($aParts['ref']).'"';
- if(isset($aParts['http://schemas.xmlsoap.org/wsdl/:arrayType'])){
- $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl'];
- $contentStr .= ' wsdl:arrayType="'.$this->contractQName($aParts['http://schemas.xmlsoap.org/wsdl/:arrayType']).'"';
- }
- $contentStr .= "/>\n";
- }
- }
- // if restriction
- if( isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != ''){
- $contentStr = " <$schemaPrefix:restriction base=\"".$this->contractQName($attrs['restrictionBase'])."\">\n".$contentStr." </$schemaPrefix:restriction>\n";
- }
- // compositor obviates complex/simple content
- if(isset($attrs['compositor']) && ($attrs['compositor'] != '')){
- $contentStr = " <$schemaPrefix:$attrs[compositor]>\n".$contentStr." </$schemaPrefix:$attrs[compositor]>\n";
- }
- // complex or simple content
- elseif((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)){
- $contentStr = " <$schemaPrefix:complexContent>\n".$contentStr." </$schemaPrefix:complexContent>\n";
- }
- // finalize complex type
- if($contentStr != ''){
- $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n".$contentStr." </$schemaPrefix:complexType>\n";
- } else {
- $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n";
- }
- $xml .= $contentStr;
- }
- // simple types
- if(isset($this->simpleTypes) && count($this->simpleTypes) > 0){
- foreach($this->simpleTypes as $typeName => $attr){
- $xml .= " <$schemaPrefix:simpleType name=\"$typeName\">\n <restriction base=\"".$this->contractQName($eParts['type'])."\"/>\n </$schemaPrefix:simpleType>";
- }
- }
- // elements
- if(isset($this->elements) && count($this->elements) > 0){
- foreach($this->elements as $element => $eParts){
- $xml .= " <$schemaPrefix:element name=\"$element\" type=\"".$this->contractQName($eParts['type'])."\"/>\n";
- }
- }
- // attributes
- if(isset($this->attributes) && count($this->attributes) > 0){
- foreach($this->attributes as $attr => $aParts){
- $xml .= " <$schemaPrefix:attribute name=\"$attr\" type=\"".$this->contractQName($aParts['type'])."\"\n/>";
- }
- }
- // finish 'er up
- $el = "<$schemaPrefix:schema targetNamespace=\"$this->schemaTargetNamespace\"\n";
- foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) {
- $el .= " xmlns:$nsp=\"$ns\"\n";
- }
- $xml = $el . ">\n".$xml."</$schemaPrefix:schema>\n";
- return $xml;
- }
-
- /**
- * adds debug data to the clas level debug string
- *
- * @param string $string debug data
- * @access private
- */
- function xdebug($string){
- $this->debug('<' . $this->schemaTargetNamespace . '> '.$string);
- }
-
- /**
- * get the PHP type of a user defined type in the schema
- * PHP type is kind of a misnomer since it actually returns 'struct' for assoc. arrays
- * returns false if no type exists, or not w/ the given namespace
- * else returns a string that is either a native php type, or 'struct'
- *
- * @param string $type, name of defined type
- * @param string $ns, namespace of type
- * @return mixed
- * @access public
- */
- function getPHPType($type,$ns){
- if(isset($this->typemap[$ns][$type])){
- //print "found type '$type' and ns $ns in typemap<br>";
- return $this->typemap[$ns][$type];
- } elseif(isset($this->complexTypes[$type])){
- //print "getting type '$type' and ns $ns from complexTypes array<br>";
- return $this->complexTypes[$type]['phpType'];
- }
- return false;
- }
-
- /**
- * returns an array of information about a given type
- * returns false if no type exists by the given name
- *
- * typeDef = array(
- * 'elements' => array(), // refs to elements array
- * 'restrictionBase' => '',
- * 'phpType' => '',
- * 'order' => '(sequence|all)',
- * 'attrs' => array() // refs to attributes array
- * )
- *
- * @param string
- * @return mixed
- * @access public
- */
- function getTypeDef($type){
- //$this->debug("in getTypeDef for type $type");
- if(isset($this->complexTypes[$type])){
- $this->xdebug("in getTypeDef, found complexType $type");
- return $this->complexTypes[$type];
- } elseif(isset($this->simpleTypes[$type])){
- $this->xdebug("in getTypeDef, found simpleType $type");
- if (!isset($this->simpleTypes[$type]['phpType'])) {
- // get info for type to tack onto the simple type
- // TODO: can this ever really apply (i.e. what is a simpleType really?)
- $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1);
- $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':'));
- $etype = $this->getTypeDef($uqType);
- if ($etype) {
- if (isset($etype['phpType'])) {
- $this->simpleTypes[$type]['phpType'] = $etype['phpType'];
- }
- if (isset($etype['elements'])) {
- $this->simpleTypes[$type]['elements'] = $etype['elements'];
- }
- }
- }
- return $this->simpleTypes[$type];
- } elseif(isset($this->elements[$type])){
- $this->xdebug("in getTypeDef, found element $type");
- if (!isset($this->elements[$type]['phpType'])) {
- // get info for type to tack onto the element
- $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1);
- $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':'));
- $etype = $this->getTypeDef($uqType);
- if ($etype) {
- if (isset($etype['phpType'])) {
- $this->elements[$type]['phpType'] = $etype['phpType'];
- }
- if (isset($etype['elements'])) {
- $this->elements[$type]['elements'] = $etype['elements'];
- }
- } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') {
- $this->elements[$type]['phpType'] = 'scalar';
- }
- }
- return $this->elements[$type];
- } elseif(isset($this->attributes[$type])){
- $this->xdebug("in getTypeDef, found attribute $type");
- return $this->attributes[$type];
- }
- $this->xdebug("in getTypeDef, did not find $type");
- return false;
- }
-
- /**
- * returns a sample serialization of a given type, or false if no type by the given name
- *
- * @param string $type, name of type
- * @return mixed
- * @access public
- */
- function serializeTypeDef($type){
- //print "in sTD() for type $type<br>";
- if($typeDef = $this->getTypeDef($type)){
- $str .= '<'.$type;
- if(is_array($typeDef['attrs'])){
- foreach($attrs as $attName => $data){
- $str .= " $attName=\"{type = ".$data['type']."}\"";
- }
- }
- $str .= " xmlns=\"".$this->schema['targetNamespace']."\"";
- if(count($typeDef['elements']) > 0){
- $str .= ">";
- foreach($typeDef['elements'] as $element => $eData){
- $str .= $this->serializeTypeDef($element);
- }
- $str .= "</$type>";
- } elseif($typeDef['typeClass'] == 'element') {
- $str .= "></$type>";
- } else {
- $str .= "/>";
- }
- return $str;
- }
- return false;
- }
-
- /**
- * returns HTML form elements that allow a user
- * to enter values for creating an instance of the given type.
- *
- * @param string $name, name for type instance
- * @param string $type, name of type
- * @return string
- * @access public
- */
- function typeToForm($name,$type){
- // get typedef
- if($typeDef = $this->getTypeDef($type)){
- // if struct
- if($typeDef['phpType'] == 'struct'){
- $buffer .= '<table>';
- foreach($typeDef['elements'] as $child => $childDef){
- $buffer .= "
- <tr><td align='right'>$childDef[name] (type: ".$this->getLocalPart($childDef['type'])."):</td>
- <td><input type='text' name='parameters[".$name."][$childDef[name]]'></td></tr>";
- }
- $buffer .= '</table>';
- // if array
- } elseif($typeDef['phpType'] == 'array'){
- $buffer .= '<table>';
- for($i=0;$i < 3; $i++){
- $buffer .= "
- <tr><td align='right'>array item (type: $typeDef[arrayType]):</td>
- <td><input type='text' name='parameters[".$name."][]'></td></tr>";
- }
- $buffer .= '</table>';
- // if scalar
- } else {
- $buffer .= "<input type='text' name='parameters[$name]'>";
- }
- } else {
- $buffer .= "<input type='text' name='parameters[$name]'>";
- }
- return $buffer;
- }
-
- /**
- * adds a complex type to the schema
- *
- * example: array
- *
- * addType(
- * 'ArrayOfstring',
- * 'complexType',
- * 'array',
- * '',
- * 'SOAP-ENC:Array',
- * array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'string[]'),
- * 'xsd:string'
- * );
- *
- * example: PHP associative array ( SOAP Struct )
- *
- * addType(
- * 'SOAPStruct',
- * 'complexType',
- * 'struct',
- * 'all',
- * array('myVar'=> array('name'=>'myVar','type'=>'string')
- * );
- *
- * @param name
- * @param typeClass (complexType|simpleType|attribute)
- * @param phpType: currently supported are array and struct (php assoc array)
- * @param compositor (all|sequence|choice)
- * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
- * @param elements = array ( name = array(name=>'',type=>'') )
- * @param attrs = array(
- * array(
- * 'ref' => "http://schemas.xmlsoap.org/soap/encoding/:arrayType",
- * "http://schemas.xmlsoap.org/wsdl/:arrayType" => "string[]"
- * )
- * )
- * @param arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string)
- *
- */
- function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType=''){
- $this->complexTypes[$name] = array(
- 'name' => $name,
- 'typeClass' => $typeClass,
- 'phpType' => $phpType,
- 'compositor'=> $compositor,
- 'restrictionBase' => $restrictionBase,
- 'elements' => $elements,
- 'attrs' => $attrs,
- 'arrayType' => $arrayType
- );
-
- $this->xdebug("addComplexType $name: " . $this->varDump($this->complexTypes[$name]));
- }
-
- /**
- * adds a simple type to the schema
- *
- * @param name
- * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
- * @param typeClass (simpleType)
- * @param phpType: (scalar)
- * @see xmlschema
- *
- */
- function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar') {
- $this->simpleTypes[$name] = array(
- 'name' => $name,
- 'typeClass' => $typeClass,
- 'phpType' => $phpType,
- 'type' => $restrictionBase
- );
-
- $this->xdebug("addSimpleType $name: " . $this->varDump($this->simpleTypes[$name]));
- }
-}
-
-
-
-?><?php
-
-
-
-/**
-* for creating serializable abstractions of native PHP types
-* NOTE: this is only really used when WSDL is not available.
-*
-* @author Dietrich Ayala <dietrich@ganx4.com>
-* @access public
-*/
-class soapval extends nusoap_base {
- /**
- * constructor
- *
- * @param string $name optional name
- * @param string $type optional type name
- * @param mixed $value optional value
- * @param string $namespace optional namespace of value
- * @param string $type_namespace optional namespace of type
- * @param array $attributes associative array of attributes to add to element serialization
- * @access public
- */
- function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) {
- $this->name = $name;
- $this->value = $value;
- $this->type = $type;
- $this->element_ns = $element_ns;
- $this->type_ns = $type_ns;
- $this->attributes = $attributes;
- }
-
- /**
- * return serialized value
- *
- * @return string XML data
- * @access private
- */
- function serialize($use='encoded') {
- return $this->serialize_val($this->value,$this->name,$this->type,$this->element_ns,$this->type_ns,$this->attributes,$use);
- }
-
- /**
- * decodes a soapval object into a PHP native type
- *
- * @param object $soapval optional SOAPx4 soapval object, else uses self
- * @return mixed
- * @access public
- */
- function decode(){
- return $this->value;
- }
-}
-
-
-
-?><?php
-
-
-
-/**
-* transport class for sending/receiving data via HTTP and HTTPS
-* NOTE: PHP must be compiled with the CURL extension for HTTPS support
-*
-* @author Dietrich Ayala <dietrich@ganx4.com>
-* @access public
-*/
-class soap_transport_http extends nusoap_base {
-
- var $url = '';
- var $uri = '';
- var $scheme = '';
- var $host = '';
- var $port = '';
- var $path = '';
- var $request_method = 'POST';
- var $protocol_version = '1.0';
- var $encoding = '';
- var $outgoing_headers = array();
- var $incoming_headers = array();
- var $outgoing_payload = '';
- var $incoming_payload = '';
- var $useSOAPAction = true;
- var $persistentConnection = false;
- var $ch = false; // cURL handle
- var $username;
- var $password;
-
- /**
- * constructor
- */
- function soap_transport_http($url){
- $this->url = $url;
-
- $u = parse_url($url);
- foreach($u as $k => $v){
- $this->debug("$k = $v");
- $this->$k = $v;
- }
-
- // add any GET params to path
- if(isset($u['query']) && $u['query'] != ''){
- $this->path .= '?' . $u['query'];
- }
-
- // set default port
- if(!isset($u['port'])){
- if($u['scheme'] == 'https'){
- $this->port = 443;
- } else {
- $this->port = 80;
- }
- }
-
- $this->uri = $this->path;
-
- // build headers
- ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev);
- $this->outgoing_headers['User-Agent'] = $this->title.'/'.$this->version.' ('.$rev[1].')';
- if (!isset($u['port'])) {
- $this->outgoing_headers['Host'] = $this->host;
- } else {
- $this->outgoing_headers['Host'] = $this->host.':'.$this->port;
- }
-
- if (isset($u['user']) && $u['user'] != '') {
- $this->setCredentials($u['user'], isset($u['pass']) ? $u['pass'] : '');
- }
- }
-
- function connect($connection_timeout=0,$response_timeout=30){
- // For PHP 4.3 with OpenSSL, change https scheme to ssl, then treat like
- // "regular" socket.
- // TODO: disabled for now because OpenSSL must be *compiled* in (not just
- // loaded), and until PHP5 stream_get_wrappers is not available.
-// if ($this->scheme == 'https') {
-// if (version_compare(phpversion(), '4.3.0') >= 0) {
-// if (extension_loaded('openssl')) {
-// $this->scheme = 'ssl';
-// $this->debug('Using SSL over OpenSSL');
-// }
-// }
-// }
- $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port");
- if ($this->scheme == 'http' || $this->scheme == 'ssl') {
- // use persistent connection
- if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){
- if (!feof($this->fp)) {
- $this->debug('Re-use persistent connection');
- return true;
- }
- fclose($this->fp);
- $this->debug('Closed persistent connection at EOF');
- }
-
- // munge host if using OpenSSL
- if ($this->scheme == 'ssl') {
- $host = 'ssl://' . $this->host;
- } else {
- $host = $this->host;
- }
- $this->debug('calling fsockopen with host ' . $host);
-
- // open socket
- if($connection_timeout > 0){
- $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout);
- } else {
- $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str);
- }
-
- // test pointer
- if(!$this->fp) {
- $msg = 'Couldn\'t open socket connection to server ' . $this->url;
- if ($this->errno) {
- $msg .= ', Error ('.$this->errno.'): '.$this->error_str;
- } else {
- $msg .= ' prior to connect(). This is often a problem looking up the host name.';
- }
- $this->debug($msg);
- $this->setError($msg);
- return false;
- }
-
- // set response timeout
- socket_set_timeout( $this->fp, $response_timeout);
-
- $this->debug('socket connected');
- return true;
- } else if ($this->scheme == 'https') {
- if (!extension_loaded('curl')) {
- $this->setError('CURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS');
- return false;
- }
- $this->debug('connect using https');
- // init CURL
- $this->ch = curl_init();
- // set url
- $hostURL = ($this->port != '') ? "https://$this->host:$this->port" : "https://$this->host";
- // add path
- $hostURL .= $this->path;
- curl_setopt($this->ch, CURLOPT_URL, $hostURL);
- // ask for headers in the response output
- curl_setopt($this->ch, CURLOPT_HEADER, 1);
- // ask for the response output as the return value
- curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
- // encode
- // We manage this ourselves through headers and encoding
-// if(function_exists('gzuncompress')){
-// curl_setopt($this->ch, CURLOPT_ENCODING, 'deflate');
-// }
- // persistent connection
- if ($this->persistentConnection) {
- // The way we send data, we cannot use persistent connections, since
- // there will be some "junk" at the end of our request.
- //curl_setopt($this->ch, CURL_HTTP_VERSION_1_1, true);
- $this->persistentConnection = false;
- $this->outgoing_headers['Connection'] = 'close';
- }
- // set timeout (NOTE: cURL does not have separate connection and response timeouts)
- if ($connection_timeout != 0) {
- curl_setopt($this->ch, CURLOPT_TIMEOUT, $connection_timeout);
- }
-
- // recent versions of cURL turn on peer/host checking by default,
- // while PHP binaries are not compiled with a default location for the
- // CA cert bundle, so disable peer/host checking.
-//curl_setopt($this->ch, CURLOPT_CAINFO, 'f:\php-4.3.2-win32\extensions\curl-ca-bundle.crt');
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
-
- /*
- TODO: support client certificates (thanks Tobias Boes)
- curl_setopt($this->ch, CURLOPT_CAINFO, '$pathToPemFiles/rootca.pem');
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 1);
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 1);
- curl_setopt($this->ch, CURLOPT_SSLCERT, '$pathToPemFiles/mycert.pem');
- curl_setopt($this->ch, CURLOPT_SSLKEY, '$pathToPemFiles/mykey.pem');
- */
- $this->debug('cURL connection set up');
- return true;
- } else {
- $this->setError('Unknown scheme ' . $this->scheme);
- $this->debug('Unknown scheme ' . $this->scheme);
- return false;
- }
- }
-
- /**
- * send the SOAP message via HTTP
- *
- * @param string $data message data
- * @param integer $timeout set connection timeout in seconds
- * @param integer $response_timeout set response timeout in seconds
- * @return string data
- * @access public
- */
- function send($data, $timeout=0, $response_timeout=30) {
-
- $this->debug('entered send() with data of length: '.strlen($data));
-
- $this->tryagain = true;
- $tries = 0;
- while ($this->tryagain) {
- $this->tryagain = false;
- if ($tries++ < 2) {
- // make connnection
- if (!$this->connect($timeout, $response_timeout)){
- return false;
- }
-
- // send request
- if (!$this->sendRequest($data)){
- return false;
- }
-
- // get response
- $respdata = $this->getResponse();
- } else {
- $this->setError('Too many tries to get an OK response');
- }
- }
- $this->debug('end of send()');
- return $respdata;
- }
-
-
- /**
- * send the SOAP message via HTTPS 1.0 using CURL
- *
- * @param string $msg message data
- * @param integer $timeout set connection timeout in seconds
- * @param integer $response_timeout set response timeout in seconds
- * @return string data
- * @access public
- */
- function sendHTTPS($data, $timeout=0, $response_timeout=30) {
- return $this->send($data, $timeout, $response_timeout);
- }
-
- /**
- * if authenticating, set user credentials here
- *
- * @param string $username
- * @param string $password
- * @param string $authtype
- * @param array $digestRequest
- * @access public
- */
- function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array()) {
- global $_SERVER;
-
- $this->debug("Set credentials for authtype $authtype");
- // cf. RFC 2617
- if ($authtype == 'basic') {
- $this->outgoing_headers['Authorization'] = 'Basic '.base64_encode($username.':'.$password);
- } elseif ($authtype == 'digest') {
- if (isset($digestRequest['nonce'])) {
- $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1;
-
- // calculate the Digest hashes (calculate code based on digest implementation found at: http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html)
-
- // A1 = unq(username-value) ":" unq(realm-value) ":" passwd
- $A1 = $username. ':' . $digestRequest['realm'] . ':' . $password;
-
- // H(A1) = MD5(A1)
- $HA1 = md5($A1);
-
- // A2 = Method ":" digest-uri-value
- $A2 = 'POST:' . $this->uri;
-
- // H(A2)
- $HA2 = md5($A2);
-
- // KD(secret, data) = H(concat(secret, ":", data))
- // if qop == auth:
- // request-digest = <"> < KD ( H(A1), unq(nonce-value)
- // ":" nc-value
- // ":" unq(cnonce-value)
- // ":" unq(qop-value)
- // ":" H(A2)
- // ) <">
- // if qop is missing,
- // request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <">
-
- $unhashedDigest = '';
- $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : '';
- $cnonce = $nonce;
- if ($digestRequest['qop'] != '') {
- $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2;
- } else {
- $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2;
- }
-
- $hashedDigest = md5($unhashedDigest);
-
- $this->outgoing_headers['Authorization'] = 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->uri . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"';
- }
- }
- $this->username = $username;
- $this->password = $password;
- $this->authtype = $authtype;
- $this->digestRequest = $digestRequest;
-
- if (isset($this->outgoing_headers['Authorization'])) {
- $this->debug('Authorization header set: ' . substr($this->outgoing_headers['Authorization'], 0, 12) . '...');
- } else {
- $this->debug('Authorization header not set');
- }
- }
-
- /**
- * set the soapaction value
- *
- * @param string $soapaction
- * @access public
- */
- function setSOAPAction($soapaction) {
- $this->outgoing_headers['SOAPAction'] = '"' . $soapaction . '"';
- }
-
- /**
- * use http encoding
- *
- * @param string $enc encoding style. supported values: gzip, deflate, or both
- * @access public
- */
- function setEncoding($enc='gzip, deflate'){
- $this->protocol_version = '1.1';
- $this->outgoing_headers['Accept-Encoding'] = $enc;
- $this->outgoing_headers['Connection'] = 'close';
- $this->persistentConnection = false;
- set_magic_quotes_runtime(0);
- // deprecated
- $this->encoding = $enc;
- }
-
- /**
- * set proxy info here
- *
- * @param string $proxyhost
- * @param string $proxyport
- * @param string $proxyusername
- * @param string $proxypassword
- * @access public
- */
- function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') {
- $this->uri = $this->url;
- $this->host = $proxyhost;
- $this->port = $proxyport;
- if ($proxyusername != '' && $proxypassword != '') {
- $this->outgoing_headers['Proxy-Authorization'] = ' Basic '.base64_encode($proxyusername.':'.$proxypassword);
- }
- }
-
- /**
- * decode a string that is encoded w/ "chunked' transfer encoding
- * as defined in RFC2068 19.4.6
- *
- * @param string $buffer
- * @param string $lb
- * @returns string
- * @access public
- */
- function decodeChunked($buffer, $lb){
- // length := 0
- $length = 0;
- $new = '';
-
- // read chunk-size, chunk-extension (if any) and CRLF
- // get the position of the linebreak
- $chunkend = strpos($buffer, $lb);
- if ($chunkend == FALSE) {
- $this->debug('no linebreak found in decodeChunked');
- return $new;
- }
- $temp = substr($buffer,0,$chunkend);
- $chunk_size = hexdec( trim($temp) );
- $chunkstart = $chunkend + strlen($lb);
- // while (chunk-size > 0) {
- while ($chunk_size > 0) {
- $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size");
- $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size);
-
- // Just in case we got a broken connection
- if ($chunkend == FALSE) {
- $chunk = substr($buffer,$chunkstart);
- // append chunk-data to entity-body
- $new .= $chunk;
- $length += strlen($chunk);
- break;
- }
-
- // read chunk-data and CRLF
- $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart);
- // append chunk-data to entity-body
- $new .= $chunk;
- // length := length + chunk-size
- $length += strlen($chunk);
- // read chunk-size and CRLF
- $chunkstart = $chunkend + strlen($lb);
-
- $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb);
- if ($chunkend == FALSE) {
- break; //Just in case we got a broken connection
- }
- $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart);
- $chunk_size = hexdec( trim($temp) );
- $chunkstart = $chunkend;
- }
- return $new;
- }
-
- /*
- * Writes payload, including HTTP headers, to $this->outgoing_payload.
- */
- function buildPayload($data) {
- // add content-length header
- $this->outgoing_headers['Content-Length'] = strlen($data);
-
- // start building outgoing payload:
- $this->outgoing_payload = "$this->request_method $this->uri HTTP/$this->protocol_version\r\n";
-
- // loop thru headers, serializing
- foreach($this->outgoing_headers as $k => $v){
- $this->outgoing_payload .= $k.': '.$v."\r\n";
- }
-
- // header/body separator
- $this->outgoing_payload .= "\r\n";
-
- // add data
- $this->outgoing_payload .= $data;
- }
-
- function sendRequest($data){
- // build payload
- $this->buildPayload($data);
-
- if ($this->scheme == 'http' || $this->scheme == 'ssl') {
- // send payload
- if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) {
- $this->setError('couldn\'t write message data to socket');
- $this->debug('couldn\'t write message data to socket');
- return false;
- }
- $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload));
- return true;
- } else if ($this->scheme == 'https') {
- // set payload
- // TODO: cURL does say this should only be the verb, and in fact it
- // turns out that the URI and HTTP version are appended to this, which
- // some servers refuse to work with
- //curl_setopt($this->ch, CURLOPT_CUSTOMREQUEST, $this->outgoing_payload);
- foreach($this->outgoing_headers as $k => $v){
- $curl_headers[] = "$k: $v";
- }
- curl_setopt($this->ch, CURLOPT_HTTPHEADER, $curl_headers);
- if ($this->request_method == "POST") {
- curl_setopt($this->ch, CURLOPT_POST, 1);
- curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
- } else {
- }
- $this->debug('set cURL payload');
- return true;
- }
- }
-
- function getResponse(){
- $this->incoming_payload = '';
-
- if ($this->scheme == 'http' || $this->scheme == 'ssl') {
- // loop until headers have been retrieved
- $data = '';
- while (!isset($lb)){
-
- // We might EOF during header read.
- if(feof($this->fp)) {
- $this->incoming_payload = $data;
- $this->debug('found no headers before EOF after length ' . strlen($data));
- $this->debug("received before EOF:\n" . $data);
- $this->setError('server failed to send headers');
- return false;
- }
-
- $tmp = fgets($this->fp, 256);
- $tmplen = strlen($tmp);
- $this->debug("read line of $tmplen bytes: " . trim($tmp));
-
- if ($tmplen == 0) {
- $this->incoming_payload = $data;
- $this->debug('socket read of headers timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of headers timed out');
- return false;
- }
-
- $data .= $tmp;
- $pos = strpos($data,"\r\n\r\n");
- if($pos > 1){
- $lb = "\r\n";
- } else {
- $pos = strpos($data,"\n\n");
- if($pos > 1){
- $lb = "\n";
- }
- }
- // remove 100 header
- if(isset($lb) && ereg('^HTTP/1.1 100',$data)){
- unset($lb);
- $data = '';
- }//
- }
- // store header data
- $this->incoming_payload .= $data;
- $this->debug('found end of headers after length ' . strlen($data));
- // process headers
- $header_data = trim(substr($data,0,$pos));
- $header_array = explode($lb,$header_data);
- $this->incoming_headers = array();
- foreach($header_array as $header_line){
- $arr = explode(':',$header_line, 2);
- if(count($arr) > 1){
- $header_name = strtolower(trim($arr[0]));
- $this->incoming_headers[$header_name] = trim($arr[1]);
- } else if (isset($header_name)) {
- $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line;
- }
- }
-
- // loop until msg has been received
- if (isset($this->incoming_headers['content-length'])) {
- $content_length = $this->incoming_headers['content-length'];
- $chunked = false;
- $this->debug("want to read content of length $content_length");
- } else {
- $content_length = 2147483647;
- if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') {
- $chunked = true;
- $this->debug("want to read chunked content");
- } else {
- $chunked = false;
- $this->debug("want to read content to EOF");
- }
- }
- $data = '';
- do {
- if ($chunked) {
- $tmp = fgets($this->fp, 256);
- $tmplen = strlen($tmp);
- $this->debug("read chunk line of $tmplen bytes");
- if ($tmplen == 0) {
- $this->incoming_payload = $data;
- $this->debug('socket read of chunk length timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of chunk length timed out');
- return false;
- }
- $content_length = hexdec(trim($tmp));
- $this->debug("chunk length $content_length");
- }
- $strlen = 0;
- while (($strlen < $content_length) && (!feof($this->fp))) {
- $readlen = min(8192, $content_length - $strlen);
- $tmp = fread($this->fp, $readlen);
- $tmplen = strlen($tmp);
- $this->debug("read buffer of $tmplen bytes");
- if (($tmplen == 0) && (!feof($this->fp))) {
- $this->incoming_payload = $data;
- $this->debug('socket read of body timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of body timed out');
- return false;
- }
- $strlen += $tmplen;
- $data .= $tmp;
- }
- if ($chunked && ($content_length > 0)) {
- $tmp = fgets($this->fp, 256);
- $tmplen = strlen($tmp);
- $this->debug("read chunk terminator of $tmplen bytes");
- if ($tmplen == 0) {
- $this->incoming_payload = $data;
- $this->debug('socket read of chunk terminator timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of chunk terminator timed out');
- return false;
- }
- }
- } while ($chunked && ($content_length > 0) && (!feof($this->fp)));
- if (feof($this->fp)) {
- $this->debug('read to EOF');
- }
- $this->debug('read body of length ' . strlen($data));
- $this->incoming_payload .= $data;
- $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server');
-
- // close filepointer
- if(
- (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') ||
- (! $this->persistentConnection) || feof($this->fp)){
- fclose($this->fp);
- $this->fp = false;
- $this->debug('closed socket');
- }
-
- // connection was closed unexpectedly
- if($this->incoming_payload == ''){
- $this->setError('no response from server');
- return false;
- }
-
- // decode transfer-encoding
-// if(isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked'){
-// if(!$data = $this->decodeChunked($data, $lb)){
-// $this->setError('Decoding of chunked data failed');
-// return false;
-// }
- //print "<pre>\nde-chunked:\n---------------\n$data\n\n---------------\n</pre>";
- // set decoded payload
-// $this->incoming_payload = $header_data.$lb.$lb.$data;
-// }
-
- } else if ($this->scheme == 'https') {
- // send and receive
- $this->debug('send and receive with cURL');
- $this->incoming_payload = curl_exec($this->ch);
- $data = $this->incoming_payload;
-
- $cErr = curl_error($this->ch);
- if ($cErr != '') {
- $err = 'cURL ERROR: '.curl_errno($this->ch).': '.$cErr.'<br>';
- foreach(curl_getinfo($this->ch) as $k => $v){
- $err .= "$k: $v<br>";
- }
- $this->debug($err);
- $this->setError($err);
- curl_close($this->ch);
- return false;
- } else {
- //echo '<pre>';
- //var_dump(curl_getinfo($this->ch));
- //echo '</pre>';
- }
- // close curl
- $this->debug('No cURL error, closing cURL');
- curl_close($this->ch);
-
- // remove 100 header
- if (ereg('^HTTP/1.1 100',$data)) {
- if ($pos = strpos($data,"\r\n\r\n")) {
- $data = ltrim(substr($data,$pos));
- } elseif($pos = strpos($data,"\n\n") ) {
- $data = ltrim(substr($data,$pos));
- }
- }
-
- // separate content from HTTP headers
- if ($pos = strpos($data,"\r\n\r\n")) {
- $lb = "\r\n";
- } elseif( $pos = strpos($data,"\n\n")) {
- $lb = "\n";
- } else {
- $this->debug('no proper separation of headers and document');
- $this->setError('no proper separation of headers and document');
- return false;
- }
- $header_data = trim(substr($data,0,$pos));
- $header_array = explode($lb,$header_data);
- $data = ltrim(substr($data,$pos));
- $this->debug('found proper separation of headers and document');
- $this->debug('cleaned data, stringlen: '.strlen($data));
- // clean headers
- foreach ($header_array as $header_line) {
- $arr = explode(':',$header_line,2);
- if (count($arr) > 1) {
- $this->incoming_headers[strtolower(trim($arr[0]))] = trim($arr[1]);
- }
- }
- }
-
- // see if we need to resend the request with http digest authentication
- if (isset($this->incoming_headers['www-authenticate']) && strstr($header_array[0], '401 Unauthorized')) {
- $this->debug('Got 401 Unauthorized with WWW-Authenticate: ' . $this->incoming_headers['www-authenticate']);
- if (substr("Digest ", $this->incoming_headers['www-authenticate'])) {
- $this->debug('Server wants digest authentication');
- // remove "Digest " from our elements
- $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']);
-
- // parse elements into array
- $digestElements = explode(',', $digestString);
- foreach ($digestElements as $val) {
- $tempElement = explode('=', trim($val));
- $digestRequest[$tempElement[0]] = str_replace("\"", '', $tempElement[1]);
- }
-
- // should have (at least) qop, realm, nonce
- if (isset($digestRequest['nonce'])) {
- $this->setCredentials($this->username, $this->password, 'digest', $digestRequest);
- $this->tryagain = true;
- return false;
- }
- }
- $this->debug('HTTP authentication failed');
- $this->setError('HTTP authentication failed');
- return false;
- }
-
- // decode content-encoding
- if(isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != ''){
- if(strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip'){
- // if decoding works, use it. else assume data wasn't gzencoded
- if(function_exists('gzuncompress')){
- //$timer->setMarker('starting decoding of gzip/deflated content');
- if($this->incoming_headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)){
- $data = $degzdata;
- } elseif($this->incoming_headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))){ // do our best
- $data = $degzdata;
- } else {
- $this->setError('Errors occurred when trying to decode the data');
- }
- //$timer->setMarker('finished decoding of gzip/deflated content');
- //print "<xmp>\nde-inflated:\n---------------\n$data\n-------------\n</xmp>";
- // set decoded payload
- $this->incoming_payload = $header_data.$lb.$lb.$data;
- } else {
- $this->setError('The server sent deflated data. Your php install must have the Zlib extension compiled in to support this.');
- }
- }
- }
-
- if(strlen($data) == 0){
- $this->debug('no data after headers!');
- $this->setError('no data present after HTTP headers');
- return false;
- }
-
- return $data;
- }
-
- function setContentType($type, $charset = false) {
- $this->outgoing_headers['Content-Type'] = $type . ($charset ? '; charset=' . $charset : '');
- }
-
- function usePersistentConnection(){
- if (isset($this->outgoing_headers['Accept-Encoding'])) {
- return false;
- }
- $this->protocol_version = '1.1';
- $this->persistentConnection = true;
- $this->outgoing_headers['Connection'] = 'Keep-Alive';
- return true;
- }
-}
-
-?><?php
-
-
-
-/**
-*
-* soap_server allows the user to create a SOAP server
-* that is capable of receiving messages and returning responses
-*
-* NOTE: WSDL functionality is experimental
-*
-* @author Dietrich Ayala <dietrich@ganx4.com>
-* @access public
-*/
-class soap_server extends nusoap_base {
- var $headers = array(); // HTTP headers of request
- var $request = ''; // HTTP request
- var $requestHeaders = ''; // SOAP headers from request (incomplete namespace resolution) (text)
- var $document = ''; // SOAP body request portion (incomplete namespace resolution) (text)
- var $requestSOAP = ''; // SOAP payload for request (text)
- var $methodURI = ''; // requested method namespace URI
- var $methodname = ''; // name of method requested
- var $methodparams = array(); // method parameters from request
- var $xml_encoding = ''; // character set encoding of incoming (request) messages
- var $SOAPAction = ''; // SOAP Action from request
-
- var $outgoing_headers = array();// HTTP headers of response
- var $response = ''; // HTTP response
- var $responseHeaders = ''; // SOAP headers for response (text)
- var $responseSOAP = ''; // SOAP payload for response (text)
- var $methodreturn = false; // method return to place in response
- var $methodreturnisliteralxml = false; // whether $methodreturn is a string of literal XML
- var $fault = false; // SOAP fault for response
- var $result = 'successful'; // text indication of result (for debugging)
-
- var $operations = array(); // assoc array of operations => opData
- var $wsdl = false; // wsdl instance
- var $externalWSDLURL = false; // URL for WSDL
- var $debug_flag = false; // whether to append debug to response as XML comment
-
- /**
- * constructor
- * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to.
- *
- * @param mixed $wsdl file path or URL (string), or wsdl instance (object)
- * @access public
- */
- function soap_server($wsdl=false){
-
- // turn on debugging?
- global $debug;
- global $_REQUEST;
- global $_SERVER;
- global $HTTP_SERVER_VARS;
-
- if (isset($debug)) {
- $this->debug_flag = $debug;
- } else if (isset($_REQUEST['debug'])) {
- $this->debug_flag = $_REQUEST['debug'];
- } else if (isset($_SERVER['QUERY_STRING'])) {
- $qs = explode('&', $_SERVER['QUERY_STRING']);
- foreach ($qs as $v) {
- if (substr($v, 0, 6) == 'debug=') {
- $this->debug_flag = substr($v, 6);
- }
- }
- } else if (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
- $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']);
- foreach ($qs as $v) {
- if (substr($v, 0, 6) == 'debug=') {
- $this->debug_flag = substr($v, 6);
- }
- }
- }
-
- // wsdl
- if($wsdl){
- if (is_object($wsdl) && is_a($wsdl, 'wsdl')) {
- $this->wsdl = $wsdl;
- $this->externalWSDLURL = $this->wsdl->wsdl;
- $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL);
- } else {
- $this->debug('Create wsdl from ' . $wsdl);
- $this->wsdl = new wsdl($wsdl);
- $this->externalWSDLURL = $wsdl;
- }
- $this->debug("wsdl...\n" . $this->wsdl->debug_str);
- $this->wsdl->debug_str = '';
- if($err = $this->wsdl->getError()){
- die('WSDL ERROR: '.$err);
- }
- }
- }
-
- /**
- * processes request and returns response
- *
- * @param string $data usually is the value of $HTTP_RAW_POST_DATA
- * @access public
- */
- function service($data){
- global $QUERY_STRING;
- if(isset($_SERVER['QUERY_STRING'])){
- $qs = $_SERVER['QUERY_STRING'];
- } elseif(isset($GLOBALS['QUERY_STRING'])){
- $qs = $GLOBALS['QUERY_STRING'];
- } elseif(isset($QUERY_STRING) && $QUERY_STRING != ''){
- $qs = $QUERY_STRING;
- }
-
- if(isset($qs) && ereg('wsdl', $qs) ){
- // This is a request for WSDL
- if($this->externalWSDLURL){
- if (strpos($this->externalWSDLURL,"://")!==false) { // assume URL
- header('Location: '.$this->externalWSDLURL);
- } else { // assume file
- header("Content-Type: text/xml\r\n");
- $fp = fopen($this->externalWSDLURL, 'r');
- fpassthru($fp);
- }
- } else {
- header("Content-Type: text/xml; charset=ISO-8859-1\r\n");
- print $this->wsdl->serialize();
- }
- } elseif($data == '' && $this->wsdl){
- // print web interface
- print $this->webDescription();
- } else {
- // handle the request
- $this->parse_request($data);
- if (! $this->fault) {
- $this->invoke_method();
- }
- if (! $this->fault) {
- $this->serialize_return();
- }
- $this->send_response();
- }
- }
-
- /**
- * parses HTTP request headers.
- *
- * The following fields are set by this function (when successful)
- *
- * headers
- * request
- * xml_encoding
- * SOAPAction
- *
- * @access private
- */
- function parse_http_headers() {
- global $HTTP_SERVER_VARS;
- global $_SERVER;
-
- $this->request = '';
- if(function_exists('getallheaders')){
- $this->headers = getallheaders();
- foreach($this->headers as $k=>$v){
- $this->request .= "$k: $v\r\n";
- $this->debug("$k: $v");
- }
- // get SOAPAction header
- if(isset($this->headers['SOAPAction'])){
- $this->SOAPAction = str_replace('"','',$this->headers['SOAPAction']);
- }
- // get the character encoding of the incoming request
- if(strpos($this->headers['Content-Type'],'=')){
- $enc = str_replace('"','',substr(strstr($this->headers["Content-Type"],'='),1));
- if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
- // should be US-ASCII, but for XML, let's be pragmatic and admit UTF-8 is most common
- $this->xml_encoding = 'UTF-8';
- }
- } elseif(isset($_SERVER) && is_array($_SERVER)){
- foreach ($_SERVER as $k => $v) {
- if (substr($k, 0, 5) == 'HTTP_') {
- $k = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($k, 5)))));
- } else {
- $k = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $k))));
- }
- if ($k == 'Soapaction') {
- // get SOAPAction header
- $k = 'SOAPAction';
- $v = str_replace('"', '', $v);
- $v = str_replace('\\', '', $v);
- $this->SOAPAction = $v;
- } else if ($k == 'Content-Type') {
- // get the character encoding of the incoming request
- if (strpos($v, '=')) {
- $enc = substr(strstr($v, '='), 1);
- $enc = str_replace('"', '', $enc);
- $enc = str_replace('\\', '', $enc);
- if (eregi('^(ISO-8859-1|US-ASCII|UTF-8)$', $enc)) {
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
- // should be US-ASCII, but for XML, let's be pragmatic and admit UTF-8 is most common
- $this->xml_encoding = 'UTF-8';
- }
- }
- $this->headers[$k] = $v;
- $this->request .= "$k: $v\r\n";
- $this->debug("$k: $v");
- }
- } elseif (is_array($HTTP_SERVER_VARS)) {
- foreach ($HTTP_SERVER_VARS as $k => $v) {
- if (substr($k, 0, 5) == 'HTTP_') {
- $k = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($k, 5)))));
- if ($k == 'Soapaction') {
- // get SOAPAction header
- $k = 'SOAPAction';
- $v = str_replace('"', '', $v);
- $v = str_replace('\\', '', $v);
- $this->SOAPAction = $v;
- } else if ($k == 'Content-Type') {
- // get the character encoding of the incoming request
- if (strpos($v, '=')) {
- $enc = substr(strstr($v, '='), 1);
- $enc = str_replace('"', '', $enc);
- $enc = str_replace('\\', '', $enc);
- if (eregi('^(ISO-8859-1|US-ASCII|UTF-8)$', $enc)) {
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
- // should be US-ASCII, but for XML, let's be pragmatic and admit UTF-8 is most common
- $this->xml_encoding = 'UTF-8';
- }
- }
- $this->headers[$k] = $v;
- $this->request .= "$k: $v\r\n";
- $this->debug("$k: $v");
- }
- }
- }
- }
-
- /**
- * parses a request
- *
- * The following fields are set by this function (when successful)
- *
- * headers
- * request
- * xml_encoding
- * SOAPAction
- * request
- * requestSOAP
- * methodURI
- * methodname
- * methodparams
- * requestHeaders
- * document
- *
- * This sets the fault field on error
- *
- * @param string $data XML string
- * @access private
- */
- function parse_request($data='') {
- $this->debug('entering parse_request() on '.date('H:i Y-m-d'));
- $this->parse_http_headers();
- $this->debug('got character encoding: '.$this->xml_encoding);
- // uncompress if necessary
- if (isset($this->headers['Content-Encoding']) && $this->headers['Content-Encoding'] != '') {
- $this->debug('got content encoding: ' . $this->headers['Content-Encoding']);
- if ($this->headers['Content-Encoding'] == 'deflate' || $this->headers['Content-Encoding'] == 'gzip') {
- // if decoding works, use it. else assume data wasn't gzencoded
- if (function_exists('gzuncompress')) {
- if ($this->headers['Content-Encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) {
- $data = $degzdata;
- } elseif ($this->headers['Content-Encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) {
- $data = $degzdata;
- } else {
- $this->fault('Server', 'Errors occurred when trying to decode the data');
- return;
- }
- } else {
- $this->fault('Server', 'This Server does not support compressed data');
- return;
- }
- }
- }
- $this->request .= "\r\n".$data;
- $this->requestSOAP = $data;
- // parse response, get soap parser obj
- $parser = new soap_parser($data,$this->xml_encoding);
- // parser debug
- $this->debug("parser debug: \n".$parser->debug_str);
- // if fault occurred during message parsing
- if($err = $parser->getError()){
- $this->result = 'fault: error in msg parsing: '.$err;
- $this->fault('Server',"error in msg parsing:\n".$err);
- // else successfully parsed request into soapval object
- } else {
- // get/set methodname
- $this->methodURI = $parser->root_struct_namespace;
- $this->methodname = $parser->root_struct_name;
- $this->debug('method name: '.$this->methodname);
- $this->debug('calling parser->get_response()');
- $this->methodparams = $parser->get_response();
- // get SOAP headers
- $this->requestHeaders = $parser->getHeaders();
- // add document for doclit support
- $this->document = $parser->document;
- }
- $this->debug('leaving parse_request() on '.date('H:i Y-m-d'));
- }
-
- /**
- * invokes a PHP function for the requested SOAP method
- *
- * The following fields are set by this function (when successful)
- *
- * methodreturn
- *
- * Note that the PHP function that is called may also set the following
- * fields to affect the response sent to the client
- *
- * responseHeaders
- * outgoing_headers
- *
- * This sets the fault field on error
- *
- * @access private
- */
- function invoke_method() {
- $this->debug('entering invoke_method');
- // does method exist?
- if(!function_exists($this->methodname)){
- // "method not found" fault here
- $this->debug("method '$this->methodname' not found!");
- $this->result = 'fault: method not found';
- $this->fault('Server',"method '$this->methodname' not defined in service");
- return;
- }
- if($this->wsdl){
- if(!$this->opData = $this->wsdl->getOperationData($this->methodname)){
- //if(
- $this->fault('Server',"Operation '$this->methodname' is not defined in the WSDL for this service");
- return;
- }
- $this->debug('opData is ' . $this->varDump($this->opData));
- }
- $this->debug("method '$this->methodname' exists");
- // evaluate message, getting back parameters
- // verify that request parameters match the method's signature
- if(! $this->verify_method($this->methodname,$this->methodparams)){
- // debug
- $this->debug('ERROR: request not verified against method signature');
- $this->result = 'fault: request failed validation against method signature';
- // return fault
- $this->fault('Server',"Operation '$this->methodname' not defined in service.");
- return;
- }
-
- // if there are parameters to pass
- $this->debug('params var dump '.$this->varDump($this->methodparams));
- if($this->methodparams){
- $this->debug("calling '$this->methodname' with params");
- if (! function_exists('call_user_func_array')) {
- $this->debug('calling method using eval()');
- $funcCall = $this->methodname.'(';
- foreach($this->methodparams as $param) {
- $funcCall .= "\"$param\",";
- }
- $funcCall = substr($funcCall, 0, -1).')';
- $this->debug('function call:<br>'.$funcCall);
- @eval("\$this->methodreturn = $funcCall;");
- } else {
- $this->debug('calling method using call_user_func_array()');
- $this->methodreturn = call_user_func_array("$this->methodname",$this->methodparams);
- }
- } else {
- // call method w/ no parameters
- $this->debug("calling $this->methodname w/ no params");
- $m = $this->methodname;
- $this->methodreturn = @$m();
- }
- $this->debug('methodreturn var dump'.$this->varDump($this->methodreturn));
- $this->debug("leaving invoke_method: called method $this->methodname, received $this->methodreturn of type ".gettype($this->methodreturn));
- }
-
- /**
- * serializes the return value from a PHP function into a full SOAP Envelope
- *
- * The following fields are set by this function (when successful)
- *
- * responseSOAP
- *
- * This sets the fault field on error
- *
- * @access private
- */
- function serialize_return() {
- $this->debug("Entering serialize_return");
- // if we got nothing back. this might be ok (echoVoid)
- if(isset($this->methodreturn) && ($this->methodreturn != '' || is_bool($this->methodreturn))) {
- // if fault
- if(get_class($this->methodreturn) == 'soap_fault'){
- $this->debug('got a fault object from method');
- $this->fault = $this->methodreturn;
- return;
- } elseif ($this->methodreturnisliteralxml) {
- $return_val = $this->methodreturn;
- // returned value(s)
- } else {
- $this->debug('got a(n) '.gettype($this->methodreturn).' from method');
- $this->debug('serializing return value');
- if($this->wsdl){
- // weak attempt at supporting multiple output params
- if(sizeof($this->opData['output']['parts']) > 1){
- $opParams = $this->methodreturn;
- } else {
- // TODO: is this really necessary?
- $opParams = array($this->methodreturn);
- }
- $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams);
- if($errstr = $this->wsdl->getError()){
- $this->debug('got wsdl error: '.$errstr);
- $this->fault('Server', 'got wsdl error: '.$errstr);
- return;
- }
- } else {
- $return_val = $this->serialize_val($this->methodreturn, 'return');
- }
- }
- $this->debug('return val: '.$this->varDump($return_val));
- } else {
- $return_val = '';
- $this->debug('got no response from method');
- }
- $this->debug('serializing response');
- if ($this->wsdl) {
- if ($this->opData['style'] == 'rpc') {
- $payload = '<ns1:'.$this->methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'</ns1:'.$this->methodname."Response>";
- } else {
- $payload = $return_val;
- }
- } else {
- $payload = '<ns1:'.$this->methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'</ns1:'.$this->methodname."Response>";
- }
- $this->result = 'successful';
- if($this->wsdl){
- //if($this->debug_flag){
- $this->debug("WSDL debug data:\n".$this->wsdl->debug_str);
- // }
- // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces.
- $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style']);
- } else {
- $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders);
- }
- $this->debug("Leaving serialize_return");
- }
-
- /**
- * sends an HTTP response
- *
- * The following fields are set by this function (when successful)
- *
- * outgoing_headers
- * response
- *
- * @access private
- */
- function send_response() {
- $this->debug('Enter send_response');
- if ($this->fault) {
- $payload = $this->fault->serialize();
- $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error";
- $this->outgoing_headers[] = "Status: 500 Internal Server Error";
- } else {
- $payload = $this->responseSOAP;
- // Some combinations of PHP+Web server allow the Status
- // to come through as a header. Since OK is the default
- // just do nothing.
- // $this->outgoing_headers[] = "HTTP/1.0 200 OK";
- // $this->outgoing_headers[] = "Status: 200 OK";
- }
- // add debug data if in debug mode
- if(isset($this->debug_flag) && $this->debug_flag){
- while (strpos($this->debug_str, '--')) {
- $this->debug_str = str_replace('--', '- -', $this->debug_str);
- }
- $payload .= "<!--\n" . $this->debug_str . "\n-->";
- }
- $this->outgoing_headers[] = "Server: $this->title Server v$this->version";
- ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev);
- $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")";
- // Let the Web server decide about this
- //$this->outgoing_headers[] = "Connection: Close\r\n";
- $this->outgoing_headers[] = "Content-Type: text/xml; charset=$this->soap_defencoding";
- //begin code to compress payload - by John
- if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['Accept-Encoding'])) {
- if (strstr($this->headers['Accept-Encoding'], 'deflate')) {
- if (function_exists('gzcompress')) {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "<!-- Content being deflated -->";
- }
- $this->outgoing_headers[] = "Content-Encoding: deflate";
- $payload = gzcompress($payload);
- } else {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "<!-- Content will not be deflated: no gzcompress -->";
- }
- }
- } else if (strstr($this->headers['Accept-Encoding'], 'gzip')) {
- if (function_exists('gzencode')) {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "<!-- Content being gzipped -->";
- }
- $this->outgoing_headers[] = "Content-Encoding: gzip";
- $payload = gzencode($payload);
- } else {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "<!-- Content will not be gzipped: no gzencode -->";
- }
- }
- }
- }
- //end code
- $this->outgoing_headers[] = "Content-Length: ".strlen($payload);
- reset($this->outgoing_headers);
- foreach($this->outgoing_headers as $hdr){
- header($hdr, false);
- }
- $this->response = join("\r\n",$this->outgoing_headers)."\r\n".$payload;
- print $payload;
- }
-
- /**
- * takes the value that was created by parsing the request
- * and compares to the method's signature, if available.
- *
- * @param mixed
- * @return boolean
- * @access private
- */
- function verify_method($operation,$request){
- if(isset($this->wsdl) && is_object($this->wsdl)){
- if($this->wsdl->getOperationData($operation)){
- return true;
- }
- } elseif(isset($this->operations[$operation])){
- return true;
- }
- return false;
- }
-
- /**
- * add a method to the dispatch map
- *
- * @param string $methodname
- * @param string $in array of input values
- * @param string $out array of output values
- * @access public
- */
- function add_to_map($methodname,$in,$out){
- $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out);
- }
-
- /**
- * register a service with the server
- *
- * @param string $methodname
- * @param string $in assoc array of input values: key = param name, value = param type
- * @param string $out assoc array of output values: key = param name, value = param type
- * @param string $namespace
- * @param string $soapaction
- * @param string $style optional (rpc|document)
- * @param string $use optional (encoded|literal)
- * @param string $documentation optional Description to include in WSDL
- * @access public
- */
- function register($name,$in=false,$out=false,$namespace=false,$soapaction=false,$style=false,$use=false,$documentation=''){
- if($this->externalWSDLURL){
- die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.');
- }
- if(false == $in) {
- }
- if(false == $out) {
- }
- if(false == $namespace) {
- }
- if(false == $soapaction) {
- $SERVER_NAME = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : $GLOBALS['SERVER_NAME'];
- $SCRIPT_NAME = isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : $GLOBALS['SCRIPT_NAME'];
- $soapaction = "http://$SERVER_NAME$SCRIPT_NAME/$name";
- }
- if(false == $style) {
- $style = "rpc";
- }
- if(false == $use) {
- $use = "encoded";
- }
-
- $this->operations[$name] = array(
- 'name' => $name,
- 'in' => $in,
- 'out' => $out,
- 'namespace' => $namespace,
- 'soapaction' => $soapaction,
- 'style' => $style);
- if($this->wsdl){
- $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation);
- }
- return true;
- }
-
- /**
- * create a fault. this also acts as a flag to the server that a fault has occured.
- *
- * @param string faultcode
- * @param string faultstring
- * @param string faultactor
- * @param string faultdetail
- * @access public
- */
- function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){
- $this->fault = new soap_fault($faultcode,$faultactor,$faultstring,$faultdetail);
- }
-
- /**
- * prints html description of services
- *
- * @access private
- */
- function webDescription(){
- $b = '
- <html><head><title>NuSOAP: '.$this->wsdl->serviceName.'</title>
- <style type="text/css">
- body { font-family: arial; color: #000000; background-color: #ffffff; margin: 0px 0px 0px 0px; }
- p { font-family: arial; color: #000000; margin-top: 0px; margin-bottom: 12px; }
- pre { background-color: silver; padding: 5px; font-family: Courier New; font-size: x-small; color: #000000;}
- ul { margin-top: 10px; margin-left: 20px; }
- li { list-style-type: none; margin-top: 10px; color: #000000; }
- .content{
- margin-left: 0px; padding-bottom: 2em; }
- .nav {
- padding-top: 10px; padding-bottom: 10px; padding-left: 15px; font-size: .70em;
- margin-top: 10px; margin-left: 0px; color: #000000;
- background-color: #ccccff; width: 20%; margin-left: 20px; margin-top: 20px; }
- .title {
- font-family: arial; font-size: 26px; color: #ffffff;
- background-color: #999999; width: 105%; margin-left: 0px;
- padding-top: 10px; padding-bottom: 10px; padding-left: 15px;}
- .hidden {
- position: absolute; visibility: hidden; z-index: 200; left: 250px; top: 100px;
- font-family: arial; overflow: hidden; width: 600;
- padding: 20px; font-size: 10px; background-color: #999999;
- layer-background-color:#FFFFFF; }
- a,a:active { color: charcoal; font-weight: bold; }
- a:visited { color: #666666; font-weight: bold; }
- a:hover { color: cc3300; font-weight: bold; }
- </style>
- <script language="JavaScript" type="text/javascript">
- <!--
- // POP-UP CAPTIONS...
- function lib_bwcheck(){ //Browsercheck (needed)
- this.ver=navigator.appVersion
- this.agent=navigator.userAgent
- this.dom=document.getElementById?1:0
- this.opera5=this.agent.indexOf("Opera 5")>-1
- this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0;
- this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
- this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
- this.ie=this.ie4||this.ie5||this.ie6
- this.mac=this.agent.indexOf("Mac")>-1
- this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
- this.ns4=(document.layers && !this.dom)?1:0;
- this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5)
- return this
- }
- var bw = new lib_bwcheck()
- //Makes crossbrowser object.
- function makeObj(obj){
- this.evnt=bw.dom? document.getElementById(obj):bw.ie4?document.all[obj]:bw.ns4?document.layers[obj]:0;
- if(!this.evnt) return false
- this.css=bw.dom||bw.ie4?this.evnt.style:bw.ns4?this.evnt:0;
- this.wref=bw.dom||bw.ie4?this.evnt:bw.ns4?this.css.document:0;
- this.writeIt=b_writeIt;
- return this
- }
- // A unit of measure that will be added when setting the position of a layer.
- //var px = bw.ns4||window.opera?"":"px";
- function b_writeIt(text){
- if (bw.ns4){this.wref.write(text);this.wref.close()}
- else this.wref.innerHTML = text
- }
- //Shows the messages
- var oDesc;
- function popup(divid){
- if(oDesc = new makeObj(divid)){
- oDesc.css.visibility = "visible"
- }
- }
- function popout(){ // Hides message
- if(oDesc) oDesc.css.visibility = "hidden"
- }
- //-->
- </script>
- </head>
- <body>
- <div class=content>
- <br><br>
- <div class=title>'.$this->wsdl->serviceName.'</div>
- <div class=nav>
- <p>View the <a href="'.(isset($GLOBALS['PHP_SELF']) ? $GLOBALS['PHP_SELF'] : $_SERVER['PHP_SELF']).'?wsdl">WSDL</a> for the service.
- Click on an operation name to view it&apos;s details.</p>
- <ul>';
- foreach($this->wsdl->getOperations() as $op => $data){
- $b .= "<li><a href='#' onclick=\"popup('$op')\">$op</a></li>";
- // create hidden div
- $b .= "<div id='$op' class='hidden'>
- <a href='#' onclick='popout()'><font color='#ffffff'>Close</font></a><br><br>";
- foreach($data as $donnie => $marie){ // loop through opdata
- if($donnie == 'input' || $donnie == 'output'){ // show input/output data
- $b .= "<font color='white'>".ucfirst($donnie).':</font><br>';
- foreach($marie as $captain => $tenille){ // loop through data
- if($captain == 'parts'){ // loop thru parts
- $b .= "&nbsp;&nbsp;$captain:<br>";
- //if(is_array($tenille)){
- foreach($tenille as $joanie => $chachi){
- $b .= "&nbsp;&nbsp;&nbsp;&nbsp;$joanie: $chachi<br>";
- }
- //}
- } else {
- $b .= "&nbsp;&nbsp;$captain: $tenille<br>";
- }
- }
- } else {
- $b .= "<font color='white'>".ucfirst($donnie).":</font> $marie<br>";
- }
- }
- $b .= '</div>';
- }
- $b .= '
- <ul>
- </div>
- </div></body></html>';
- return $b;
- }
-
- /**
- * sets up wsdl object
- * this acts as a flag to enable internal WSDL generation
- *
- * @param string $serviceName, name of the service
- * @param string $namespace optional tns namespace
- * @param string $endpoint optional URL of service endpoint
- * @param string $style optional (rpc|document) WSDL style (also specified by operation)
- * @param string $transport optional SOAP transport
- * @param string $schemaTargetNamespace optional targetNamespace for service schema
- */
- function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false)
- {
- $SERVER_NAME = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : $GLOBALS['SERVER_NAME'];
- $SERVER_PORT = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : $GLOBALS['SERVER_PORT'];
- if ($SERVER_PORT == 80) {
- $SERVER_PORT = '';
- } else {
- $SERVER_PORT = ':' . $SERVER_PORT;
- }
- $SCRIPT_NAME = isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : $GLOBALS['SCRIPT_NAME'];
- if(false == $namespace) {
- $namespace = "http://$SERVER_NAME/soap/$serviceName";
- }
-
- if(false == $endpoint) {
- if (isset($_SERVER['HTTPS'])) {
- $HTTPS = $_SERVER['HTTPS'];
- } elseif (isset($GLOBALS['HTTPS'])) {
- $HTTPS = $GLOBALS['HTTPS'];
- } else {
- $HTTPS = '0';
- }
- if ($HTTPS == '1' || $HTTPS == 'on') {
- $SCHEME = 'https';
- } else {
- $SCHEME = 'http';
- }
- $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME";
- }
-
- if(false == $schemaTargetNamespace) {
- $schemaTargetNamespace = $namespace;
- }
-
- $this->wsdl = new wsdl;
- $this->wsdl->serviceName = $serviceName;
- $this->wsdl->endpoint = $endpoint;
- $this->wsdl->namespaces['tns'] = $namespace;
- $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/';
- $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/';
- if ($schemaTargetNamespace != $namespace) {
- $this->wsdl->namespaces['types'] = $schemaTargetNamespace;
- }
- $this->wsdl->schemas[$schemaTargetNamespace][0] = new xmlschema('', '', $this->wsdl->namespaces);
- $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace;
- $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true);
- $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true);
- $this->wsdl->bindings[$serviceName.'Binding'] = array(
- 'name'=>$serviceName.'Binding',
- 'style'=>$style,
- 'transport'=>$transport,
- 'portType'=>$serviceName.'PortType');
- $this->wsdl->ports[$serviceName.'Port'] = array(
- 'binding'=>$serviceName.'Binding',
- 'location'=>$endpoint,
- 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/');
- }
-}
-
-
-
-?><?php
-
-
-
-/**
-* parses a WSDL file, allows access to it's data, other utility methods
-*
-* @author Dietrich Ayala <dietrich@ganx4.com>
-* @access public
-*/
-class wsdl extends nusoap_base {
- // URL or filename of the root of this WSDL
- var $wsdl;
- // define internal arrays of bindings, ports, operations, messages, etc.
- var $schemas = array();
- var $currentSchema;
- var $message = array();
- var $complexTypes = array();
- var $messages = array();
- var $currentMessage;
- var $currentOperation;
- var $portTypes = array();
- var $currentPortType;
- var $bindings = array();
- var $currentBinding;
- var $ports = array();
- var $currentPort;
- var $opData = array();
- var $status = '';
- var $documentation = false;
- var $endpoint = '';
- // array of wsdl docs to import
- var $import = array();
- // parser vars
- var $parser;
- var $position = 0;
- var $depth = 0;
- var $depth_array = array();
- // for getting wsdl
- var $proxyhost = '';
- var $proxyport = '';
- var $proxyusername = '';
- var $proxypassword = '';
- var $timeout = 0;
- var $response_timeout = 30;
-
- /**
- * constructor
- *
- * @param string $wsdl WSDL document URL
- * @param string $proxyhost
- * @param string $proxyport
- * @param string $proxyusername
- * @param string $proxypassword
- * @param integer $timeout set the connection timeout
- * @param integer $response_timeout set the response timeout
- * @access public
- */
- function wsdl($wsdl = '',$proxyhost=false,$proxyport=false,$proxyusername=false,$proxypassword=false,$timeout=0,$response_timeout=30){
- $this->wsdl = $wsdl;
- $this->proxyhost = $proxyhost;
- $this->proxyport = $proxyport;
- $this->proxyusername = $proxyusername;
- $this->proxypassword = $proxypassword;
- $this->timeout = $timeout;
- $this->response_timeout = $response_timeout;
-
- // parse wsdl file
- if ($wsdl != "") {
- $this->debug('initial wsdl URL: ' . $wsdl);
- $this->parseWSDL($wsdl);
- }
- // imports
- // TODO: handle imports more properly, grabbing them in-line and nesting them
- $imported_urls = array();
- $imported = 1;
- while ($imported > 0) {
- $imported = 0;
- // Schema imports
- foreach ($this->schemas as $ns => $list) {
- foreach ($list as $xs) {
- $wsdlparts = parse_url($this->wsdl); // this is bogusly simple!
- foreach ($xs->imports as $ns2 => $list2) {
- for ($ii = 0; $ii < count($list2); $ii++) {
- if (! $list2[$ii]['loaded']) {
- $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true;
- $url = $list2[$ii]['location'];
- if ($url != '') {
- $urlparts = parse_url($url);
- if (!isset($urlparts['host'])) {
- $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] .
- substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path'];
- }
- if (! in_array($url, $imported_urls)) {
- $this->parseWSDL($url);
- $imported++;
- $imported_urls[] = $url;
- }
- } else {
- $this->debug("Unexpected scenario: empty URL for unloaded import");
- }
- }
- }
- }
- }
- }
- // WSDL imports
- $wsdlparts = parse_url($this->wsdl); // this is bogusly simple!
- foreach ($this->import as $ns => $list) {
- for ($ii = 0; $ii < count($list); $ii++) {
- if (! $list[$ii]['loaded']) {
- $this->import[$ns][$ii]['loaded'] = true;
- $url = $list[$ii]['location'];
- if ($url != '') {
- $urlparts = parse_url($url);
- if (!isset($urlparts['host'])) {
- $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] .
- substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path'];
- }
- if (! in_array($url, $imported_urls)) {
- $this->parseWSDL($url);
- $imported++;
- $imported_urls[] = $url;
- }
- } else {
- $this->debug("Unexpected scenario: empty URL for unloaded import");
- }
- }
- }
- }
- }
- // add new data to operation data
- foreach($this->bindings as $binding => $bindingData) {
- if (isset($bindingData['operations']) && is_array($bindingData['operations'])) {
- foreach($bindingData['operations'] as $operation => $data) {
- $this->debug('post-parse data gathering for ' . $operation);
- $this->bindings[$binding]['operations'][$operation]['input'] =
- isset($this->bindings[$binding]['operations'][$operation]['input']) ?
- array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) :
- $this->portTypes[ $bindingData['portType'] ][$operation]['input'];
- $this->bindings[$binding]['operations'][$operation]['output'] =
- isset($this->bindings[$binding]['operations'][$operation]['output']) ?
- array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) :
- $this->portTypes[ $bindingData['portType'] ][$operation]['output'];
- if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])){
- $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ];
- }
- if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])){
- $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ];
- }
- if (isset($bindingData['style'])) {
- $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style'];
- }
- $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : '';
- $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : '';
- $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : '';
- }
- }
- }
- }
-
- /**
- * parses the wsdl document
- *
- * @param string $wsdl path or URL
- * @access private
- */
- function parseWSDL($wsdl = '')
- {
- if ($wsdl == '') {
- $this->debug('no wsdl passed to parseWSDL()!!');
- $this->setError('no wsdl passed to parseWSDL()!!');
- return false;
- }
-
- // parse $wsdl for url format
- $wsdl_props = parse_url($wsdl);
-
- if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) {
- $this->debug('getting WSDL http(s) URL ' . $wsdl);
- // get wsdl
- $tr = new soap_transport_http($wsdl);
- $tr->request_method = 'GET';
- $tr->useSOAPAction = false;
- if($this->proxyhost && $this->proxyport){
- $tr->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword);
- }
- if (isset($wsdl_props['user'])) {
- $tr->setCredentials($wsdl_props['user'],$wsdl_props['pass']);
- }
- $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout);
- //$this->debug("WSDL request\n" . $tr->outgoing_payload);
- //$this->debug("WSDL response\n" . $tr->incoming_payload);
- $this->debug("transport debug data...\n" . $tr->debug_str);
- // catch errors
- if($err = $tr->getError() ){
- $errstr = 'HTTP ERROR: '.$err;
- $this->debug($errstr);
- $this->setError($errstr);
- unset($tr);
- return false;
- }
- unset($tr);
- } else {
- // $wsdl is not http(s), so treat it as a file URL or plain file path
- if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) {
- $path = isset($wsdl_props['host']) ? ($wsdl_props['host'] . ':' . $wsdl_props['path']) : $wsdl_props['path'];
- } else {
- $path = $wsdl;
- }
- $this->debug('getting WSDL file ' . $path);
- if ($fp = @fopen($path, 'r')) {
- $wsdl_string = '';
- while ($data = fread($fp, 32768)) {
- $wsdl_string .= $data;
- }
- fclose($fp);
- } else {
- $errstr = "Bad path to WSDL file $path";
- $this->debug($errstr);
- $this->setError($errstr);
- return false;
- }
- }
- // end new code added
- // Create an XML parser.
- $this->parser = xml_parser_create();
- // Set the options for parsing the XML data.
- // xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
- xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
- // Set the object for the parser.
- xml_set_object($this->parser, $this);
- // Set the element handlers for the parser.
- xml_set_element_handler($this->parser, 'start_element', 'end_element');
- xml_set_character_data_handler($this->parser, 'character_data');
- // Parse the XML file.
- if (!xml_parse($this->parser, $wsdl_string, true)) {
- // Display an error message.
- $errstr = sprintf(
- 'XML error parsing WSDL from %s on line %d: %s',
- $wsdl,
- xml_get_current_line_number($this->parser),
- xml_error_string(xml_get_error_code($this->parser))
- );
- $this->debug($errstr);
- $this->debug("XML payload:\n" . $wsdl_string);
- $this->setError($errstr);
- return false;
- }
- // free the parser
- xml_parser_free($this->parser);
- // catch wsdl parse errors
- if($this->getError()){
- return false;
- }
- return true;
- }
-
- /**
- * start-element handler
- *
- * @param string $parser XML parser object
- * @param string $name element name
- * @param string $attrs associative array of attributes
- * @access private
- */
- function start_element($parser, $name, $attrs)
- {
- if ($this->status == 'schema') {
- $this->currentSchema->schemaStartElement($parser, $name, $attrs);
- $this->debug_str .= $this->currentSchema->debug_str;
- $this->currentSchema->debug_str = '';
- } elseif (ereg('schema$', $name)) {
- // $this->debug("startElement for $name ($attrs[name]). status = $this->status (".$this->getLocalPart($name).")");
- $this->status = 'schema';
- $this->currentSchema = new xmlschema('', '', $this->namespaces);
- $this->currentSchema->schemaStartElement($parser, $name, $attrs);
- $this->debug_str .= $this->currentSchema->debug_str;
- $this->currentSchema->debug_str = '';
- } else {
- // position in the total number of elements, starting from 0
- $pos = $this->position++;
- $depth = $this->depth++;
- // set self as current value for this depth
- $this->depth_array[$depth] = $pos;
- $this->message[$pos] = array('cdata' => '');
- // get element prefix
- if (ereg(':', $name)) {
- // get ns prefix
- $prefix = substr($name, 0, strpos($name, ':'));
- // get ns
- $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] : '';
- // get unqualified name
- $name = substr(strstr($name, ':'), 1);
- }
-
- if (count($attrs) > 0) {
- foreach($attrs as $k => $v) {
- // if ns declarations, add to class level array of valid namespaces
- if (ereg("^xmlns", $k)) {
- if ($ns_prefix = substr(strrchr($k, ':'), 1)) {
- $this->namespaces[$ns_prefix] = $v;
- } else {
- $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v;
- }
- if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema') {
- $this->XMLSchemaVersion = $v;
- $this->namespaces['xsi'] = $v . '-instance';
- }
- } //
- // expand each attribute
- $k = strpos($k, ':') ? $this->expandQname($k) : $k;
- if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') {
- $v = strpos($v, ':') ? $this->expandQname($v) : $v;
- }
- $eAttrs[$k] = $v;
- }
- $attrs = $eAttrs;
- } else {
- $attrs = array();
- }
- // find status, register data
- switch ($this->status) {
- case 'message':
- if ($name == 'part') {
- if (isset($attrs['type'])) {
- $this->debug("msg " . $this->currentMessage . ": found part $attrs[name]: " . implode(',', $attrs));
- $this->messages[$this->currentMessage][$attrs['name']] = $attrs['type'];
- }
- if (isset($attrs['element'])) {
- $this->messages[$this->currentMessage][$attrs['name']] = $attrs['element'];
- }
- }
- break;
- case 'portType':
- switch ($name) {
- case 'operation':
- $this->currentPortOperation = $attrs['name'];
- $this->debug("portType $this->currentPortType operation: $this->currentPortOperation");
- if (isset($attrs['parameterOrder'])) {
- $this->portTypes[$this->currentPortType][$attrs['name']]['parameterOrder'] = $attrs['parameterOrder'];
- }
- break;
- case 'documentation':
- $this->documentation = true;
- break;
- // merge input/output data
- default:
- $m = isset($attrs['message']) ? $this->getLocalPart($attrs['message']) : '';
- $this->portTypes[$this->currentPortType][$this->currentPortOperation][$name]['message'] = $m;
- break;
- }
- break;
- case 'binding':
- switch ($name) {
- case 'binding':
- // get ns prefix
- if (isset($attrs['style'])) {
- $this->bindings[$this->currentBinding]['prefix'] = $prefix;
- }
- $this->bindings[$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs);
- break;
- case 'header':
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs;
- break;
- case 'operation':
- if (isset($attrs['soapAction'])) {
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction'] = $attrs['soapAction'];
- }
- if (isset($attrs['style'])) {
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['style'] = $attrs['style'];
- }
- if (isset($attrs['name'])) {
- $this->currentOperation = $attrs['name'];
- $this->debug("current binding operation: $this->currentOperation");
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['name'] = $attrs['name'];
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['binding'] = $this->currentBinding;
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['endpoint'] = isset($this->bindings[$this->currentBinding]['endpoint']) ? $this->bindings[$this->currentBinding]['endpoint'] : '';
- }
- break;
- case 'input':
- $this->opStatus = 'input';
- break;
- case 'output':
- $this->opStatus = 'output';
- break;
- case 'body':
- if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) {
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = array_merge($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus], $attrs);
- } else {
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = $attrs;
- }
- break;
- }
- break;
- case 'service':
- switch ($name) {
- case 'port':
- $this->currentPort = $attrs['name'];
- $this->debug('current port: ' . $this->currentPort);
- $this->ports[$this->currentPort]['binding'] = $this->getLocalPart($attrs['binding']);
-
- break;
- case 'address':
- $this->ports[$this->currentPort]['location'] = $attrs['location'];
- $this->ports[$this->currentPort]['bindingType'] = $namespace;
- $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['bindingType'] = $namespace;
- $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['endpoint'] = $attrs['location'];
- break;
- }
- break;
- }
- // set status
- switch ($name) {
- case 'import':
- if (isset($attrs['location'])) {
- $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false);
- $this->debug('parsing import ' . $attrs['namespace']. ' - ' . $attrs['location'] . ' (' . count($this->import[$attrs['namespace']]).')');
- } else {
- $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true);
- if (! $this->getPrefixFromNamespace($attrs['namespace'])) {
- $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace'];
- }
- $this->debug('parsing import ' . $attrs['namespace']. ' - [no location] (' . count($this->import[$attrs['namespace']]).')');
- }
- break;
- //wait for schema
- //case 'types':
- // $this->status = 'schema';
- // break;
- case 'message':
- $this->status = 'message';
- $this->messages[$attrs['name']] = array();
- $this->currentMessage = $attrs['name'];
- break;
- case 'portType':
- $this->status = 'portType';
- $this->portTypes[$attrs['name']] = array();
- $this->currentPortType = $attrs['name'];
- break;
- case "binding":
- if (isset($attrs['name'])) {
- // get binding name
- if (strpos($attrs['name'], ':')) {
- $this->currentBinding = $this->getLocalPart($attrs['name']);
- } else {
- $this->currentBinding = $attrs['name'];
- }
- $this->status = 'binding';
- $this->bindings[$this->currentBinding]['portType'] = $this->getLocalPart($attrs['type']);
- $this->debug("current binding: $this->currentBinding of portType: " . $attrs['type']);
- }
- break;
- case 'service':
- $this->serviceName = $attrs['name'];
- $this->status = 'service';
- $this->debug('current service: ' . $this->serviceName);
- break;
- case 'definitions':
- foreach ($attrs as $name => $value) {
- $this->wsdl_info[$name] = $value;
- }
- break;
- }
- }
- }
-
- /**
- * end-element handler
- *
- * @param string $parser XML parser object
- * @param string $name element name
- * @access private
- */
- function end_element($parser, $name){
- // unset schema status
- if (/*ereg('types$', $name) ||*/ ereg('schema$', $name)) {
- $this->status = "";
- $this->schemas[$this->currentSchema->schemaTargetNamespace][] = $this->currentSchema;
- }
- if ($this->status == 'schema') {
- $this->currentSchema->schemaEndElement($parser, $name);
- } else {
- // bring depth down a notch
- $this->depth--;
- }
- // end documentation
- if ($this->documentation) {
- //TODO: track the node to which documentation should be assigned; it can be a part, message, etc.
- //$this->portTypes[$this->currentPortType][$this->currentPortOperation]['documentation'] = $this->documentation;
- $this->documentation = false;
- }
- }
-
- /**
- * element content handler
- *
- * @param string $parser XML parser object
- * @param string $data element content
- * @access private
- */
- function character_data($parser, $data)
- {
- $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[$this->depth] : 0;
- if (isset($this->message[$pos]['cdata'])) {
- $this->message[$pos]['cdata'] .= $data;
- }
- if ($this->documentation) {
- $this->documentation .= $data;
- }
- }
-
- function getBindingData($binding)
- {
- if (is_array($this->bindings[$binding])) {
- return $this->bindings[$binding];
- }
- }
-
- /**
- * returns an assoc array of operation names => operation data
- *
- * @param string $bindingType eg: soap, smtp, dime (only soap is currently supported)
- * @return array
- * @access public
- */
- function getOperations($bindingType = 'soap')
- {
- $ops = array();
- if ($bindingType == 'soap') {
- $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/';
- }
- // loop thru ports
- foreach($this->ports as $port => $portData) {
- // binding type of port matches parameter
- if ($portData['bindingType'] == $bindingType) {
- //$this->debug("getOperations for port $port");
- //$this->debug("port data: " . $this->varDump($portData));
- //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ]));
- // merge bindings
- if (isset($this->bindings[ $portData['binding'] ]['operations'])) {
- $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']);
- }
- }
- }
- return $ops;
- }
-
- /**
- * returns an associative array of data necessary for calling an operation
- *
- * @param string $operation , name of operation
- * @param string $bindingType , type of binding eg: soap
- * @return array
- * @access public
- */
- function getOperationData($operation, $bindingType = 'soap')
- {
- if ($bindingType == 'soap') {
- $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/';
- }
- // loop thru ports
- foreach($this->ports as $port => $portData) {
- // binding type of port matches parameter
- if ($portData['bindingType'] == $bindingType) {
- // get binding
- //foreach($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) {
- foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) {
- if ($operation == $bOperation) {
- $opData = $this->bindings[ $portData['binding'] ]['operations'][$operation];
- return $opData;
- }
- }
- }
- }
- }
-
- /**
- * returns an array of information about a given type
- * returns false if no type exists by the given name
- *
- * typeDef = array(
- * 'elements' => array(), // refs to elements array
- * 'restrictionBase' => '',
- * 'phpType' => '',
- * 'order' => '(sequence|all)',
- * 'attrs' => array() // refs to attributes array
- * )
- *
- * @param $type string
- * @param $ns string
- * @return mixed
- * @access public
- * @see xmlschema
- */
- function getTypeDef($type, $ns) {
- if ((! $ns) && isset($this->namespaces['tns'])) {
- $ns = $this->namespaces['tns'];
- }
- if (isset($this->schemas[$ns])) {
- foreach ($this->schemas[$ns] as $xs) {
- $t = $xs->getTypeDef($type);
- $this->debug_str .= $xs->debug_str;
- $xs->debug_str = '';
- if ($t) {
- return $t;
- }
- }
- }
- return false;
- }
-
- /**
- * serialize the parsed wsdl
- *
- * @return string , serialization of WSDL
- * @access public
- */
- function serialize()
- {
- $xml = '<?xml version="1.0" encoding="ISO-8859-1"?><definitions';
- foreach($this->namespaces as $k => $v) {
- $xml .= " xmlns:$k=\"$v\"";
- }
- // 10.9.02 - add poulter fix for wsdl and tns declarations
- if (isset($this->namespaces['wsdl'])) {
- $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\"";
- }
- if (isset($this->namespaces['tns'])) {
- $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\"";
- }
- $xml .= '>';
- // imports
- if (sizeof($this->import) > 0) {
- foreach($this->import as $ns => $list) {
- foreach ($list as $ii) {
- if ($ii['location'] != '') {
- $xml .= '<import location="' . $ii['location'] . '" namespace="' . $ns . '" />';
- } else {
- $xml .= '<import namespace="' . $ns . '" />';
- }
- }
- }
- }
- // types
- if (count($this->schemas)>=1) {
- $xml .= '<types>';
- foreach ($this->schemas as $ns => $list) {
- foreach ($list as $xs) {
- $xml .= $xs->serializeSchema();
- }
- }
- $xml .= '</types>';
- }
- // messages
- if (count($this->messages) >= 1) {
- foreach($this->messages as $msgName => $msgParts) {
- $xml .= '<message name="' . $msgName . '">';
- if(is_array($msgParts)){
- foreach($msgParts as $partName => $partType) {
- // print 'serializing '.$partType.', sv: '.$this->XMLSchemaVersion.'<br>';
- if (strpos($partType, ':')) {
- $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType));
- } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) {
- // print 'checking typemap: '.$this->XMLSchemaVersion.'<br>';
- $typePrefix = 'xsd';
- } else {
- foreach($this->typemap as $ns => $types) {
- if (isset($types[$partType])) {
- $typePrefix = $this->getPrefixFromNamespace($ns);
- }
- }
- if (!isset($typePrefix)) {
- die("$partType has no namespace!");
- }
- }
- $xml .= '<part name="' . $partName . '" type="' . $typePrefix . ':' . $this->getLocalPart($partType) . '" />';
- }
- }
- $xml .= '</message>';
- }
- }
- // bindings & porttypes
- if (count($this->bindings) >= 1) {
- $binding_xml = '';
- $portType_xml = '';
- foreach($this->bindings as $bindingName => $attrs) {
- $binding_xml .= '<binding name="' . $bindingName . '" type="tns:' . $attrs['portType'] . '">';
- $binding_xml .= '<soap:binding style="' . $attrs['style'] . '" transport="' . $attrs['transport'] . '"/>';
- $portType_xml .= '<portType name="' . $attrs['portType'] . '">';
- foreach($attrs['operations'] as $opName => $opParts) {
- $binding_xml .= '<operation name="' . $opName . '">';
- $binding_xml .= '<soap:operation soapAction="' . $opParts['soapAction'] . '" style="'. $attrs['style'] . '"/>';
- if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') {
- $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"';
- } else {
- $enc_style = '';
- }
- $binding_xml .= '<input><soap:body use="' . $opParts['input']['use'] . '" namespace="' . $opParts['input']['namespace'] . '"' . $enc_style . '/></input>';
- if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') {
- $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"';
- } else {
- $enc_style = '';
- }
- $binding_xml .= '<output><soap:body use="' . $opParts['output']['use'] . '" namespace="' . $opParts['output']['namespace'] . '"' . $enc_style . '/></output>';
- $binding_xml .= '</operation>';
- $portType_xml .= '<operation name="' . $opParts['name'] . '"';
- if (isset($opParts['parameterOrder'])) {
- $portType_xml .= ' parameterOrder="' . $opParts['parameterOrder'] . '"';
- }
- $portType_xml .= '>';
- if(isset($opParts['documentation']) && $opParts['documentation'] != '') {
- $portType_xml .= '<documentation>' . htmlspecialchars($opParts['documentation']) . '</documentation>';
- }
- $portType_xml .= '<input message="tns:' . $opParts['input']['message'] . '"/>';
- $portType_xml .= '<output message="tns:' . $opParts['output']['message'] . '"/>';
- $portType_xml .= '</operation>';
- }
- $portType_xml .= '</portType>';
- $binding_xml .= '</binding>';
- }
- $xml .= $portType_xml . $binding_xml;
- }
- // services
- $xml .= '<service name="' . $this->serviceName . '">';
- if (count($this->ports) >= 1) {
- foreach($this->ports as $pName => $attrs) {
- $xml .= '<port name="' . $pName . '" binding="tns:' . $attrs['binding'] . '">';
- $xml .= '<soap:address location="' . $attrs['location'] . '"/>';
- $xml .= '</port>';
- }
- }
- $xml .= '</service>';
- return $xml . '</definitions>';
- }
-
- /**
- * serialize a PHP value according to a WSDL message definition
- *
- * TODO
- * - multi-ref serialization
- * - validate PHP values against type definitions, return errors if invalid
- *
- * @param string $ type name
- * @param mixed $ param value
- * @return mixed new param or false if initial value didn't validate
- */
- function serializeRPCParameters($operation, $direction, $parameters)
- {
- $this->debug('in serializeRPCParameters with operation '.$operation.', direction '.$direction.' and '.count($parameters).' param(s), and xml schema version ' . $this->XMLSchemaVersion);
-
- if ($direction != 'input' && $direction != 'output') {
- $this->debug('The value of the \$direction argument needs to be either "input" or "output"');
- $this->setError('The value of the \$direction argument needs to be either "input" or "output"');
- return false;
- }
- if (!$opData = $this->getOperationData($operation)) {
- $this->debug('Unable to retrieve WSDL data for operation: ' . $operation);
- $this->setError('Unable to retrieve WSDL data for operation: ' . $operation);
- return false;
- }
- $this->debug($this->varDump($opData));
-
- // Get encoding style for output and set to current
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) {
- $encodingStyle = $opData['output']['encodingStyle'];
- $enc_style = $encodingStyle;
- }
-
- // set input params
- $xml = '';
- if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) {
-
- $use = $opData[$direction]['use'];
- $this->debug("use=$use");
- $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)');
- if (is_array($parameters)) {
- $parametersArrayType = $this->isArraySimpleOrStruct($parameters);
- $this->debug('have ' . $parametersArrayType . ' parameters');
- foreach($opData[$direction]['parts'] as $name => $type) {
- $this->debug('serializing part "'.$name.'" of type "'.$type.'"');
- // Track encoding style
- if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) {
- $encodingStyle = $opData[$direction]['encodingStyle'];
- $enc_style = $encodingStyle;
- } else {
- $enc_style = false;
- }
- // NOTE: add error handling here
- // if serializeType returns false, then catch global error and fault
- if ($parametersArrayType == 'arraySimple') {
- $p = array_shift($parameters);
- $this->debug('calling serializeType w/indexed param');
- $xml .= $this->serializeType($name, $type, $p, $use, $enc_style);
- } elseif (isset($parameters[$name])) {
- $this->debug('calling serializeType w/named param');
- $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style);
- } else {
- // TODO: only send nillable
- $this->debug('calling serializeType w/null param');
- $xml .= $this->serializeType($name, $type, null, $use, $enc_style);
- }
- }
- } else {
- $this->debug('no parameters passed.');
- }
- }
- return $xml;
- }
-
- /**
- * serialize a PHP value according to a WSDL message definition
- *
- * TODO
- * - multi-ref serialization
- * - validate PHP values against type definitions, return errors if invalid
- *
- * @param string $ type name
- * @param mixed $ param value
- * @return mixed new param or false if initial value didn't validate
- */
- function serializeParameters($operation, $direction, $parameters)
- {
- $this->debug('in serializeParameters with operation '.$operation.', direction '.$direction.' and '.count($parameters).' param(s), and xml schema version ' . $this->XMLSchemaVersion);
-
- if ($direction != 'input' && $direction != 'output') {
- $this->debug('The value of the \$direction argument needs to be either "input" or "output"');
- $this->setError('The value of the \$direction argument needs to be either "input" or "output"');
- return false;
- }
- if (!$opData = $this->getOperationData($operation)) {
- $this->debug('Unable to retrieve WSDL data for operation: ' . $operation);
- $this->setError('Unable to retrieve WSDL data for operation: ' . $operation);
- return false;
- }
- $this->debug($this->varDump($opData));
-
- // Get encoding style for output and set to current
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) {
- $encodingStyle = $opData['output']['encodingStyle'];
- $enc_style = $encodingStyle;
- }
-
- // set input params
- $xml = '';
- if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) {
-
- $use = $opData[$direction]['use'];
- $this->debug("use=$use");
- $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)');
- if (is_array($parameters)) {
- $parametersArrayType = $this->isArraySimpleOrStruct($parameters);
- $this->debug('have ' . $parametersArrayType . ' parameters');
- foreach($opData[$direction]['parts'] as $name => $type) {
- $this->debug('serializing part "'.$name.'" of type "'.$type.'"');
- // Track encoding style
- if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) {
- $encodingStyle = $opData[$direction]['encodingStyle'];
- $enc_style = $encodingStyle;
- } else {
- $enc_style = false;
- }
- // NOTE: add error handling here
- // if serializeType returns false, then catch global error and fault
- if ($parametersArrayType == 'arraySimple') {
- $p = array_shift($parameters);
- $this->debug('calling serializeType w/indexed param');
- $xml .= $this->serializeType($name, $type, $p, $use, $enc_style);
- } elseif (isset($parameters[$name])) {
- $this->debug('calling serializeType w/named param');
- $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style);
- } else {
- // TODO: only send nillable
- $this->debug('calling serializeType w/null param');
- $xml .= $this->serializeType($name, $type, null, $use, $enc_style);
- }
- }
- } else {
- $this->debug('no parameters passed.');
- }
- }
- return $xml;
- }
-
- /**
- * serializes a PHP value according a given type definition
- *
- * @param string $name , name of type (part)
- * @param string $type , type of type, heh (type or element)
- * @param mixed $value , a native PHP value (parameter value)
- * @param string $use , use for part (encoded|literal)
- * @param string $encodingStyle , use to add encoding changes to serialisation
- * @return string serialization
- * @access public
- */
- function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false)
- {
- $this->debug("in serializeType: $name, $type, $value, $use, $encodingStyle");
- if($use == 'encoded' && $encodingStyle) {
- $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"';
- }
-
- // if a soap_val has been supplied, let its type override the WSDL
- if (is_object($value) && get_class($value) == 'soapval') {
- // TODO: get attributes from soapval?
- if ($value->type_ns) {
- $type = $value->type_ns . ':' . $value->type;
- } else {
- $type = $value->type;
- }
- $value = $value->value;
- $forceType = true;
- $this->debug("in serializeType: soapval overrides type to $type, value to $value");
- } else {
- $forceType = false;
- }
-
- $xml = '';
- if (strpos($type, ':')) {
- $uqType = substr($type, strrpos($type, ':') + 1);
- $ns = substr($type, 0, strrpos($type, ':'));
- $this->debug("got a prefixed type: $uqType, $ns");
- if ($this->getNamespaceFromPrefix($ns)) {
- $ns = $this->getNamespaceFromPrefix($ns);
- $this->debug("expanded prefixed type: $uqType, $ns");
- }
-
- if($ns == $this->XMLSchemaVersion){
-
- if (is_null($value)) {
- if ($use == 'literal') {
- // TODO: depends on nillable
- return "<$name/>";
- } else {
- return "<$name xsi:nil=\"true\"/>";
- }
- }
- if ($uqType == 'boolean' && !$value) {
- $value = 'false';
- } elseif ($uqType == 'boolean') {
- $value = 'true';
- }
- if ($uqType == 'string' && gettype($value) == 'string') {
- $value = $this->expandEntities($value);
- }
- // it's a scalar
- // TODO: what about null/nil values?
- // check type isn't a custom type extending xmlschema namespace
- if (!$this->getTypeDef($uqType, $ns)) {
- if ($use == 'literal') {
- if ($forceType) {
- return "<$name xsi:type=\"" . $this->getPrefixFromNamespace($this->XMLSchemaVersion) . ":$uqType\">$value</$name>";
- } else {
- return "<$name>$value</$name>";
- }
- } else {
- return "<$name xsi:type=\"" . $this->getPrefixFromNamespace($this->XMLSchemaVersion) . ":$uqType\"$encodingStyle>$value</$name>";
- }
- }
- } else if ($ns == 'http://xml.apache.org/xml-soap') {
- if ($uqType == 'Map') {
- $contents = '';
- foreach($value as $k => $v) {
- $this->debug("serializing map element: key $k, value $v");
- $contents .= '<item>';
- $contents .= $this->serialize_val($k,'key',false,false,false,false,$use);
- $contents .= $this->serialize_val($v,'value',false,false,false,false,$use);
- $contents .= '</item>';
- }
- if ($use == 'literal') {
- if ($forceType) {
- return "<$name xsi:type=\"" . $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap') . ":$uqType\">$contents</$name>";
- } else {
- return "<$name>$contents</$name>";
- }
- } else {
- return "<$name xsi:type=\"" . $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap') . ":$uqType\"$encodingStyle>$contents</$name>";
- }
- }
- }
- } else {
- $this->debug("No namespace for type $type");
- $ns = '';
- $uqType = $type;
- }
- if(!$typeDef = $this->getTypeDef($uqType, $ns)){
- $this->setError("$type ($uqType) is not a supported type.");
- $this->debug("$type ($uqType) is not a supported type.");
- return false;
- } else {
- foreach($typeDef as $k => $v) {
- $this->debug("typedef, $k: $v");
- }
- }
- $phpType = $typeDef['phpType'];
- $this->debug("serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') );
- // if php type == struct, map value to the <all> element names
- if ($phpType == 'struct') {
- if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') {
- $elementName = $uqType;
- if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
- $elementNS = " xmlns=\"$ns\"";
- }
- } else {
- $elementName = $name;
- $elementNS = '';
- }
- if (is_null($value)) {
- if ($use == 'literal') {
- // TODO: depends on nillable
- return "<$elementName$elementNS/>";
- } else {
- return "<$elementName$elementNS xsi:nil=\"true\"/>";
- }
- }
- if ($use == 'literal') {
- if ($forceType) {
- $xml = "<$elementName$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">";
- } else {
- $xml = "<$elementName$elementNS>";
- }
- } else {
- $xml = "<$elementName$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>";
- }
-
- if (isset($typeDef['elements']) && is_array($typeDef['elements'])) {
- if (is_array($value)) {
- $xvalue = $value;
- } elseif (is_object($value)) {
- $xvalue = get_object_vars($value);
- } else {
- $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType");
- $xvalue = array();
- }
- // toggle whether all elements are present - ideally should validate against schema
- if(count($typeDef['elements']) != count($xvalue)){
- $optionals = true;
- }
- foreach($typeDef['elements'] as $eName => $attrs) {
- // if user took advantage of a minOccurs=0, then only serialize named parameters
- if(isset($optionals) && !isset($xvalue[$eName])){
- // do nothing
- } else {
- // get value
- if (isset($xvalue[$eName])) {
- $v = $xvalue[$eName];
- } else {
- $v = null;
- }
- // TODO: if maxOccurs > 1 (not just unbounded), then allow serialization of an array
- if (isset($attrs['maxOccurs']) && $attrs['maxOccurs'] == 'unbounded' && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') {
- $vv = $v;
- foreach ($vv as $k => $v) {
- if (isset($attrs['type'])) {
- // serialize schema-defined type
- $xml .= $this->serializeType($eName, $attrs['type'], $v, $use, $encodingStyle);
- } else {
- // serialize generic type
- $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use");
- $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use);
- }
- }
- } else {
- if (isset($attrs['type'])) {
- // serialize schema-defined type
- $xml .= $this->serializeType($eName, $attrs['type'], $v, $use, $encodingStyle);
- } else {
- // serialize generic type
- $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use");
- $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use);
- }
- }
- }
- }
- } else {
- $this->debug("Expected elements for XML Schema type $ns:$uqType");
- }
- $xml .= "</$elementName>";
- } elseif ($phpType == 'array') {
- if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
- $elementNS = " xmlns=\"$ns\"";
- } else {
- $elementNS = '';
- }
- if (is_null($value)) {
- if ($use == 'literal') {
- // TODO: depends on nillable
- return "<$name$elementNS/>";
- } else {
- return "<$name$elementNS xsi:nil=\"true\"/>";
- }
- }
- if (isset($typeDef['multidimensional'])) {
- $nv = array();
- foreach($value as $v) {
- $cols = ',' . sizeof($v);
- $nv = array_merge($nv, $v);
- }
- $value = $nv;
- } else {
- $cols = '';
- }
- if (is_array($value) && sizeof($value) >= 1) {
- $rows = sizeof($value);
- $contents = '';
- foreach($value as $k => $v) {
- $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]");
- //if (strpos($typeDef['arrayType'], ':') ) {
- if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) {
- $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use);
- } else {
- $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use);
- }
- }
- $this->debug('contents: '.$this->varDump($contents));
- } else {
- $rows = 0;
- $contents = null;
- }
- // TODO: for now, an empty value will be serialized as a zero element
- // array. Revisit this when coding the handling of null/nil values.
- if ($use == 'literal') {
- $xml = "<$name$elementNS>"
- .$contents
- ."</$name>";
- } else {
- $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '.
- $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/')
- .':arrayType="'
- .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType']))
- .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">"
- .$contents
- ."</$name>";
- }
- } elseif ($phpType == 'scalar') {
- if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
- $elementNS = " xmlns=\"$ns\"";
- } else {
- $elementNS = '';
- }
- if ($use == 'literal') {
- if ($forceType) {
- return "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value</$name>";
- } else {
- return "<$name$elementNS>$value</$name>";
- }
- } else {
- return "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value</$name>";
- }
- }
- $this->debug('returning: '.$this->varDump($xml));
- return $xml;
- }
-
- /**
- * adds an XML Schema complex type to the WSDL types
- *
- * @param name
- * @param typeClass (complexType|simpleType|attribute)
- * @param phpType: currently supported are array and struct (php assoc array)
- * @param compositor (all|sequence|choice)
- * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
- * @param elements = array ( name = array(name=>'',type=>'') )
- * @param attrs = array(
- * array(
- * 'ref' => "http://schemas.xmlsoap.org/soap/encoding/:arrayType",
- * "http://schemas.xmlsoap.org/wsdl/:arrayType" => "string[]"
- * )
- * )
- * @param arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string)
- * @see xmlschema
- *
- */
- function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') {
- if (count($elements) > 0) {
- foreach($elements as $n => $e){
- // expand each element
- foreach ($e as $k => $v) {
- $k = strpos($k,':') ? $this->expandQname($k) : $k;
- $v = strpos($v,':') ? $this->expandQname($v) : $v;
- $ee[$k] = $v;
- }
- $eElements[$n] = $ee;
- }
- $elements = $eElements;
- }
-
- if (count($attrs) > 0) {
- foreach($attrs as $n => $a){
- // expand each attribute
- foreach ($a as $k => $v) {
- $k = strpos($k,':') ? $this->expandQname($k) : $k;
- $v = strpos($v,':') ? $this->expandQname($v) : $v;
- $aa[$k] = $v;
- }
- $eAttrs[$n] = $aa;
- }
- $attrs = $eAttrs;
- }
-
- $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase;
- $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType;
-
- $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
- $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType);
- }
-
- /**
- * adds an XML Schema simple type to the WSDL types
- *
- * @param name
- * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
- * @param typeClass (simpleType)
- * @param phpType: (scalar)
- * @see xmlschema
- *
- */
- function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar') {
- $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase;
-
- $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
- $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType);
- }
-
- /**
- * register a service with the server
- *
- * @param string $methodname
- * @param string $in assoc array of input values: key = param name, value = param type
- * @param string $out assoc array of output values: key = param name, value = param type
- * @param string $namespace optional The namespace for the operation
- * @param string $soapaction optional The soapaction for the operation
- * @param string $style (rpc|document) optional The style for the operation
- * @param string $use (encoded|literal) optional The use for the parameters (cannot mix right now)
- * @param string $documentation optional The description to include in the WSDL
- * @access public
- */
- function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = ''){
- if ($style == 'rpc' && $use == 'encoded') {
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- } else {
- $encodingStyle = '';
- }
- // get binding
- $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] =
- array(
- 'name' => $name,
- 'binding' => $this->serviceName . 'Binding',
- 'endpoint' => $this->endpoint,
- 'soapAction' => $soapaction,
- 'style' => $style,
- 'input' => array(
- 'use' => $use,
- 'namespace' => $namespace,
- 'encodingStyle' => $encodingStyle,
- 'message' => $name . 'Request',
- 'parts' => $in),
- 'output' => array(
- 'use' => $use,
- 'namespace' => $namespace,
- 'encodingStyle' => $encodingStyle,
- 'message' => $name . 'Response',
- 'parts' => $out),
- 'namespace' => $namespace,
- 'transport' => 'http://schemas.xmlsoap.org/soap/http',
- 'documentation' => $documentation);
- // add portTypes
- // add messages
- if($in)
- {
- foreach($in as $pName => $pType)
- {
- if(strpos($pType,':')) {
- $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType);
- }
- $this->messages[$name.'Request'][$pName] = $pType;
- }
- } else {
- $this->messages[$name.'Request']= '0';
- }
- if($out)
- {
- foreach($out as $pName => $pType)
- {
- if(strpos($pType,':')) {
- $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType);
- }
- $this->messages[$name.'Response'][$pName] = $pType;
- }
- } else {
- $this->messages[$name.'Response']= '0';
- }
- return true;
- }
-}
-?><?php
-
-
-
-/**
-*
-* soap_parser class parses SOAP XML messages into native PHP values
-*
-* @author Dietrich Ayala <dietrich@ganx4.com>
-* @access public
-*/
-class soap_parser extends nusoap_base {
-
- var $xml = '';
- var $xml_encoding = '';
- var $method = '';
- var $root_struct = '';
- var $root_struct_name = '';
- var $root_struct_namespace = '';
- var $root_header = '';
- var $document = ''; // incoming SOAP body (text)
- // determines where in the message we are (envelope,header,body,method)
- var $status = '';
- var $position = 0;
- var $depth = 0;
- var $default_namespace = '';
- var $namespaces = array();
- var $message = array();
- var $parent = '';
- var $fault = false;
- var $fault_code = '';
- var $fault_str = '';
- var $fault_detail = '';
- var $depth_array = array();
- var $debug_flag = true;
- var $soapresponse = NULL;
- var $responseHeaders = ''; // incoming SOAP headers (text)
- var $body_position = 0;
- // for multiref parsing:
- // array of id => pos
- var $ids = array();
- // array of id => hrefs => pos
- var $multirefs = array();
- // toggle for auto-decoding element content
- var $decode_utf8 = true;
-
- /**
- * constructor
- *
- * @param string $xml SOAP message
- * @param string $encoding character encoding scheme of message
- * @param string $method
- * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1
- * @access public
- */
- function soap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){
- $this->xml = $xml;
- $this->xml_encoding = $encoding;
- $this->method = $method;
- $this->decode_utf8 = $decode_utf8;
-
- // Check whether content has been read.
- if(!empty($xml)){
- $this->debug('Entering soap_parser(), length='.strlen($xml).', encoding='.$encoding);
- // Create an XML parser - why not xml_parser_create_ns?
- $this->parser = xml_parser_create($this->xml_encoding);
- // Set the options for parsing the XML data.
- //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
- xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
- xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding);
- // Set the object for the parser.
- xml_set_object($this->parser, $this);
- // Set the element handlers for the parser.
- xml_set_element_handler($this->parser, 'start_element','end_element');
- xml_set_character_data_handler($this->parser,'character_data');
-
- // Parse the XML file.
- if(!xml_parse($this->parser,$xml,true)){
- // Display an error message.
- $err = sprintf('XML error parsing SOAP payload on line %d: %s',
- xml_get_current_line_number($this->parser),
- xml_error_string(xml_get_error_code($this->parser)));
- $this->debug($err);
- $this->debug("XML payload:\n" . $xml);
- $this->setError($err);
- } else {
- $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name);
- // get final value
- $this->soapresponse = $this->message[$this->root_struct]['result'];
- // get header value: no, because this is documented as XML string
-// if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){
-// $this->responseHeaders = $this->message[$this->root_header]['result'];
-// }
- // resolve hrefs/ids
- if(sizeof($this->multirefs) > 0){
- foreach($this->multirefs as $id => $hrefs){
- $this->debug('resolving multirefs for id: '.$id);
- $idVal = $this->buildVal($this->ids[$id]);
- foreach($hrefs as $refPos => $ref){
- $this->debug('resolving href at pos '.$refPos);
- $this->multirefs[$id][$refPos] = $idVal;
- }
- }
- }
- }
- xml_parser_free($this->parser);
- } else {
- $this->debug('xml was empty, didn\'t parse!');
- $this->setError('xml was empty, didn\'t parse!');
- }
- }
-
- /**
- * start-element handler
- *
- * @param string $parser XML parser object
- * @param string $name element name
- * @param string $attrs associative array of attributes
- * @access private
- */
- function start_element($parser, $name, $attrs) {
- // position in a total number of elements, starting from 0
- // update class level pos
- $pos = $this->position++;
- // and set mine
- $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>'');
- // depth = how many levels removed from root?
- // set mine as current global depth and increment global depth value
- $this->message[$pos]['depth'] = $this->depth++;
-
- // else add self as child to whoever the current parent is
- if($pos != 0){
- $this->message[$this->parent]['children'] .= '|'.$pos;
- }
- // set my parent
- $this->message[$pos]['parent'] = $this->parent;
- // set self as current parent
- $this->parent = $pos;
- // set self as current value for this depth
- $this->depth_array[$this->depth] = $pos;
- // get element prefix
- if(strpos($name,':')){
- // get ns prefix
- $prefix = substr($name,0,strpos($name,':'));
- // get unqualified name
- $name = substr(strstr($name,':'),1);
- }
- // set status
- if($name == 'Envelope'){
- $this->status = 'envelope';
- } elseif($name == 'Header'){
- $this->root_header = $pos;
- $this->status = 'header';
- } elseif($name == 'Body'){
- $this->status = 'body';
- $this->body_position = $pos;
- // set method
- } elseif($this->status == 'body' && $pos == ($this->body_position+1)){
- $this->status = 'method';
- $this->root_struct_name = $name;
- $this->root_struct = $pos;
- $this->message[$pos]['type'] = 'struct';
- $this->debug("found root struct $this->root_struct_name, pos $this->root_struct");
- }
- // set my status
- $this->message[$pos]['status'] = $this->status;
- // set name
- $this->message[$pos]['name'] = htmlspecialchars($name);
- // set attrs
- $this->message[$pos]['attrs'] = $attrs;
-
- // loop through atts, logging ns and type declarations
- $attstr = '';
- foreach($attrs as $key => $value){
- $key_prefix = $this->getPrefix($key);
- $key_localpart = $this->getLocalPart($key);
- // if ns declarations, add to class level array of valid namespaces
- if($key_prefix == 'xmlns'){
- if(ereg('^http://www.w3.org/[0-9]{4}/XMLSchema$',$value)){
- $this->XMLSchemaVersion = $value;
- $this->namespaces['xsd'] = $this->XMLSchemaVersion;
- $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance';
- }
- $this->namespaces[$key_localpart] = $value;
- // set method namespace
- if($name == $this->root_struct_name){
- $this->methodNamespace = $value;
- }
- // if it's a type declaration, set type
- } elseif($key_localpart == 'type'){
- $value_prefix = $this->getPrefix($value);
- $value_localpart = $this->getLocalPart($value);
- $this->message[$pos]['type'] = $value_localpart;
- $this->message[$pos]['typePrefix'] = $value_prefix;
- if(isset($this->namespaces[$value_prefix])){
- $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix];
- } else if(isset($attrs['xmlns:'.$value_prefix])) {
- $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix];
- }
- // should do something here with the namespace of specified type?
- } elseif($key_localpart == 'arrayType'){
- $this->message[$pos]['type'] = 'array';
- /* do arrayType ereg here
- [1] arrayTypeValue ::= atype asize
- [2] atype ::= QName rank*
- [3] rank ::= '[' (',')* ']'
- [4] asize ::= '[' length~ ']'
- [5] length ::= nextDimension* Digit+
- [6] nextDimension ::= Digit+ ','
- */
- $expr = '([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]';
- if(ereg($expr,$value,$regs)){
- $this->message[$pos]['typePrefix'] = $regs[1];
- $this->message[$pos]['arrayTypePrefix'] = $regs[1];
- if (isset($this->namespaces[$regs[1]])) {
- $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]];
- } else if (isset($attrs['xmlns:'.$regs[1]])) {
- $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]];
- }
- $this->message[$pos]['arrayType'] = $regs[2];
- $this->message[$pos]['arraySize'] = $regs[3];
- $this->message[$pos]['arrayCols'] = $regs[4];
- }
- }
- // log id
- if($key == 'id'){
- $this->ids[$value] = $pos;
- }
- // root
- if($key_localpart == 'root' && $value == 1){
- $this->status = 'method';
- $this->root_struct_name = $name;
- $this->root_struct = $pos;
- $this->debug("found root struct $this->root_struct_name, pos $pos");
- }
- // for doclit
- $attstr .= " $key=\"$value\"";
- }
- // get namespace - must be done after namespace atts are processed
- if(isset($prefix)){
- $this->message[$pos]['namespace'] = $this->namespaces[$prefix];
- $this->default_namespace = $this->namespaces[$prefix];
- } else {
- $this->message[$pos]['namespace'] = $this->default_namespace;
- }
- if($this->status == 'header'){
- if ($this->root_header != $pos) {
- $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
- }
- } elseif($this->root_struct_name != ''){
- $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
- }
- }
-
- /**
- * end-element handler
- *
- * @param string $parser XML parser object
- * @param string $name element name
- * @access private
- */
- function end_element($parser, $name) {
- // position of current element is equal to the last value left in depth_array for my depth
- $pos = $this->depth_array[$this->depth--];
-
- // get element prefix
- if(strpos($name,':')){
- // get ns prefix
- $prefix = substr($name,0,strpos($name,':'));
- // get unqualified name
- $name = substr(strstr($name,':'),1);
- }
-
- // build to native type
- if(isset($this->body_position) && $pos > $this->body_position){
- // deal w/ multirefs
- if(isset($this->message[$pos]['attrs']['href'])){
- // get id
- $id = substr($this->message[$pos]['attrs']['href'],1);
- // add placeholder to href array
- $this->multirefs[$id][$pos] = 'placeholder';
- // add set a reference to it as the result value
- $this->message[$pos]['result'] =& $this->multirefs[$id][$pos];
- // build complex values
- } elseif($this->message[$pos]['children'] != ''){
-
- // if result has already been generated (struct/array
- if(!isset($this->message[$pos]['result'])){
- $this->message[$pos]['result'] = $this->buildVal($pos);
- }
-
- // set value of simple type
- } else {
- //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']);
- if (isset($this->message[$pos]['type'])) {
- $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
- } else {
- $parent = $this->message[$pos]['parent'];
- if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
- $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
- } else {
- $this->message[$pos]['result'] = $this->message[$pos]['cdata'];
- }
- }
-
- /* add value to parent's result, if parent is struct/array
- $parent = $this->message[$pos]['parent'];
- if($this->message[$parent]['type'] != 'map'){
- if(strtolower($this->message[$parent]['type']) == 'array'){
- $this->message[$parent]['result'][] = $this->message[$pos]['result'];
- } else {
- $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result'];
- }
- }
- */
- }
- }
-
- // for doclit
- if($this->status == 'header'){
- if ($this->root_header != $pos) {
- $this->responseHeaders .= "</" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
- }
- } elseif($pos >= $this->root_struct){
- $this->document .= "</" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
- }
- // switch status
- if($pos == $this->root_struct){
- $this->status = 'body';
- $this->root_struct_namespace = $this->message[$pos]['namespace'];
- } elseif($name == 'Body'){
- $this->status = 'envelope';
- } elseif($name == 'Header'){
- $this->status = 'envelope';
- } elseif($name == 'Envelope'){
- //
- }
- // set parent back to my parent
- $this->parent = $this->message[$pos]['parent'];
- }
-
- /**
- * element content handler
- *
- * @param string $parser XML parser object
- * @param string $data element content
- * @access private
- */
- function character_data($parser, $data){
- $pos = $this->depth_array[$this->depth];
- if ($this->xml_encoding=='UTF-8'){
- // TODO: add an option to disable this for folks who want
- // raw UTF-8 that, e.g., might not map to iso-8859-1
- // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
- if($this->decode_utf8){
- $data = utf8_decode($data);
- }
- }
- $this->message[$pos]['cdata'] .= $data;
- // for doclit
- if($this->status == 'header'){
- $this->responseHeaders .= $data;
- } else {
- $this->document .= $data;
- }
- }
-
- /**
- * get the parsed message
- *
- * @return mixed
- * @access public
- */
- function get_response(){
- return $this->soapresponse;
- }
-
- /**
- * get the parsed headers
- *
- * @return string XML or empty if no headers
- * @access public
- */
- function getHeaders(){
- return $this->responseHeaders;
- }
-
- /**
- * decodes entities
- *
- * @param string $text string to translate
- * @access private
- */
- function decode_entities($text){
- foreach($this->entities as $entity => $encoded){
- $text = str_replace($encoded,$entity,$text);
- }
- return $text;
- }
-
- /**
- * decodes simple types into PHP variables
- *
- * @param string $value value to decode
- * @param string $type XML type to decode
- * @param string $typens XML type namespace to decode
- * @access private
- */
- function decodeSimple($value, $type, $typens) {
- // TODO: use the namespace!
- if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') {
- return (string) $value;
- }
- if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') {
- return (int) $value;
- }
- if ($type == 'float' || $type == 'double' || $type == 'decimal') {
- return (double) $value;
- }
- if ($type == 'boolean') {
- if (strtolower($value) == 'false' || strtolower($value) == 'f') {
- return false;
- }
- return (boolean) $value;
- }
- if ($type == 'base64' || $type == 'base64Binary') {
- return base64_decode($value);
- }
- // obscure numeric types
- if ($type == 'nonPositiveInteger' || $type == 'negativeInteger'
- || $type == 'nonNegativeInteger' || $type == 'positiveInteger'
- || $type == 'unsignedInt'
- || $type == 'unsignedShort' || $type == 'unsignedByte') {
- return (int) $value;
- }
- // everything else
- return (string) $value;
- }
-
- /**
- * builds response structures for compound values (arrays/structs)
- *
- * @param string $pos position in node tree
- * @access private
- */
- function buildVal($pos){
- if(!isset($this->message[$pos]['type'])){
- $this->message[$pos]['type'] = '';
- }
- $this->debug('inside buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']);
- // if there are children...
- if($this->message[$pos]['children'] != ''){
- $children = explode('|',$this->message[$pos]['children']);
- array_shift($children); // knock off empty
- // md array
- if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){
- $r=0; // rowcount
- $c=0; // colcount
- foreach($children as $child_pos){
- $this->debug("got an MD array element: $r, $c");
- $params[$r][] = $this->message[$child_pos]['result'];
- $c++;
- if($c == $this->message[$pos]['arrayCols']){
- $c = 0;
- $r++;
- }
- }
- // array
- } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){
- $this->debug('adding array '.$this->message[$pos]['name']);
- foreach($children as $child_pos){
- $params[] = &$this->message[$child_pos]['result'];
- }
- // apache Map type: java hashtable
- } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){
- foreach($children as $child_pos){
- $kv = explode("|",$this->message[$child_pos]['children']);
- $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result'];
- }
- // generic compound type
- //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') {
- } else {
- // Apache Vector type: treat as an array
- if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') {
- $notstruct = 1;
- } else {
- // is array or struct?
- foreach($children as $child_pos){
- if(isset($keys) && isset($keys[$this->message[$child_pos]['name']])){
- $notstruct = 1;
- break;
- }
- $keys[$this->message[$child_pos]['name']] = 1;
- }
- }
- //
- foreach($children as $child_pos){
- if(isset($notstruct)){
- $params[] = &$this->message[$child_pos]['result'];
- } else {
- if (isset($params[$this->message[$child_pos]['name']])) {
- // de-serialize repeated element name into an array
- if (!is_array($params[$this->message[$child_pos]['name']])) {
- $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]);
- }
- $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result'];
- } else {
- $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result'];
- }
- }
- }
- }
- return is_array($params) ? $params : array();
- } else {
- $this->debug('no children');
- if(strpos($this->message[$pos]['cdata'],'&')){
- return strtr($this->message[$pos]['cdata'],array_flip($this->entities));
- } else {
- return $this->message[$pos]['cdata'];
- }
- }
- }
-}
-
-
-
-?><?php
-
-
-
-/**
-*
-* soapclient higher level class for easy usage.
-*
-* usage:
-*
-* // instantiate client with server info
-* $soapclient = new soapclient( string path [ ,boolean wsdl] );
-*
-* // call method, get results
-* echo $soapclient->call( string methodname [ ,array parameters] );
-*
-* // bye bye client
-* unset($soapclient);
-*
-* @author Dietrich Ayala <dietrich@ganx4.com>
-* @access public
-*/
-class soapclient extends nusoap_base {
-
- var $username = '';
- var $password = '';
- var $authtype = '';
- var $requestHeaders = false; // SOAP headers in request (text)
- var $responseHeaders = ''; // SOAP headers from response (incomplete namespace resolution) (text)
- var $document = ''; // SOAP body response portion (incomplete namespace resolution) (text)
- var $endpoint;
- var $error_str = false;
- var $proxyhost = '';
- var $proxyport = '';
- var $proxyusername = '';
- var $proxypassword = '';
- var $xml_encoding = ''; // character set encoding of incoming (response) messages
- var $http_encoding = false;
- var $timeout = 0; // HTTP connection timeout
- var $response_timeout = 30; // HTTP response timeout
- var $endpointType = '';
- var $persistentConnection = false;
- var $defaultRpcParams = false; // This is no longer used
- var $request = ''; // HTTP request
- var $response = ''; // HTTP response
- var $responseData = ''; // SOAP payload of response
- // toggles whether the parser decodes element content w/ utf8_decode()
- var $decode_utf8 = true;
-
- /**
- * fault related variables
- *
- * @var fault
- * @var faultcode
- * @var faultstring
- * @var faultdetail
- * @access public
- */
- var $fault, $faultcode, $faultstring, $faultdetail;
-
- /**
- * constructor
- *
- * @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object)
- * @param bool $wsdl optional, set to true if using WSDL
- * @param int $portName optional portName in WSDL document
- * @param string $proxyhost
- * @param string $proxyport
- * @param string $proxyusername
- * @param string $proxypassword
- * @param integer $timeout set the connection timeout
- * @param integer $response_timeout set the response timeout
- * @access public
- */
- function soapclient($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30){
- $this->endpoint = $endpoint;
- $this->proxyhost = $proxyhost;
- $this->proxyport = $proxyport;
- $this->proxyusername = $proxyusername;
- $this->proxypassword = $proxypassword;
- $this->timeout = $timeout;
- $this->response_timeout = $response_timeout;
-
- // make values
- if($wsdl){
- $this->endpointType = 'wsdl';
- if (is_object($endpoint) && is_a($endpoint, 'wsdl')) {
- $this->wsdl = $endpoint;
- $this->endpoint = $this->wsdl->wsdl;
- $this->wsdlFile = $this->endpoint;
- $this->debug('existing wsdl instance created from ' . $this->endpoint);
- } else {
- $this->wsdlFile = $this->endpoint;
-
- // instantiate wsdl object and parse wsdl file
- $this->debug('instantiating wsdl class with doc: '.$endpoint);
- $this->wsdl =& new wsdl($this->wsdlFile,$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout);
- }
- $this->debug("wsdl debug...\n".$this->wsdl->debug_str);
- $this->wsdl->debug_str = '';
- // catch errors
- if($errstr = $this->wsdl->getError()){
- $this->debug('got wsdl error: '.$errstr);
- $this->setError('wsdl error: '.$errstr);
- } elseif($this->operations = $this->wsdl->getOperations()){
- $this->debug( 'got '.count($this->operations).' operations from wsdl '.$this->wsdlFile);
- } else {
- $this->debug( 'getOperations returned false');
- $this->setError('no operations defined in the WSDL document!');
- }
- }
- }
-
- /**
- * calls method, returns PHP native type
- *
- * @param string $method SOAP server URL or path
- * @param array $params An array, associative or simple, of the parameters
- * for the method call, or a string that is the XML
- * for the call. For rpc style, this call will
- * wrap the XML in a tag named after the method, as
- * well as the SOAP Envelope and Body. For document
- * style, this will only wrap with the Envelope and Body.
- * IMPORTANT: when using an array with document style,
- * in which case there
- * is really one parameter, the root of the fragment
- * used in the call, which encloses what programmers
- * normally think of parameters. A parameter array
- * *must* include the wrapper.
- * @param string $namespace optional method namespace (WSDL can override)
- * @param string $soapAction optional SOAPAction value (WSDL can override)
- * @param boolean $headers optional array of soapval objects for headers
- * @param boolean $rpcParams optional no longer used
- * @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override)
- * @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override)
- * @return mixed
- * @access public
- */
- function call($operation,$params=array(),$namespace='',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){
- $this->operation = $operation;
- $this->fault = false;
- $this->error_str = '';
- $this->request = '';
- $this->response = '';
- $this->responseData = '';
- $this->faultstring = '';
- $this->faultcode = '';
- $this->opData = array();
-
- $this->debug("call: $operation, $params, $namespace, $soapAction, $headers, $style, $use; endpointType: $this->endpointType");
- if ($headers) {
- $this->requestHeaders = $headers;
- }
- // serialize parameters
- if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){
- // use WSDL for operation
- $this->opData = $opData;
- foreach($opData as $key => $value){
- $this->debug("$key -> $value");
- }
- if (isset($opData['soapAction'])) {
- $soapAction = $opData['soapAction'];
- }
- $this->endpoint = $opData['endpoint'];
- $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : ($namespace != '' ? $namespace : 'http://testuri.org');
- $style = $opData['style'];
- $use = $opData['input']['use'];
- // add ns to ns array
- if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){
- $this->wsdl->namespaces['nu'] = $namespace;
- }
- $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace);
- // serialize payload
- if (is_string($params)) {
- $this->debug("serializing param string for WSDL operation $operation");
- $payload = $params;
- } elseif (is_array($params)) {
- $this->debug("serializing param array for WSDL operation $operation");
- $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params);
- } else {
- $this->debug('params must be array or string');
- $this->setError('params must be array or string');
- return false;
- }
- $usedNamespaces = $this->wsdl->usedNamespaces;
- // Partial fix for multiple encoding styles in the same function call
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- if (isset($opData['output']['encodingStyle']) && $encodingStyle != $opData['output']['encodingStyle']) {
- $methodEncodingStyle = ' SOAP-ENV:encodingStyle="' . $opData['output']['encodingStyle'] . '"';
- } else {
- $methodEncodingStyle = '';
- }
- $this->debug("wsdl debug: \n".$this->wsdl->debug_str);
- $this->wsdl->debug_str = '';
- if ($errstr = $this->wsdl->getError()) {
- $this->debug('got wsdl error: '.$errstr);
- $this->setError('wsdl error: '.$errstr);
- return false;
- }
- } elseif($this->endpointType == 'wsdl') {
- // operation not in WSDL
- $this->setError( 'operation '.$operation.' not present.');
- $this->debug("operation '$operation' not present.");
- $this->debug("wsdl debug: \n".$this->wsdl->debug_str);
- $this->wsdl->debug_str = '';
- return false;
- } else {
- // no WSDL
- if($namespace == ''){
- $namespace = 'http://testuri.org';
- }
- //$this->namespaces['ns1'] = $namespace;
- $nsPrefix = 'ns1';
- // serialize
- $payload = '';
- if (is_string($params)) {
- $this->debug("serializing param string for operation $operation");
- $payload = $params;
- } elseif (is_array($params)) {
- $this->debug("serializing param array for operation $operation");
- foreach($params as $k => $v){
- $payload .= $this->serialize_val($v,$k,false,false,false,false,$use);
- }
- } else {
- $this->debug('params must be array or string');
- $this->setError('params must be array or string');
- return false;
- }
- $usedNamespaces = array();
- $methodEncodingStyle = '';
- }
- // wrap RPC calls with method element
- if ($style == 'rpc') {
- if ($use == 'literal') {
- $this->debug("wrapping RPC request with literal method element");
- $payload = "<$operation xmlns=\"$namespace\">" . $payload . "</$operation>";
- } else {
- $this->debug("wrapping RPC request with encoded method element");
- $payload = "<$nsPrefix:$operation$methodEncodingStyle xmlns:$nsPrefix=\"$namespace\">" .
- $payload .
- "</$nsPrefix:$operation>";
- }
- }
- // serialize envelope
- $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use);
- $this->debug("endpoint: $this->endpoint, soapAction: $soapAction, namespace: $namespace, style: $style, use: $use");
- $this->debug('SOAP message length: ' . strlen($soapmsg) . ' contents: ' . substr($soapmsg, 0, 1000));
- // send
- $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout);
- if($errstr = $this->getError()){
- $this->debug('Error: '.$errstr);
- return false;
- } else {
- $this->return = $return;
- $this->debug('sent message successfully and got a(n) '.gettype($return).' back');
-
- // fault?
- if(is_array($return) && isset($return['faultcode'])){
- $this->debug('got fault');
- $this->setError($return['faultcode'].': '.$return['faultstring']);
- $this->fault = true;
- foreach($return as $k => $v){
- $this->$k = $v;
- $this->debug("$k = $v<br>");
- }
- return $return;
- } else {
- // array of return values
- if(is_array($return)){
- // multiple 'out' parameters
- if(sizeof($return) > 1){
- return $return;
- }
- // single 'out' parameter
- return array_shift($return);
- // nothing returned (ie, echoVoid)
- } else {
- return "";
- }
- }
- }
- }
-
- /**
- * get available data pertaining to an operation
- *
- * @param string $operation operation name
- * @return array array of data pertaining to the operation
- * @access public
- */
- function getOperationData($operation){
- if(isset($this->operations[$operation])){
- return $this->operations[$operation];
- }
- $this->debug("No data for operation: $operation");
- }
-
- /**
- * send the SOAP message
- *
- * Note: if the operation has multiple return values
- * the return value of this method will be an array
- * of those values.
- *
- * @param string $msg a SOAPx4 soapmsg object
- * @param string $soapaction SOAPAction value
- * @param integer $timeout set connection timeout in seconds
- * @param integer $response_timeout set response timeout in seconds
- * @return mixed native PHP types.
- * @access private
- */
- function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) {
- // detect transport
- switch(true){
- // http(s)
- case ereg('^http',$this->endpoint):
- $this->debug('transporting via HTTP');
- if($this->persistentConnection == true && is_object($this->persistentConnection)){
- $http =& $this->persistentConnection;
- } else {
- $http = new soap_transport_http($this->endpoint);
- if ($this->persistentConnection) {
- $http->usePersistentConnection();
- }
- }
- $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset());
- $http->setSOAPAction($soapaction);
- if($this->proxyhost && $this->proxyport){
- $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword);
- }
- if($this->username != '' && $this->password != '') {
- $http->setCredentials($this->username, $this->password, $this->authtype);
- }
- if($this->http_encoding != ''){
- $http->setEncoding($this->http_encoding);
- }
- $this->debug('sending message, length: '.strlen($msg));
- if(ereg('^http:',$this->endpoint)){
- //if(strpos($this->endpoint,'http:')){
- $this->responseData = $http->send($msg,$timeout,$response_timeout);
- } elseif(ereg('^https',$this->endpoint)){
- //} elseif(strpos($this->endpoint,'https:')){
- //if(phpversion() == '4.3.0-dev'){
- //$response = $http->send($msg,$timeout,$response_timeout);
- //$this->request = $http->outgoing_payload;
- //$this->response = $http->incoming_payload;
- //} else
- if (extension_loaded('curl')) {
- $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout);
- } else {
- $this->setError('CURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS');
- }
- } else {
- $this->setError('no http/s in endpoint url');
- }
- $this->request = $http->outgoing_payload;
- $this->response = $http->incoming_payload;
- $this->debug("transport debug data...\n".$http->debug_str);
-
- // save transport object if using persistent connections
- if ($this->persistentConnection) {
- $http->debug_str = '';
- if (!is_object($this->persistentConnection)) {
- $this->persistentConnection = $http;
- }
- }
-
- if($err = $http->getError()){
- $this->setError('HTTP Error: '.$err);
- return false;
- } elseif($this->getError()){
- return false;
- } else {
- $this->debug('got response, length: '. strlen($this->responseData).' type: '.$http->incoming_headers['content-type']);
- return $this->parseResponse($http->incoming_headers, $this->responseData);
- }
- break;
- default:
- $this->setError('no transport found, or selected transport is not yet supported!');
- return false;
- break;
- }
- }
-
- /**
- * processes SOAP message returned from server
- *
- * @param array $headers The HTTP headers
- * @param string $data unprocessed response data from server
- * @return mixed value of the message, decoded into a PHP type
- * @access protected
- */
- function parseResponse($headers, $data) {
- $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']);
- if (!strstr($headers['content-type'], 'text/xml')) {
- $this->setError('Response not of type text/xml');
- return false;
- }
- if (strpos($headers['content-type'], '=')) {
- $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1));
- $this->debug('Got response encoding: ' . $enc);
- if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
- // should be US-ASCII, but for XML, let's be pragmatic and admit UTF-8 is most common
- $this->xml_encoding = 'UTF-8';
- }
- $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser');
- $parser = new soap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8);
- // add parser debug data to our debug
- $this->debug($parser->debug_str);
- // if parse errors
- if($errstr = $parser->getError()){
- $this->setError( $errstr);
- // destroy the parser object
- unset($parser);
- return false;
- } else {
- // get SOAP headers
- $this->responseHeaders = $parser->getHeaders();
- // get decoded message
- $return = $parser->get_response();
- // add document for doclit support
- $this->document = $parser->document;
- // destroy the parser object
- unset($parser);
- // return decode message
- return $return;
- }
- }
-
- /**
- * set the SOAP headers
- *
- * @param $headers string XML
- * @access public
- */
- function setHeaders($headers){
- $this->requestHeaders = $headers;
- }
-
- /**
- * get the response headers
- *
- * @return mixed object SOAPx4 soapval object or empty if no headers
- * @access public
- */
- function getHeaders(){
- if($this->responseHeaders != '') {
- return $this->responseHeaders;
- }
- }
-
- /**
- * set proxy info here
- *
- * @param string $proxyhost
- * @param string $proxyport
- * @param string $proxyusername
- * @param string $proxypassword
- * @access public
- */
- function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') {
- $this->proxyhost = $proxyhost;
- $this->proxyport = $proxyport;
- $this->proxyusername = $proxyusername;
- $this->proxypassword = $proxypassword;
- }
-
- /**
- * if authenticating, set user credentials here
- *
- * @param string $username
- * @param string $password
- * @param string $authtype (basic|digest)
- * @access public
- */
- function setCredentials($username, $password, $authtype = 'basic') {
- $this->username = $username;
- $this->password = $password;
- $this->authtype = $authtype;
- }
-
- /**
- * use HTTP encoding
- *
- * @param string $enc
- * @access public
- */
- function setHTTPEncoding($enc='gzip, deflate'){
- $this->http_encoding = $enc;
- }
-
- /**
- * use HTTP persistent connections if possible
- *
- * @access public
- */
- function useHTTPPersistentConnection(){
- $this->persistentConnection = true;
- }
-
- /**
- * gets the default RPC parameter setting.
- * If true, default is that call params are like RPC even for document style.
- * Each call() can override this value.
- *
- * This is no longer used.
- *
- * @access public
- * @deprecated
- */
- function getDefaultRpcParams() {
- return $this->defaultRpcParams;
- }
-
- /**
- * sets the default RPC parameter setting.
- * If true, default is that call params are like RPC even for document style
- * Each call() can override this value.
- *
- * @param boolean $rpcParams
- * @access public
- */
- function setDefaultRpcParams($rpcParams) {
- $this->defaultRpcParams = $rpcParams;
- }
-
- /**
- * dynamically creates proxy class, allowing user to directly call methods from wsdl
- *
- * @return object soap_proxy object
- * @access public
- */
- function getProxy(){
- $evalStr = '';
- foreach($this->operations as $operation => $opData){
- if($operation != ''){
- // create param string
- $paramStr = '';
- if(sizeof($opData['input']['parts']) > 0){
- foreach($opData['input']['parts'] as $name => $type){
- $paramStr .= "\$$name,";
- }
- $paramStr = substr($paramStr,0,strlen($paramStr)-1);
- }
- $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace'];
- $evalStr .= "function $operation ($paramStr){
- // load params into array
- \$params = array($paramStr);
- return \$this->call('$operation',\$params,'".$opData['namespace']."','".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."');
- }";
- unset($paramStr);
- }
- }
- $r = rand();
- $evalStr = 'class soap_proxy_'.$r.' extends soapclient {
- '.$evalStr.'
- }';
- //print "proxy class:<pre>$evalStr</pre>";
- // eval the class
- eval($evalStr);
- // instantiate proxy object
- eval("\$proxy = new soap_proxy_$r('');");
- // transfer current wsdl data to the proxy thereby avoiding parsing the wsdl twice
- $proxy->endpointType = 'wsdl';
- $proxy->wsdlFile = $this->wsdlFile;
- $proxy->wsdl = $this->wsdl;
- $proxy->operations = $this->operations;
- $proxy->defaultRpcParams = $this->defaultRpcParams;
- // transfer other state
- $proxy->username = $this->username;
- $proxy->password = $this->password;
- $proxy->proxyhost = $this->proxyhost;
- $proxy->proxyport = $this->proxyport;
- $proxy->proxyusername = $this->proxyusername;
- $proxy->proxypassword = $this->proxypassword;
- $proxy->timeout = $this->timeout;
- $proxy->response_timeout = $this->response_timeout;
- $proxy->http_encoding = $this->http_encoding;
- $proxy->persistentConnection = $this->persistentConnection;
- return $proxy;
- }
-
- /**
- * gets the HTTP body for the current request.
- *
- * @param string $soapmsg The SOAP payload
- * @return string The HTTP body, which includes the SOAP payload
- * @access protected
- */
- function getHTTPBody($soapmsg) {
- return $soapmsg;
- }
-
- /**
- * gets the HTTP content type for the current request.
- *
- * Note: getHTTPBody must be called before this.
- *
- * @return string the HTTP content type for the current request.
- * @access protected
- */
- function getHTTPContentType() {
- return 'text/xml';
- }
-
- /**
- * gets the HTTP content type charset for the current request.
- * returns false for non-text content types.
- *
- * Note: getHTTPBody must be called before this.
- *
- * @return string the HTTP content type charset for the current request.
- * @access protected
- */
- function getHTTPContentTypeCharset() {
- return $this->soap_defencoding;
- }
-
- /*
- * whether or not parser should decode utf8 element content
- *
- * @return always returns true
- * @access public
- */
- function decodeUTF8($bool){
- $this->decode_utf8 = $bool;
- return true;
- }
-}
-?>
diff --git a/tests/.htaccess b/tests/.htaccess
new file mode 100644
index 000000000000..3a4288278871
--- /dev/null
+++ b/tests/.htaccess
@@ -0,0 +1 @@
+Deny from all
diff --git a/texvc.phtml b/texvc.phtml
deleted file mode 100644
index 7f427d8916a1..000000000000
--- a/texvc.phtml
+++ /dev/null
@@ -1,165 +0,0 @@
-<?php
-include( "./LocalSettings.php" );
-include( "Setup.php" );
-header( "Content-type: text/xml; charset={$wgInputEncoding}" );
-print "<";
-print "?xml version=\"1.0\" encoding=\"utf-8\"?";
-print ">";
-?>
-<!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><title>texvc</title></head><body>
-<?php
-print "<form method=\"post\" action=\"{$wgServer}{$wgScriptPath}/texvc_cgi.phtml\">"
-?>
-<textarea name='math' rows='10' cols='80'><?php
- global $math;
- $math = preg_replace ("/\\\\\\\\/", '\\', $math);
- print $math;
-?></textarea><br /><input type="submit" value="Preview" name="preview" /></form>
-<?php
-function xlinkToMathImage ( $tex, $outputhash )
-{
- global $wgMathPath;
- return "<img src=\"".$wgMathPath."/".$outputhash.".png\" alt=\"".wfEscapeHTML($tex)."\" />";
-}
-
-function texvc_cgi_renderMath( $tex )
-{
- global $wgMathDirectory, $wgTmpDirectory, $wgInputEncoding;
- $dbr =& wfGetDB( DB_SLAVE );
- $mf = wfMsg( "math_failure" );
- $munk = wfMsg( "math_unknown_error" );
-
- $image = "";
- $outhtml = "";
- $outtex = "";
-
- $fname = "texvc_cgi_renderMath";
-
- $md5 = md5($tex);
- $md5_sql = pack("H32", $md5);
-
- $mathTable = $dbr->tableName( 'math' );
- $rpage = $dbr->selectRow( 'math', array('math_outputhash','math_html_conservativeness','math_html','math_mathml'),
- array( 'math_inputhash' => $md5_sql ) );
-
- if ( $rpage === false )
- {
- $cmd = "./math/texvc ".wfEscapeShellArg($wgTmpDirectory)." ".
- wfEscapeShellArg($wgMathDirectory)." ".wfEscapeShellArg($tex)." ".wfEscapeShellArg($wgInputEncoding);
- $contents = `$cmd`;
-
- if (strlen($contents) == 0)
- return "<h3>".$mf." (".$munk."): ".wfEscapeHTML($tex)."</h3>";
- $retval = substr ($contents, 0, 1);
-
- if (($retval == "C") || ($retval == "M") || ($retval == "L")) {
- if ($retval == "C")
- $conservativeness = 2;
- else if ($retval == "M")
- $conservativeness = 1;
- else
- $conservativeness = 0;
- $outdata = substr ($contents, 33);
-
- $i = strpos($outdata, "\000");
-
- $outhtml = substr($outdata, 0, $i);
- $mathml = substr($outdata, $i+1);
-
- #$sql_html = "'".mysql_escape_string($outhtml)."'";
- #$sql_mathml = "'".mysql_escape_string($mathml)."'";
- } else if (($retval == "c") || ($retval == "m") || ($retval == "l")) {
- $outhtml = substr ($contents, 33);
- if ($retval == "c")
- $conservativeness = 2;
- else if ($retval == "m")
- $conservativeness = 1;
- else
- $conservativeness = 0;
- #$sql_html = "'".mysql_escape_string($outhtml)."'";
- $mathml = NULL;
- #$sql_mathml = 'NULL';
- } else if ($retval == "X") {
- $outhtml = NULL;
- $mathml = substr ($contents, 33);
- #$sql_html = 'NULL';
- #$sql_mathml = "'".mysql_escape_string($mathml)."'";
- $conservativeness = 0;
- } else if ($retval == "+") {
- $outhtml = NULL;
- $mathml = NULL;
- #$sql_html = 'NULL';
- #$sql_mathml = 'NULL';
- $conservativeness = 0;
- } else {
- if ($retval == "E")
- $errmsg = wfMsg( "math_lexing_error" );
- else if ($retval == "S")
- $errmsg = wfMsg( "math_syntax_error" );
- else if ($retval == "F")
- $errmsg = wfMsg( "math_unknown_function" );
- else
- $errmsg = $munk;
- return "<h3>".$mf." (".$errmsg.substr($contents, 1)."): ".wfEscapeHTML($tex)."</h3>";
- }
-
- $outmd5 = substr ($contents, 1, 32);
- if (!preg_match("/^[a-f0-9]{32}$/", $outmd5))
- return "<h3>".$mf." (".$munk."): ".wfEscapeHTML($tex)."</h3>";
-
- $outmd5_sql = pack("H32", $outmd5);
-
- # Someone may have inserted the same hash since the SELECT, but that's no big deal, just ignore errors
- $dbw =& wfGetDB( DB_MASTER );
- $dbw->insert( 'math',
- array(
- 'math_inputhash' => $md5_sql,
- 'math_outputhash' => $outmd5_sql,
- 'math_html_conservativeness' => $conservativeness,
- 'math_html' => $outhtml,
- 'math_mathml' => $mathml,
- ), $fname, array( 'IGNORE' )
- );
-
-// we don't really care if it fails
- } else {
- $outmd5 = unpack ("H32md5", $rpage->math_outputhash);
- $outmd5 = $outmd5 ['md5'];
- $outhtml = $rpage->math_html;
- $conservativeness = $rpage->math_html_conservativeness;
- $mathml = $rpage->math_mathml;
- }
- if ( is_null( $mathml ) || $mathml === '' )
- $mathml = "<h3>Failed to generate MathML</h3>";
- else
- $mathml = "<h3>MathML</h3><math xmlns=\"http://www.w3.org/1998/Math/MathML\">$mathml</math>";
- $image = "<h3>Image</h3>" . xlinkToMathImage ( $tex, $outmd5 );
- $cmd = "./math/texvc_tex ".escapeshellarg($tex)." ".escapeshellarg($wgInputEncoding);
- $outtex = `$cmd`;
-
- if ( is_null( $outhtml ) || $outhtml === '' )
- $outhtml = "<h3>Failed to generate HTML</h3>";
- else
- if ( $conservativeness == 2)
- $outhtml = "<h3>HTML (conservative)</h3>" . $outhtml;
- else if ( $conservativeness == 1)
- $outhtml = "<h3>HTML (moderate)</h3>" . $outhtml;
- else
- $outhtml = "<h3>HTML (liberal)</h3>" . $outhtml;
-
- if ( $outtex == '' )
- $outtex = "<h3>Failed to generate TeX</h3>";
- else
- $outtex = "<h3>TeX</h3>" . wfEscapeHTML($outtex);
-
- return $outtex . $outhtml . $mathml . $image;
-}
-
-global $math;
-if ($math != '')
- print texvc_cgi_renderMath($math);
-?>
-</body></html>