Index: functions.php
===================================================================
--- functions.php	(revision 8903)
+++ functions.php	(working copy)
@@ -46,25 +46,11 @@
 	if ( -1 == $i || false == $i )
 		$i = 0;
 
-	if ( !empty( $wp_locale->month ) && !empty( $wp_locale->weekday ) && $translate ) {
-		$datemonth = $wp_locale->get_month( date( 'm', $i ) );
-		$datemonth_abbrev = $wp_locale->get_month_abbrev( $datemonth );
-		$dateweekday = $wp_locale->get_weekday( date( 'w', $i ) );
-		$dateweekday_abbrev = $wp_locale->get_weekday_abbrev( $dateweekday );
-		$datemeridiem = $wp_locale->get_meridiem( date( 'a', $i ) );
-		$datemeridiem_capital = $wp_locale->get_meridiem( date( 'A', $i ) );
-		$dateformatstring = ' ' . $dateformatstring;
-		$dateformatstring = preg_replace( "/([^\\\])D/", "\\1" . backslashit( $dateweekday_abbrev ), $dateformatstring );
-		$dateformatstring = preg_replace( "/([^\\\])F/", "\\1" . backslashit( $datemonth ), $dateformatstring );
-		$dateformatstring = preg_replace( "/([^\\\])l/", "\\1" . backslashit( $dateweekday ), $dateformatstring );
-		$dateformatstring = preg_replace( "/([^\\\])M/", "\\1" . backslashit( $datemonth_abbrev ), $dateformatstring );
-		$dateformatstring = preg_replace( "/([^\\\])a/", "\\1" . backslashit( $datemeridiem ), $dateformatstring );
-		$dateformatstring = preg_replace( "/([^\\\])A/", "\\1" . backslashit( $datemeridiem_capital ), $dateformatstring );
+	if ( $translate ) // localizing names or calendar system
+		$j = date_i18n( $dateformatstring, $i );
+	else
+		$j = @date( $dateformatstring, $i );
 
-		$dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) -1 );
-	}
-	$j = @date( $dateformatstring, $i );
-
 	/*
 	if ( !$j ) // for debug purposes
 		echo $i." ".$mysqlstring;
@@ -118,6 +104,11 @@
 	// Sanity check for PHP 5.1.0-
 	if ( -1 == $i )
 		$i = false;
+  
+ 	// Let the user convert date from Gregorian to localized calendar system
+	$j = apply_filters( 'pre_date_i18n', $dateformatstring, $i ); 
+	if ($j !== $dateformatstring)
+		return $j;
 
 	if ( ( !empty( $wp_locale->month ) ) && ( !empty( $wp_locale->weekday ) ) ) {
 		$datemonth = $wp_locale->get_month( date( 'm', $i ) );
@@ -136,8 +127,10 @@
 
 		$dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) -1 );
 	}
-	$j = @date( $dateformatstring, $i );
-	return $j;
+	$j = @date( $dateformatstring, $i );       
+
+	// Let the user translate digits from latin to localized language
+	return apply_filters( 'date_i18n', $j);
 }
 
 /**
@@ -154,7 +147,10 @@
 	// let the user override the precision only
 	$decimals = ( is_null( $decimals ) ) ? $wp_locale->number_format['decimals'] : intval( $decimals );
 
-	return number_format( $number, $decimals, $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep'] );
+	$num = number_format( $number, $decimals, $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep'] );
+  
+	// let the user translate digits from latin to localized language
+	return apply_filters( 'number_format_i18n', $num ); 
 }
 
 /**
