diff options
Diffstat (limited to 'includes/Preferences.php')
-rw-r--r-- | includes/Preferences.php | 135 |
1 files changed, 86 insertions, 49 deletions
diff --git a/includes/Preferences.php b/includes/Preferences.php index a5239331..d0475c17 100644 --- a/includes/Preferences.php +++ b/includes/Preferences.php @@ -124,6 +124,7 @@ class Preferences { $disable = !$user->isAllowed( 'editmyoptions' ); + $defaultOptions = User::getDefaultOptions(); ## Prod in defaults from the user foreach ( $defaultPreferences as $name => &$info ) { $prefFromUser = self::getOptionFromUser( $name, $info, $user ); @@ -131,7 +132,6 @@ class Preferences { $info['disabled'] = 'disabled'; } $field = HTMLForm::loadInputFromParameters( $name, $info, $dummyForm ); // For validation - $defaultOptions = User::getDefaultOptions(); $globalDefault = isset( $defaultOptions[$name] ) ? $defaultOptions[$name] : null; @@ -657,8 +657,9 @@ class Preferences { $now = wfTimestampNow(); $lang = $context->getLanguage(); $nowlocal = Xml::element( 'span', array( 'id' => 'wpLocalTime' ), - $lang->time( $now, true ) ); - $nowserver = $lang->time( $now, false ) . + $lang->userTime( $now, $user ) ); + $nowserver = $lang->userTime( $now, $user, + array( 'format' => false, 'timecorrection' => false ) ) . Html::hidden( 'wpServerTime', (int)substr( $now, 8, 2 ) * 60 + (int)substr( $now, 10, 2 ) ); $defaultPreferences['nowserver'] = array( @@ -750,7 +751,11 @@ class Preferences { 'type' => 'select', 'section' => 'rendering/advancedrendering', 'options' => $stubThresholdOptions, - 'label-raw' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay? + // This is not a raw HTML message; label-raw is needed for the manual <a></a> + 'label-raw' => $context->msg( 'stub-threshold' )->rawParams( + '<a href="#" class="stub">' . + $context->msg( 'stub-threshold-sample-link' )->parse() . + '</a>' )->parse(), ); $defaultPreferences['showhiddencats'] = array( @@ -1293,12 +1298,19 @@ class Preferences { $opt = array(); $localTZoffset = $context->getConfig()->get( 'LocalTZoffset' ); + $timeZoneList = self::getTimeZoneList( $context->getLanguage() ); + $timestamp = MWTimestamp::getLocalInstance(); // Check that the LocalTZoffset is the same as the local time zone offset if ( $localTZoffset == $timestamp->format( 'Z' ) / 60 ) { + $timezoneName = $timestamp->getTimezone()->getName(); + // Localize timezone + if ( isset( $timeZoneList[$timezoneName] ) ) { + $timezoneName = $timeZoneList[$timezoneName]['name']; + } $server_tz_msg = $context->msg( 'timezoneuseserverdefault', - $timestamp->getTimezone()->getName() + $timezoneName )->text(); } else { $tzstring = sprintf( @@ -1312,49 +1324,12 @@ class Preferences { $opt[$context->msg( 'timezoneuseoffset' )->text()] = 'other'; $opt[$context->msg( 'guesstimezone' )->text()] = 'guess'; - if ( function_exists( 'timezone_identifiers_list' ) ) { - # Read timezone list - $tzs = timezone_identifiers_list(); - sort( $tzs ); - - $tzRegions = array(); - $tzRegions['Africa'] = $context->msg( 'timezoneregion-africa' )->text(); - $tzRegions['America'] = $context->msg( 'timezoneregion-america' )->text(); - $tzRegions['Antarctica'] = $context->msg( 'timezoneregion-antarctica' )->text(); - $tzRegions['Arctic'] = $context->msg( 'timezoneregion-arctic' )->text(); - $tzRegions['Asia'] = $context->msg( 'timezoneregion-asia' )->text(); - $tzRegions['Atlantic'] = $context->msg( 'timezoneregion-atlantic' )->text(); - $tzRegions['Australia'] = $context->msg( 'timezoneregion-australia' )->text(); - $tzRegions['Europe'] = $context->msg( 'timezoneregion-europe' )->text(); - $tzRegions['Indian'] = $context->msg( 'timezoneregion-indian' )->text(); - $tzRegions['Pacific'] = $context->msg( 'timezoneregion-pacific' )->text(); - asort( $tzRegions ); - - $prefill = array_fill_keys( array_values( $tzRegions ), array() ); - $opt = array_merge( $opt, $prefill ); - - $now = date_create( 'now' ); - - foreach ( $tzs as $tz ) { - $z = explode( '/', $tz, 2 ); - - # timezone_identifiers_list() returns a number of - # backwards-compatibility entries. This filters them out of the - # list presented to the user. - if ( count( $z ) != 2 || !array_key_exists( $z[0], $tzRegions ) ) { - continue; - } - - # Localize region - $z[0] = $tzRegions[$z[0]]; - - $minDiff = floor( timezone_offset_get( timezone_open( $tz ), $now ) / 60 ); - - $display = str_replace( '_', ' ', $z[0] . '/' . $z[1] ); - $value = "ZoneInfo|$minDiff|$tz"; - - $opt[$z[0]][$display] = $value; + foreach ( $timeZoneList as $timeZoneInfo ) { + $region = $timeZoneInfo['region']; + if ( !isset( $opt[$region] ) ) { + $opt[$region] = array(); } + $opt[$region][$timeZoneInfo['name']] = $timeZoneInfo['timecorrection']; } return $opt; } @@ -1393,7 +1368,7 @@ class Preferences { } # Max is +14:00 and min is -12:00, see: - # http://en.wikipedia.org/wiki/Timezone + # https://en.wikipedia.org/wiki/Timezone $minDiff = min( $minDiff, 840 ); # 14:00 $minDiff = max( $minDiff, - 720 ); # -12:00 return 'Offset|' . $minDiff; @@ -1458,10 +1433,10 @@ class Preferences { } Hooks::run( 'PreferencesFormPreSave', array( $formData, $form, $user, &$result ) ); - $user->saveSettings(); } $wgAuth->updateExternalDB( $user ); + $user->saveSettings(); return $result; } @@ -1490,6 +1465,68 @@ class Preferences { return Status::newGood(); } + + /** + * Get a list of all time zones + * @param Language $language Language used for the localized names + * @return array A list of all time zones. The system name of the time zone is used as key and + * the value is an array which contains localized name, the timecorrection value used for + * preferences and the region + * @since 1.26 + */ + public static function getTimeZoneList( Language $language ) { + $identifiers = DateTimeZone::listIdentifiers(); + if ( $identifiers === false ) { + return array(); + } + sort( $identifiers ); + + $tzRegions = array( + 'Africa' => wfMessage( 'timezoneregion-africa' )->inLanguage( $language )->text(), + 'America' => wfMessage( 'timezoneregion-america' )->inLanguage( $language )->text(), + 'Antarctica' => wfMessage( 'timezoneregion-antarctica' )->inLanguage( $language )->text(), + 'Arctic' => wfMessage( 'timezoneregion-arctic' )->inLanguage( $language )->text(), + 'Asia' => wfMessage( 'timezoneregion-asia' )->inLanguage( $language )->text(), + 'Atlantic' => wfMessage( 'timezoneregion-atlantic' )->inLanguage( $language )->text(), + 'Australia' => wfMessage( 'timezoneregion-australia' )->inLanguage( $language )->text(), + 'Europe' => wfMessage( 'timezoneregion-europe' )->inLanguage( $language )->text(), + 'Indian' => wfMessage( 'timezoneregion-indian' )->inLanguage( $language )->text(), + 'Pacific' => wfMessage( 'timezoneregion-pacific' )->inLanguage( $language )->text(), + ); + asort( $tzRegions ); + + $timeZoneList = array(); + + $now = new DateTime(); + + foreach ( $identifiers as $identifier ) { + $parts = explode( '/', $identifier, 2 ); + + // DateTimeZone::listIdentifiers() returns a number of + // backwards-compatibility entries. This filters them out of the + // list presented to the user. + if ( count( $parts ) !== 2 || !array_key_exists( $parts[0], $tzRegions ) ) { + continue; + } + + // Localize region + $parts[0] = $tzRegions[$parts[0]]; + + $dateTimeZone = new DateTimeZone( $identifier ); + $minDiff = floor( $dateTimeZone->getOffset( $now ) / 60 ); + + $display = str_replace( '_', ' ', $parts[0] . '/' . $parts[1] ); + $value = "ZoneInfo|$minDiff|$identifier"; + + $timeZoneList[$identifier] = array( + 'name' => $display, + 'timecorrection' => $value, + 'region' => $parts[0], + ); + } + + return $timeZoneList; + } } /** Some tweaks to allow js prefs to work */ |