Sync with en: version 1.43
[lhc/web/wiklou.git] / languages / Language.php
index acb5156..05e78ea 100644 (file)
@@ -1,5 +1,42 @@
 <?
 
+#--------------------------------------------------------------------------
+# Constants
+#--------------------------------------------------------------------------
+
+# Namespaces
+define("NS_SPECIAL", -1);
+define("NS_MAIN", 0);
+define("NS_TALK", 1);
+define("NS_USER", 2);
+define("NS_USER_TALK", 3);
+define("NS_WP", 4);
+define("NS_WP_TALK", 5);
+define("NS_IMAGE", 6);
+define("NS_IMAGE_TALK", 7);
+define("NS_MEDIAWIKI", 8);
+define("NS_MEDIAWIKI_TALK", 9);
+
+# Magic words
+define("MAG_REDIRECT", 0);
+define("MAG_NOTOC", 1);
+define("MAG_START", 2);
+define("MAG_CURRENTMONTH", 3);
+define("MAG_CURRENTMONTHNAME", 4);
+define("MAG_CURRENTDAY", 5);
+define("MAG_CURRENTDAYNAME", 6);
+define("MAG_CURRENTYEAR", 7);
+define("MAG_CURRENTTIME", 8);
+define("MAG_NUMBEROFARTICLES", 9);
+define("MAG_CURRENTMONTHNAMEGEN", 10);
+define("MAG_MSG", 11);
+define("MAG_SUBST", 12);
+define("MAG_MSGNW", 13);
+
+#--------------------------------------------------------------------------
+# Language-specific text
+#--------------------------------------------------------------------------
+
 # NOTE: To turn off "Current Events" in the sidebar,
 # set "currentevents" => "-"
 
@@ -16,7 +53,9 @@
        4       => "Wikipedia",
        5       => "Wikipedia_talk",
        6       => "Image",
-       7       => "Image_talk"
+       7       => "Image_talk",
+       8       => "MediaWiki",
+       9       => "MediaWiki_talk"
 );
 
 /* private */ $wgDefaultUserOptionsEn = array(
@@ -25,7 +64,8 @@
        "contextlines" => 5, "contextchars" => 50,
        "skin" => 0, "math" => 1, "rcdays" => 7, "rclimit" => 50,
        "highlightbroken" => 1, "stubthreshold" => 0,
-       "previewontop" => 1, "editsection"=>1, "showtoc"=>1
+       "previewontop" => 1, "editsection"=>1,"editsectiononrightclick"=>0, "showtoc"=>1,
+       "date" => 0
 );
 
 /* private */ $wgQuickbarSettingsEn = array(
@@ -33,7 +73,7 @@
 );
 
 /* private */ $wgSkinNamesEn = array(
-       "Standard", "Nostalgia", "Cologne Blue"
+       "Standard", "Nostalgia", "Cologne Blue", "Paddington", "Montparnasse"
 );
 
 /* private */ $wgMathNamesEn = array(
@@ -47,7 +87,7 @@
 /* private */ $wgDateFormatsEn = array(
        "No preference",
        "January 15, 2001",
-       "15 January, 2001",
+       "15 January 2001",
        "2001 January 15"
 );
 
@@ -60,12 +100,13 @@ this</a> (alternative: like this<a href=\"\" class=\"internal\">?</a>).",
        "hideminor" => "Hide minor edits in recent changes",
        "usenewrc" => "Enhanced recent changes (not for all browsers)",
        "numberheadings" => "Auto-number headings",
-       "editsection"=>"Show links for editing individual sections",
-       "showtoc"=>"Show table of contents for articles with more than 3 headings",
+       "editondblclick" => "Edit pages on double click (JavaScript)",
+       "editsection"=>"Enable section editing via [edit] links",
+       "editsectiononrightclick"=>"Enable section editing by right clicking<br> on section titles (JavaScript)",
+       "showtoc"=>"Show table of contents<br>(for articles with more than 3 headings)",
        "rememberpassword" => "Remember password across sessions",
        "editwidth" => "Edit box has full width",
-       "editondblclick" => "Edit pages on double click (JavaScript)",
-       "watchdefault" => "Watch new and modified articles",
+       "watchdefault" => "Add pages you edit to your watchlist",
        "minordefault" => "Mark all edits minor by default",
        "previewontop" => "Show preview before edit box and not after it",
        "nocache" => "Disable page caching"
@@ -189,7 +230,7 @@ this</a> (alternative: like this<a href=\"\" class=\"internal\">?</a>).",
        "sr" => "Srpski",
        "ss"    => "Siswati",
        "st"    => "Sesotho",
-       "su"    => "Sudanese",
+       "su"    => "Sundanese",
        "sv" => "Svenska",
        "sw" => "Kiswahili",
        "ta"    => "Tamil",
@@ -238,6 +279,24 @@ this</a> (alternative: like this<a href=\"\" class=\"internal\">?</a>).",
        "Sep", "Oct", "Nov", "Dec"
 );
 
+/* private */ $wgMagicWordsEn = array(
+#   ID                                 CASE  SYNONYMS
+    MAG_REDIRECT             => array( 0,    "#redirect"              ),
+    MAG_NOTOC                => array( 0,    "__NOTOC__"              ),
+    MAG_START                => array( 0,    "__START__"              ),
+    MAG_CURRENTMONTH         => array( 1,    "{{CURRENTMONTH}}"       ),
+    MAG_CURRENTMONTHNAME     => array( 1,    "{{CURRENTMONTHNAME}}"   ),
+    MAG_CURRENTDAY           => array( 1,    "{{CURRENTDAY}}"         ),   
+    MAG_CURRENTDAYNAME       => array( 1,    "{{CURRENTDAYNAME}}"     ),
+    MAG_CURRENTYEAR          => array( 1,    "{{CURRENTYEAR}}"        ),
+    MAG_CURRENTTIME          => array( 1,    "{{CURRENTTIME}}"        ),
+    MAG_NUMBEROFARTICLES     => array( 1,    "{{NUMBEROFARTICLES}}"   ),
+    MAG_CURRENTMONTHNAMEGEN  => array( 1,    "{{CURRENTMONTHNAMEGEN}}"),
+       MAG_MSG                  => array( 1,    "{{MSG:$1}}"             ),
+       MAG_SUBST                => array( 1,    "{{SUBST:$1}}"           ),
+    MAG_MSGNW                => array( 1,    "{{MSGNW:$1}}"           )
+);
+       
 # All special pages have to be listed here: a description of ""
 # will make them not show up on the "Special Pages" page, which
 # is the right thing for some of them (such as the "targeted" ones).
@@ -265,7 +324,7 @@ this</a> (alternative: like this<a href=\"\" class=\"internal\">?</a>).",
        "Intl"          => "Interlanguage links",
        "Allpages"              => "All pages by title",
 
-       "Ipblocklist"   => "Blocked IP addresses",
+       "Ipblocklist"   => "Blocked users/IP addresses",
        "Maintenance" => "Maintenance page",
        "Specialpages"  => "",
        "Contributions" => "",
@@ -273,11 +332,13 @@ this</a> (alternative: like this<a href=\"\" class=\"internal\">?</a>).",
        "Whatlinkshere" => "",
        "Recentchangeslinked" => "",
        "Movepage"              => "",
-       "Booksources"   => "External book sources"
+       "Booksources"   => "External book sources",
+"Categories" => "Page categories",
+"Export"       => ""
 );
 
 /* private */ $wgSysopSpecialPagesEn = array(
-       "Blockip"               => "Block aIP address",
+       "Blockip"               => "Block a user/IP address",
        "Asksql"                => "Query the database",
        "Undelete"              => "Restore deleted pages"
 );
@@ -292,6 +353,11 @@ this</a> (alternative: like this<a href=\"\" class=\"internal\">?</a>).",
 
 # Bits of text used by many pages:
 #
+"categories" => "Page categories",
+"category" => "category",
+"category_header" => "Articles in category \"$1\"",
+"subcategories" => "Subcategories",
+
 "linktrail"            => "/^([a-z]+)(.*)\$/sD",
 "mainpage"             => "Main Page",
 "mainpagetext" => "Wiki software successfully installed.",
@@ -332,6 +398,7 @@ this</a> (alternative: like this<a href=\"\" class=\"internal\">?</a>).",
 "unprotectthispage" => "Unprotect this page",
 "newpage" => "New page",
 "talkpage"             => "Discuss this page",
+"postcomment"   => "Post a comment",
 "articlepage"  => "View article",
 "subjectpage"  => "View subject", # For compatibility
 "userpage" => "View user page",
@@ -364,6 +431,10 @@ See $1.",
 "newmessageslink" => "new messages",
 "editsection"=>"edit",
 "toc" => "Table of contents",
+"showtoc" => "show",
+"hidetoc" => "hide",
+"thisisdeleted" => "View or restore $1?",
+"restorelink" => "$1 deleted edits",
 
 # Main script and global functions
 #
@@ -390,8 +461,9 @@ The last attempted database query was:
 \"$1\"
 from within function \"$2\".
 MySQL returned error \"$3: $4\".\n",
-"noconnect"            => "Could not connect to DB on $1",
+"noconnect"            => "Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server.",
 "nodb"                 => "Could not select database $1",
+"cachederror"          => "The following is a cached copy of the requested page, and may not be up to date.",
 "readonly"             => "Database locked",
 "enterlockreason" => "Enter a reason for the lock, including an estimate
 of when the lock will be released",
@@ -428,9 +500,11 @@ the wiki.",
 # Login and logout pages
 #
 "logouttitle"  => "User logout",
-"logouttext"   => "You are now logged out.
+"logouttext" => "You are now logged out.
 You can continue to use Wikipedia anonymously, or you can log in
-again as the same or as a different user.\n",
+again as the same or as a different user. Note that some pages may
+continue to be displayed as if you were still logged in, until you clear
+your browser cache\n",
 
 "welcomecreation" => "<h2>Welcome, $1!</h2><p>Your account has been created.
 Don't forget to personalize your wikipedia preferences.",
@@ -455,6 +529,7 @@ that it be to the address you give.<br>\n",
 "userlogout"   => "Log out",
 "notloggedin"  => "Not logged in",
 "createaccount"        => "Create new account",
+"createaccountmail"    => "by eMail",
 "badretype"            => "The passwords you entered do not match.",
 "userexists"   => "The user name you entered is already in use. Please choose a different name.",
 "youremail"            => "Your e-mail*",
@@ -484,6 +559,7 @@ Please log in again after you receive it.",
 # Edit pages
 #
 "summary"              => "Summary",
+"subject"              => "Subject/headline",
 "minoredit"            => "This is a minor edit",
 "watchthis"            => "Watch this article",
 "savearticle"  => "Save page",
@@ -493,6 +569,14 @@ Please log in again after you receive it.",
 "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
 [[Wikipedia:administrators|administrators]] to discuss the block.",
+"whitelistedittitle" => "Login required to edit",
+"whitelistedittext" => "You have to [[Special:Userlogin|login]] to edit articles.",
+"whitelistreadtitle" => "Login required to read",
+"whitelistreadtext" => "You have to [[Special:Userlogin|login]] to read articles.",
+"whitelistacctitle" => "You are not allowed to create an account",
+"whitelistacctext" => "To be allowed to create accounts in this Wiki you have to [[Special:Userlogin|log]] in and have the appropriate permissions.",
+"accmailtitle" => "Password sent.",
+"accmailtext" => "The Password for '$1' has been sent to $2.",
 "newarticle"   => "(New)",
 "newarticletext" =>
 "You've followed a link to a page that doesn't exist yet.
@@ -508,6 +592,7 @@ If you are here by mistake, just click your browser's '''back''' button.",
 text editing area as it will appear if you choose to save.",
 "editing"              => "Editing $1",
 "sectionedit"  => " (section)",
+"commentedit"  => " (comment)",
 "editconflict" => "Edit conflict: $1",
 "explainconflict" => "Someone else has changed this page since you
 started editing it.
@@ -600,7 +685,27 @@ containing all of the search terms will appear in the result).",
 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>
+
+<!-- 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=\"\">
+<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 -->",
+"blanknamespace" => "(Main)",
 
 # Preferences page
 #
@@ -610,7 +715,9 @@ $2 List redirects &nbsp; Search for $3 $9",
   wfLocalUrl( "Special:Userlogin" ) . "\">logged in</a>
 to set user preferences.",
 "prefslogintext" => "You are logged in as \"$1\".
-Your internal ID number is $2.",
+Your internal ID number is $2.
+
+See [[Wikipedia:User preferences help]] for help deciphering the options.",
 "prefsreset"   => "Preferences have been reset from storage.",
 "qbsettings"   => "Quickbar settings", 
 "changepassword" => "Change password",
@@ -650,7 +757,8 @@ from server time (UTC).",
 #
 "changes" => "changes",
 "recentchanges" => "Recent changes",
-"recentchangestext" => "Track the most recent changes to Wikipedia on this page.
+"recentchangestext" => 
+"Track the most recent changes to Wikipedia on this page.
 [[Wikipedia:Welcome,_newcomers|Welcome, newcomers]]!
 Please have a look at these pages: [[wikipedia:FAQ|Wikipedia FAQ]],
 [[Wikipedia:Policies and guidelines|Wikipedia policy]]
@@ -692,7 +800,7 @@ See also the [http://meta.wikipedia.org/wiki/Special:Recentchanges recent meta d
 "uploadnologintext"    => "You must be <a href=\"" .
   wfLocalUrl( "Special:Userlogin" ) . "\">logged in</a>
 to upload files.",
-"uploadfile"   => "Upload file",
+"uploadfile"   => "Upload images, sounds, documents etc.",
 "uploaderror"  => "Upload error",
 "uploadtext"   => "<strong>STOP!</strong> Before you upload here,
 make sure to read and follow Wikipedia's <a href=\"" .
@@ -730,6 +838,8 @@ All times shown are server time (UTC).
 ",
 "filename"             => "Filename",
 "filedesc"             => "Summary",
+"filestatus" => "Copyright status",
+"filesource" => "Source",
 "affirmation"  => "I affirm that the copyright holder of this file
 agrees to license it under the terms of the $1.",
 "copyrightpage" => "Wikipedia:Copyrights",
@@ -829,9 +939,9 @@ That comes to <b>$5</b> average edits per page, and <b>$6</b> views per edit.",
 "longpages"            => "Long pages",
 "listusers"            => "User list",
 "specialpages" => "Special pages",
-"spheading"            => "Special pages",
-"sysopspheading" => "Special pages for sysop use",
-"developerspheading" => "Special pages for developer use",
+"spheading"            => "Special pages for all users",
+"sysopspheading" => "For sysop use only",
+"developerspheading" => "For developer use only",
 "protectpage"  => "Protect page",
 "recentchangeslinked" => "Related changes",
 "rclsub"               => "(to pages linked from \"$1\")",
@@ -901,6 +1011,27 @@ make it easier to pick out.</p>
 "watchthispage"        => "Watch this page",
 "unwatchthispage" => "Stop watching",
 "notanarticle" => "Not an article",
+"watchnochange" => "None of your watched items were edited in the time period displayed.",
+"watchdetails" => "($1 pages watched not counting talk pages;
+$2 total pages edited since cutoff;
+$3...
+<a href='$4'>show and edit complete list</a>.)",
+"watchmethod-recent" => "checking recent edits for watched pages",
+"watchmethod-list" => "checking watched pages for recent edits",
+"removechecked" => "Remove checked items from watchlist",
+"watchlistcontains" => "Your watchlist contains $1 pages.",
+"watcheditlist" => "Here's an alphabetical list of your
+watched pages. Check the boxes of pages you want to remove
+from your watchlist and click the 'remove checked' button
+at the bottom of the screen.",
+"removingchecked" => "Removing requested items from watchlist...",
+"couldntremove" => "Couldn't remove item '$1'...",
+"iteminvalidname" => "Problem with item '$1', invalid name...",
+"wlnote" => "Below are the last $1 changes in the last <b>$2</b> hours.",
+"wlshowlast" => "Show last ",
+"wlhours"    => " hours",
+"wldays"     => " days",
+                                                                                                                                       
 
 # Delete/protect/revert
 #
@@ -984,31 +1115,32 @@ to perform this function on.",
 
 # Block/unblock IP
 #
-"blockip"              => "Block IP address",
+"blockip"              => "Block user",
 "blockiptext"  => "Use the form below to block write access
-from a specific IP address.
+from a specific IP address or username.
 This should be done only only to prevent vandalism, and in
 accordance with [[Wikipedia:Policy|Wikipedia policy]].
 Fill in a specific reason below (for example, citing particular
 pages that were vandalized).",
-"ipaddress"            => "IP Address",
+"ipaddress"            => "IP Address/username",
 "ipbreason"            => "Reason",
-"ipbsubmit"            => "Block this address",
-"badipaddress" => "The IP address is badly formed.",
+"ipbsubmit"            => "Block this user",
+"badipaddress" => "No user exists by that name",
 "noblockreason" => "You must supply a reason for the block.",
 "blockipsuccesssub" => "Block succeeded",
-"blockipsuccesstext" => "The IP address \"$1\" has been blocked.
+"blockipsuccesstext" => "\"$1\" has been blocked.
 <br>See [[Special:Ipblocklist|IP block list]] to review blocks.",
-"unblockip"            => "Unblock IP address",
+"unblockip"            => "Unblock user",
 "unblockiptext"        => "Use the form below to restore write access
-to a previously blocked IP address.",
+to a previously blocked IP address or username.",
 "ipusubmit"            => "Unblock this address",
-"ipusuccess"   => "IP address \"$1\" unblocked",
-"ipblocklist"  => "List of blocked IP addresses",
+"ipusuccess"   => "\"$1\" unblocked",
+"ipblocklist"  => "List of blocked IP addresses and usernames",
 "blocklistline"        => "$1, $2 blocked $3",
 "blocklink"            => "block",
 "unblocklink"  => "unblock",
 "contribslink" => "contribs",
+"autoblocker"  => "Autoblocked because you share an IP address with \"$1\". Reason \"$2\".",
 
 # Developer tools
 #
@@ -1096,8 +1228,23 @@ title. Please merge them manually.",
 "talkpagemoved" => "The corresponding talk page was also moved.",
 "talkpagenotmoved" => "The corresponding talk page was <strong>not</strong> moved.",
 
+"export"               => "Export pages",
+"exporttext"   => "You can export the text and editing history of a particular
+page or set of pages wrapped in some XML; this can then be imported into another
+wiki running MediaWiki software, transformed, or just kept for your private
+amusement.",
+"exportcuronly"        => "Include only the current revision, not the full history",
+
+# Namespace 8 related
+
+"allmessages"  => "All_messages",
+"allmessagestext"      => "This is a list of all messages available in the MediaWiki: namespace"
 );
 
+#--------------------------------------------------------------------------
+# Internationalisation code
+#--------------------------------------------------------------------------
+
 class Language {
 
        function getDefaultUserOptions () {
@@ -1221,12 +1368,16 @@ class Language {
  
        function date( $ts, $adj = false )
        {
-               global $wgAmericanDates, $wgUser;
+               global $wgAmericanDates, $wgUser, $wgUseDynamicDates;
 
                if ( $adj ) { $ts = $this->userAdjust( $ts ); }
-
-               $datePreference = $wgUser->getOption('date');           
-               if ( $datePrefernce == 0 ) {
+               
+               if ( $wgUseDynamicDates ) {
+                       $datePreference = $wgUser->getOption( 'date' );         
+                       if ( $datePreference == 0 ) {
+                               $datePreference = $wgAmericanDates ? 1 : 2;
+                       }
+               } else {
                        $datePreference = $wgAmericanDates ? 1 : 2;
                }
                
@@ -1259,7 +1410,7 @@ class Language {
 
        function timeanddate( $ts, $adj = false )
        {
-               return $this->time( $ts, $adj ) . " " . $this->date( $ts, $adj );
+               return $this->time( $ts, $adj ) . ", " . $this->date( $ts, $adj );
        }
 
        function rfc1123( $ts )
@@ -1291,6 +1442,12 @@ class Language {
                return $wgAllMessagesEn[$key];
        }
        
+       function getAllMessages()
+       {
+               global $wgAllMessagesEn;
+               return $wgAllMessagesEn;
+       }
+
        function iconv( $in, $out, $string ) {
                # For most languages, this is a wrapper for iconv
                return iconv( $in, $out, $string );
@@ -1370,58 +1527,95 @@ class Language {
 
        function replaceDates( $text )
        {
-               global $wgUser;
+               global $wgUser, $wgInputEncoding, $wgUseDynamicDates;
                
+               # Feature can be disabled
+               if ( !$wgUseDynamicDates ) {
+                       return;
+               }
+
                # Setup
                
-               $datePreference = $wgUser->getOption('date');
-               static $monthNames = "", $rxDM, $rxMD, $rxY, $rxDMY, $rxYMD, $rxMDY, $rxYMD;
+               $datePreference = $wgUser->getOption( 'date' );
+
+               static $monthNames = "", $rxDM, $rxMD, $rxY, $rxDMY, $rxYDM, $rxMDY, $rxYMD;
                if ( $monthNames == "" ) {
                        $monthNames = $this->getMonthRegex();
-                       $rxDM = '\[\[(\d{1,2})[ _](' . $monthNames . ')]](?![a-z])';
-                       $rxMD = '\[\[(' . $monthNames . ')[ _](\d{1,2})]](?![a-z])';
-                       $rxY = '\[\[(\d{1,4}([ _]BC|))]](?![a-z])';
                        
-                       $rxDMY = "/{$rxDM} *, *{$rxY}/i";       
-                       $rxYDM = "/{$rxY} *, *{$rxDM}/i";
-                       $rxMDY = "/{$rxMD} *, *{$rxY}/i";
-                       $rxYMD = "/{$rxY} *, *{$rxMD}/i";
+                       # Attempt at UTF-8 support, untested at the moment
+                       if ( $wgInputEncoding == 'UTF-8' ) {
+                               $regexTrail = '(?![a-z])/iu';
+                       } else {
+                               $regexTrail = '(?![a-z])/i';
+                       }
+
+                       # Partial regular expressions
+                       $prxDM = '\[\[(\d{1,2})[ _](' . $monthNames . ')]]';
+                       $prxMD = '\[\[(' . $monthNames . ')[ _](\d{1,2})]]';
+                       $prxY = '\[\[(\d{1,4}([ _]BC|))]]';
+                       
+                       # Real regular expressions
+                       $rxDMY = "/{$prxDM} *,? *{$prxY}{$regexTrail}"; 
+                       $rxYDM = "/{$prxY} *,? *{$prxDM}{$regexTrail}";
+                       $rxMDY = "/{$prxMD} *,? *{$prxY}{$regexTrail}";
+                       $rxYMD = "/{$prxY} *,? *{$prxMD}{$regexTrail}";
+                       $rxDM = "/{$prxDM}{$regexTrail}";
+                       $rxMD = "/{$prxMD}{$regexTrail}";
+                       $rxY = "/{$prxY}{$regexTrail}";
                }
                
                # Do replacements
                # TODO: month capitalisation?
                if ( $datePreference == 0 ) { 
                        # no preference
-                       $text = preg_replace( $rxDMY, '[[$2 $1|$1 $2]], [[$3]]', $text);
+                       $text = preg_replace( $rxDMY, '[[$2 $1|$1 $2]] [[$3]]', $text);
                        $text = preg_replace( $rxYDM, '[[$1]] [[$4 $3]]', $text);
                        $text = preg_replace( $rxMDY, '[[$1 $2]], [[$3]]', $text);
                        $text = preg_replace( $rxYMD, '[[$1]] [[$3 $4]]', $text);
-                       $text = preg_replace ( "/$rxDM/i", '[[$2 $1|$1 $2]]', $text);
+                       $text = preg_replace ( $rxDM, '[[$2 $1|$1 $2]]', $text);
                } else if ( $datePreference == 1 ) {
                        # MDY preferred
                        $text = preg_replace( $rxDMY, '[[$2 $1]], [[$3]]', $text);
                        $text = preg_replace( $rxYDM, '[[$4 $3]], [[$1]]', $text);
                        $text = preg_replace( $rxMDY, '[[$1 $2]], [[$3]]', $text);
                        $text = preg_replace( $rxYMD, '[[$3 $4]], [[$1]]', $text);
-                       $text = preg_replace ( "/$rxDM/i", '[[$2 $1]]', $text);
+                       $text = preg_replace ( $rxDM, '[[$2 $1]]', $text);
                } else if ( $datePreference == 2 ) {
                        # DMY preferred
-                       $text = preg_replace( $rxDMY, '[[$2 $1|$1 $2]], [[$3]]', $text);
-                       $text = preg_replace( $rxYDM, '[[$4 $3|$3 $4]], [[$1]]', $text);
-                       $text = preg_replace( $rxMDY, '[[$1 $2|$2 $1]], [[$3]]', $text);
-                       $text = preg_replace( $rxYMD, '[[$3 $4|$4 $3]], [[$1]]', $text);
-                       $text = preg_replace ( "/$rxDM/i", '[[$2 $1|$1 $2]]', $text);
-                       $text = preg_replace ( "/$rxMD/i", '[[$1 $2|$2 $1]]', $text);
+                       $text = preg_replace( $rxDMY, '[[$2 $1|$1 $2]] [[$3]]', $text);
+                       $text = preg_replace( $rxYDM, '[[$4 $3|$3 $4]] [[$1]]', $text);
+                       $text = preg_replace( $rxMDY, '[[$1 $2|$2 $1]] [[$3]]', $text);
+                       $text = preg_replace( $rxYMD, '[[$3 $4|$4 $3]] [[$1]]', $text);
+                       $text = preg_replace ( $rxDM, '[[$2 $1|$1 $2]]', $text);
+                       $text = preg_replace ( $rxMD, '[[$1 $2|$2 $1]]', $text);
                } else if ( $datePreference == 3 ) {
                        # YMD preferred
                        $text = preg_replace( $rxDMY, '[[$3]] [[$2 $1]]', $text);
                        $text = preg_replace( $rxYDM, '[[$1]] [[$4 $3]]', $text);
                        $text = preg_replace( $rxMDY, '[[$3]] [[$1 $2]]', $text);
                        $text = preg_replace( $rxYMD, '[[$1]] [[$3 $4]]', $text);
-                       $text = preg_replace ( "/$rxDM/i", '[[$2 $1]]', $text);
+                       $text = preg_replace ( $rxDM, '[[$2 $1]]', $text);
                }
                return $text;
        }
+
+       # For right-to-left language support
+       function isRTL() { return false; }
+
+       function getMagicWords() 
+       {
+               global $wgMagicWordsEn;
+               return $wgMagicWordsEn;
+       }
+
+       # Fill a MagicWord object with data from here
+       function getMagic( &$mw )
+       {
+               $raw = $this->getMagicWords(); # don't worry, it's reference counted not deep copy
+               $rawEntry = $raw[$mw->mId];
+               $mw->mCaseSensitive = $rawEntry[0];
+               $mw->mSynonyms = array_slice( $rawEntry, 1 );
+       }
 }
 
 global $IP;