jenkins-bot has submitted this change and it was merged. Change subject: Use localization for server default timezone on Special:Preferences ......................................................................
Use localization for server default timezone on Special:Preferences The timezone list on Special:Preferences contains all time zones with a localized region and also an option to use the system default value. The message for this option gets the current server timezone as parameter, but that parameter is not localized. Refactor the timezone list processing into a new function and call it at the beginning to do a lookup for the localized name and use it, if it exists in the array. Also changed from procedural style to object oriented style for the DateTime processing. Bug: T33516 Change-Id: I00e81324d0d16fbe6c9811480210ab6513461823 --- M includes/Preferences.php 1 file changed, 75 insertions(+), 43 deletions(-) Approvals: Nikerabbit: Looks good to me, approved Siebrand: Looks good to me, but someone else must approve jenkins-bot: Verified diff --git a/includes/Preferences.php b/includes/Preferences.php index ecb2294..9497ee7 100644 --- a/includes/Preferences.php +++ b/includes/Preferences.php @@ -1294,12 +1294,19 @@ $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( @@ -1313,49 +1320,12 @@ $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; } @@ -1491,6 +1461,68 @@ 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 */ -- To view, visit https://gerrit.wikimedia.org/r/205101 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I00e81324d0d16fbe6c9811480210ab6513461823 Gerrit-PatchSet: 8 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Umherirrender <umherirrender_de...@web.de> Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org> Gerrit-Reviewer: Nikerabbit <niklas.laxst...@gmail.com> Gerrit-Reviewer: Siebrand <siebr...@kitano.nl> Gerrit-Reviewer: Umherirrender <umherirrender_de...@web.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits