relative_time 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +6 -3
- data/Gemfile +5 -0
- data/README.md +22 -5
- data/config/locales/be.yml +37 -0
- data/config/locales/en.yml +25 -0
- data/config/locales/id.yml +26 -0
- data/config/locales/plurals.rb +113 -0
- data/config/locales/pt.yml +25 -0
- data/config/locales/ru.yml +37 -0
- data/config/locales/tr.yml +19 -0
- data/config/locales/uk.yml +37 -0
- data/lib/relative_time.rb +2 -3
- data/lib/relative_time/in_words.rb +36 -25
- data/lib/relative_time/version.rb +1 -1
- data/relative_time.gemspec +4 -2
- metadata +27 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1bb21472ca972bc14a71e1f9d4fe25285c9b0e301d689eb8f4d84dde5f0a9795
|
4
|
+
data.tar.gz: 62cfbb2417caf29323ff4776c64596808503f47e17ff30b4d35af0636d915774
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b22ba084d8417c6a2d992c8bb50ab5662295172d4f81efaab13d287c92820a6ddd60d7432abf346e60a0f41b2a1ce6c6b4a12bb1514ddacfbe07738eecce0053
|
7
|
+
data.tar.gz: 066f206550011f7b4f77873b252784918df9ef4557a2f288ac610760d27f64ee70d72cd20ee529503bb13f7fc57fec532deac66e0e1a6cf7de9492d4115e962b
|
data/.travis.yml
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
sudo: false
|
2
2
|
language: ruby
|
3
3
|
rvm:
|
4
|
-
- 2.0.0
|
5
|
-
- 2.1.0
|
6
|
-
- 2.2.0
|
7
4
|
- 2.3.0
|
5
|
+
- 2.4.0
|
6
|
+
- 2.5.0
|
7
|
+
- 2.6.0
|
8
8
|
before_install: gem install bundler -v 1.13.7
|
9
|
+
addons:
|
10
|
+
code_climate:
|
11
|
+
repo_token: be4f42e2cf6fb22ecf1028df50d055d41dc446b31b6b4f96c71fbe7d7ddff48c
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# RelativeTime
|
2
|
-
[![Build Status](https://travis-ci.org/davydovanton/relative_time.svg?branch=master)](https://travis-ci.org/davydovanton/relative_time)
|
2
|
+
[![Build Status](https://travis-ci.org/davydovanton/relative_time.svg?branch=master)](https://travis-ci.org/davydovanton/relative_time) [![Code Climate](https://codeclimate.com/github/davydovanton/relative_time/badges/gpa.svg)](https://codeclimate.com/github/davydovanton/relative_time) [![Test Coverage](https://codeclimate.com/github/davydovanton/relative_time/badges/coverage.svg)](https://codeclimate.com/github/davydovanton/relative_time/coverage)
|
3
3
|
|
4
|
-
Micro lib without any
|
4
|
+
Micro lib without any dependency for getting relative time.
|
5
5
|
|
6
6
|
|
7
7
|
## Motivation
|
@@ -40,7 +40,7 @@ Also you can use second argument as a from date:
|
|
40
40
|
|
41
41
|
```ruby
|
42
42
|
date_from = Time.now - 60 * 60 # one hour ago
|
43
|
-
RelativeTime.in_words(Time.now, date_from) # =>
|
43
|
+
RelativeTime.in_words(Time.now, date_from) # => an hour ago
|
44
44
|
```
|
45
45
|
|
46
46
|
### Supported intervals
|
@@ -52,9 +52,26 @@ RelativeTime.in_words(Time.now, date_from) # => a hour ago
|
|
52
52
|
* months
|
53
53
|
* years
|
54
54
|
|
55
|
+
### I18n
|
56
|
+
Relative time use [i18n](https://github.com/ruby-i18n/i18n) for pluralization and translation to other languages. For using specific locale just call `#in_words` with specific locale:
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
RelativeTime.in_words(Time.now, locale: :ru) # => через 3 часа
|
60
|
+
RelativeTime.in_words(Time.now, date_from, locale: :ru) # => минуту назад
|
61
|
+
```
|
62
|
+
|
63
|
+
List of supported locales:
|
64
|
+
|
65
|
+
* `en`
|
66
|
+
* `id`
|
67
|
+
* `ru`
|
68
|
+
* `tr`
|
69
|
+
* `uk`
|
70
|
+
* `be`
|
71
|
+
* `pt`
|
72
|
+
|
55
73
|
## Contributing
|
56
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
74
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/davydovanton/relative_time. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
57
75
|
|
58
76
|
## License
|
59
77
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
60
|
-
|
@@ -0,0 +1,37 @@
|
|
1
|
+
be:
|
2
|
+
relative:
|
3
|
+
less_than_a_minute: 'менш хвіліны таму'
|
4
|
+
|
5
|
+
ago: '%{date_string} таму'
|
6
|
+
in: 'праз %{date_string}'
|
7
|
+
|
8
|
+
years:
|
9
|
+
one: 'год'
|
10
|
+
few: '%{count} года'
|
11
|
+
many: '%{count} гадоў'
|
12
|
+
other: '%{count} гадоў'
|
13
|
+
months:
|
14
|
+
one: 'месяц'
|
15
|
+
few: '%{count} месяцы'
|
16
|
+
many: '%{count} месяцаў'
|
17
|
+
other: '%{count} месяцаў'
|
18
|
+
weeks:
|
19
|
+
one: 'тыдзень'
|
20
|
+
few: '%{count} тыдні'
|
21
|
+
many: '%{count} тыдняў'
|
22
|
+
other: '%{count} тыдняў'
|
23
|
+
days:
|
24
|
+
one: 'дзень'
|
25
|
+
few: '%{count} дні'
|
26
|
+
many: '%{count} дзён'
|
27
|
+
other: '%{count} дзён'
|
28
|
+
hours:
|
29
|
+
one: 'гадзіну'
|
30
|
+
few: '%{count} гадзіны'
|
31
|
+
many: '%{count} гадзін'
|
32
|
+
other: '%{count} гадзін'
|
33
|
+
minutes:
|
34
|
+
one: 'хвіліну'
|
35
|
+
few: '%{count} хвіліны'
|
36
|
+
many: '%{count} хвілін'
|
37
|
+
other: '%{count} хвілін'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
en:
|
2
|
+
relative:
|
3
|
+
less_than_a_minute: 'less than a minute'
|
4
|
+
|
5
|
+
ago: '%{date_string} ago'
|
6
|
+
in: 'in %{date_string}'
|
7
|
+
|
8
|
+
years:
|
9
|
+
one: 'a year'
|
10
|
+
other: '%{count} years'
|
11
|
+
months:
|
12
|
+
one: 'a month'
|
13
|
+
other: '%{count} months'
|
14
|
+
weeks:
|
15
|
+
one: 'a week'
|
16
|
+
other: '%{count} weeks'
|
17
|
+
days:
|
18
|
+
one: 'a day'
|
19
|
+
other: '%{count} days'
|
20
|
+
hours:
|
21
|
+
one: 'an hour'
|
22
|
+
other: '%{count} hours'
|
23
|
+
minutes:
|
24
|
+
one: 'a minute'
|
25
|
+
other: '%{count} minutes'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
id:
|
2
|
+
relative:
|
3
|
+
less_than_a_minute: 'kurang dari 1 menit'
|
4
|
+
|
5
|
+
ago: '%{date_string} yang lalu'
|
6
|
+
in: 'dalam %{date_string}'
|
7
|
+
|
8
|
+
years:
|
9
|
+
one: 'setahun'
|
10
|
+
other: '%{count} tahun'
|
11
|
+
months:
|
12
|
+
one: 'sebulan'
|
13
|
+
other: '%{count} bulan'
|
14
|
+
weeks:
|
15
|
+
one: 'seminggu'
|
16
|
+
other: '%{count} minggu'
|
17
|
+
days:
|
18
|
+
one: 'sehari'
|
19
|
+
other: '%{count} hari'
|
20
|
+
hours:
|
21
|
+
one: 'sejam'
|
22
|
+
other: '%{count} jam'
|
23
|
+
minutes:
|
24
|
+
one: 'semenit'
|
25
|
+
other: '%{count} menit'
|
26
|
+
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
{
|
4
|
+
af: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
5
|
+
am: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
6
|
+
ar: { i18n: { plural: { keys: [:zero, :one, :two, :few, :many, :other], rule: lambda { |n| n == 0 ? :zero : n == 1 ? :one : n == 2 ? :two : [3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99].include?(n % 100) ? :many : :other } } } },
|
7
|
+
az: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
8
|
+
be: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
|
9
|
+
bg: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
10
|
+
bh: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
11
|
+
bn: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
12
|
+
bo: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
13
|
+
bs: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
|
14
|
+
ca: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
15
|
+
cs: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } },
|
16
|
+
cy: { i18n: { plural: { keys: [:one, :two, :many, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : n == 8 || n == 11 ? :many : :other } } } },
|
17
|
+
da: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
18
|
+
de: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
19
|
+
dz: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
20
|
+
el: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
21
|
+
en: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
22
|
+
eo: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
23
|
+
es: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
24
|
+
et: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
25
|
+
eu: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
26
|
+
fa: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
27
|
+
fi: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
28
|
+
fil: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
29
|
+
fo: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
30
|
+
fr: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n.between?(0, 2) && n != 2 ? :one : :other } } } },
|
31
|
+
fur: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
32
|
+
fy: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
33
|
+
ga: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
|
34
|
+
gl: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
35
|
+
gu: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
36
|
+
guw: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
37
|
+
ha: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
38
|
+
he: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
39
|
+
hi: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
40
|
+
hr: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
|
41
|
+
hu: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
42
|
+
id: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
43
|
+
is: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
44
|
+
it: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
45
|
+
iw: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
46
|
+
ja: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
47
|
+
jv: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
48
|
+
ka: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
49
|
+
km: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
50
|
+
kn: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
51
|
+
ko: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
52
|
+
ku: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
53
|
+
lb: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
54
|
+
ln: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
55
|
+
lt: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n % 10 == 1 && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :one : [2, 3, 4, 5, 6, 7, 8, 9].include?(n % 10) && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :few : :other } } } },
|
56
|
+
lv: { i18n: { plural: { keys: [:zero, :one, :other], rule: lambda { |n| n == 0 ? :zero : n % 10 == 1 && n % 100 != 11 ? :one : :other } } } },
|
57
|
+
mg: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
58
|
+
mk: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n % 10 == 1 ? :one : :other } } } },
|
59
|
+
ml: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
60
|
+
mn: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
61
|
+
mo: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n == 1 ? :one : n == 0 ? :few : :other } } } },
|
62
|
+
mr: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
63
|
+
ms: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
64
|
+
mt: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n == 1 ? :one : n == 0 || [2, 3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :many : :other } } } },
|
65
|
+
my: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
66
|
+
nah: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
67
|
+
nb: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
68
|
+
ne: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
69
|
+
nl: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
70
|
+
nn: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
71
|
+
no: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
72
|
+
nso: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
73
|
+
oc: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
74
|
+
om: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
75
|
+
or: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
76
|
+
pa: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
77
|
+
pap: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
78
|
+
pl: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : (n != 1 && [0, 1].include?(n % 10)) || [5, 6, 7, 8, 9].include?(n % 10) || [12, 13, 14].include?(n % 100) ? :many : :other } } } },
|
79
|
+
ps: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
80
|
+
pt: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
81
|
+
"pt-PT": { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
82
|
+
ro: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n == 1 ? :one : n == 0 ? :few : :other } } } },
|
83
|
+
ru: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
|
84
|
+
se: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
|
85
|
+
sh: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
|
86
|
+
sk: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } },
|
87
|
+
sl: { i18n: { plural: { keys: [:one, :two, :few, :other], rule: lambda { |n| n % 100 == 1 ? :one : n % 100 == 2 ? :two : [3, 4].include?(n % 100) ? :few : :other } } } },
|
88
|
+
sma: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
|
89
|
+
smi: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
|
90
|
+
smj: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
|
91
|
+
smn: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
|
92
|
+
sms: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
|
93
|
+
so: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
94
|
+
sq: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
95
|
+
sr: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
|
96
|
+
sv: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
97
|
+
sw: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
98
|
+
ta: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
99
|
+
te: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
100
|
+
th: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
101
|
+
ti: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
102
|
+
tk: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
103
|
+
tl: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
104
|
+
to: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
105
|
+
tr: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
106
|
+
uk: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
|
107
|
+
ur: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
|
108
|
+
vi: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
109
|
+
wa: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
|
110
|
+
yo: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
111
|
+
zh: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
|
112
|
+
au: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } }
|
113
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
pt:
|
2
|
+
relative:
|
3
|
+
less_than_a_minute: 'menos de um minuto'
|
4
|
+
|
5
|
+
ago: 'há %{date_string}'
|
6
|
+
in: 'em %{date_string}'
|
7
|
+
|
8
|
+
years:
|
9
|
+
one: 'um ano'
|
10
|
+
other: '%{count} anos'
|
11
|
+
months:
|
12
|
+
one: 'um mês'
|
13
|
+
other: '%{count} meses'
|
14
|
+
weeks:
|
15
|
+
one: 'uma semana'
|
16
|
+
other: '%{count} semanas'
|
17
|
+
days:
|
18
|
+
one: 'um dia'
|
19
|
+
other: '%{count} dias'
|
20
|
+
hours:
|
21
|
+
one: 'uma hora'
|
22
|
+
other: '%{count} horas'
|
23
|
+
minutes:
|
24
|
+
one: 'um minuto'
|
25
|
+
other: '%{count} minutos'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
ru:
|
2
|
+
relative:
|
3
|
+
less_than_a_minute: 'меньше минуты назад'
|
4
|
+
|
5
|
+
ago: '%{date_string} назад'
|
6
|
+
in: 'через %{date_string}'
|
7
|
+
|
8
|
+
years:
|
9
|
+
one: 'год'
|
10
|
+
few: '%{count} года'
|
11
|
+
many: '%{count} лет'
|
12
|
+
other: '%{count} лет'
|
13
|
+
months:
|
14
|
+
one: 'месяц'
|
15
|
+
few: '%{count} месяца'
|
16
|
+
many: '%{count} месяцев'
|
17
|
+
other: '%{count} месяцев'
|
18
|
+
weeks:
|
19
|
+
one: 'неделю'
|
20
|
+
few: '%{count} недели'
|
21
|
+
many: '%{count} недель'
|
22
|
+
other: '%{count} недель'
|
23
|
+
days:
|
24
|
+
one: 'день'
|
25
|
+
few: '%{count} дня'
|
26
|
+
many: '%{count} дней'
|
27
|
+
other: '%{count} дней'
|
28
|
+
hours:
|
29
|
+
one: 'час'
|
30
|
+
few: '%{count} часа'
|
31
|
+
many: '%{count} часов'
|
32
|
+
other: '%{count} часов'
|
33
|
+
minutes:
|
34
|
+
one: 'минуту'
|
35
|
+
few: '%{count} минуты'
|
36
|
+
many: '%{count} минут'
|
37
|
+
other: '%{count} минут'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
tr:
|
2
|
+
relative:
|
3
|
+
less_than_a_minute: '1 dakikadan daha az'
|
4
|
+
|
5
|
+
ago: '%{date_string} önce'
|
6
|
+
in: '%{date_string} içinde'
|
7
|
+
|
8
|
+
years:
|
9
|
+
other: '%{count} yıl'
|
10
|
+
months:
|
11
|
+
other: '%{count} ay'
|
12
|
+
weeks:
|
13
|
+
other: '%{count} hafta'
|
14
|
+
days:
|
15
|
+
other: '%{count} gün'
|
16
|
+
hours:
|
17
|
+
other: '%{count} saat'
|
18
|
+
minutes:
|
19
|
+
other: '%{count} dakika'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
uk:
|
2
|
+
relative:
|
3
|
+
less_than_a_minute: 'менш ніж хвилину тому'
|
4
|
+
|
5
|
+
ago: '%{date_string} тому'
|
6
|
+
in: 'за %{date_string}'
|
7
|
+
|
8
|
+
years:
|
9
|
+
one: 'рік'
|
10
|
+
few: '%{count} роки'
|
11
|
+
many: '%{count} років'
|
12
|
+
other: '%{count} років'
|
13
|
+
months:
|
14
|
+
one: 'місяць'
|
15
|
+
few: '%{count} місяці'
|
16
|
+
many: '%{count} місяців'
|
17
|
+
other: '%{count} місяців'
|
18
|
+
weeks:
|
19
|
+
one: 'тиждень'
|
20
|
+
few: '%{count} тижні'
|
21
|
+
many: '%{count} тижнів'
|
22
|
+
other: '%{count} тижнів'
|
23
|
+
days:
|
24
|
+
one: 'день'
|
25
|
+
few: '%{count} дні'
|
26
|
+
many: '%{count} днів'
|
27
|
+
other: '%{count} днів'
|
28
|
+
hours:
|
29
|
+
one: 'година'
|
30
|
+
few: '%{count} години'
|
31
|
+
many: '%{count} годин'
|
32
|
+
other: '%{count} годин'
|
33
|
+
minutes:
|
34
|
+
one: 'хвилина'
|
35
|
+
few: '%{count} хвилини'
|
36
|
+
many: '%{count} хвилин'
|
37
|
+
other: '%{count} хвилин'
|
data/lib/relative_time.rb
CHANGED
@@ -2,8 +2,7 @@ require 'relative_time/in_words'
|
|
2
2
|
require 'relative_time/version'
|
3
3
|
|
4
4
|
module RelativeTime
|
5
|
-
|
6
|
-
|
7
|
-
InWords.new.(date_to, date_from)
|
5
|
+
def self.in_words(date_to, date_from = Time.now, locale: :en)
|
6
|
+
InWords.new(locale: locale).(date_to, date_from)
|
8
7
|
end
|
9
8
|
end
|
@@ -1,42 +1,53 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
require 'i18n/backend/pluralization'
|
3
|
+
|
1
4
|
module RelativeTime
|
2
5
|
class InWords
|
6
|
+
def self.setup
|
7
|
+
return if @setup
|
8
|
+
|
9
|
+
I18n.load_path << Dir[File.expand_path("#{__dir__}/../../config/locales") + '/*.yml']
|
10
|
+
I18n.load_path << Dir[File.expand_path("#{__dir__}/../../config/locales") + '/*.rb']
|
11
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization)
|
12
|
+
|
13
|
+
@setup = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(locale: :en)
|
17
|
+
self.class.setup
|
18
|
+
I18n.locale = locale
|
19
|
+
end
|
20
|
+
|
3
21
|
def call(date_to, date_from)
|
4
|
-
diff = date_from - date_to.to_time
|
5
|
-
return '
|
22
|
+
diff = date_from.to_time - date_to.to_time
|
23
|
+
return I18n.t('relative.less_than_a_minute') if diff.abs.round <= 59
|
6
24
|
|
7
|
-
date_string =
|
8
|
-
diff >= 0 ?
|
25
|
+
date_string = resolution(diff.abs.round)
|
26
|
+
diff >= 0 ? I18n.t('relative.ago', date_string: date_string) : I18n.t('relative.in', date_string: date_string)
|
9
27
|
end
|
10
28
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
29
|
+
private
|
30
|
+
|
31
|
+
MINUTE = 60
|
32
|
+
HOUR = 60 * MINUTE
|
33
|
+
DAY = 24 * HOUR
|
34
|
+
WEEK = 7 * DAY
|
35
|
+
MONTH = 4 * WEEK
|
36
|
+
YEAR = 12 * MONTH
|
18
37
|
|
19
38
|
def resolution(diff)
|
20
39
|
if diff >= YEAR
|
21
|
-
|
40
|
+
I18n.t('relative.years', count: (diff / YEAR).round)
|
22
41
|
elsif diff >= MONTH
|
23
|
-
|
42
|
+
I18n.t('relative.months', count: (diff / MONTH).round)
|
24
43
|
elsif diff >= WEEK
|
25
|
-
|
44
|
+
I18n.t('relative.weeks', count: (diff / WEEK).round)
|
26
45
|
elsif diff >= DAY
|
27
|
-
|
46
|
+
I18n.t('relative.days', count: (diff / DAY).round)
|
28
47
|
elsif diff >= HOUR
|
29
|
-
|
30
|
-
else
|
31
|
-
[(diff / MINUTE).round, 'minutes']
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def verb_agreement(resolution)
|
36
|
-
if resolution[0] == 1
|
37
|
-
"a #{resolution.last[0...-1]}"
|
48
|
+
I18n.t('relative.hours', count: (diff / HOUR).round)
|
38
49
|
else
|
39
|
-
|
50
|
+
I18n.t('relative.minutes', count: (diff / MINUTE).round)
|
40
51
|
end
|
41
52
|
end
|
42
53
|
end
|
data/relative_time.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Anton Davydov"]
|
10
10
|
spec.email = ["antondavydov.o@gmail.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{Micro lib without any
|
13
|
-
spec.description = %q{Micro lib without any
|
12
|
+
spec.summary = %q{Micro lib without any dependency for getting relative time}
|
13
|
+
spec.description = %q{Micro lib without any dependency for getting relative time}
|
14
14
|
spec.homepage = "https://github.com/davydovanton/relative_time"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
@@ -22,6 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ["lib"]
|
24
24
|
|
25
|
+
spec.add_dependency "i18n"
|
26
|
+
|
25
27
|
spec.add_development_dependency "bundler", "~> 1.13"
|
26
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
27
29
|
spec.add_development_dependency "minitest", "~> 5.0"
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relative_time
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Davydov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: i18n
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +66,7 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '5.0'
|
55
|
-
description: Micro lib without any
|
69
|
+
description: Micro lib without any dependency for getting relative time
|
56
70
|
email:
|
57
71
|
- antondavydov.o@gmail.com
|
58
72
|
executables: []
|
@@ -66,6 +80,14 @@ files:
|
|
66
80
|
- LICENSE.txt
|
67
81
|
- README.md
|
68
82
|
- Rakefile
|
83
|
+
- config/locales/be.yml
|
84
|
+
- config/locales/en.yml
|
85
|
+
- config/locales/id.yml
|
86
|
+
- config/locales/plurals.rb
|
87
|
+
- config/locales/pt.yml
|
88
|
+
- config/locales/ru.yml
|
89
|
+
- config/locales/tr.yml
|
90
|
+
- config/locales/uk.yml
|
69
91
|
- lib/relative_time.rb
|
70
92
|
- lib/relative_time/in_words.rb
|
71
93
|
- lib/relative_time/version.rb
|
@@ -90,8 +112,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
112
|
version: '0'
|
91
113
|
requirements: []
|
92
114
|
rubyforge_project:
|
93
|
-
rubygems_version: 2.
|
115
|
+
rubygems_version: 2.7.3
|
94
116
|
signing_key:
|
95
117
|
specification_version: 4
|
96
|
-
summary: Micro lib without any
|
118
|
+
summary: Micro lib without any dependency for getting relative time
|
97
119
|
test_files: []
|