[banshee] Fixed smart playlist templates in non-English locales (bgo#581987)



commit 02ab975b5abe4f0038f89058e91fd000783f7cc2
Author: Alexander Kojevnikov <alexander kojevnikov com>
Date:   Tue May 12 08:40:50 2009 +1000

    Fixed smart playlist templates in non-English locales (bgo#581987)
    
    When parsing predefined smart playlists that include time spans, banshee first
    translated them which made them unparsable. This commit tries to parse both the
    original and the translated version. The side-effect is that user queries can
    now include both the English and the localised versions of time span terms.
---
 .../Hyena.Query/RelativeTimeSpanQueryValue.cs      |    7 ++-
 .../Hyena/Hyena.Query/TimeSpanQueryValue.cs        |   50 ++++++++++++++------
 src/Libraries/Hyena/Hyena/StringUtil.cs            |   11 ++--
 3 files changed, 45 insertions(+), 23 deletions(-)

diff --git a/src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs b/src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs
index 3095744..772ef48 100644
--- a/src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs
+++ b/src/Libraries/Hyena/Hyena.Query/RelativeTimeSpanQueryValue.cs
@@ -83,10 +83,11 @@ namespace Hyena.Query
             return DateTimeUtil.FromDateTime (DateTime.Now + TimeSpan.FromSeconds ((double) offset)).ToString (System.Globalization.CultureInfo.InvariantCulture);
         }
 
-        protected override string FactorString (TimeFactor factor, double count)
+        protected override string FactorString (TimeFactor factor, double count, bool translate)
         {
-            string translated = base.FactorString (factor, count);
-            return (translated == null) ? null : String.Format (Catalog.GetString ("{0} ago"), translated);
+            string result = base.FactorString (factor, count, translate);
+            return (result == null) ? null : String.Format (
+                translate ? Catalog.GetString ("{0} ago") : "{0} ago", result);
         }
     }
 }
diff --git a/src/Libraries/Hyena/Hyena.Query/TimeSpanQueryValue.cs b/src/Libraries/Hyena/Hyena.Query/TimeSpanQueryValue.cs
index 51f22cd..3e3d52d 100644
--- a/src/Libraries/Hyena/Hyena.Query/TimeSpanQueryValue.cs
+++ b/src/Libraries/Hyena/Hyena.Query/TimeSpanQueryValue.cs
@@ -28,6 +28,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.Xml;
 using System.Text;
 using System.Text.RegularExpressions;
@@ -92,9 +93,14 @@ namespace Hyena.Query
         {
             Match match = number_regex.Match (input);
             if (match != Match.Empty && match.Groups.Count > 0) {
-                double val = Convert.ToDouble (match.Groups[0].Captures[0].Value);
+                double val;
+                try {
+                    val = Convert.ToDouble (match.Groups[0].Captures[0].Value);
+                } catch (FormatException) {
+                    val = Convert.ToDouble (match.Groups[0].Captures[0].Value, NumberFormatInfo.InvariantInfo);
+                }
                 foreach (TimeFactor factor in Enum.GetValues (typeof(TimeFactor))) {
-                    if (input == FactorString (factor, val)) {
+                    if (input == FactorString (factor, val, true) || input == FactorString (factor, val, false)) {
                         SetUserRelativeValue (val, factor);
                         return;
                     }
@@ -105,7 +111,7 @@ namespace Hyena.Query
 
         public override string ToUserQuery ()
         {
-            return FactorString (factor, FactoredValue);
+            return FactorString (factor, FactoredValue, true);
         }
 
         public virtual void SetUserRelativeValue (double offset, TimeFactor factor)
@@ -163,22 +169,36 @@ namespace Hyena.Query
             return Convert.ToString (offset * 1000, System.Globalization.CultureInfo.InvariantCulture);
         }
 
-        protected virtual string FactorString (TimeFactor factor, double count)
+        protected virtual string FactorString (TimeFactor factor, double count, bool translate)
         {
-            string translated = null;
+            string result = null;
             int plural_count = StringUtil.DoubleToPluralInt (count);
-            switch (factor) {
-                case TimeFactor.Second: translated = Catalog.GetPluralString ("{0} second", "{0} seconds", plural_count); break;
-                case TimeFactor.Minute: translated = Catalog.GetPluralString ("{0} minute", "{0} minutes", plural_count); break;
-                case TimeFactor.Hour:   translated = Catalog.GetPluralString ("{0} hour",   "{0} hours", plural_count); break;
-                case TimeFactor.Day:    translated = Catalog.GetPluralString ("{0} day",    "{0} days", plural_count); break;
-                case TimeFactor.Week:   translated = Catalog.GetPluralString ("{0} week",   "{0} weeks", plural_count); break;
-                case TimeFactor.Month:  translated = Catalog.GetPluralString ("{0} month",  "{0} months", plural_count); break;
-                case TimeFactor.Year:   translated = Catalog.GetPluralString ("{0} year",   "{0} years", plural_count); break;
-                default: return null;
+            if (translate) {
+                switch (factor) {
+                    case TimeFactor.Second: result = Catalog.GetPluralString ("{0} second", "{0} seconds", plural_count); break;
+                    case TimeFactor.Minute: result = Catalog.GetPluralString ("{0} minute", "{0} minutes", plural_count); break;
+                    case TimeFactor.Hour:   result = Catalog.GetPluralString ("{0} hour",   "{0} hours", plural_count); break;
+                    case TimeFactor.Day:    result = Catalog.GetPluralString ("{0} day",    "{0} days", plural_count); break;
+                    case TimeFactor.Week:   result = Catalog.GetPluralString ("{0} week",   "{0} weeks", plural_count); break;
+                    case TimeFactor.Month:  result = Catalog.GetPluralString ("{0} month",  "{0} months", plural_count); break;
+                    case TimeFactor.Year:   result = Catalog.GetPluralString ("{0} year",   "{0} years", plural_count); break;
+                    default: return null;
+                }
+            } else {
+                switch (factor) {
+                    case TimeFactor.Second: result = plural_count == 1 ? "{0} second" : "{0} seconds"; break;
+                    case TimeFactor.Minute: result = plural_count == 1 ? "{0} minute" : "{0} minutes"; break;
+                    case TimeFactor.Hour:   result = plural_count == 1 ? "{0} hour"   : "{0} hours"; break;
+                    case TimeFactor.Day:    result = plural_count == 1 ? "{0} day"    : "{0} days"; break;
+                    case TimeFactor.Week:   result = plural_count == 1 ? "{0} week"   : "{0} weeks"; break;
+                    case TimeFactor.Month:  result = plural_count == 1 ? "{0} month"  : "{0} months"; break;
+                    case TimeFactor.Year:   result = plural_count == 1 ? "{0} year"   : "{0} years"; break;
+                    default: return null;
+                }
             }
 
-            return String.Format (translated, StringUtil.DoubleToTenthsPrecision (count));
+            return String.Format (result, StringUtil.DoubleToTenthsPrecision (
+                count, false, translate ? NumberFormatInfo.CurrentInfo : NumberFormatInfo.InvariantInfo));
         }
     }
 }
diff --git a/src/Libraries/Hyena/Hyena/StringUtil.cs b/src/Libraries/Hyena/Hyena/StringUtil.cs
index c19cada..5386083 100644
--- a/src/Libraries/Hyena/Hyena/StringUtil.cs
+++ b/src/Libraries/Hyena/Hyena/StringUtil.cs
@@ -146,12 +146,13 @@ namespace Hyena
         
         public static string DoubleToTenthsPrecision (double num, bool always_decimal)
         {
+            return DoubleToTenthsPrecision (num, always_decimal, NumberFormatInfo.CurrentInfo);
+        }
+
+        public static string DoubleToTenthsPrecision (double num, bool always_decimal, IFormatProvider provider)
+        {
             num = Math.Round (num, 1, MidpointRounding.ToEven);
-            return String.Format (
-                !always_decimal && num == (int)num 
-                    ? "{0:N0}" : "{0:N1}",
-                num
-            );
+            return String.Format (provider, !always_decimal && num == (int)num ? "{0:N0}" : "{0:N1}", num);
         }
         
         // This method helps us pluralize doubles. Probably a horrible i18n idea.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]