Language Name | Code | Category | Examples | Rules |
---|---|---|---|---|
English | en | one | one | one → n is 1; other → everything else |
other | 0, 2-999; 1.2, 2.07 ... |
public enum PluralCategories { One, Few, Many, Other }
public interface ITimeFormatter { /// <summary> /// Returns category for plural form /// </summary> /// <param name="count"></param> /// <returns></returns> PluralCategories GetPluralCategoryByCount(int count); }
/// <summary> /// Default fabric for TimeFormatters /// </summary> public class TimeFormatterFabric { /// <summary> /// Returns TimeFormatter for corresponding culture /// </summary> /// <param name="cultureInfo"></param> /// <returns></returns> public ITimeFormatter GetTimeFormatter(CultureInfo cultureInfo) { ITimeFormatter result; if (cultureInfo.Name.StartsWith("en", StringComparison.InvariantCultureIgnoreCase)) { result = new EnglishTimeFormatter(); } else if (cultureInfo.Name.StartsWith("ru", StringComparison.InvariantCultureIgnoreCase)) { result = new RussianTimeFormatter(); } else { result = new EnglishTimeFormatter(); } return result; } }
public class TimeFormatter { private readonly ILocalizationService _localizationService; private readonly ITimeFormatter _timeFormatter; /// <summary> /// Defaults constructor. /// </summary> /// <param name="localizationService"></param> public TimeFormatter(ILocalizationService localizationService) { _localizationService = localizationService; _timeFormatter = new TimeFormatterFabric().GetTimeFormatter(localizationService.CurrentUiCulture); } /// <summary> /// Returns localized string by key and count of items. /// </summary> /// <param name="rootResourceKey"></param> /// <param name="count"></param> /// <returns></returns> public string Localize(string rootResourceKey, int count) { var resourceKey = string.Format("{0}.{1}", rootResourceKey, _timeFormatter.GetPluralCategoryByCount(count).ToString()); return _localizationService.Localize(resourceKey); } }
public class EnglishTimeFormatter : ITimeFormatter { /// <summary> /// Return plural category by count for English language rules /// </summary> /// <param name="count"></param> /// <returns></returns> public PluralCategories GetPluralCategoryByCount(int count) { PluralCategories result = PluralCategories.Other; if (count == 1) { result = PluralCategories.One; } return result; } }
public static string ToTimeLeftString(this DateTime dateTime) { var result = new StringBuilder(); var _localizationService = DependencyResolver.Current.GetService<ILocalizationService>(); var timeFormatter = new TimeFormatter(_localizationService); var currentTime = DateTime.UtcNow; var timeLeft = currentTime - dateTime; result.AppendFormat("{0} {1} {2} {3} {4}", timeLeft.Days, timeFormatter.Localize("DateTime.Days", timeLeft.Days), _localizationService.Localize("Common.Ago"), _localizationService.Localize("Common.At"), _localizationService.ConverUtcDateTimeToUsersTimeZone(dateTime).ToShortTimeString()); return result.ToString(); }
Source: https://habr.com/ru/post/140121/
All Articles