Merge pull request #2023 from juergenhoetzel/master
[mono.git] / tools / locale-builder / Driver.cs
index a41a2fe2ae6eecff173d94e15a5062b6ed33fd5a..3907485baf297ebbf7bac4d6c0a66c013e42ff3d 100644 (file)
@@ -174,10 +174,6 @@ namespace Mono.Tools.LocaleBuilder
                                writer.WriteLine ("{0}: {1}", "NumberGroupSeparator", nf.NumberGroupSeparator);
                                Dump (writer, nf.NumberGroupSizes, "NumberGroupSizes", true);
                                writer.WriteLine ("{0}: {1}", "NumberNegativePattern", nf.NumberNegativePattern);
-                               writer.WriteLine ("{0}: {1}", "PercentDecimalDigits", nf.PercentDecimalDigits);
-                               writer.WriteLine ("{0}: {1}", "PercentDecimalSeparator", nf.PercentDecimalSeparator);
-                               writer.WriteLine ("{0}: {1}", "PercentGroupSeparator", nf.PercentGroupSeparator);
-                               Dump (writer, nf.PercentGroupSizes, "PercentGroupSizes", true);
                                writer.WriteLine ("{0}: {1}", "PercentNegativePattern", nf.PercentNegativePattern);
                                writer.WriteLine ("{0}: {1}", "PercentPositivePattern", nf.PercentPositivePattern);
                                writer.WriteLine ("{0}: {1}", "PercentSymbol", nf.PercentSymbol);
@@ -562,10 +558,19 @@ namespace Mono.Tools.LocaleBuilder
                                        case "en":
                                                nfe.CurrencySymbol = "$";
                                                break;
+                                       case "bs":
+                                               nfe.CurrencySymbol = "KM";
+                                               break;
                                        case "es":
                                        case "fr":
+                                       case "de":
+                                       case "it":
+                                       case "se":
                                                nfe.CurrencySymbol = "€";
                                                break;
+                                       case "hr":
+                                               nfe.CurrencySymbol = "kn";
+                                               break;                          
                                        case "pt":
                                                nfe.CurrencySymbol = "R$";
                                                break;
@@ -586,6 +591,7 @@ namespace Mono.Tools.LocaleBuilder
                                                nfe.CurrencySymbol = "Din.";
                                                break;
                                        case "zh":
+                                       case "zh-Hans":
                                                nfe.CurrencySymbol = "¥";
                                                break;
                                        case "zh-Hant":
@@ -607,7 +613,7 @@ namespace Mono.Tools.LocaleBuilder
                                                } else {
                                                        // .NET has weird concept of territory data available for neutral cultures (e.g. en, es, pt)
                                                        // We have to manually disambiguate the correct entry (which is artofficial anyway)
-                                                       throw new ApplicationException (string.Format ("Ambiguous currency data for `{0}'", ci.Name));
+                                                       throw new ApplicationException (string.Format ("Ambiguous currency data for `{0}'. Possible values '{1}'", ci.Name, string.Join (", ", children)));
                                                }
 
                                                break;
@@ -925,12 +931,10 @@ namespace Mono.Tools.LocaleBuilder
                        // We don't add 3 as it's for some arabic states only
                        switch (data.ThreeLetterISOLanguageName) {
                        case "amh":
-                               data.NumberFormatEntry.NumberDecimalDigits =
-                               data.NumberFormatEntry.PercentDecimalDigits = 1;
+                               data.NumberFormatEntry.NumberDecimalDigits = 1;
                                break;
                        default:
-                               data.NumberFormatEntry.NumberDecimalDigits =
-                               data.NumberFormatEntry.PercentDecimalDigits = 2;
+                               data.NumberFormatEntry.NumberDecimalDigits = 2;
                                break;
                        }
 
@@ -963,7 +967,7 @@ namespace Mono.Tools.LocaleBuilder
 
                        string calendar;
                        // Default calendar is for now always "gregorian"
-                       switch (ci.Name) {
+                       switch (ci.OriginalName) {
                        case "th": case "th-TH":
                                calendar = "buddhist";
                                ci.CalendarType = CalendarType.ThaiBuddhist; // typeof (ThaiBuddhistCalendar);
@@ -996,11 +1000,27 @@ namespace Mono.Tools.LocaleBuilder
                                nodes = node.SelectNodes ("months/monthContext[@type='stand-alone']/monthWidth[@type='wide']/month");
                                ProcessAllNodes (nodes, df.MonthNames, AddOrReplaceValue);
 
+                               if (df.MonthNames != null) {
+                                       if (ci.Name == "sv" || ci.Name == "sv-SE") {
+                                               ToLower (df.MonthNames);
+                                       }
+                               }
+
                                // Apply global rule first <alias source="locale" path="../../monthContext[@type='format']/monthWidth[@type='abbreviated']"/>
-                               nodes = node.SelectNodes ("months/monthContext[@type='format']/monthWidth[@type='abbreviated']/month");
-                               ProcessAllNodes (nodes, df.AbbreviatedMonthNames, AddOrReplaceValue);
-                               nodes = node.SelectNodes ("months/monthContext[@type='stand-alone']/monthWidth[@type='abbreviated']/month");
-                               ProcessAllNodes (nodes, df.AbbreviatedMonthNames, AddOrReplaceValue);
+                               if (ci.Name == "ja" || ci.Name == "ja-JP") {
+                                       // Use common number style
+                               } else {
+                                       nodes = node.SelectNodes ("months/monthContext[@type='format']/monthWidth[@type='abbreviated']/month");
+                                       ProcessAllNodes (nodes, df.AbbreviatedMonthNames, AddOrReplaceValue);
+                                       nodes = node.SelectNodes ("months/monthContext[@type='stand-alone']/monthWidth[@type='abbreviated']/month");
+                                       ProcessAllNodes (nodes, df.AbbreviatedMonthNames, AddOrReplaceValue);
+                               }
+
+                               if (df.AbbreviatedMonthNames != null) {
+                                       if (ci.Name == "sv" || ci.Name == "sv-SE") {
+                                               ToLower (df.AbbreviatedMonthNames);
+                                       }
+                               }
 
                                nodes = node.SelectNodes ("months/monthContext[@type='format']/monthWidth[@type='wide']/month");
                                if (nodes != null) {
@@ -1019,6 +1039,12 @@ namespace Mono.Tools.LocaleBuilder
                                nodes = node.SelectNodes ("days/dayContext[@type='stand-alone']/dayWidth[@type='abbreviated']/day");
                                ProcessAllNodes (nodes, df.AbbreviatedDayNames, AddOrReplaceDayValue);
 
+                               if (df.AbbreviatedDayNames != null) {
+                                       if (ci.Name == "sv" || ci.Name == "sv-SE") {
+                                               ToLower (df.AbbreviatedDayNames);
+                                       }
+                               }
+
                                // TODO: This is not really ShortestDayNames as .NET uses it
                                // Apply global rules first <alias source="locale" path="../../dayContext[@type='stand-alone']/dayWidth[@type='narrow']"/>
                                nodes = node.SelectNodes ("days/dayContext[@type='format']/dayWidth[@type='narrow']/day");
@@ -1059,29 +1085,43 @@ namespace Mono.Tools.LocaleBuilder
                                        // Apply global rule first <alias source="locale" path="../dayPeriodWidth[@type='wide']"/>
                                        el = node.SelectSingleNode ("dayPeriods/dayPeriodContext/dayPeriodWidth[@type='wide']/dayPeriod[@type='am']");
 
-                               if (el != null)
-                                       df.AMDesignator = el.InnerText;
+                               // Manual edits for exact .net compatiblity
+                               switch (ci.Name) {
+                               case "en-AU":
+                                       df.AMDesignator = "AM";
+                                       break;
+                               case "en-NZ":
+                                       df.AMDesignator = "a.m.";
+                                       break;
+                               default:
+                                       if (el != null)
+                                               df.AMDesignator = el.InnerText;
+                                       break;
+                               }
 
                                el = node.SelectSingleNode ("dayPeriods/dayPeriodContext/dayPeriodWidth[@type='abbreviated']/dayPeriod[@type='pm']");
                                if (el == null)
                                        // Apply global rule first <alias source="locale" path="../dayPeriodWidth[@type='wide']"/>
                                        el = node.SelectSingleNode ("dayPeriods/dayPeriodContext/dayPeriodWidth[@type='wide']/dayPeriod[@type='pm']");
 
-                               // No data
-                               if (el != null)
-                                       df.PMDesignator = el.InnerText;
+                               switch (ci.Name) {
+                               case "en-AU":
+                                       df.PMDesignator = "PM";
+                                       break;
+                               case "en-NZ":
+                                       df.PMDesignator = "p.m.";
+                                       break;
+                               default:
+                                       if (el != null)
+                                               df.PMDesignator = el.InnerText;
+                                       break;
+                               }
                        }
 
                        var ni = ci.NumberFormatEntry;
 
                        node = doc.SelectSingleNode ("ldml/numbers/symbols");
                        if (node != null) {
-                               el = node.SelectSingleNode ("decimal");
-                               if (el != null) {
-                                       ni.NumberDecimalSeparator =
-                                       ni.PercentDecimalSeparator = el.InnerText;
-                               }
-
                                el = node.SelectSingleNode ("plusSign");
                                if (el != null)
                                        ni.PositiveSign = el.InnerText;
@@ -1090,9 +1130,12 @@ namespace Mono.Tools.LocaleBuilder
                                if (el != null) {
                                        // CLDR uses unicode negative sign for some culture (e.g sv, is, lt, don't kwnow why) but .net always
                                        // uses simple - sign
-                                       if (el.InnerText == "\u2212")
+                                       if (el.InnerText == "\u2212") {
                                                ni.NegativeSign = "-";
-                                       else
+                                       } else if (el.InnerText ==  "\u200F\u002D") {
+                                               // Remove any right-to-left mark characters
+                                               ni.NegativeSign = "-";
+                                       } else
                                                ni.NegativeSign = el.InnerText;                                 
                                }
 
@@ -1120,12 +1163,43 @@ namespace Mono.Tools.LocaleBuilder
                                if (el != null)
                                        ni.PercentSymbol = el.InnerText;
 
-                               el = node.SelectSingleNode ("group");
-                               if (el != null) {
-                                       ni.NumberGroupSeparator =
-                                       ni.PercentGroupSeparator =
-                                       ni.CurrencyGroupSeparator = el.InnerText;
+                       }
+
+                       string value = null;
+
+                       // .net has incorrect separators for some countries and we want to be compatible
+                       switch (ci.Name) {
+                       case "es-ES":
+                       case "es":
+                               // es-ES does not have group separator but .net has '.'
+                               value = ".";
+                               break;
+                       default:
+                               if (node != null) {
+                                       el = node.SelectSingleNode ("group");
+                                       if (el != null) {
+                                               value = el.InnerText;
+                                       }
                                }
+
+                               break;
+                       }
+                                       
+                       if (value != null) {
+                               ni.NumberGroupSeparator = ni.CurrencyGroupSeparator = value;
+                       }
+               }
+
+               static void ToLower (string[] values)
+               {
+                       if (values == null)
+                               return;
+
+                       for (int i = 0; i < values.Length; ++i) {
+                               if (values [i] == null)
+                                       continue;
+
+                               values [i] = values [i].ToLower ();
                        }
                }