From 827d6dcd86bf5bc3340ac5556b757434710691c2 Mon Sep 17 00:00:00 2001 From: Huji Date: Sun, 4 Nov 2007 20:44:19 +0000 Subject: [PATCH] Adds support for Iranian calendar --- RELEASE-NOTES | 2 +- languages/Language.php | 104 +++++++++++++++++++++++++- languages/messages/MessagesEn.php | 14 ++++ languages/messages/MessagesFa.php | 18 +++++ maintenance/language/messageTypes.inc | 12 +++ maintenance/language/messages.inc | 14 ++++ 6 files changed, 160 insertions(+), 4 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index ff8f2b8589..e5ced1afe4 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -48,7 +48,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN * (bug 1405) Add wgUseNPPatrol option to control patroling for new articles on Special:Newpages * LogLine hook added to allow formatting custom entries in Special:Log. - +* Support for Iranian calendar === Bug fixes in 1.12 === diff --git a/languages/Language.php b/languages/Language.php index 6c4cef36e0..375c2e204a 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -90,6 +90,13 @@ class Language { 'sep', 'oct', 'nov', 'dec' ); + static public $mIranianCalendarMonthMsgs = array( + 'iranian-calendar-m1', 'iranian-calendar-m2', 'iranian-calendar-m3', + 'iranian-calendar-m4', 'iranian-calendar-m5', 'iranian-calendar-m6', + 'iranian-calendar-m7', 'iranian-calendar-m8', 'iranian-calendar-m9', + 'iranian-calendar-m10', 'iranian-calendar-m11', 'iranian-calendar-m12' + ); + /** * Create a language object for a given language code */ @@ -393,6 +400,11 @@ class Language { return $this->getMessageFromDB( self::$mWeekdayAbbrevMsgs[$key-1] ); } + function getIranianCalendarMonthName( $key ) { + return $this->getMessageFromDB( self::$mIranianCalendarMonthMsgs[$key-1] ); + } + + /** * Used by date() and time() to adjust the time output. * @public @@ -464,6 +476,11 @@ class Language { * xx Literal x * xg Genitive month name * + * xij j (day number) in Iranian calendar + * xiF F (month name) in Iranian calendar + * xin n (month number) in Iranian calendar + * xiY Y (full year) in Iranian calendar + * * Characters enclosed in double quotes will be considered literal (with * the quotes themselves removed). Unmatched quotes will be considered * literal quotes. Example: @@ -487,13 +504,18 @@ class Language { $roman = false; $unix = false; $rawToggle = false; + $iranian = false; for ( $p = 0; $p < strlen( $format ); $p++ ) { $num = false; $code = $format[$p]; if ( $code == 'x' && $p < strlen( $format ) - 1 ) { $code .= $format[++$p]; } - + + if ( $code === 'xi' && $p < strlen( $format ) - 1 ) { + $code .= $format[++$p]; + } + switch ( $code ) { case 'xx': $s .= 'x'; @@ -520,6 +542,10 @@ class Language { case 'j': $num = intval( substr( $ts, 6, 2 ) ); break; + case 'xij': + if ( !$iranian ) $iranian = self::tsToIranian( $ts ); + $num = $iranian[2]; + break; case 'l': if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts ); $s .= $this->getWeekdayName( gmdate( 'w', $unix ) + 1 ); @@ -540,10 +566,14 @@ class Language { case 'W': if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts ); $num = gmdate( 'W', $unix ); - break; + break; case 'F': $s .= $this->getMonthName( substr( $ts, 4, 2 ) ); break; + case 'xiF': + if ( !$iranian ) $iranian = self::tsToIranian( $ts ); + $s .= $this->getIranianCalendarMonthName( $iranian[1] ); + break; case 'm': $num = substr( $ts, 4, 2 ); break; @@ -553,6 +583,10 @@ class Language { case 'n': $num = intval( substr( $ts, 4, 2 ) ); break; + case 'xin': + if ( !$iranian ) $iranian = self::tsToIranian( $ts ); + $num = $iranian[1]; + break; case 't': if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts ); $num = gmdate( 't', $unix ); @@ -560,10 +594,14 @@ class Language { case 'L': if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts ); $num = gmdate( 'L', $unix ); - break; + break; case 'Y': $num = substr( $ts, 0, 4 ); break; + case 'xiY': + if ( !$iranian ) $iranian = self::tsToIranian( $ts ); + $num = $iranian[0]; + break; case 'y': $num = substr( $ts, 2, 2 ); break; @@ -648,6 +686,64 @@ class Language { return $s; } + private static $GREG_DAYS = array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ); + private static $IRANIAN_DAYS = array( 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29 ); + /** + * Algorithm by Roozbeh Pournader and Mohammad Toossi to convert + * Gregorian dates to Iranian dates. Originally written in C, it + * is released under the terms of GNU Lesser General Public + * License. Conversion to PHP was performed by Niklas Laxström. + * + * Link: http://www.farsiweb.info/jalali/jalali.c + */ + private static function tsToIranian( $ts ) { + $gy = substr( $ts, 0, 4 ) -1600; + $gm = substr( $ts, 4, 2 ) -1; + $gd = substr( $ts, 6, 2 ) -1; + + # Days passed from the beginning (including leap years) + $gDayNo = 365*$gy + + floor(($gy+3) / 4) + - floor(($gy+99) / 100) + + floor(($gy+399) / 400); + + + // Add days of the past months of this year + for( $i = 0; $i < $gm; $i++ ) { + $gDayNo += self::$GREG_DAYS[$i]; + } + + // Leap years + if ( $gm > 1 && (($gy%4===0 && $gy%100!==0 || ($gy%400==0)))) { + $gDayNo++; + } + + // Days passed in current month + $gDayNo += $gd; + + $jDayNo = $gDayNo - 79; + + $jNp = floor($jDayNo / 12053); + $jDayNo %= 12053; + + $jy = 979 + 33*$jNp + 4*floor($jDayNo/1461); + $jDayNo %= 1461; + + if ( $jDayNo >= 366 ) { + $jy += floor(($jDayNo-1)/365); + $jDayNo = floor(($jDayNo-1)%365); + } + + for ( $i = 0; $i < 11 && $jDayNo >= self::$IRANIAN_DAYS[$i]; $i++ ) { + $jDayNo -= self::$IRANIAN_DAYS[$i]; + } + + $jm= $i+1; + $jd= $jDayNo+1; + + return array($jy, $jm, $jd); + } + /** * Roman number formatting up to 3000 */ @@ -1913,3 +2009,5 @@ class Language { + + diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index 3396c119cb..be2fb7e91d 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -2996,4 +2996,18 @@ $1', 'watchlisttools-edit' => 'View and edit watchlist', 'watchlisttools-raw' => 'Edit raw watchlist', +# Iranian month names +'iranian-calendar-m1' => 'Farvardin', +'iranian-calendar-m2' => 'Ordibehesht', +'iranian-calendar-m3' => 'Khordad', +'iranian-calendar-m4' => 'Tir', +'iranian-calendar-m5' => 'Mordad', +'iranian-calendar-m6' => 'Shahrivar', +'iranian-calendar-m7' => 'Mehr', +'iranian-calendar-m8' => 'Aban', +'iranian-calendar-m9' => 'Azar', +'iranian-calendar-m10' => 'Dey', +'iranian-calendar-m11' => 'Bahman', +'iranian-calendar-m12' => 'Esfand', + ); diff --git a/languages/messages/MessagesFa.php b/languages/messages/MessagesFa.php index d54eb81144..aecea096a6 100644 --- a/languages/messages/MessagesFa.php +++ b/languages/messages/MessagesFa.php @@ -73,6 +73,7 @@ $datePreferences = array( 'mdy', 'dmy', 'ymd', + 'persian', 'ISO 8601', ); @@ -115,6 +116,11 @@ $dateFormats = array( 'ymd time' => 'H:i', 'ymd date' => 'Y xg j', 'ymd both' => 'H:i، Y xg j', # Arabic comma + + 'persian time' => 'H:i', + 'persian date' => '‏xij xiF xiY', # Don't delete the invisible RLM from the beginning. + 'persian both' => 'H:i، xij xiF xiY', + 'ISO 8601 time' => 'xnH:xni:xns', 'ISO 8601 date' => 'xnY-xnm-xnd', @@ -287,6 +293,18 @@ $messages = array( 'oct' => 'اکتبر', 'nov' => 'نوامبر', 'dec' => 'دسامبر', +'iranian-calendar-m1' => 'فروردین', +'iranian-calendar-m2' => 'اردیبهشت', +'iranian-calendar-m3' => 'خرداد', +'iranian-calendar-m4' => 'تیر', +'iranian-calendar-m5' => 'مرداد', +'iranian-calendar-m6' => 'شهریور', +'iranian-calendar-m7' => 'مهر', +'iranian-calendar-m8' => 'آبان', +'iranian-calendar-m9' => 'آذر', +'iranian-calendar-m10' => 'دی', +'iranian-calendar-m11' => 'بهمن', +'iranian-calendar-m12' => 'اسفند', # Bits of text used by many pages 'categories' => 'رده‌های صفحه', diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc index 8cf3a3eae6..3cb8e90079 100644 --- a/maintenance/language/messageTypes.inc +++ b/maintenance/language/messageTypes.inc @@ -214,6 +214,18 @@ $wgOptionalMessages = array( 'size-kilobytes', 'size-megabytes', 'size-gigabytes', + 'iranian-calendar-m1', + 'iranian-calendar-m2', + 'iranian-calendar-m3', + 'iranian-calendar-m4', + 'iranian-calendar-m5', + 'iranian-calendar-m6', + 'iranian-calendar-m7', + 'iranian-calendar-m8', + 'iranian-calendar-m9', + 'iranian-calendar-m10', + 'iranian-calendar-m11', + 'iranian-calendar-m12', ); /** EXIF messages, which may be set as optional in several checks, but are generally mandatory */ diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index 3199abe6a2..47e8c1189e 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -2219,6 +2219,20 @@ $wgMessageStructure = array( 'watchlisttools-edit', 'watchlisttools-raw', ), + 'iranian-dates' => array( + 'iranian-calendar-m1', + 'iranian-calendar-m2', + 'iranian-calendar-m3', + 'iranian-calendar-m4', + 'iranian-calendar-m5', + 'iranian-calendar-m6', + 'iranian-calendar-m7', + 'iranian-calendar-m8', + 'iranian-calendar-m9', + 'iranian-calendar-m10', + 'iranian-calendar-m11', + 'iranian-calendar-m12', + ), ); /** Comments for each block */ $wgBlockComments = array( -- 2.20.1