Hi,

I made a set of patches for a few globalization related stuff.

1) native TimeZone name support. Now it returns native names
as long as they are provided by the locale-builder.

Am also planning to update locale data to the latest version
of CLDR (it has much more timezone names than existing one).

2) TZ environment variable support on Win32. If TZ environment
variable is set, then it uses posix-compat timezone names
(its behavior depends on mingw though).

3) tiny change on RegionInfo.CurrentRegion to construct
apart from CultureInfo. In fact I have further patch to store
it inside Thread (as once Kornel suggested) but it is not
working perfectly now, so I just extracted minimal working part.
(This looks like independent but it shares a function with 1).

Comments are welcome :-)

Atsushi Eno

Index: tools/locale-builder/Driver.cs
===================================================================
--- tools/locale-builder/Driver.cs	(revision 50129)
+++ tools/locale-builder/Driver.cs	(working copy)
@@ -48,6 +48,7 @@
                 private Hashtable langs;
                 private Hashtable currency_types;
                 private Hashtable regions;
+                private ArrayList timezones;
 
 		// The lang is the language that display names will be displayed in
 		public string Lang {
@@ -82,6 +83,7 @@
                         langs = new Hashtable ();
                         cultures = new ArrayList ();
                         regions = new Hashtable ();
+                        timezones = new ArrayList ();
 
 			LookupRegions ();
 
@@ -116,6 +118,9 @@
 
 			ArrayList regionList = new ArrayList (regions.Values);
 			regionList.Sort (RegionComparer.Instance);
+
+			timezones.Sort (TimeZoneEntryComparer.Instance);
+
 			int number = 0;
 			foreach (RegionInfoEntry r in regionList)
 				r.RegionId = number++;
@@ -163,6 +168,7 @@
 
                                 writer.WriteLine ("#define NUM_CULTURE_ENTRIES " + cultures.Count);
                                 writer.WriteLine ("#define NUM_REGION_ENTRIES " + regionList.Count);
+                                writer.WriteLine ("#define NUM_TIMEZONE_ENTRIES " + timezones.Count);
                                 writer.WriteLine ("\n");
 
                                 // Sort the cultures by lcid
@@ -245,6 +251,15 @@
 				writer.Write (builder);
 				writer.WriteLine ("};\n\n");
 
+				builder = new StringBuilder ();
+				foreach (TimeZoneEntry ti in timezones) {
+					ti.AppendTableRow (builder);
+					builder.Append (",\n");
+				}
+				writer.WriteLine ("static const TimeZoneEntry timezone_entries [] = {");
+				writer.Write (builder);
+				writer.WriteLine ("NULL};\n\n");
+
                                 builder = new StringBuilder ();
 				rcount = 0;
 				foreach (RegionInfoEntry ri in regionList) {
@@ -321,12 +336,44 @@
                         ci.DateTimeFormatEntry = null;
                         ci.NumberFormatEntry = null;
 
+			// TimeZones
+			XPathNodeIterator iter = doc.CreateNavigator ()
+				.Select ("/ldml/dates/timeZoneNames/zone");
+			while (iter.MoveNext ()) {
+				nav = iter.Current;
+				int lcid;
+				try {
+					if (ci.SpecificLcid.StartsWith ("0x"))
+						lcid = int.Parse (ci.SpecificLcid.Substring (2), NumberStyles.HexNumber);
+					else
+						lcid = int.Parse (ci.SpecificLcid);
+				} catch {
+					Console.WriteLine ("Invalid LCID: '{0}'", ci.SpecificLcid);
+					throw;
+				}
+				timezones.Add (new TimeZoneEntry (
+					lcid,
+					nav.GetAttribute ("type", String.Empty),
+					EvaluateAsString (nav, "long/standard/text()"),
+					EvaluateAsString (nav, "long/daylight/text()"),
+					EvaluateAsString (nav, "short/standard/text()"),
+					EvaluateAsString (nav, "short/daylight/text()")));
+			}
+
                         langs [lang] = ci;
                         cultures.Add (ci);
 
                         return true;
                 }
 
+		private string EvaluateAsString (XPathNavigator nav, string xpath)
+		{
+			XPathNodeIterator i = nav.Select (xpath);
+			if (i.MoveNext ())
+				return i.Current.Value;
+			return String.Empty;
+		}
+
                 private void ParseLocale (string locale)
                 {
                         CultureInfoEntry ci;
Index: tools/locale-builder/Makefile.am
===================================================================
--- tools/locale-builder/Makefile.am	(revision 50129)
+++ tools/locale-builder/Makefile.am	(working copy)
@@ -24,6 +24,7 @@
 			 NumberFormatEntry.cs	\
 			 RegionInfoEntry.cs     \
 			 TextInfoEntry.cs	\
+			 TimeZoneEntry.cs	\
 			 Entry.cs
 
 supp_data_files = supp/ar_AE.xml supp/ar_EG.xml supp/ar_KW.xml supp/ar_MA.xml	\
Index: mono/metadata/culture-info-tables.h
===================================================================
--- mono/metadata/culture-info-tables.h	(revision 50129)
+++ mono/metadata/culture-info-tables.h	(working copy)
@@ -6,6 +6,7 @@
 
 #define NUM_CULTURE_ENTRIES 161
 #define NUM_REGION_ENTRIES 230
+#define NUM_TIMEZONE_ENTRIES 38
 
 
 static const DateTimeFormatEntry datetime_format_entries [] = {
@@ -506,9 +507,9 @@
 	{18874, 48},
 	{24906, 99},
 	{17885, 17},
+	{24912, 68},
 	{18967, 51},
-	{24912, 102},
-	{24919, 68},
+	{24918, 102},
 	{18440, 35},
 	{24925, 86},
 	{18411, 34},
@@ -796,6 +797,48 @@
 };
 
 
+static const TimeZoneEntry timezone_entries [] = {
+{ 1031, 31444, 31458, 31482, 31512, 31516},
+{ 1033, 31521, 31525, 31546, 31521, 31567},
+{ 1033, 31571, 31589, 31589, 31609, 31609},
+{ 1033, 31613, 31525, 31546, 31521, 31567},
+{ 1033, 31631, 31647, 31669, 31691, 31695},
+{ 1033, 31699, 31714, 31737, 31760, 31764},
+{ 1033, 31768, 31784, 31807, 31521, 31567},
+{ 1033, 31830, 31851, 31851, 31873, 31873},
+{ 1033, 31877, 31897, 31919, 31941, 31945},
+{ 1033, 31949, 31851, 31966, 31873, 31988},
+{ 1033, 31992, 31714, 31714, 31760, 31760},
+{ 1033, 32008, 32025, 32052, 32079, 31695},
+{ 1033, 32083, 32098, 32119, 32140, 32144},
+{ 1033, 32148, 32162, 32162, 32182, 31695},
+{ 1033, 32186, 32197, 32197, 32217, 32217},
+{ 1033, 32079, 32025, 32052, 32079, 31695},
+{ 1033, 31691, 31647, 31669, 31691, 31695},
+{ 1033, 32182, 32162, 32162, 32182, 31695},
+{ 1033, 32221, 32225, 32256, 32287, 32291},
+{ 1033, 31873, 31851, 31966, 31873, 31988},
+{ 1033, 32296, 32313, 32344, 32375, 32379},
+{ 1033, 32384, 32225, 32256, 32287, 32291},
+{ 1033, 31609, 31589, 31589, 31609, 31609},
+{ 1033, 32397, 32401, 32401, 32397, 32397},
+{ 1033, 32422, 31851, 31851, 31873, 31873},
+{ 1033, 32217, 32197, 32197, 32217, 32217},
+{ 1033, 31760, 31714, 31737, 31760, 31764},
+{ 1033, 32426, 31714, 31714, 31760, 31760},
+{ 1033, 31941, 31897, 31919, 31941, 31945},
+{ 1033, 32430, 32401, 32401, 32397, 32397},
+{ 1041, 32186, 32447, 32447, 32217, 32217},
+{ 1042, 32463, 32474, 32474, 32490, 32490},
+{ 1065, 32494, 32506, 32543, 32578, 32583},
+{ 1081, 32588, 32602, 32602, 32140, 32140},
+{ 1089, 32631, 32646, 32646, 32670, 32670},
+{ 1097, 32588, 32674, 32674, 32140, 32140},
+{ 1102, 32588, 32602, 32602, 32140, 32140},
+{ 1111, 32588, 32602, 32602, 32140, 32140},
+NULL};
+
+
 static const RegionInfoNameEntry region_name_entries [] = {
 	{25107, 0},
 	{25163, 1},
@@ -3555,8 +3598,8 @@
 	"it-it\0"
 	"ja-jp\0"
 	"kn-in\0"
+	"ko-kr\0"
 	"kok-in\0"
-	"ko-kr\0"
 	"lt-lt\0"
 	"lv-lv\0"
 	"mk-mk\0"
@@ -4351,6 +4394,90 @@
 	"Zimbabwe\0"
 	"ZWD\0"
 	"Zimbabwe Dollar\0"
+	"Europe/Berlin\0"
+	"Mitteleurop\xc3\xa4ische Zeit\0"
+	"Mitteleurop\xc3\xa4ische Sommerzeit\0"
+	"MEZ\0"
+	"MESZ\0"
+	"AST\0"
+	"Alaska Standard Time\0"
+	"Alaska Daylight Time\0"
+	"ADT\0"
+	"Africa/Casablanca\0"
+	"Greenwich Mean Time\0"
+	"GMT\0"
+	"America/Anchorage\0"
+	"America/Chicago\0"
+	"Central Standard Time\0"
+	"Central Daylight Time\0"
+	"CST\0"
+	"CDT\0"
+	"America/Denver\0"
+	"Mountain Standard Time\0"
+	"Mountain Daylight Time\0"
+	"MST\0"
+	"MDT\0"
+	"America/Halifax\0"
+	"Atlantic Standard Time\0"
+	"Atlantic Daylight Time\0"
+	"America/Indianapolis\0"
+	"Eastern Standard Time\0"
+	"EST\0"
+	"America/Los_Angeles\0"
+	"Pacific Standard Time\0"
+	"Pacific Daylight Time\0"
+	"PST\0"
+	"PDT\0"
+	"America/New_York\0"
+	"Eastern Daylight Time\0"
+	"EDT\0"
+	"America/Phoenix\0"
+	"America/St_Johns\0"
+	"Newfoundland Standard Time\0"
+	"Newfoundland Daylight Time\0"
+	"CNT\0"
+	"Asia/Jerusalem\0"
+	"Israel Standard Time\0"
+	"Israel Daylight Time\0"
+	"IST\0"
+	"IDT\0"
+	"Asia/Shanghai\0"
+	"China Standard Time\0"
+	"CTT\0"
+	"Asia/Tokyo\0"
+	"Japan Standard Time\0"
+	"JST\0"
+	"ECT\0"
+	"Central European Standard Time\0"
+	"Central European Daylight Time\0"
+	"CET\0"
+	"CEST\0"
+	"Europe/Bucharest\0"
+	"Eastern European Standard Time\0"
+	"Eastern European Daylight Time\0"
+	"EET\0"
+	"EEST\0"
+	"Europe/Paris\0"
+	"HST\0"
+	"Hawaii Standard Time\0"
+	"IET\0"
+	"PNT\0"
+	"Pacific/Honolulu\0"
+	"\xe6\x97\xa5\xe6\x9c\xac\xe6\xa8\x99\xe6\xba\x96\xe6\x99\x82\0"
+	"Asia/Seoul\0"
+	"\xed\x95\x9c\xea\xb5\xad\xed\x91\x9c\xec\xa4\x80\xec\x8b\x9c\0"
+	"KST\0"
+	"Asia/Tehran\0"
+	"\xd9\x88\xd9\x82\xd8\xaa \xd8\xa7\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\xd8\xaf\xd8\xa7\xd8\xb1\xd8\xaf \xd8\xaa\xd9\x87\xd8\xb1\xd8\xa7\xd9\x86\0"
+	"\xd9\x88\xd9\x82\xd8\xaa \xd8\xaa\xd8\xa7\xd8\xa8\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\xdb\x8c \xd8\xaa\xd9\x87\xd8\xb1\xd8\xa7\xd9\x86\0"
+	"IRST\0"
+	"IRDT\0"
+	"Asia/Calcutta\0"
+	"\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa5\x80\xe0\xa4\xaf \xe0\xa4\xb8\xe0\xa4\xae\xe0\xa4\xaf\0"
+	"Africa/Nairobi\0"
+	"Saa za Africa Mashariki\0"
+	"EAT\0"
+	"\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf \xe0\xae\xa8\xe0\xaf\x87\xe0\xae\xb0\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\x9f\xe0\xae\xbf\0"
 };
 
 
Index: mono/metadata/locales.c
===================================================================
--- mono/metadata/locales.c	(revision 50129)
+++ mono/metadata/locales.c	(working copy)
@@ -299,6 +299,45 @@
 	return construct_culture (ci, entry);
 }
 
+gint32 get_current_locale_id (void)
+{
+	const CultureInfoNameEntry *ne;
+	const gchar *locale;
+
+	locale = get_current_locale_name ();
+	if (locale == NULL)
+		return FALSE;
+
+	ne = bsearch (locale, culture_name_entries, NUM_CULTURE_ENTRIES,
+			sizeof (CultureInfoNameEntry), culture_name_locator);
+
+	g_free (locale);
+
+	if (ne == NULL)
+		return -1;
+	return culture_entries [ne->culture_entry_index].lcid;
+}
+
+MonoBoolean
+ves_icall_System_Globalization_RegionInfo_construct_internal_current_region (MonoRegionInfo *ri)
+{
+	const CultureInfoEntry *culture;
+	const RegionInfoEntry *region;
+	int lcid;
+
+	lcid = get_current_locale_id ();
+	if (lcid < 0)
+		return FALSE;
+	culture = &culture_entries [lcid];
+
+	/* try avoiding another lookup, often the culture is its own specific culture */
+	if (culture->lcid != culture->specific_lcid)
+		culture = culture_info_entry_from_lcid (culture->specific_lcid);
+
+	region = &region_entries [culture->region_entry_index];
+	return construct_region (ri, region);
+}
+
 static gboolean
 construct_region_from_specific_name (MonoRegionInfo *ri, gchar *name)
 {
@@ -392,7 +431,10 @@
         gchar *c;
 
 #ifdef PLATFORM_WIN32
-	locale = g_win32_getlocale ();
+	if (!getenv ("TZ"))
+		locale = g_win32_getlocale ();
+	else
+		locale = get_posix_locale ();
 #else	
 	locale = get_posix_locale ();
 #endif	
@@ -473,6 +515,40 @@
 	return construct_culture (this, ci);
 }
 
+gboolean
+find_timezone_name_from_tz (int target_lcid, const char *tzname, gboolean is_daylight, char **std, char **dst)
+{
+	int i;
+	TimeZoneEntry *tze;
+
+	*std = tzname;
+	*dst = tzname;
+	tze = NULL;
+
+	for (i = 0; i < NUM_TIMEZONE_ENTRIES; i++) {
+		tze = &timezone_entries [i];
+		if (tze->lcid == target_lcid) {
+			if (!strcmp (tzname, idx2string (tze->type)))
+				break;
+		}
+	}
+	if (i == NUM_TIMEZONE_ENTRIES) {
+		for (i = 0; i < NUM_TIMEZONE_ENTRIES; i++) {
+			tze = &timezone_entries [i];
+			if (tze->lcid == target_lcid) {
+					if (!strcmp (tzname, idx2string (is_daylight ? tze->daylight_short_name : tze->standard_short_name)))
+						break;
+			}
+		}
+	}
+	if (i == NUM_TIMEZONE_ENTRIES)
+		return FALSE;
+
+	*std = idx2string (tze->standard_long_name);
+	*dst = idx2string (tze->daylight_long_name);
+	return TRUE;
+}
+
 MonoBoolean
 ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (MonoCultureInfo *this,
 		MonoString *name)
Index: mono/metadata/locales.h
===================================================================
--- mono/metadata/locales.h	(revision 50129)
+++ mono/metadata/locales.h	(working copy)
@@ -38,7 +38,10 @@
 extern void ves_icall_System_Globalization_CompareInfo_construct_compareinfo (MonoCompareInfo *comp, MonoString *locale);
 extern int ves_icall_System_Globalization_CompareInfo_internal_compare (MonoCompareInfo *this, MonoString *str1, gint32 off1, gint32 len1, MonoString *str2, gint32 off2, gint32 len2, gint32 options);
 extern void ves_icall_System_Globalization_CompareInfo_free_internal_collator (MonoCompareInfo *this);
+extern gint32 get_current_locale_id (void);
 extern MonoBoolean
+ves_icall_System_Globalization_RegionInfo_construct_internal_current_region (MonoRegionInfo *ri);
+extern MonoBoolean
 ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_lcid (MonoRegionInfo *this, gint lcid);
 extern MonoBoolean
 ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name (MonoRegionInfo *this,
@@ -52,5 +55,7 @@
 extern MonoString *ves_icall_System_String_InternalToUpper_Comp (MonoString *this, MonoCultureInfo *cult);
 extern gunichar2 ves_icall_System_Char_InternalToUpper_Comp (gunichar2 c, MonoCultureInfo *cult);
 extern gunichar2 ves_icall_System_Char_InternalToLower_Comp (gunichar2 c, MonoCultureInfo *cult);
+extern gchar* get_current_locale_name (void);
+extern gboolean find_timezone_name_from_tz (int target_lcid, const char *tzname, gboolean is_daylight, char **std, char **dst);
 
 #endif /* _MONO_METADATA_FILEIO_H_ */
Index: mono/metadata/culture-info.h
===================================================================
--- mono/metadata/culture-info.h	(revision 50129)
+++ mono/metadata/culture-info.h	(working copy)
@@ -134,5 +134,14 @@
 	gint16 region_entry_index;
 } RegionInfoNameEntry;
 
+typedef struct {
+	gint16 lcid;
+	const stridx_t type;
+	const stridx_t standard_long_name;
+	const stridx_t daylight_long_name;
+	const stridx_t standard_short_name;
+	const stridx_t daylight_short_name;
+} TimeZoneEntry;
+
 #endif
 
Index: mono/metadata/icall.c
===================================================================
--- mono/metadata/icall.c	(revision 50129)
+++ mono/metadata/icall.c	(working copy)
@@ -4896,7 +4896,6 @@
 }
 #endif
 
-#ifndef PLATFORM_WIN32
 /*
  * Return's the offset from GMT of a local time.
  * 
@@ -4917,7 +4916,7 @@
 	return (int)difftime(t, t2);
 #endif
 }
-#endif
+
 /*
  * This is heavily based on zdump.c from glibc 2.2.
  *
@@ -4934,9 +4933,8 @@
  *  Returns true on success and zero on failure.
  */
 static guint32
-ves_icall_System_CurrentTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)
+get_time_zone_data_posix (guint32 year, MonoArray **data, MonoArray **names)
 {
-#ifndef PLATFORM_WIN32
 	MonoDomain *domain = mono_domain_get ();
 	struct tm start, tt;
 	time_t t;
@@ -4944,6 +4942,9 @@
 	long int gmtoff;
 	int is_daylight = 0, day;
 	char tzone [64];
+	int current_lcid;
+	char *std_native_name;
+	char *dst_native_name;
 
 	MONO_ARCH_SAVE_REGS;
 
@@ -4953,6 +4954,10 @@
 	(*data) = mono_array_new (domain, mono_defaults.int64_class, 4);
 	(*names) = mono_array_new (domain, mono_defaults.string_class, 2);
 
+	current_lcid = get_current_locale_id ();
+	if (current_lcid < 0)
+		current_lcid = 0x7F;
+
 	/* 
 	 * no info is better than crashing: we'll need our own tz data
 	 * to make this work properly, anyway. The range is probably
@@ -5004,14 +5009,14 @@
 			} while (gmt_offset (&tt1, t1) == gmtoff);
 			t1+=gmtoff;
 			strftime (tzone, sizeof (tzone), "%Z", &tt);
-			
+			find_timezone_name_from_tz (current_lcid, tzone, is_daylight, &std_native_name, &dst_native_name);
 			/* Write data, if we're already in daylight saving, we're done. */
 			if (is_daylight) {
-				mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
+				mono_array_set ((*names), gpointer, 0, mono_string_new (domain, dst_native_name));
 				mono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
 				return 1;
 			} else {
-				mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
+				mono_array_set ((*names), gpointer, 1, mono_string_new (domain, std_native_name));
 				mono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
 				is_daylight = 1;
 			}
@@ -5026,8 +5031,9 @@
 
 	if (!is_daylight) {
 		strftime (tzone, sizeof (tzone), "%Z", &tt);
-		mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
-		mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
+		find_timezone_name_from_tz (current_lcid, tzone, FALSE, &std_native_name, &dst_native_name);
+		mono_array_set ((*names), gpointer, 0, mono_string_new (domain, std_native_name));
+		mono_array_set ((*names), gpointer, 1, mono_string_new (domain, std_native_name));
 		mono_array_set ((*data), gint64, 0, 0);
 		mono_array_set ((*data), gint64, 1, 0);
 		mono_array_set ((*data), gint64, 2, (gint64) gmtoff * 10000000L);
@@ -5035,7 +5041,12 @@
 	}
 
 	return 1;
-#else
+}
+
+#ifdef PLATFORM_WIN32
+static guint32
+get_time_zone_data_win32 (guint32 year, MonoArray **data, MonoArray **names)
+{
 	MonoDomain *domain = mono_domain_get ();
 	TIME_ZONE_INFORMATION tz_info;
 	FILETIME ft;
@@ -5086,7 +5097,17 @@
 	mono_array_set ((*data), gint64, 3, (tz_info.DaylightBias - tz_info.StandardBias) * -600000000LL);
 
 	return 1;
+}
 #endif
+
+static guint32
+ves_icall_System_CurrentTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)
+{
+#ifdef PLATFORM_WIN32
+	if (g_getenv ("TZ") == NULL)
+		return get_time_zone_data_win32 (year, data, names);
+#endif
+	return get_time_zone_data_posix (year, data, names);
 }
 
 static gpointer
@@ -6402,6 +6423,7 @@
 };
 
 static const IcallEntry regioninfo_icalls [] = {
+	{"construct_internal_current_region", ves_icall_System_Globalization_RegionInfo_construct_internal_current_region},
 	{"construct_internal_region_from_lcid", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_lcid},
 	{"construct_internal_region_from_name", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name}
 };
Index: System.Globalization/RegionInfo.cs
===================================================================
--- System.Globalization/RegionInfo.cs	(revision 50129)
+++ System.Globalization/RegionInfo.cs	(working copy)
@@ -29,6 +29,7 @@
 //
 using System.Globalization;
 using System.Runtime.CompilerServices;
+using System.Threading;
 
 namespace System.Globalization
 {
@@ -41,14 +42,8 @@
 		// we need to use bootstrap CurrentCulture LCID.
 		public static RegionInfo CurrentRegion {
 			get {
-				if (currentRegion == null) {
-					// make sure to fill BootstrapCultureID.
-					CultureInfo ci = CultureInfo.CurrentCulture;
-					// If current culture is invariant then region is not available.
-					if (ci == null || CultureInfo.BootstrapCultureID == 0x7F)
-						return null;
-					currentRegion = new RegionInfo (CultureInfo.BootstrapCultureID);
-				}
+				if (currentRegion == null)
+					currentRegion = new RegionInfo ();
 				return currentRegion;
 			}
 		}
@@ -62,6 +57,12 @@
 		string isoCurrencySymbol;
 		string currencyEnglishName;
 
+		internal RegionInfo ()
+		{
+			// for current region.
+			construct_internal_current_region (this);
+		}
+
 		public RegionInfo (int lcid)
 		{
 			if (!construct_internal_region_from_lcid (lcid))
@@ -81,6 +82,9 @@
 		}
 
 		[MethodImplAttribute (MethodImplOptions.InternalCall)]
+		private extern bool construct_internal_current_region (RegionInfo ri);
+
+		[MethodImplAttribute (MethodImplOptions.InternalCall)]
 		private extern bool construct_internal_region_from_lcid (int lcid);
 
 		[MethodImplAttribute (MethodImplOptions.InternalCall)]
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to