remove trailing \n which got removed by the parser anyway. Attempt to fix
[lhc/web/wiklou.git] / languages / Language.php
index 673076d..8f19968 100644 (file)
@@ -81,6 +81,8 @@ if(isset($wgExtraNamespaces)) {
        'fancysig'              => 0,
        'externaleditor'        => 0,
        'externaldiff'          => 0,
+       'showjumplinks'         => 1,
+       'numberheadings'        => 0,
 );
 
 /* private */ $wgQuickbarSettingsEn = array(
@@ -107,14 +109,24 @@ if(isset($wgExtraNamespaces)) {
        MW_MATH_MATHML => 'mw_math_mathml'
 );
 
-# Whether to use user or default setting in Language::date()
-
-/* private */ $wgDateFormatsEn = array(
-       'No preference',
-       '16:12, January 15, 2001',
-       '16:12, 15 January 2001',
-       '16:12, 2001 January 15',
-       'ISO 8601' => '2001-01-15 16:12:34'
+/**
+ * Whether to use user or default setting in Language::date()
+ *
+ * NOTE: the array string values are no longer important!
+ * The actual date format functions are now called for the selection in
+ * Special:Preferences, and the 'datedefault' message for MW_DATE_DEFAULT.
+ *
+ * The array keys make up the set of formats which this language allows
+ * the user to select. It's exposed via Language::getDateFormats().
+ *
+ * @access private
+ */
+$wgDateFormatsEn = array(
+       MW_DATE_DEFAULT => 'No preference',
+       MW_DATE_DMY => '16:12, 15 January 2001',
+       MW_DATE_MDY => '16:12, January 15, 2001',
+       MW_DATE_YMD => '16:12, 2001 January 15',
+       MW_DATE_ISO => '2001-01-15 16:12:34'
 );
 
 /* private */ $wgUserTogglesEn = array(
@@ -143,6 +155,7 @@ if(isset($wgExtraNamespaces)) {
        'fancysig',
        'externaleditor',
        'externaldiff',
+       'showjumplinks',
 );
 
 /* private */ $wgBookstoreListEn = array(
@@ -188,7 +201,7 @@ $wgLanguageNamesEn =& $wgLanguageNames;
 #
 /* private */ $wgMagicWordsEn = array(
 #   ID                                 CASE  SYNONYMS
-       MAG_REDIRECT             => array( 0,    '#redirect'              ),
+       MAG_REDIRECT             => array( 0,    '#REDIRECT'              ),
        MAG_NOTOC                => array( 0,    '__NOTOC__'              ),
        MAG_FORCETOC             => array( 0,    '__FORCETOC__'           ),
        MAG_TOC                  => array( 0,    '__TOC__'                ),
@@ -207,6 +220,9 @@ $wgLanguageNamesEn =& $wgLanguageNames;
        MAG_PAGENAME             => array( 1,    'PAGENAME'               ),
        MAG_PAGENAMEE            => array( 1,    'PAGENAMEE'              ),
        MAG_NAMESPACE            => array( 1,    'NAMESPACE'              ),
+       MAG_NAMESPACEE           => array( 1,    'NAMESPACEE'             ),
+       MAG_FULLPAGENAME         => array( 1,    'FULLPAGENAME'           ),
+       MAG_FULLPAGENAMEE        => array( 1,    'FULLPAGENAMEE'          ),
        MAG_MSG                  => array( 0,    'MSG:'                   ),
        MAG_SUBST                => array( 0,    'SUBST:'                 ),
        MAG_MSGNW                => array( 0,    'MSGNW:'                 ),
@@ -233,6 +249,13 @@ $wgLanguageNamesEn =& $wgLanguageNames;
        MAG_CURRENTWEEK          => array( 1,    'CURRENTWEEK'            ),
        MAG_CURRENTDOW           => array( 1,    'CURRENTDOW'             ),
        MAG_REVISIONID           => array( 1,    'REVISIONID'             ),
+       MAG_PLURAL               => array( 0,    'PLURAL:'                ),
+       MAG_FULLURL              => array( 0,    'FULLURL:'               ),
+       MAG_FULLURLE             => array( 0,    'FULLURLE:'              ),
+       MAG_LCFIRST              => array( 0,    'LCFIRST:'               ),
+       MAG_UCFIRST              => array( 0,    'UCFIRST:'               ),
+       MAG_LC                   => array( 0,    'LC:'                    ),
+       MAG_UC                   => array( 0,    'UC:'                    ),
 );
 
 #-------------------------------------------------------------------
@@ -246,10 +269,6 @@ $wgLanguageNamesEn =& $wgLanguageNames;
 global $wgRightsText;
 
 /* private */ $wgAllMessagesEn = array(
-
-# The navigation toolbar, int: is used here to make sure that the appropriate
-# messages are automatically pulled from the user-selected language file.
-
 /*
 The sidebar for MonoBook is generated from this message, lines that do not
 begin with * or ** are discarded, furthermore lines that do begin with ** and
@@ -274,7 +293,7 @@ parent class in order maintain consistency across languages.
 ',
 
 # User preference toggles
-'tog-underline' => 'Underline links',
+'tog-underline' => 'Underline links:',
 'tog-highlightbroken' => 'Format broken links <a href="" class="new">like this</a> (alternative: like this<a href="" class="internal">?</a>).',
 'tog-justify'  => 'Justify paragraphs',
 'tog-hideminor' => 'Hide minor edits in recent changes',
@@ -292,14 +311,15 @@ parent class in order maintain consistency across languages.
 'tog-previewontop' => 'Show preview before edit box',
 'tog-previewonfirst' => 'Show preview on first edit',
 'tog-nocache' => 'Disable page caching',
-'tog-enotifwatchlistpages'     => 'Send me an email on page changes',
-'tog-enotifusertalkpages'      => 'Send me an email when my user talk page is changed',
-'tog-enotifminoredits'                 => 'Send me an email also for minor edits of pages',
-'tog-enotifrevealaddr'                 => 'Reveal my email address in notification mails',
+'tog-enotifwatchlistpages'     => 'E-mail me on page changes',
+'tog-enotifusertalkpages'      => 'E-mail me when my user talk page is changed',
+'tog-enotifminoredits'                 => 'E-mail me also for minor edits of pages',
+'tog-enotifrevealaddr'                 => 'Reveal my e-mail address in notification mails',
 'tog-shownumberswatching'      => 'Show the number of watching users',
 'tog-fancysig' => 'Raw signatures (without automatic link)',
 'tog-externaleditor' => 'Use external editor by default',
 'tog-externaldiff' => 'Use external diff by default',
+'tog-showjumplinks' => 'Enable "jump to" accessibility links',
 
 'underline-always' => 'Always',
 'underline-never' => 'Never',
@@ -341,6 +361,7 @@ parent class in order maintain consistency across languages.
 'dec' => 'Dec',
 # Bits of text used by many pages:
 #
+'categories1' => 'Category',
 'categories' => 'Categories',
 'category' => 'category',
 'category_header' => 'Articles in category "$1"',
@@ -393,6 +414,8 @@ parent class in order maintain consistency across languages.
 
 'disclaimers' => 'Disclaimers',
 'disclaimerpage' => 'Project:General_disclaimer',
+'privacy' => 'Privacy policy',
+'privacypage' => 'Project:Privacy_policy',
 'errorpagetitle' => 'Error',
 'returnto'             => 'Return to $1.',
 'tagline'              => 'From {{SITENAME}}',
@@ -400,7 +423,7 @@ parent class in order maintain consistency across languages.
 'help'                 => 'Help',
 'search'               => 'Search',
 'go'           => 'Go',
-"history"              => 'Page history',
+'history'              => 'Page history',
 'history_short' => 'History',
 'updatedmarker' => 'updated since my last visit',
 'info_short'   => 'Information',
@@ -434,6 +457,7 @@ parent class in order maintain consistency across languages.
 'viewtalkpage' => 'View discussion',
 'otherlanguages' => 'In other languages',
 'redirectedfrom' => '(Redirected from $1)',
+'redirectpagesub' => 'Redirect page',
 'lastmodified' => 'This page was last modified $1.',
 'viewcount'            => 'This page has been accessed $1 times.',
 'copyright'    => 'Content is available under $1.',
@@ -441,6 +465,9 @@ parent class in order maintain consistency across languages.
 'printsubtitle' => '(From {{SERVER}})',
 'protectedpage' => 'Protected page',
 'administrators' => 'Project:Administrators',
+'jumpto' => 'Jump to:',
+'jumptonavigation' => 'navigation',
+'jumptosearch' => 'search',
 
 'sysoptitle'   => 'Sysop access required',
 'sysoptext'            => 'The action you have requested can only be
@@ -460,10 +487,13 @@ See $1.',
 'versionrequiredtext' => 'Version $1 of MediaWiki is required to use this page. See [[Special:Version]]',
 
 'nbytes'               => '$1 bytes',
+'ncategories'          => '$1 categories',
+'nrevisions'           => '$1 revisions',
+'widthheight'          => '$1x$2',
 'ok'                   => 'OK',
 'sitetitle'            => '{{SITENAME}}',
 'pagetitle'            => '$1 - {{SITENAME}}',
-'sitesubtitle' => 'The Free Encyclopedia', # FIXME
+'sitesubtitle' => '',
 'retrievedfrom' => 'Retrieved from "$1"',
 'newmessages' => 'You have $1.',
 'newmessageslink' => 'new messages',
@@ -512,7 +542,7 @@ MySQL returned error "<tt>$3: $4</tt>".',
 The last attempted database query was:
 "$1"
 from within function "$2".
-MySQL returned error "$3: $4"'."\n",
+MySQL returned error "$3: $4"',
 'noconnect'            => 'Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server. <br />
 $1',
 'nodb'                 => 'Could not select database $1',
@@ -560,11 +590,11 @@ You can view and copy the source of this page:',
 # Login and logout pages
 #
 'logouttitle'  => 'User logout',
-'logouttext'           => "You are now logged out.<br />
+'logouttext'   => '<strong>You are now logged out.</strong><br />
 You can continue to use {{SITENAME}} anonymously, or you can log in
 again as the same or as a different user. Note that some pages may
 continue to be displayed as if you were still logged in, until you clear
-your browser cache.\n",
+your browser cache.',
 
 'welcomecreation' => "== Welcome, $1! ==
 
@@ -579,66 +609,72 @@ Your account has been created. Don't forget to change your {{SITENAME}} preferen
 'yourdomainname'       => 'Your domain',
 'externaldberror'      => 'There was either an external authentication database error or you are not allowed to update your external account.',
 'loginproblem' => '<b>There has been a problem with your login.</b><br />Try again!',
-'alreadyloggedin' => "<strong>User $1, you are already logged in!</strong><br />\n",
+'alreadyloggedin' => "<strong>User $1, you are already logged in!</strong><br />",
 
 'login'                        => 'Log in',
 'loginprompt'  => 'You must have cookies enabled to log in to {{SITENAME}}.',
-'userlogin'            => 'Create an account or log in',
+'userlogin'            => 'Log in / create account',
 'logout'               => 'Log out',
 'userlogout'   => 'Log out',
 'notloggedin'  => 'Not logged in',
-'createaccount'        => 'Create new account',
-'createaccountmail'    => 'by email',
+'nologin'      => 'Don\'t have a login? $1.',
+'nologinlink'  => 'Create an account',
+'createaccount'        => 'Create account',
+'gotaccount'   => 'Already got an account? $1.',
+'gotaccountlink'       => 'Log in',
+'createaccountmail'    => 'by e-mail',
 'badretype'            => 'The passwords you entered do not match.',
-'userexists'   => 'The user name you entered is already in use. Please choose a different name.',
-'youremail'            => 'Email *',
+'userexists'   => 'Username entered already in use. Please choose a different name.',
+'youremail'            => 'E-mail *',
+'username'             => 'Username: ',
+'uid'                  => 'User ID: ',
 'yourrealname'         => 'Real name *',
-'yourlanguage' => 'Language',
+'yourlanguage' => 'Language:',
 'yourvariant'  => 'Variant',
-'yournick'             => 'Nickname',
-'email'                        => 'Email',
-'emailforlost'         => "Fields marked with superscripts 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-email-enotif' => 'This address is also used to send you email notifications if you enabled the options.',
+'yournick'             => 'Nickname:',
+'badsig'               => 'Invalid raw signature; check HTML tags.',
+'email'                        => 'E-mail',
+'emailforlost' => '<div style="width:30em">* Optional. An e-mail lets others contact you on this site without revealing your address, and lets us send you a new password if you forget it.<br /><br />Your real name will be used to give you attribution for your work.</div>',
+'prefs-help-email-enotif' => 'This address is also used to send you e-mail notifications if you enabled the options.',
 'prefs-help-realname'  => '* Real name (optional): if you choose to provide it this will be used for giving you attribution for your work.',
 'loginerror'   => 'Login error',
-'prefs-help-email'      => '* Email (optional): Enables others to contact you through your user or user_talk page without the need of revealing your identity.',
-'nocookiesnew' => "The user account was created, but you are not logged in. {{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.",
-'nocookieslogin'       => "{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them and try again.",
+'prefs-help-email'      => '* E-mail (optional): Enables others to contact you through your user or user_talk page without the need of revealing your identity.',
+'nocookiesnew' => 'The user account was created, but you are not logged in. {{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.',
+'nocookieslogin'       => '{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them and try again.',
 'noname'               => 'You have not specified a valid user name.',
 'loginsuccesstitle' => 'Login successful',
-'loginsuccess' => "You are now logged in to {{SITENAME}} as \"$1\".",
-'nosuchuser'   => "There is no user by the name \"$1\".
-Check your spelling, or use the form below to create a new user account.",
-'nosuchusershort'      => "There is no user by the name \"$1\". Check your spelling.",
-'wrongpassword'                => 'The password you entered is incorrect (or missing). Please try again.',
-'mailmypassword'       => 'Mail me a new password',
-'passwordremindertitle' => "Password reminder from {{SITENAME}}",
-'passwordremindertext' => "Someone (probably you, from IP address $1)
+'loginsuccess' => "'''You are now logged in to {{SITENAME}} as \"$1\".'''",
+'nosuchuser'   => 'There is no user by the name "$1". Check your spelling, or create a new account.',
+'nosuchusershort'      => 'There is no user by the name "$1". Check your spelling.',
+'wrongpassword'                => 'Incorrect password entered. Please try again.',
+'wrongpasswordempty'           => 'Password entered was blank. Please try again.',
+'mailmypassword'       => 'E-mail password',
+'passwordremindertitle' => 'Password reminder from {{SITENAME}}',
+'passwordremindertext' => 'Someone (probably you, from IP address $1)
 requested that we send you a new {{SITENAME}} login password for {{SERVERNAME}}.
-The password for user \"$2\" is now \"$3\".
+The password for user "$2" is now "$3".
 You should log in and change your password now.
 
 If someone else made this request or if you have remembered your password and
 you no longer wish to change it, you may ignore this message and continue using
-your old password.",
-'noemail'                          => "There is no e-mail address recorded for user \"$1\".",
-'passwordsent' => "A new password has been sent to the e-mail address
-registered for \"$1\".
-Please log in again after you receive it.",
-'eauthentsent'             =>  "A confirmation email has been sent to the nominated email address.
-Before any other mail is sent to the account, you will have to follow the instructions in the email,
-to confirm that the account is actually yours.",
-'loginend'                         => '&nbsp;',
-'mailerror'                 => "Error sending mail: $1",
+your old password.',
+'noemail' => 'There is no e-mail address recorded for user "$1".',
+'passwordsent' => 'A new password has been sent to the e-mail address
+registered for "$1".
+Please log in again after you receive it.',
+'eauthentsent' =>  'A confirmation e-mail has been sent to the nominated e-mail address.
+Before any other mail is sent to the account, you will have to follow the instructions in the e-mail,
+to confirm that the account is actually yours.',
+'loginend'                         => '',
+'signupend'                        => '{{int:loginend}}',
+'mailerror'                 => 'Error sending mail: $1',
 'acct_creation_throttle_hit' => 'Sorry, you have already created $1 accounts. You can\'t make any more.',
-'emailauthenticated'        => 'Your email address was authenticated on $1.',
-'emailnotauthenticated'     => 'Your email address is <strong>not yet authenticated</strong>. No email
+'emailauthenticated'        => 'Your e-mail address was authenticated on $1.',
+'emailnotauthenticated'     => 'Your e-mail address is <strong>not yet authenticated</strong>. No e-mail
 will be sent for any of the following features.',
-'noemailprefs'              => '<strong>No email address has been specified</strong>, the following
-features will not work.',
+'noemailprefs'              => '<strong>Specify an e-mail address for these features to work.</strong>',
 'emailconfirmlink' => 'Confirm your e-mail address',
-'invalidemailaddress'  => 'The email address cannot be accepted as it appears to have an invalid
+'invalidemailaddress'  => 'The e-mail address cannot be accepted as it appears to have an invalid
 format. Please enter a well-formatted address or empty that field.',
 
 # Edit page toolbar
@@ -674,14 +710,14 @@ format. Please enter a well-formatted address or empty that field.',
 'showpreview'  => 'Show preview',
 'showdiff'     => 'Show changes',
 '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
+'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
 [[Project: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]].
+Note that you may not use the "e-mail this user" feature unless you have a valid e-mail address registered in your [[Special:Preferences|user preferences]].
 
 Your IP address is $3. Please include this address in any queries you make.
-",
+',
 'whitelistedittitle' => 'Login required to edit',
 'whitelistedittext' => 'You have to [[Special:Userlogin|login]] to edit pages.',
 'whitelistreadtitle' => 'Login required to read',
@@ -692,36 +728,40 @@ Your IP address is $3. Please include this address in any queries you make.
 'loginreqlink' => 'login',
 'loginreqpagetext'     => 'You must $1 to view other pages.',
 'accmailtitle' => 'Password sent.',
-'accmailtext' => "The password for '$1' has been sent to $2.",
+'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.
 To create the page, start typing in the box below
 (see the [[Project:Help|help page]] for more info).
 If you are here by mistake, just click your browser's '''back''' button.",
+'newarticletextanon' => '{{int:newarticletext}}',
 'talkpagetext' => '<!-- MediaWiki:talkpagetext -->',
 'anontalkpagetext' => "----''This is the discussion page for an anonymous user who has not created an account yet or who does not use it. We therefore have to use the numerical [[IP address]] to identify him/her. Such an IP address can be shared by several users. If you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:Userlogin|create an account or log in]] to avoid future confusion with other anonymous users.'' ",
-'noarticletext' => '(There is currently no text in this page)',
+'noarticletext' => 'There is currently no text in this page, you can [[{{ns:special}}:Search/{{PAGENAME}}|search for this page title]] in other pages or [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} edit this page].',
+'noarticletextanon' => '{{int:noarticletext}}',
 'clearyourcache' => "'''Note:''' After saving, you may have to bypass your browser's cache to see the changes. '''Mozilla / Firefox / Safari:''' hold down ''Shift'' while clicking ''Reload'', or press ''Ctrl-Shift-R'' (''Cmd-Shift-R'' on Apple Mac); '''IE:''' hold ''Ctrl'' while clicking ''Refresh'', or press ''Ctrl-F5''; '''Konqueror:''': simply click the ''Reload'' button, or press ''F5''; '''Opera''' users may need to completely clear their cache in ''Tools&rarr;Preferences''.",
-'usercssjsyoucanpreview' => "<strong>Tip:</strong> Use the 'Show preview' button to test your new CSS/JS before saving.",
-'usercsspreview' => "'''Remember that you are only previewing your user CSS, it has not yet been saved!'''",
-'userjspreview' => "'''Remember that you are only testing/previewing your user JavaScript, it has not yet been saved!'''",
-'updated'              => '(Updated)',
-'note'                 => '<strong>Note:</strong> ',
-'previewnote'  => 'Remember that this is only a preview, and has not yet been saved!',
+'usercssjsyoucanpreview' => '<strong>Tip:</strong> Use the \'Show preview\' button to test your new CSS/JS before saving.',
+'usercsspreview' => '\'\'\'Remember that you are only previewing your user CSS, it has not yet been saved!\'\'\'',
+'userjspreview' => '\'\'\'Remember that you are only testing/previewing your user JavaScript, it has not yet been saved!\'\'\'',
+'updated' => '(Updated)',
+'note' => '<strong>Note:</strong> ',
+'previewnote' => '<strong>This is only a preview; changes have not yet been saved!</strong>',
+'session_fail_preview' => '<strong>Sorry! We could not process your edit due to a loss of session data. 
+Please try again. If it still doesn\'t work, try logging out and logging back in.</strong>',
 'previewconflict' => 'This preview reflects the text in the upper
 text editing area as it will appear if you choose to save.',
-'editing'              => "Editing $1",
-'editingsection'               => "Editing $1 (section)",
-'editingcomment'               => "Editing $1 (comment)",
-'editconflict' => 'Edit conflict: $1',
-'explainconflict' => "Someone else has changed this page since you
-started editing it.
+'importing' => 'Importing $1',
+'editing' => 'Editing $1',
+'editingsection' => 'Editing $1 (section)',
+'editingcomment' => 'Editing $1 (comment)',
+'editconflict' => 'Edit conflict: $1',
+'explainconflict' => 'Someone else has changed this page since you started editing it.
 The upper text area contains the page text as it currently exists.
 Your changes are shown in the lower text area.
 You will have to merge your changes into the existing text.
 <b>Only</b> the text in the upper text area will be saved when you
-press \"Save page\".<br />",
+press "Save page".<br />',
 'yourtext'             => 'Your text',
 'storedversion' => 'Stored version',
 'nonunicodebrowser' => "<strong>WARNING: Your browser is not unicode compliant. A workaround is in place to allow you to safely edit articles: non-ASCII characters will appear in the edit box as hexadecimal codes.</strong>",
@@ -729,19 +769,13 @@ press \"Save page\".<br />",
 revision of this page.
 If you save it, any changes made since this revision will be lost.</strong>",
 'yourdiff'             => 'Differences',
-'copyrightwarning' => "Please note that all contributions to {{SITENAME}} are
-considered to be released under the $2 (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 />
-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>",
-'copyrightwarning2' => "Please note that all contributions to {{SITENAME}}
-may be edited, altered, or removed by other contributors.
-If you don't want your writing to be edited mercilessly, then don't submit it here.<br />
+'copyrightwarning' => 'Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (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 />
+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>',
+'copyrightwarning2' => 'Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors. If you don\'t want your writing to be edited mercilessly, 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 (see $1 for details).
-<strong>DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!</strong>",
+<strong>DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!</strong>',
 'longpagewarning' => "<strong>WARNING: This page is $1 kilobytes long; some
 browsers may have problems editing pages approaching or longer than 32kb.
 Please consider breaking the page into smaller sections.</strong>",
@@ -750,6 +784,10 @@ so you will not be able to save your edits right now. You may wish to cut-n-past
 the text into a text file and save it for later.</strong>',
 'protectedpagewarning' => "<strong>WARNING:  This page has been locked so that only users with sysop privileges can edit it. Be sure you are following the [[Project:Protected_page_guidelines|protected page guidelines]].</strong>",
 'templatesused'        => 'Templates used on this page:',
+'edittools' => '<!-- Text here will be shown below edit and upload forms. -->',
+'nocreatetitle' => 'Page creation limited',
+'nocreatetext' => 'This site has restricted the ability to create new pages.
+You can go back and edit an existing page, or [[Special:Userlogin|log in or create an account]].',
 
 # History pages
 #
@@ -757,7 +795,7 @@ the text into a text file and save it for later.</strong>',
 'nohistory'            => 'There is no edit history for this page.',
 'revnotfound'  => 'Revision not found',
 'revnotfoundtext' => "The old revision of the page you asked for could not be found.
-Please check the URL you used to access this page.\n",
+Please check the URL you used to access this page.",
 'loadhist'             => 'Loading page history',
 'currentrev'   => 'Current revision',
 'revisionasof'          => 'Revision as of $1',
@@ -820,7 +858,7 @@ 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" => '{{SITENAME}} search is disabled. You can search via Google in the meantime. Note that their indexes of {{SITENAME}} content may be out of date.',
+'searchdisabled' => '{{SITENAME}} search is disabled. You can search via Google in the meantime. Note that their indexes of {{SITENAME}} content may be out of date.',
 
 'googlesearch' => '
 <form method="get" action="http://www.google.com/search" id="googlesearch">
@@ -843,16 +881,14 @@ $2 List redirects &nbsp; Search for $3 $9",
 'preferences'  => 'Preferences',
 'prefsnologin' => 'Not logged in',
 'prefsnologintext'     => "You must be [[Special:Userlogin|logged in]] to set user preferences.",
-'prefslogintext' => "You are logged in as \"$1\".
-Your internal ID number is $2.
-
-See [[Project:User preferences help]] for help deciphering the options.",
 'prefsreset'   => 'Preferences have been reset from storage.',
 'qbsettings'   => 'Quickbar',
 'changepassword' => 'Change password',
 'skin'                 => 'Skin',
 'math'                 => 'Math',
 'dateformat'           => 'Date format',
+'datedefault'          => 'No preference',
+'datetime'             => 'Date and time',
 'math_failure'         => 'Failed to parse',
 'math_unknown_error'   => 'unknown error',
 'math_unknown_function'        => 'unknown function ',
@@ -862,23 +898,23 @@ See [[Project:User preferences help]] for help deciphering the options.",
 'math_bad_tmpdir'      => 'Can\'t write to or create math temp directory',
 'math_bad_output'      => 'Can\'t write to or create math output directory',
 'math_notexvc' => 'Missing texvc executable; please see math/README to configure.',
-'prefs-personal' => 'User data',
-'prefs-rc' => 'Recent changes & stubs',
+'prefs-personal' => 'User profile',
+'prefs-rc' => 'Recent changes',
 'prefs-misc' => 'Misc',
 'saveprefs'            => 'Save',
 'resetprefs'   => 'Reset',
-'oldpassword'  => 'Old password',
-'newpassword'  => 'New password',
-'retypenew'            => 'Retype new password',
+'oldpassword'  => 'Old password:',
+'newpassword'  => 'New password:',
+'retypenew'            => 'Retype new password:',
 'textboxsize'  => 'Editing',
-'rows'                 => 'Rows',
-'columns'              => 'Columns',
+'rows'                 => 'Rows:',
+'columns'              => 'Columns:',
 'searchresultshead' => 'Search',
-'resultsperpage' => 'Hits per page',
-'contextlines' => 'Lines per hit',
-'contextchars' => 'Context per line',
-'stubthreshold' => 'Threshold for stub display',
-'recentchangescount' => 'Titles in recent changes',
+'resultsperpage' => 'Hits per page:',
+'contextlines' => 'Lines per hit:',
+'contextchars' => 'Context per line:',
+'stubthreshold' => 'Threshold for stub display:',
+'recentchangescount' => 'Titles in recent changes:',
 'savedprefs'   => 'Your preferences have been saved.',
 'timezonelegend' => 'Time zone',
 'timezonetext' => 'The number of hours your local time differs from server time (UTC).',
@@ -886,7 +922,7 @@ See [[Project:User preferences help]] for help deciphering the options.",
 'timezoneoffset' => 'Offset¹',
 'servertime'   => 'Server time',
 'guesstimezone' => 'Fill in from browser',
-'emailflag'            => 'Disable e-mail from other users',
+'allowemail'           => 'Enable e-mail from other users',
 'defaultns'            => 'Search in these namespaces by default:',
 'default'              => 'default',
 'files'                        => 'Files',
@@ -984,19 +1020,12 @@ Unselected groups will not be changed. You can deselect a group with CTRL + Left
 to upload files.",
 'upload_directory_read_only' => 'The upload directory ($1) is not writable by the webserver.',
 'uploaderror'  => 'Upload error',
-'uploadtext'   =>
-"
-Use the form below to upload files,
-to view or search previously uploaded images
-go to the [[Special:Imagelist|list of uploaded files]],
-uploads and deletions are also logged in the [[Special:Log/upload|upload log]].
+'uploadtext'   => "Use the form below to upload files, to view or search previously uploaded images go to the [[Special:Imagelist|list of uploaded files]], uploads and deletions are also logged in the [[Special:Log/upload|upload log]].
 
 To include the image in a page, use a link in the form
 '''<nowiki>[[{{ns:6}}:file.jpg]]</nowiki>''',
 '''<nowiki>[[{{ns:6}}:file.png|alt text]]</nowiki>''' or
-'''<nowiki>[[{{ns:-2}}:file.ogg]]</nowiki>''' for directly linking to the file.
-",
-
+'''<nowiki>[[{{ns:-2}}:file.ogg]]</nowiki>''' for directly linking to the file.",
 'uploadlog'            => 'upload log',
 'uploadlogpage' => 'Upload_log',
 'uploadlogpagetext' => 'Below is a list of the most recent file uploads.',
@@ -1008,7 +1037,8 @@ To include the image in a page, use a link in the form
 'copyrightpage' => "Project:Copyrights",
 'copyrightpagename' => "{{SITENAME}} copyright",
 'uploadedfiles'        => 'Uploaded files',
-'ignorewarning'        => 'Ignore warning and save file anyway.',
+'ignorewarning'        => 'Ignore warning and save file anyway.',
+'ignorewarnings'       => 'Ignore any warnings',
 'minlength'            => 'File names must be at least three letters.',
 'illegalfilename'      => 'The filename "$1" contains characters that are not allowed in page titles. Please rename the file and try uploading it again.',
 'badfilename'  => 'File name has been changed to "$1".',
@@ -1034,7 +1064,7 @@ created and by whom, and anything else you may know about it. If this is an imag
 'sourcefilename' => 'Source filename',
 'destfilename' => 'Destination filename',
 
-'license' => 'Licensing',      
+'license' => 'Licensing',
 'nolicense' => 'None selected',
 
 # Image list
@@ -1068,6 +1098,16 @@ this old version, (rev) = revert to this old version.
 'noimage-linktext'       => 'upload it',
 'uploadnewversion' => '[$1 Upload a new version of this file]',
 
+# Mime search
+#
+'mimesearch' => 'MIME search',
+'mimetype' => 'MIME type: ',
+'download' => 'download',
+
+# Unwatchedpages
+#
+'unwatchedpages' => 'Unwatched pages',
+
 # Statistics
 #
 'statistics'   => 'Statistics',
@@ -1095,6 +1135,7 @@ That comes to '''$5''' average edits per page, and '''$6''' views per edit.",
 'disambiguationstext'  => "The following pages link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as disambiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
 'doubleredirects'      => 'Double redirects',
 'doubleredirectstext'  => "Each row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" target page, which the first redirect should point to.",
+'doubleredirectsarrow' => '→',
 'brokenredirects'      => 'Broken Redirects',
 'brokenredirectstext'  => 'The following redirects link to a non-existing pages.',
 'selflinks'            => 'Pages with Self Links',
@@ -1110,7 +1151,6 @@ That comes to '''$5''' average edits per page, and '''$6''' views per edit.",
 # Miscellaneous special pages
 #
 'orphans'              => 'Orphaned pages',
-'geo'          => 'GEO coordinates',
 'validate'             => 'Validate page',
 'lonelypages'  => 'Orphaned pages',
 'uncategorizedpages'   => 'Uncategorized pages',
@@ -1119,8 +1159,13 @@ That comes to '''$5''' average edits per page, and '''$6''' views per edit.",
 'unusedimages' => 'Unused files',
 'popularpages' => 'Popular pages',
 'nviews'               => '$1 views',
+'wantedcategories' => 'Wanted categories',
 'wantedpages'  => 'Wanted pages',
 'mostlinked'   => 'Most linked to pages',
+'mostlinkedcategories' => 'Most linked to categories',
+'mostcategories' => 'Articles with the most categories',
+'mostimages'   => 'Most linked to images',
+'mostrevisions' => 'Articles with the most revisions',
 'nlinks'               => '$1 links',
 'allpages'             => 'All pages',
 'prefixindex'   => 'Prefix index',
@@ -1175,6 +1220,7 @@ You can narrow down the view by selecting a log type, the user name, or the affe
 'allpagesprev'         => 'Previous',
 'allpagesnext'         => 'Next',
 'allpagessubmit'       => 'Go',
+'allpagesprefix'       => 'Display pages with prefix:',
 
 # E this user
 #
@@ -1224,10 +1270,9 @@ make it easier to pick out.
 'unwatchthispage'      => 'Stop watching',
 'notanarticle'         => 'Not a content page',
 'watchnochange'        => 'None of your watched items was edited in the time period displayed.',
-'watchdetails'         => "* $1 pages watched not counting talk pages
-* [[Special:Watchlist/edit|Show and edit complete watchlist]]
-",
-'wlheader-enotif'              => "* Email notification is enabled.",
+'watchdetails'         => '* $1 pages watched not counting talk pages
+* [[Special:Watchlist/edit|Show and edit complete watchlist]]',
+'wlheader-enotif'              => "* E-mail notification is enabled.",
 'wlheader-showupdated'   => "* Pages which have been changed since you last visited them are shown in '''bold'''",
 'watchmethod-recent'=> 'checking recent edits for watched pages',
 'watchmethod-list'     => 'checking watched pages for recent edits',
@@ -1352,7 +1397,7 @@ before deletion. The actual text of these deleted revisions is only available to
 'undeletebtn' => 'Restore!',
 'undeletedarticle' => "restored \"[[$1]]\"",
 'undeletedrevisions' => "$1 revisions restored",
-'undeletedtext'   => "[[$1]] has been successfully restored.
+'undeletedtext'   => "[[:$1|$1]] has been successfully restored.
 See [[Special:Log/delete]] for a record of recent deletions and restorations.",
 
 # Namespace form on various pages
@@ -1425,10 +1470,10 @@ the list of currently operational bans and blocks.',
 'unblocklogentry'      => 'unblocked $1',
 'range_block_disabled' => 'The sysop ability to create range blocks is disabled.',
 'ipb_expiry_invalid'   => 'Expiry time invalid.',
-'ip_range_invalid'     => "Invalid IP range.\n",
+'ip_range_invalid'     => 'Invalid IP range.',
 'proxyblocker' => 'Proxy blocker',
 'proxyblockreason'     => 'Your IP address has been blocked because it is an open proxy. Please contact your Internet service provider or tech support and inform them of this serious security problem.',
-'proxyblocksuccess'    => "Done.\n",
+'proxyblocksuccess'    => 'Done.',
 'sorbs'         => 'SORBS DNSBL',
 'sorbsreason'   => 'Your IP address is listed as an open proxy in the [http://www.sorbs.net SORBS] DNSBL.',
 'sorbs_create_account_reason' => 'Your IP address is listed as an open proxy in the [http://www.sorbs.net SORBS] DNSBL. You cannot create an account',
@@ -1516,7 +1561,7 @@ Type the name of the user in the box and press the button to make the user an ad
 'val_tab' => 'Validate',
 'val_this_is_current_version' => 'this is the latest version',
 'val_version_of' => "Version of $1" ,
-'val_table_header' => '<tr><th>Class</th>$1<th colspan="4">Opinion</th>$1<th>Comment</th></tr>\n',
+'val_table_header' => '<tr><th>Class</th>$1<th colspan="4">Opinion</th>$1<th>Comment</th></tr>',
 'val_stat_link_text' => 'Validation statistics for this article',
 'val_view_version' => 'View this revision',
 'val_validate_version' => 'Validate this version',
@@ -1526,6 +1571,9 @@ Type the name of the user in the box and press the button to make the user an ad
 'val_validated' => 'Validation done.',
 'val_article_lists' => 'List of validated articles',
 'val_page_validation_statistics' => 'Page validation statistics for $1',
+'val_max_topics' => 'Maximum number of $1 topics reached',
+'val_no_topics_defined' => 'No topics defined',
+'val_no_topics_defined_text' => 'You have no topics defined which can be rated. Go to [[Special:Validate]], and have an administrator run the "Manage" function to add at least one topic and point range.',
 
 # Move page
 #
@@ -1572,8 +1620,8 @@ title. Please merge them manually.'''",
 'movetalk'             => 'Move "talk" page as well, if applicable.',
 'talkpagemoved' => 'The corresponding talk page was also moved.',
 'talkpagenotmoved' => 'The corresponding talk page was <strong>not</strong> moved.',
-'1movedto2'            => '$1 moved to $2',
-'1movedto2_redir' => '$1 moved to $2 over redirect',
+'1movedto2'            => '[[$1]] moved to [[$2]]',
+'1movedto2_redir' => '[[$1]] moved to [[$2]] over redirect',
 'movelogpage' => 'Move log',
 'movelogpagetext' => 'Below is a list of page moved.',
 'movereason'   => 'Reason',
@@ -1595,12 +1643,11 @@ set of pages wrapped in some XML. In the future, this may then be imported into
 wiki running MediaWiki software, although there is no support for this feature in the
 current version.
 
-To export article pages, enter the titles in the text box below, one title per line, and
+To export pages, enter the titles in the text box below, one title per line, and
 select whether you want the current version as well as all old versions, with the page
 history lines, or just the current version with the info about the last edit.
 
-In the latter case you can also use a link, e.g. [[{{ns:Special}}:Export/Train]] for the
-article [[Train]].
+In the latter case you can also use a link, e.g. [[{{ns:Special}}:Export/{{Mediawiki:mainpage}}]] for the page {{Mediawiki:mainpage}}.
 ',
 'exportcuronly'        => 'Include only the current revision, not the full history',
 
@@ -1617,7 +1664,7 @@ article [[Train]].
 # Thumbnails
 
 'thumbnail-more'       => 'Enlarge',
-'missingimage'         => "<b>Missing image</b><br /><i>$1</i>\n",
+'missingimage'         => '<b>Missing image</b><br /><i>$1</i>',
 'filemissing'          => 'File missing',
 
 # Special:Import
@@ -1629,6 +1676,8 @@ article [[Train]].
 'importsuccess'        => 'Import succeeded!',
 'importhistoryconflict' => 'Conflicting history revision exists (may have imported this page before)',
 'importnosources' => 'No transwiki import sources have been defined and direct history uploads are disabled.',
+'importnofile' => 'No import file was uploaded.',
+'importuploaderror' => 'Upload of import file failed; perhaps the file is bigger than the allowed upload size.',
 
 # Keyboard access keys for power users
 'accesskey-search' => 'f',
@@ -1796,6 +1845,18 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');
 
 # Metadata
 'metadata' => 'Metadata',
+'metadata-help' => 'This file contains additional information, probably added from the digital camera or scanner used to create or digitize it. If the file has been modified from its original state, some details may not fully reflect the modified image.',
+'metadata-expand' => 'Show extended details',
+'metadata-collapse' => 'Hide extended details',
+'metadata-fields' => 'EXIF metadata fields listed in this message will
+be included on image page display when the metadata table
+is collapsed. Others will be hidden by default.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* focallength',
 
 # Exif tags
 'exif-imagewidth' =>'Width',
@@ -1844,7 +1905,9 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');
 'exif-subsectimeoriginal' =>'DateTimeOriginal subseconds',
 'exif-subsectimedigitized' =>'DateTimeDigitized subseconds',
 'exif-exposuretime' =>'Exposure time',
+'exif-exposuretime-format' => '$1 sec ($2)',
 'exif-fnumber' =>'F Number',
+'exif-fnumber-format' =>'f/$1',
 'exif-exposureprogram' =>'Exposure Program',
 'exif-spectralsensitivity' =>'Spectral sensitivity',
 'exif-isospeedratings' =>'ISO speed rating',
@@ -1859,6 +1922,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');
 'exif-lightsource' =>'Light source',
 'exif-flash' =>'Flash',
 'exif-focallength' =>'Lens focal length',
+'exif-focallength-format' =>'$1 mm',
 'exif-subjectarea' =>'Subject area',
 'exif-flashenergy' =>'Flash energy',
 'exif-spatialfrequencyresponse' =>'Spatial frequency response',
@@ -1927,7 +1991,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');
 'exif-compression-1' => 'Uncompressed',
 'exif-compression-6' => 'JPEG',
 
-'exif-photometricinterpretation-1' => 'RGB',
+'exif-photometricinterpretation-2' => 'RGB',
 'exif-photometricinterpretation-6' => 'YCbCr',
 
 'exif-orientation-1' => 'Normal', // 0th row: top; 0th column: left
@@ -1983,7 +2047,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');
 'exif-lightsource-3' => 'Tungsten (incandescent light)',
 'exif-lightsource-4' => 'Flash',
 'exif-lightsource-9' => 'Fine weather',
-'exif-lightsource-10' => 'Clody weather',
+'exif-lightsource-10' => 'Cloudy weather',
 'exif-lightsource-11' => 'Shade',
 'exif-lightsource-12' => 'Daylight fluorescent (D 5700 – 7100K)',
 'exif-lightsource-13' => 'Day white fluorescent (N 4600 – 5400K)',
@@ -2123,13 +2187,13 @@ will expire at $4.
 'scarytranscludetoolong' => '[URL is too long; sorry]',
 
 # Trackbacks
-'trackbackbox' => "<div id='mw_trackbacks'>
+'trackbackbox' => '<div id="mw_trackbacks">
 Trackbacks for this article:<br />
 $1
 </div>
-",
-'trackback' => "; $4$5 : [$2 $1]\n",
-'trackbackexcerpt' => "; $4$5 : [$2 $1]: <nowiki>$3</nowiki>\n",
+',
+'trackback' => '; $4$5 : [$2 $1]',
+'trackbackexcerpt' => '; $4$5 : [$2 $1]: <nowiki>$3</nowiki>',
 'trackbackremove' => ' ([$1 Delete])',
 'trackbacklink' => 'Trackback',
 'trackbackdeleteok' => 'The trackback was successfully deleted.',
@@ -2146,6 +2210,13 @@ Please confirm that really want to recreate this article.',
 
 'unit-pixel' => 'px',
 
+# HTML dump
+'redirectingto' => 'Redirecting to [[$1]]...',
+
+# action=purge
+'confirm_purge' => "Clear the cache of this page?\n\n$1",
+'confirm_purge_button' => 'OK',
+
 );
 
 /* a fake language converter */
@@ -2414,23 +2485,34 @@ class Language {
         * all children.
         *
         *<code>
-        * function timeanddate([...], $format = '0') {
+        * function timeanddate([...], $format = true) {
         *      $datePreference = $this->dateFormat($format);
         * [...]
         *</code>
         *
-        * @param mixed $format
+        * @param mixed $usePrefs: if true, the user's preference is used
+        *                         if false, the site/language default is used
+        *                         if int/string, assumed to be a format.
         * @return string
         */
-       function dateFormat( $format ) {
-               global $wgUser;
+       function dateFormat( $usePrefs = true ) {
+               global $wgUser, $wgAmericanDates;
 
-               if ( !$wgUser->isLoggedIn() || $format === false ) {
-                       $options = $this->getDefaultUserOptions();
-                       return (string)$options['date'];
+               if( is_bool( $usePrefs ) ) {
+                       if( $usePrefs ) {
+                               $datePreference = $wgUser->getOption( 'date' );
+                       } else {
+                               $options = $this->getDefaultUserOptions();
+                               $datePreference = (string)$options['date'];
+                       }
                } else {
-                       return $wgUser->getOption( 'date' );
+                       $datePreference = (string)$usePrefs;
+               }
+
+               if( $datePreference == MW_DATE_DEFAULT || $datePreference == '' ) {
+                       return $wgAmericanDates ? MW_DATE_MDY : MW_DATE_DMY;
                }
+               return $datePreference;
        }
 
        /**
@@ -2439,30 +2521,26 @@ class Language {
         *               date('YmdHis') format with wfTimestamp(TS_MW,$ts)
         * @param bool   $adj whether to adjust the time output according to the
         *               user configured offset ($timecorrection)
-        * @param mixed  $format what format to return, if it's false output the
-        *               default one.
+        * @param mixed  $format true to use user's date format preference
         * @param string $timecorrection the time offset as returned by
         *               validateTimeZone() in Special:Preferences
         * @return string
         */
        function date( $ts, $adj = false, $format = true, $timecorrection = false ) {
-               global $wgAmericanDates, $wgUser;
+               global $wgUser;
 
                if ( $adj ) { $ts = $this->userAdjust( $ts, $timecorrection ); }
 
-               $datePreference = $this->dateFormat($format);
-
-               if ($datePreference == '0'
-                   || $datePreference == '' ) {$datePreference = $wgAmericanDates ? '0' : '2';}
+               $datePreference = $this->dateFormat( $format );
 
-               $month = $this->getMonthName( substr( $ts, 4, 2 ) );
-               $day = $this->formatNum( 0 + substr( $ts, 6, 2 ) );
+               $month = $this->formatMonth( substr( $ts, 4, 2 ), $datePreference );
+               $day = $this->formatDay( substr( $ts, 6, 2 ), $datePreference );
                $year = $this->formatNum( substr( $ts, 0, 4 ), true );
 
                switch( $datePreference ) {
-                       case '2': return "$day $month $year";
-                       case '3': return "$year $month $day";
-                       case 'ISO 8601': return substr($ts, 0, 4). '-' . substr($ts, 4, 2). '-' .substr($ts, 6, 2);
+                       case MW_DATE_DMY: return "$day $month $year";
+                       case MW_DATE_YMD: return "$year $month $day";
+                       case MW_DATE_ISO: return substr($ts, 0, 4). '-' . substr($ts, 4, 2). '-' .substr($ts, 6, 2);
                        default: return "$month $day, $year";
                }
        }
@@ -2473,26 +2551,63 @@ class Language {
        *               date('YmdHis') format with wfTimestamp(TS_MW,$ts)
        * @param bool   $adj whether to adjust the time output according to the
        *               user configured offset ($timecorrection)
-       * @param mixed  $format what format to return, if it's false output the
-       *               default one (default true)
+       * @param mixed  $format true to use user's date format preference
        * @param string $timecorrection the time offset as returned by
        *               validateTimeZone() in Special:Preferences
        * @return string
        */
        function time( $ts, $adj = false, $format = true, $timecorrection = false ) {
-               global $wgUser, $wgAmericanDates;
+               global $wgUser;
 
                if ( $adj ) { $ts = $this->userAdjust( $ts, $timecorrection ); }
-               $datePreference = $this->dateFormat($format);
-
-               if ($datePreference == '0') {$datePreference = $wgAmericanDates ? '0' : '2';}
-
-               $t = substr( $ts, 8, 2 ) . ':' . substr( $ts, 10, 2 );
-
-               if ( $datePreference === 'ISO 8601' ) {
-                       $t .= ':' . substr( $ts, 12, 2 );
+               $datePreference = $this->dateFormat( $format );
+               
+               $sep = ($datePreference == MW_DATE_ISO)
+                       ? ':'
+                       : $this->timeSeparator( $format );
+               
+               $t = substr( $ts, 8, 2 ) . $sep . substr( $ts, 10, 2 );
+
+               if ( $datePreference == MW_DATE_ISO ) {
+                       $t .= $sep . substr( $ts, 12, 2 );
                }
-               return $this->formatNum( $t );
+               return $t;
+       }
+       
+       /**
+        * Default separator character between hours, minutes, and seconds.
+        * Will be used by Language::time() for non-ISO formats.
+        * (ISO will always use a colon.)
+        * @return string
+        */
+       function timeSeparator( $format ) {
+               return ':';
+       }
+       
+       /**
+        * String to insert between the time and the date in a combined
+        * string. Should include any relevant whitespace.
+        * @return string
+        */
+       function timeDateSeparator( $format ) {
+               return ', ';
+       }
+       
+       /**
+        * Return true if the time should display before the date.
+        * @return bool
+        * @access private
+        */
+       function timeBeforeDate() {
+               return true;
+       }
+
+       function formatMonth( $month, $format ) {
+               return $this->getMonthName( $month );
+       }
+       
+       function formatDay( $day, $format ) {
+               return $this->formatNum( 0 + $day );
        }
 
        /**
@@ -2501,22 +2616,25 @@ class Language {
        *               date('YmdHis') format with wfTimestamp(TS_MW,$ts)
        * @param bool   $adj whether to adjust the time output according to the
        *               user configured offset ($timecorrection)
-       * @param mixed  $format what format to return, if it's false output the
-       *               default one (default true)
+       * @param mixed  $format true to use user's date format preference
        * @param string $timecorrection the time offset as returned by
        *               validateTimeZone() in Special:Preferences
        * @return string
        */
        function timeanddate( $ts, $adj = false, $format = true, $timecorrection = false) {
-               global $wgUser, $wgAmericanDates;
+               global $wgUser;
 
                $datePreference = $this->dateFormat($format);
-
                switch ( $datePreference ) {
-                       case 'ISO 8601': return $this->date( $ts, $adj, $datePreference, $timecorrection ) . ' ' .
-                               $this->time( $ts, $adj, $datePreference, $timecorrection );
-                       default: return $this->time( $ts, $adj, $datePreference, $timecorrection ) . ', ' .
-                               $this->date( $ts, $adj, $datePreference, $timecorrection );
+                       case MW_DATE_ISO: return $this->date( $ts, $adj, $format, $timecorrection ) . ' ' .
+                               $this->time( $ts, $adj, $format, $timecorrection );
+                       default:
+                               $time = $this->time( $ts, $adj, $format, $timecorrection );
+                               $sep = $this->timeDateSeparator( $datePreference );
+                               $date = $this->date( $ts, $adj, $format, $timecorrection );
+                               return $this->timeBeforeDate( $datePreference )
+                                       ? $time . $sep . $date
+                                       : $date . $sep . $time;
                }
        }
 
@@ -2540,10 +2658,18 @@ class Language {
                return ucfirst( $string );
        }
 
+       function uc( $str ) {
+               return strtoupper( $str );
+       }
+
        function lcfirst( $s ) {
                return strtolower( $s{0} ). substr( $s, 1 );
        }
 
+       function lc( $str ) {
+               return strtolower( $str );
+       }
+
        function checkTitleEncoding( $s ) {
                global $wgInputEncoding;
 
@@ -2664,6 +2790,9 @@ class Language {
        # Fill a MagicWord object with data from here
        function getMagic( &$mw ) {
                $raw = $this->getMagicWords();
+
+               wfRunHooks( 'LanguageGetMagic', array( &$raw ) );
+               
                if( !isset( $raw[$mw->mId] ) ) {
                        # Fall back to English if local list is incomplete
                        $raw =& Language::getMagicWords();
@@ -2782,6 +2911,27 @@ class Language {
                return $word;
        }
 
+       /**
+        * Plural form transformations, needed for some languages.
+        * For example, where are 3 form of plural in Russian and Polish,
+        * depending on "count mod 10". See [[w:Plural]]
+        * For English it is pretty simple.
+        *
+        * Invoked by putting {{plural:count|wordform1|wordform2}}
+        * or {{plural:count|wordform1|wordform2|wordform3}}
+        *
+        * Example: {{plural:{{NUMBEROFARTICLES}}|article|articles}} 
+        *
+        * @param integer $count
+        * @param string $wordform1
+        * @param string $wordform2
+        * @param string $wordform3 (optional)
+        * @return string
+        */
+       function convertPlural( $count, $wordform1, $wordform2, $wordform3) {
+               return $count == 1 ? $wordform1 : $wordform2;
+       }
+
        /**
         * For translaing of expiry times
         * @param string The validated block time in English