Index: gtk/gtkcalendar.c
===================================================================
--- gtk/gtkcalendar.c	(revision 17540)
+++ gtk/gtkcalendar.c	(working copy)
@@ -87,7 +87,7 @@
 {
   return((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0));
 }
-
+	
 static guint 
 day_of_week (guint year, guint mm, guint dd)
 {
@@ -232,6 +232,7 @@
   PROP_SHOW_DAY_NAMES,
   PROP_NO_MONTH_CHANGE,
   PROP_SHOW_WEEK_NUMBERS,
+  PROP_YEAR_ASTRONOMICAL,
   PROP_LAST
 };
 
@@ -492,6 +493,21 @@
 							 FALSE,
 							 GTK_PARAM_READWRITE));
 
+/**
+ * GtkCalendar:year-astronomical:
+ *
+ * Determines whether the year is represented in astronomical notation (1 BC == year 0, and previous years will be represented as negative integers).
+ *
+ * Since: 2.10
+ */
+  g_object_class_install_property (gobject_class,
+                                   PROP_YEAR_ASTRONOMICAL,
+                                   g_param_spec_boolean ("year-astronomical",
+							 P_("Represent year using astronomical notation"),
+							 P_("If TRUE, the year 1 BC will be displayed as year 0, and previous years will be represented as negative integers"),
+							 FALSE,
+							 GTK_PARAM_READWRITE));
+
   gtk_calendar_signals[MONTH_CHANGED_SIGNAL] =
     g_signal_new (I_("month_changed"),
 		  G_OBJECT_CLASS_TYPE (gobject_class),
@@ -743,7 +759,9 @@
     {
       calendar->month = 0;
       calendar->year++;
-    } 
+	  if (calendar->year == 1)
+	    gtk_widget_queue_resize (GTK_WIDGET (calendar));
+    }
   else 
     calendar->month++;
   
@@ -764,7 +782,7 @@
     }
   else
     gtk_calendar_select_day (calendar, calendar->selected_day);
-
+  
   gtk_widget_queue_draw (GTK_WIDGET (calendar));
 }
 
@@ -794,6 +812,8 @@
   else
     gtk_calendar_select_day (calendar, calendar->selected_day);
   
+  if (calendar->year == 0)
+	  gtk_widget_queue_resize (GTK_WIDGET (calendar));
   gtk_widget_queue_draw (GTK_WIDGET (calendar));
 }
 
@@ -823,6 +843,8 @@
   else
     gtk_calendar_select_day (calendar, calendar->selected_day);
   
+  if (calendar->year == 1)
+	  gtk_widget_queue_resize (GTK_WIDGET (calendar));
   gtk_widget_queue_draw (GTK_WIDGET (calendar));
 }
 
@@ -1104,6 +1126,8 @@
     {
       calendar->month = 11;
       calendar->year--;
+  		if (calendar->year == 0)
+	      gtk_widget_queue_resize (GTK_WIDGET (calendar));
     } 
   else 
     calendar->month--;
@@ -1130,7 +1154,7 @@
 	calendar->selected_day = calendar->selected_day + 1 + month_length[leap (calendar->year)][calendar->month + 1];
       gtk_calendar_select_day (calendar, calendar->selected_day);
     }
-
+	
   gtk_widget_queue_draw (GTK_WIDGET (calendar));
 }
 
@@ -1220,6 +1244,11 @@
 				   GTK_CALENDAR_SHOW_WEEK_NUMBERS,
 				   g_value_get_boolean (value));
       break;
+	case PROP_YEAR_ASTRONOMICAL:
+	  calendar_set_display_option (calendar,
+				   GTK_CALENDAR_YEAR_ASTRONOMICAL,
+				   g_value_get_boolean (value));
+	  break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1263,6 +1292,10 @@
       g_value_set_boolean (value, calendar_get_display_option (calendar,
 							       GTK_CALENDAR_SHOW_WEEK_NUMBERS));
       break;
+	case PROP_YEAR_ASTRONOMICAL:
+	  g_value_set_boolean (value, calendar_get_display_option (calendar,
+							       GTK_CALENDAR_YEAR_ASTRONOMICAL));
+	  break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1592,12 +1625,23 @@
        *
        * If you don't understand this, leave it as "2000"
        */
-      pango_layout_set_text (layout, Q_("year measurement template|2000"), -1);	  
+	  if (calendar->display_flags & GTK_CALENDAR_YEAR_ASTRONOMICAL)
+	  {
+		pango_layout_set_text (layout, Q_("year measurement template|2000"), -1);
+	  }
+	  else if (calendar->year > 0)
+	  {
+		pango_layout_set_text (layout, Q_("year measurement template|2000"), -1);
+	  }
+	  else
+	  {
+		pango_layout_set_text (layout, Q_("year measurement BC template|2000 BC"), -1);
+	  }
       pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
       priv->max_year_width = MAX (priv->max_year_width,
 				  logical_rect.width + 8);
       max_header_height = MAX (max_header_height, logical_rect.height); 
-    } 
+    }
   else 
     {
       priv->max_month_width = 0;
@@ -1850,10 +1894,8 @@
 		    GTK_STATE_NORMAL, GTK_SHADOW_OUT,
 		    NULL, widget, "calendar",
 		    0, 0, header_width, priv->header_h);
-
+  
   tmp_time = 1;  /* Jan 1 1970, 00:00:01 UTC */
-  tm = gmtime (&tmp_time);
-  tm->tm_year = calendar->year - 1900;
 
   /* Translators: This dictates how the year is displayed in
    * gtkcalendar widget.  See strftime() manual for the format.
@@ -1866,7 +1908,33 @@
    * Don't include the prefix "calendar year format|" in the 
    * translation. "%Y" is appropriate for most locales.
    */
-  strftime (buffer, sizeof (buffer), Q_("calendar year format|%Y"), tm);
+  if (calendar->display_flags & GTK_CALENDAR_YEAR_ASTRONOMICAL)
+  {
+	/*
+	 * In astronomical notation, the years go -1, 0, 1 at the epoch
+	 */
+	tm = gmtime (&tmp_time);
+	tm->tm_year = calendar->year - 1900;
+    strftime (buffer, sizeof (buffer), Q_("calendar year format|%Y"), tm);
+  }
+  else
+  {
+    if (calendar->year > 0 )
+	{
+	  tm = gmtime (&tmp_time);
+	  tm->tm_year = calendar->year - 1900;
+	  strftime (buffer, sizeof (buffer), Q_("calendar year format|%Y"), tm);
+	}
+	else
+	{
+	  /*
+	   * Astronomical notation year 0 is 1 BC. There is no 0 BC or 0 AD.
+	   */
+	  tm = gmtime (&tmp_time);
+	  tm->tm_year = -1 * (calendar->year + 1900) + 1;
+	  strftime (buffer, sizeof (buffer), Q_("calendar year BC format|%Y BC"), tm);
+	}
+  }
   str = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
   layout = gtk_widget_create_pango_layout (widget, str);
   g_free (str);
@@ -3309,6 +3377,8 @@
     g_object_notify (G_OBJECT (calendar), "no-month-change");
   if ((old_flags ^ calendar->display_flags) & GTK_CALENDAR_SHOW_WEEK_NUMBERS)
     g_object_notify (G_OBJECT (calendar), "show-week-numbers");
+  if ((old_flags ^ calendar->display_flags) & GTK_CALENDAR_YEAR_ASTRONOMICAL)
+	g_object_notify (G_OBJECT (calendar), "year-astronomical");
   g_object_thaw_notify (G_OBJECT (calendar));
 }
 
Index: gtk/gtkcalendar.h
===================================================================
--- gtk/gtkcalendar.h	(revision 17540)
+++ gtk/gtkcalendar.h	(working copy)
@@ -57,7 +57,8 @@
   GTK_CALENDAR_SHOW_DAY_NAMES		= 1 << 1,
   GTK_CALENDAR_NO_MONTH_CHANGE		= 1 << 2,
   GTK_CALENDAR_SHOW_WEEK_NUMBERS	= 1 << 3,
-  GTK_CALENDAR_WEEK_START_MONDAY	= 1 << 4
+  GTK_CALENDAR_WEEK_START_MONDAY	= 1 << 4,
+  GTK_CALENDAR_YEAR_ASTRONOMICAL	= 1 << 5
 } GtkCalendarDisplayOptions;
 
 struct _GtkCalendar
