рд╣рд╛рдп рд╕рдм рд▓реЛрдЧ
рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкрд┐рдЫрд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА "рд╕рдордп рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖" рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рдЬрд╛рдП (рдлреЙрд░реНрдо рдХрд╛ рд╕рдВрджреЗрд╢: "рдШрдЯрдирд╛ рдПрди рдорд┐рдирдЯ \ рдорд┐рдирдЯ рдкрд╣рд▓реЗ рд╣реБрдИ")ред рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрдкрд╕реНрдерд┐рддрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рдерд╛ рдХрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
"рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЬрдЯрд┐рд▓ рд╣реИ?", рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдФрд░ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, Google рдкрд░ рдЧрдПред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, Google рдиреЗ рдкрдХреНрд╖рдкрд╛рддрдкреВрд░реНрдг рд╣реЛрдиреЗ рдХрд╛ рдирд╛рдЯрдХ рдХрд┐рдпрд╛, рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХреА, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ред
"рд╣рдордиреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдЕрдкрдиреА рд╕рд╛рдЗрдХрд┐рд▓
рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд░реВрд╕реА рдСрдЯреЛ рдЙрджреНрдпреЛрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛," рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдХреНрдпрд╛ рдЖрдпрд╛ ...
рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдХрд┐ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рднреА рдЙрдирдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреАред рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдирд┐рдпрдореЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдереА рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╢рдмреНрдж рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рдХреЛ рд╕рдВрд╕рд╛рдзрди рд╕реЗ рд▓реЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рд╢рдмреНрдж "рджрд┐рди", "рдШрдВрдЯрд╛", "рдорд┐рдирдЯ" рдереЗ, рдЬреЛ рдЗрд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдереЗред
Google рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд
рд╕рд╛рдЗрдЯ рдорд┐рд▓реА, рдЬрд┐рд╕ рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдФрд░ рдПрдХрд╛рдзрд┐рдХ рд╢рдмреНрдж рд░реВрдкреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдФрд░ рдорд╛рдирдХреАрдХрд░рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдерд╛ред
рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рдЗрдЯ рдкрд░, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рдмреНрдж рд░реВрдкреЛрдВ рдХреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп:
- рдПрдХ
- рдХреБрдЫ
- рдХрдИ
- рдЕрдиреНрдп
рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ, рд╕рд╛рде рд╣реА рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдореВрд╣ рдореЗрдВ рдирд┐рдпрдо, рд╕рджрд╕реНрдпрддрд╛ред
рдЖрд╕рд╛рди рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:
рднрд╛рд╖рд╛ рдХрд╛ рдирд╛рдо | рдХреЛрдб | рд╢реНрд░реЗрдгреА | рдЙрджрд╛рд╣рд░рдг | рдирд┐рдпрдо |
---|
рдЕрдВрдЧреНрд░реЗрдЬреА | en
| рдПрдХ | 1 | рдПрдХ тЖТ рдПрди 1 рд╣реИ;
рдЕрдиреНрдп тЖТ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ
|
рдЕрдиреНрдп | 0, 2-999;
1.2, 2.07 ...
|
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдордиреЗ рдпрд╣ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХреИрд╕реЗ рдХрд┐рдпрд╛:
рд╣рдо рдЬрд┐рди рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрд╕ рд╢реНрд░реЗрдгреА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢рдмреНрдж рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрд╕рд╛рдзрди рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ {ObjectName}ред {рд╢реНрд░реЗрдгреА} рдЗрд╕ рднрд╛рд╖рд╛ рдХреА рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИрдВред рдПрдХ рджреВрд░рдмреАрди рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрдХреНрдд рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрд╕ рднрд╛рд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж рдХреЗ рд░реВрдк рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╢рдмреНрдж рдкреНрд░рдкрддреНрд░ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ ({ObjectName}) рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрд╕рд╛рдзрди рдХреБрдВрдЬреА рдФрд░ рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреА рд╣реИ, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╢реНрд░реЗрдгреА рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддреА рд╣реИред
рдареАрдХ рд╣реИ, рд╢рдмреНрджреЛрдВ рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рддрдХ! рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕рдордп рд╣реИ ...
рдкрд╣рд▓рд╛ рдХрджрдо рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдирдо рдмрдирд╛рдирд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
public enum PluralCategories { One, Few, Many, Other }
рднрд╡рд┐рд╖реНрдп рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рд╢реНрд░реЗрдгреА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
public interface ITimeFormatter {
рдлреИрдХреНрдЯрд░реА рд╡рд░реНрдЧ:
/// <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; } }
рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдорд╛рди рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ:
рджрд┐рдирд╛рдВрдХ рд╕рдордпред рдПрдХ рджрд┐рди
DateTime.Days.Other рджрд┐рди
DateTime.Hours.One рдШрдВрдЯрд╛
DateTime.Hours.Other рдШрдВрдЯреЗ
DateTime.Minutes.One рдорд┐рдирдЯ
DateTime.Minutes.Other рдорд┐рдирдЯ
рдЦреИрд░, рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг:
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(); }
рдпрд╣ рд╕рдм, рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред