mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Introduce :almost keyword for distance_of_time_in_words. Make 1.75 days - 2 days return '2 days'.
Signed-off-by: Michael Koziarski <michael@koziarski.com> [#3266 state:committed]
This commit is contained in:
parent
8ef1cd9733
commit
c9318e9010
4 changed files with 59 additions and 31 deletions
|
@ -26,8 +26,10 @@ module ActionView
|
|||
# 47 hrs, 59 mins, 29 secs <-> 29 days, 23 hrs, 59 mins, 29 secs # => [2..29] days
|
||||
# 29 days, 23 hrs, 59 mins, 30 secs <-> 59 days, 23 hrs, 59 mins, 29 secs # => about 1 month
|
||||
# 59 days, 23 hrs, 59 mins, 30 secs <-> 1 yr minus 1 sec # => [2..12] months
|
||||
# 1 yr <-> 2 yrs minus 1 secs # => about 1 year
|
||||
# 2 yrs <-> max time or date # => over [2..X] years
|
||||
# 1 yr <-> 1 yr, 3 months # => about 1 year
|
||||
# 1 yr, 3 months <-> 1 yr, 9 months # => over 1 year
|
||||
# 1 yr, 9 months <-> 2 yr minus 1 sec # => almost 2 years
|
||||
# 2 yrs <-> max time or date # => (same rules as 1 yr)
|
||||
#
|
||||
# With <tt>include_seconds</tt> = true and the difference < 1 minute 29 seconds:
|
||||
# 0-4 secs # => less than 5 seconds
|
||||
|
@ -53,8 +55,8 @@ module ActionView
|
|||
# distance_of_time_in_words(from_time, from_time + 4.years + 9.days + 30.minutes + 5.seconds) # => about 4 years
|
||||
#
|
||||
# to_time = Time.now + 6.years + 19.days
|
||||
# distance_of_time_in_words(from_time, to_time, true) # => over 6 years
|
||||
# distance_of_time_in_words(to_time, from_time, true) # => over 6 years
|
||||
# distance_of_time_in_words(from_time, to_time, true) # => about 6 years
|
||||
# distance_of_time_in_words(to_time, from_time, true) # => about 6 years
|
||||
# distance_of_time_in_words(Time.now, Time.now) # => less than a minute
|
||||
#
|
||||
def distance_of_time_in_words(from_time, to_time = 0, include_seconds = false, options = {})
|
||||
|
@ -82,14 +84,21 @@ module ActionView
|
|||
when 2..44 then locale.t :x_minutes, :count => distance_in_minutes
|
||||
when 45..89 then locale.t :about_x_hours, :count => 1
|
||||
when 90..1439 then locale.t :about_x_hours, :count => (distance_in_minutes.to_f / 60.0).round
|
||||
when 1440..2879 then locale.t :x_days, :count => 1
|
||||
when 2880..43199 then locale.t :x_days, :count => (distance_in_minutes / 1440).round
|
||||
when 1440..2529 then locale.t :x_days, :count => 1
|
||||
when 2530..43199 then locale.t :x_days, :count => (distance_in_minutes.to_f / 1440.0).round
|
||||
when 43200..86399 then locale.t :about_x_months, :count => 1
|
||||
when 86400..525599 then locale.t :x_months, :count => (distance_in_minutes / 43200).round
|
||||
when 86400..525599 then locale.t :x_months, :count => (distance_in_minutes.to_f / 43200.0).round
|
||||
else
|
||||
return distance_in_minutes % 525600 < 262800 ?
|
||||
locale.t(:about_x_years, :count => (distance_in_minutes / 525600).round) :
|
||||
locale.t(:over_x_years, :count => (distance_in_minutes / 525600).round)
|
||||
distance_in_years = distance_in_minutes / 525600
|
||||
minute_offset_for_leap_year = (distance_in_years / 4) * 1440
|
||||
remainder = ((distance_in_minutes - minute_offset_for_leap_year) % 525600)
|
||||
if remainder < 131400
|
||||
locale.t(:about_x_years, :count => distance_in_years)
|
||||
elsif remainder < 394200
|
||||
locale.t(:over_x_years, :count => distance_in_years)
|
||||
else
|
||||
locale.t(:almost_x_years, :count => distance_in_years + 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -91,6 +91,9 @@
|
|||
over_x_years:
|
||||
one: "over 1 year"
|
||||
other: "over {{count}} years"
|
||||
almost_x_years:
|
||||
one: "almost 1 year"
|
||||
other: "almost {{count}} years"
|
||||
prompts:
|
||||
year: "Year"
|
||||
month: "Month"
|
||||
|
|
|
@ -20,15 +20,16 @@ class DateHelperDistanceOfTimeInWordsI18nTests < Test::Unit::TestCase
|
|||
[60.seconds, true] => [:'x_minutes', 1],
|
||||
|
||||
# without include_seconds
|
||||
[29.seconds, false] => [:'less_than_x_minutes', 1],
|
||||
[60.seconds, false] => [:'x_minutes', 1],
|
||||
[44.minutes, false] => [:'x_minutes', 44],
|
||||
[61.minutes, false] => [:'about_x_hours', 1],
|
||||
[24.hours, false] => [:'x_days', 1],
|
||||
[30.days, false] => [:'about_x_months', 1],
|
||||
[60.days, false] => [:'x_months', 2],
|
||||
[1.year, false] => [:'about_x_years', 1],
|
||||
[3.years, false] => [:'over_x_years', 3]
|
||||
[29.seconds, false] => [:'less_than_x_minutes', 1],
|
||||
[60.seconds, false] => [:'x_minutes', 1],
|
||||
[44.minutes, false] => [:'x_minutes', 44],
|
||||
[61.minutes, false] => [:'about_x_hours', 1],
|
||||
[24.hours, false] => [:'x_days', 1],
|
||||
[30.days, false] => [:'about_x_months', 1],
|
||||
[60.days, false] => [:'x_months', 2],
|
||||
[1.year, false] => [:'about_x_years', 1],
|
||||
[3.years + 6.months, false] => [:'over_x_years', 3],
|
||||
[3.years + 10.months, false] => [:'almost_x_years', 4]
|
||||
|
||||
}.each do |passed, expected|
|
||||
assert_distance_of_time_in_words_translates_key passed, expected
|
||||
|
|
|
@ -53,13 +53,14 @@ class DateHelperTest < ActionView::TestCase
|
|||
assert_equal "about 2 hours", distance_of_time_in_words(from, to + 89.minutes + 30.seconds)
|
||||
assert_equal "about 24 hours", distance_of_time_in_words(from, to + 23.hours + 59.minutes + 29.seconds)
|
||||
|
||||
# 1440..2879
|
||||
# 1440..2529
|
||||
assert_equal "1 day", distance_of_time_in_words(from, to + 23.hours + 59.minutes + 30.seconds)
|
||||
assert_equal "1 day", distance_of_time_in_words(from, to + 47.hours + 59.minutes + 29.seconds)
|
||||
assert_equal "1 day", distance_of_time_in_words(from, to + 41.hours + 59.minutes + 29.seconds)
|
||||
|
||||
# 2880..43199
|
||||
assert_equal "2 days", distance_of_time_in_words(from, to + 47.hours + 59.minutes + 30.seconds)
|
||||
assert_equal "29 days", distance_of_time_in_words(from, to + 29.days + 23.hours + 59.minutes + 29.seconds)
|
||||
# 2530..43199
|
||||
assert_equal "2 days", distance_of_time_in_words(from, to + 42.hours + 59.minutes + 30.seconds)
|
||||
assert_equal "3 days", distance_of_time_in_words(from, to + 2.days + 12.hours)
|
||||
assert_equal "30 days", distance_of_time_in_words(from, to + 29.days + 23.hours + 59.minutes + 29.seconds)
|
||||
|
||||
# 43200..86399
|
||||
assert_equal "about 1 month", distance_of_time_in_words(from, to + 29.days + 23.hours + 59.minutes + 30.seconds)
|
||||
|
@ -70,13 +71,27 @@ class DateHelperTest < ActionView::TestCase
|
|||
assert_equal "12 months", distance_of_time_in_words(from, to + 1.years - 31.seconds)
|
||||
|
||||
# > 525599
|
||||
assert_equal "about 1 year", distance_of_time_in_words(from, to + 1.years - 30.seconds)
|
||||
assert_equal "about 1 year", distance_of_time_in_words(from, to + 1.years + 6.months - 1.day)
|
||||
assert_equal "over 1 year", distance_of_time_in_words(from, to + 1.years + 6.months)
|
||||
assert_equal "about 2 years", distance_of_time_in_words(from, to + 2.years + 30.seconds)
|
||||
assert_equal "about 5 years", distance_of_time_in_words(from, to + 5.years + 5.months)
|
||||
assert_equal "over 5 years", distance_of_time_in_words(from, to + 5.years + 6.months)
|
||||
assert_equal "about 10 years", distance_of_time_in_words(from, to + 10.years)
|
||||
assert_equal "about 1 year", distance_of_time_in_words(from, to + 1.years - 30.seconds)
|
||||
assert_equal "about 1 year", distance_of_time_in_words(from, to + 1.years + 3.months - 1.day)
|
||||
assert_equal "over 1 year", distance_of_time_in_words(from, to + 1.years + 6.months)
|
||||
|
||||
assert_equal "almost 2 years", distance_of_time_in_words(from, to + 2.years - 3.months + 1.day)
|
||||
assert_equal "about 2 years", distance_of_time_in_words(from, to + 2.years + 3.months - 1.day)
|
||||
assert_equal "over 2 years", distance_of_time_in_words(from, to + 2.years + 3.months + 1.day)
|
||||
assert_equal "over 2 years", distance_of_time_in_words(from, to + 2.years + 9.months - 1.day)
|
||||
assert_equal "almost 3 years", distance_of_time_in_words(from, to + 2.years + 9.months + 1.day)
|
||||
|
||||
assert_equal "almost 5 years", distance_of_time_in_words(from, to + 5.years - 3.months + 1.day)
|
||||
assert_equal "about 5 years", distance_of_time_in_words(from, to + 5.years + 3.months - 1.day)
|
||||
assert_equal "over 5 years", distance_of_time_in_words(from, to + 5.years + 3.months + 1.day)
|
||||
assert_equal "over 5 years", distance_of_time_in_words(from, to + 5.years + 9.months - 1.day)
|
||||
assert_equal "almost 6 years", distance_of_time_in_words(from, to + 5.years + 9.months + 1.day)
|
||||
|
||||
assert_equal "almost 10 years", distance_of_time_in_words(from, to + 10.years - 3.months + 1.day)
|
||||
assert_equal "about 10 years", distance_of_time_in_words(from, to + 10.years + 3.months - 1.day)
|
||||
assert_equal "over 10 years", distance_of_time_in_words(from, to + 10.years + 3.months + 1.day)
|
||||
assert_equal "over 10 years", distance_of_time_in_words(from, to + 10.years + 9.months - 1.day)
|
||||
assert_equal "almost 11 years", distance_of_time_in_words(from, to + 10.years + 9.months + 1.day)
|
||||
|
||||
# test to < from
|
||||
assert_equal "about 4 hours", distance_of_time_in_words(from + 4.hours, to)
|
||||
|
|
Loading…
Reference in a new issue