Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions release_notes.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
###In Development
- [#285](https://github.com/Mehdik/Humanizer/pull/285): Localised ToQuantity and added FarsiQuantifier
- [#277](https://github.com/MehdiK/Humanizer/pull/277): Added support for custom enum description attribute property names
- [#276](https://github.com/Mehdik/Humanizer/pull/276): Added Farsi ToOrdinalWords


[Commits](https://github.com/MehdiK/Humanizer/compare/v1.26.1...master)

###v1.26.1 - 2014-05-20
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ public class Configurator
public Humanizer.Configuration.LocaliserRegistry<Humanizer.Localisation.Formatters.IFormatter> Formatters { get; }
public Humanizer.Configuration.LocaliserRegistry<Humanizer.Localisation.NumberToWords.INumberToWordsConverter> NumberToWordsConverters { get; }
public Humanizer.Configuration.LocaliserRegistry<Humanizer.Localisation.Ordinalizers.IOrdinalizer> Ordinalizers { get; }
public Humanizer.Configuration.LocaliserRegistry<Humanizer.Localisation.Quantifiers.IQuantifier> Quantifiers { get; }
}

public class LocaliserRegistry`1
Expand Down Expand Up @@ -243,6 +244,11 @@ public interface IOrdinalizer
string Convert(int number, string numberString, Humanizer.GrammaticalGender gender);
}

public interface IQuantifier
{
string ToQuantity(string input, int quantity, Humanizer.ShowQuantityAs showQuantityAs, string format, System.IFormatProvider formatProvider);
}

public class ResourceKeys
{
public ResourceKeys() { }
Expand Down
1 change: 1 addition & 0 deletions src/Humanizer.Tests/Humanizer.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
<Compile Include="Localisation\de\NumberToWordsTests.cs" />
<Compile Include="Localisation\de\OrdinalizeTests.cs" />
<Compile Include="Localisation\es\OrdinalizeTests.cs" />
<Compile Include="Localisation\fa\ToQuantityTests.cs" />
<Compile Include="Localisation\fr-BE\DateHumanizeTests.cs" />
<Compile Include="Localisation\fr-BE\TimeSpanHumanizeTests.cs" />
<Compile Include="Localisation\fr\DateHumanizeTests.cs" />
Expand Down
47 changes: 47 additions & 0 deletions src/Humanizer.Tests/Localisation/fa/ToQuantityTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using Xunit;
using Xunit.Extensions;

namespace Humanizer.Tests.Localisation.fa
{
public class ToQuantityTests : AmbientCulture
{
public ToQuantityTests()
: base("fa") { }

[Theory]
[InlineData("مرد", 0, "0 مرد")]
[InlineData("مرد", 1, "1 مرد")]
[InlineData("مرد", 5, "5 مرد")]
public void ToQuantity(string word, int quatity, string expected)
{
Assert.Equal(expected, word.ToQuantity(quatity));
}

[Theory]
[InlineData("مرد", 0, "مرد")]
[InlineData("مرد", 1, "مرد")]
[InlineData("مرد", 5, "مرد ها")]
public void ToQuantityWithNoQuantity(string word, int quatity, string expected)
{
Assert.Equal(expected, word.ToQuantity(quatity, ShowQuantityAs.None));
}

[Theory]
[InlineData("مرد", 0, "0 مرد")]
[InlineData("مرد", 1, "1 مرد")]
[InlineData("مرد", 5, "5 مرد")]
public void ToQuantityNumeric(string word, int quatity, string expected)
{
Assert.Equal(expected, word.ToQuantity(quatity, ShowQuantityAs.Numeric));
}

[Theory]
[InlineData("مرد", 2, "دو مرد")]
[InlineData("مرد", 1, "یک مرد")]
[InlineData("مرد", 1200, "یک هزار و دویست مرد")]
public void ToQuantityWords(string word, int quatity, string expected)
{
Assert.Equal(expected, word.ToQuantity(quatity, ShowQuantityAs.Words));
}
}
}
24 changes: 23 additions & 1 deletion src/Humanizer/Configuration/Configurator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Humanizer.Localisation.NumberToWords;
using Humanizer.Localisation.Ordinalizers;
using Humanizer.Localisation.CollectionFormatters;
using Humanizer.Localisation.Quantifiers;

namespace Humanizer.Configuration
{
Expand Down Expand Up @@ -51,14 +52,24 @@ public static LocaliserRegistry<IOrdinalizer> Ordinalizers
get { return _ordinalizers; }
}

private static readonly LocaliserRegistry<IQuantifier> _quantifiers = new QuantifierRegistry();

/// <summary>
/// A registry of quantifiers used to localise ToQuantity method
/// </summary>
public static LocaliserRegistry<IQuantifier> Quantifiers
{
get { return _quantifiers; }
}

internal static ICollectionFormatter CollectionFormatter
{
get
{
return CollectionFormatters.ResolveForUiCulture();
}
}

/// <summary>
/// The formatter to be used
/// </summary>
Expand Down Expand Up @@ -92,6 +103,17 @@ internal static IOrdinalizer Ordinalizer
}
}

/// <summary>
/// The quantifier to be used
/// </summary>
internal static IQuantifier Quantifier
{
get
{
return Quantifiers.ResolveForUiCulture();
}
}

private static IDateTimeHumanizeStrategy _dateTimeHumanizeStrategy = new DefaultDateTimeHumanizeStrategy();
/// <summary>
/// The strategy to be used for DateTime.Humanize
Expand Down
17 changes: 17 additions & 0 deletions src/Humanizer/Configuration/QuantifierRegistry.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using Humanizer.Localisation.Quantifiers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Humanizer.Configuration
{
internal class QuantifierRegistry : LocaliserRegistry<IQuantifier>
{
public QuantifierRegistry()
:base(new DefaultQuantifier())
{
Register<FarsiQuantifier>("fa");
}
}
}
4 changes: 4 additions & 0 deletions src/Humanizer/Humanizer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
<ItemGroup>
<Compile Include="CollectionHumanizeExtensions.cs" />
<Compile Include="Configuration\CollectionFormatterRegistry.cs" />
<Compile Include="Configuration\QuantifierRegistry.cs" />
<Compile Include="Localisation\CollectionFormatters\DefaultCollectionFormatter.cs" />
<Compile Include="Localisation\CollectionFormatters\EnglishCollectionFormatter.cs" />
<Compile Include="Localisation\CollectionFormatters\ICollectionFormatter.cs" />
Expand Down Expand Up @@ -94,6 +95,9 @@
<Compile Include="Localisation\Ordinalizers\DefaultOrdinalizer.cs" />
<Compile Include="Localisation\Ordinalizers\EnglishOrdinalizer.cs" />
<Compile Include="Localisation\Ordinalizers\BrazilianPortugueseOrdinalizer.cs" />
<Compile Include="Localisation\Quantifiers\DefaultQuantifier.cs" />
<Compile Include="Localisation\Quantifiers\FarsiQuantifier.cs" />
<Compile Include="Localisation\Quantifiers\IQuantifier.cs" />
<Compile Include="Localisation\Tense.cs" />
<Compile Include="Localisation\NumberToWords\SpanishNumberToWordsConverter.cs" />
<Compile Include="TimeSpanHumanizeExtensions.cs" />
Expand Down
31 changes: 31 additions & 0 deletions src/Humanizer/Localisation/Quantifiers/DefaultQuantifier.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Humanizer.Localisation.Quantifiers
{
internal class DefaultQuantifier : IQuantifier
{
public string ToQuantity(string input, int quantity, ShowQuantityAs showQuantityAs = ShowQuantityAs.Numeric, string format = null, IFormatProvider formatProvider = null)
{
var transformedInput = TransformInput(input, quantity, showQuantityAs);

if (showQuantityAs == ShowQuantityAs.None)
return transformedInput;

if (showQuantityAs == ShowQuantityAs.Numeric)
return string.Format(formatProvider, "{0} {1}", quantity.ToString(format, formatProvider), transformedInput);

return string.Format("{0} {1}", quantity.ToWords(), transformedInput);
}

protected virtual string TransformInput(string input, int quantity, ShowQuantityAs showQuantityAs)
{
return quantity == 1
? input.Singularize(Plurality.CouldBeEither)
: input.Pluralize(Plurality.CouldBeEither);

}
}
}
23 changes: 23 additions & 0 deletions src/Humanizer/Localisation/Quantifiers/FarsiQuantifier.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Humanizer.Localisation.Quantifiers
{
internal class FarsiQuantifier : DefaultQuantifier
{
protected override string TransformInput(string input, int quantity, ShowQuantityAs showQuantityAs)
{
//TODO: Use singularize and pluralize for Farsi
string postFix = string.Empty;

if (showQuantityAs == ShowQuantityAs.None && quantity > 1)
{
postFix = " ها";
}

return string.Format("{0}{1}", input, postFix);
}
}
}
24 changes: 24 additions & 0 deletions src/Humanizer/Localisation/Quantifiers/IQuantifier.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Humanizer.Localisation.Quantifiers
{
/// <summary>
/// The interface used to localise the ToQuantity method
/// </summary>
public interface IQuantifier
{
/// <summary>
/// Convert input to quantity
/// </summary>
/// <param name="input"></param>
/// <param name="quantity"></param>
/// <param name="showQuantityAs"></param>
/// <param name="format"></param>
/// <param name="formatProvider"></param>
/// <returns></returns>
string ToQuantity(string input, int quantity, ShowQuantityAs showQuantityAs, string format, IFormatProvider formatProvider);
}
}
6 changes: 4 additions & 2 deletions src/Humanizer/Localisation/ResourceKeys.DateHumanize.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Humanizer.Localisation
using Humanizer.Configuration;
using Humanizer.Localisation.Quantifiers;
namespace Humanizer.Localisation
{
public partial class ResourceKeys
{
Expand Down Expand Up @@ -37,7 +39,7 @@ public static string GetResourceKey(TimeUnit timeUnit, Tense timeUnitTense, int

var singularity = count == 1 ? Single : Multiple;
var tense = timeUnitTense == Tense.Future ? FromNow : Ago;
var unit = timeUnit.ToString().ToQuantity(count, ShowQuantityAs.None);
var unit = new DefaultQuantifier().ToQuantity(timeUnit.ToString(), count, ShowQuantityAs.None);
return DateTimeFormat.FormatWith(singularity, unit, tense);
}
}
Expand Down
21 changes: 4 additions & 17 deletions src/Humanizer/ToQuantityExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using Humanizer.Configuration;
using System;
namespace Humanizer
{
/// <summary>
Expand Down Expand Up @@ -46,7 +47,7 @@ public static class ToQuantityExtensions
/// <returns></returns>
public static string ToQuantity(this string input, int quantity, ShowQuantityAs showQuantityAs = ShowQuantityAs.Numeric)
{
return input.ToQuantity(quantity, showQuantityAs, format: null, formatProvider: null);
return Configurator.Quantifier.ToQuantity(input, quantity, showQuantityAs, null, null);
}

/// <summary>
Expand All @@ -64,22 +65,8 @@ public static string ToQuantity(this string input, int quantity, ShowQuantityAs
/// <returns></returns>
public static string ToQuantity(this string input, int quantity, string format, IFormatProvider formatProvider = null)
{
return input.ToQuantity(quantity, showQuantityAs: ShowQuantityAs.Numeric, format: format, formatProvider: formatProvider);
return Configurator.Quantifier.ToQuantity(input, quantity, ShowQuantityAs.Numeric, format, formatProvider);
}

private static string ToQuantity(this string input, int quantity, ShowQuantityAs showQuantityAs = ShowQuantityAs.Numeric, string format = null, IFormatProvider formatProvider = null)
{
var transformedInput = quantity == 1
? input.Singularize(Plurality.CouldBeEither)
: input.Pluralize(Plurality.CouldBeEither);

if (showQuantityAs == ShowQuantityAs.None)
return transformedInput;

if (showQuantityAs == ShowQuantityAs.Numeric)
return string.Format(formatProvider, "{0} {1}", quantity.ToString(format, formatProvider), transformedInput);

return string.Format("{0} {1}", quantity.ToWords(), transformedInput);
}
}
}