Skip to content

Commit f80970d

Browse files
committed
Add Catalan localisation support
1 parent e7a1428 commit f80970d

21 files changed

+2085
-4
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
namespace ca;
2+
3+
[UseCulture("ca")]
4+
public class DateHumanizeTests
5+
{
6+
[Theory]
7+
[InlineData(1, "fa un segon")]
8+
[InlineData(2, "fa 2 segons")]
9+
public void SecondsAgo(int seconds, string expected) =>
10+
DateHumanize.Verify(expected, seconds, TimeUnit.Second, Tense.Past);
11+
12+
[Theory]
13+
[InlineData(1, "d'aquí un segon")]
14+
[InlineData(2, "d'aquí 2 segons")]
15+
public void SecondsFromNow(int seconds, string expected) =>
16+
DateHumanize.Verify(expected, seconds, TimeUnit.Second, Tense.Future);
17+
18+
[Theory]
19+
[InlineData(1, "fa un minut")]
20+
[InlineData(2, "fa 2 minuts")]
21+
[InlineData(60, "fa una hora")]
22+
public void MinutesAgo(int minutes, string expected) =>
23+
DateHumanize.Verify(expected, minutes, TimeUnit.Minute, Tense.Past);
24+
25+
[Theory]
26+
[InlineData(1, "d'aquí un minut")]
27+
[InlineData(2, "d'aquí 2 minuts")]
28+
public void MinutesFromNow(int minutes, string expected) =>
29+
DateHumanize.Verify(expected, minutes, TimeUnit.Minute, Tense.Future);
30+
31+
[Theory]
32+
[InlineData(1, "fa una hora")]
33+
[InlineData(2, "fa 2 hores")]
34+
public void HoursAgo(int hours, string expected) =>
35+
DateHumanize.Verify(expected, hours, TimeUnit.Hour, Tense.Past);
36+
37+
[Theory]
38+
[InlineData(1, "d'aquí una hora")]
39+
[InlineData(2, "d'aquí 2 hores")]
40+
public void HoursFromNow(int hours, string expected) =>
41+
DateHumanize.Verify(expected, hours, TimeUnit.Hour, Tense.Future);
42+
43+
[Theory]
44+
[InlineData(1, "ahir")]
45+
[InlineData(2, "fa 2 dies")]
46+
public void DaysAgo(int days, string expected) =>
47+
DateHumanize.Verify(expected, days, TimeUnit.Day, Tense.Past);
48+
49+
[Theory]
50+
[InlineData(1, "demà")]
51+
[InlineData(2, "d'aquí 2 dies")]
52+
public void DaysFromNow(int days, string expected) =>
53+
DateHumanize.Verify(expected, days, TimeUnit.Day, Tense.Future);
54+
55+
[Theory]
56+
[InlineData(1, "fa un mes")]
57+
[InlineData(2, "fa 2 mesos")]
58+
public void MonthsAgo(int months, string expected) =>
59+
DateHumanize.Verify(expected, months, TimeUnit.Month, Tense.Past);
60+
61+
[Theory]
62+
[InlineData(1, "d'aquí un mes")]
63+
[InlineData(2, "d'aquí 2 mesos")]
64+
public void MonthsFromNow(int months, string expected) =>
65+
DateHumanize.Verify(expected, months, TimeUnit.Month, Tense.Future);
66+
67+
[Theory]
68+
[InlineData(1, "fa un any")]
69+
[InlineData(2, "fa 2 anys")]
70+
public void YearsAgo(int years, string expected) =>
71+
DateHumanize.Verify(expected, years, TimeUnit.Year, Tense.Past);
72+
73+
[Theory]
74+
[InlineData(1, "d'aquí un any")]
75+
[InlineData(2, "d'aquí 2 anys")]
76+
public void YearsFromNow(int years, string expected) =>
77+
DateHumanize.Verify(expected, years, TimeUnit.Year, Tense.Future);
78+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
namespace ca;
2+
3+
[UseCulture("ca")]
4+
public class DateToOrdinalWordsTests
5+
{
6+
[Fact]
7+
public void OrdinalizeString()
8+
{
9+
Assert.Equal("25 de gener de 2022", new DateTime(2022, 1, 25).ToOrdinalWords());
10+
Assert.Equal("29 de febrer de 2020", new DateTime(2020, 2, 29).ToOrdinalWords());
11+
Assert.Equal("4 de setembre de 2015", new DateTime(2015, 9, 4).ToOrdinalWords());
12+
Assert.Equal("7 de novembre de 1979", new DateTime(1979, 11, 7).ToOrdinalWords());
13+
}
14+
15+
#if NET6_0_OR_GREATER
16+
[Fact]
17+
public void OrdinalizeDateOnlyString()
18+
{
19+
Assert.Equal("25 de gener de 2022", new DateOnly(2022, 1, 25).ToOrdinalWords());
20+
Assert.Equal("29 de febrer de 2020", new DateOnly(2020, 2, 29).ToOrdinalWords());
21+
Assert.Equal("4 de setembre de 2015", new DateOnly(2015, 9, 4).ToOrdinalWords());
22+
Assert.Equal("7 de novembre de 1979", new DateOnly(1979, 11, 7).ToOrdinalWords());
23+
}
24+
#endif
25+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace ca;
2+
3+
[UseCulture("ca")]
4+
public class NumberToWordsFeminineTests
5+
{
6+
[Theory]
7+
[InlineData(1, "una")]
8+
[InlineData(21, "vint-i-una")]
9+
[InlineData(31, "trenta-una")]
10+
[InlineData(81, "vuitanta-una")]
11+
[InlineData(500, "cinc-centes")]
12+
[InlineData(701, "set-centes una")]
13+
[InlineData(3500, "tres mil cinc-centes")]
14+
[InlineData(200121, "dues-centes mil cent vint-i-una")]
15+
[InlineData(200000121, "dos-cents milions cent vint-i-una")]
16+
[InlineData(1000001, "un milió una")]
17+
public void ToWords(int number, string expected) =>
18+
Assert.Equal(expected, number.ToWords(GrammaticalGender.Feminine));
19+
}
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
namespace ca;
2+
3+
[UseCulture("ca")]
4+
5+
public class NumberToWordsTests
6+
{
7+
[Theory]
8+
[InlineData(-1, "menys primer", GrammaticalGender.Neuter)]
9+
[InlineData(0, "zero", GrammaticalGender.Neuter)]
10+
[InlineData(1, "primer", GrammaticalGender.Neuter)]
11+
[InlineData(1, "primer", GrammaticalGender.Masculine)]
12+
[InlineData(1, "primera", GrammaticalGender.Feminine)]
13+
[InlineData(2, "segon", GrammaticalGender.Masculine)]
14+
[InlineData(2, "segona", GrammaticalGender.Feminine)]
15+
[InlineData(3, "tercer", GrammaticalGender.Neuter)]
16+
[InlineData(3, "tercer", GrammaticalGender.Masculine)]
17+
[InlineData(3, "tercera", GrammaticalGender.Feminine)]
18+
[InlineData(4, "quart", GrammaticalGender.Masculine)]
19+
[InlineData(4, "quarta", GrammaticalGender.Feminine)]
20+
[InlineData(5, "cinquè", GrammaticalGender.Masculine)]
21+
[InlineData(5, "cinquena", GrammaticalGender.Feminine)]
22+
[InlineData(6, "sisè", GrammaticalGender.Masculine)]
23+
[InlineData(6, "sisena", GrammaticalGender.Feminine)]
24+
[InlineData(7, "setè", GrammaticalGender.Masculine)]
25+
[InlineData(7, "setena", GrammaticalGender.Feminine)]
26+
[InlineData(8, "vuitè", GrammaticalGender.Masculine)]
27+
[InlineData(8, "vuitena", GrammaticalGender.Feminine)]
28+
[InlineData(9, "novè", GrammaticalGender.Masculine)]
29+
[InlineData(9, "novena", GrammaticalGender.Feminine)]
30+
[InlineData(10, "desè", GrammaticalGender.Masculine)]
31+
[InlineData(10, "desena", GrammaticalGender.Feminine)]
32+
[InlineData(11, "onzè", GrammaticalGender.Masculine)]
33+
[InlineData(11, "onzena", GrammaticalGender.Feminine)]
34+
[InlineData(20, "vintè", GrammaticalGender.Masculine)]
35+
[InlineData(20, "vintena", GrammaticalGender.Feminine)]
36+
[InlineData(22, "vint-i-dosè", GrammaticalGender.Masculine)]
37+
[InlineData(22, "vint-i-dosena", GrammaticalGender.Feminine)]
38+
[InlineData(30, "trentè", GrammaticalGender.Masculine)]
39+
[InlineData(30, "trentena", GrammaticalGender.Feminine)]
40+
[InlineData(34, "trenta-quatrè", GrammaticalGender.Masculine)]
41+
[InlineData(34, "trenta-quatrena", GrammaticalGender.Feminine)]
42+
[InlineData(40, "quarantaè", GrammaticalGender.Masculine)]
43+
[InlineData(40, "quarantaena", GrammaticalGender.Feminine)]
44+
[InlineData(46, "quaranta-sisè", GrammaticalGender.Masculine)]
45+
[InlineData(46, "quaranta-sisena", GrammaticalGender.Feminine)]
46+
[InlineData(50, "cinquantaè", GrammaticalGender.Masculine)]
47+
[InlineData(50, "cinquantaena", GrammaticalGender.Feminine)]
48+
[InlineData(57, "cinquanta-setè", GrammaticalGender.Masculine)]
49+
[InlineData(57, "cinquanta-setena", GrammaticalGender.Feminine)]
50+
[InlineData(60, "seixantè", GrammaticalGender.Masculine)]
51+
[InlineData(60, "seixantena", GrammaticalGender.Feminine)]
52+
[InlineData(69, "seixanta-novè", GrammaticalGender.Masculine)]
53+
[InlineData(69, "seixanta-novena", GrammaticalGender.Feminine)]
54+
[InlineData(70, "setantè", GrammaticalGender.Masculine)]
55+
[InlineData(70, "setantena", GrammaticalGender.Feminine)]
56+
[InlineData(74, "setanta-quatrè", GrammaticalGender.Masculine)]
57+
[InlineData(74, "setanta-quatrena", GrammaticalGender.Feminine)]
58+
[InlineData(80, "vuitantè", GrammaticalGender.Masculine)]
59+
[InlineData(80, "vuitantena", GrammaticalGender.Feminine)]
60+
[InlineData(85, "vuitanta-cinquè", GrammaticalGender.Masculine)]
61+
[InlineData(85, "vuitanta-cinquena", GrammaticalGender.Feminine)]
62+
[InlineData(90, "norantè", GrammaticalGender.Masculine)]
63+
[InlineData(90, "norantena", GrammaticalGender.Feminine)]
64+
[InlineData(99, "noranta-novè", GrammaticalGender.Masculine)]
65+
[InlineData(99, "noranta-novena", GrammaticalGender.Feminine)]
66+
[InlineData(100, "centè", GrammaticalGender.Masculine)]
67+
[InlineData(100, "centena", GrammaticalGender.Feminine)]
68+
[InlineData(101, "cent primer", GrammaticalGender.Masculine)]
69+
[InlineData(101, "cent primera", GrammaticalGender.Feminine)]
70+
[InlineData(110, "cent deu", GrammaticalGender.Masculine)]
71+
[InlineData(111, "cent onzè", GrammaticalGender.Masculine)]
72+
[InlineData(120, "cent vint", GrammaticalGender.Masculine)]
73+
[InlineData(121, "cent vint-i-un", GrammaticalGender.Masculine)]
74+
[InlineData(121, "cent vint-i-una", GrammaticalGender.Feminine)]
75+
[InlineData(200, "dos-cents", GrammaticalGender.Masculine)]
76+
[InlineData(200, "dues-centes", GrammaticalGender.Feminine)]
77+
[InlineData(201, "dos-cents un", GrammaticalGender.Masculine)]
78+
[InlineData(201, "dues-centes una", GrammaticalGender.Feminine)]
79+
[InlineData(221, "dos-cents vint-i-un", GrammaticalGender.Masculine)]
80+
[InlineData(221, "dues-centes vint-i-una", GrammaticalGender.Feminine)]
81+
[InlineData(500, "cinc-cents", GrammaticalGender.Masculine)]
82+
[InlineData(500, "cinc-centes", GrammaticalGender.Feminine)]
83+
[InlineData(701, "set-cents un", GrammaticalGender.Masculine)]
84+
[InlineData(701, "set-centes una", GrammaticalGender.Feminine)]
85+
[InlineData(900, "nou-cents", GrammaticalGender.Masculine)]
86+
[InlineData(900, "nou-centes", GrammaticalGender.Feminine)]
87+
[InlineData(999, "nou-cents noranta-nou", GrammaticalGender.Masculine)]
88+
[InlineData(999, "nou-centes noranta-nou", GrammaticalGender.Feminine)]
89+
[InlineData(1000, "mil", GrammaticalGender.Masculine)]
90+
[InlineData(1001, "mil un", GrammaticalGender.Masculine)]
91+
[InlineData(1001, "mil una", GrammaticalGender.Feminine)]
92+
[InlineData(1021, "mil vint-i-un", GrammaticalGender.Masculine)]
93+
[InlineData(1021, "mil vint-i-una", GrammaticalGender.Feminine)]
94+
[InlineData(1100, "mil cent", GrammaticalGender.Masculine)]
95+
[InlineData(1100, "mil cent", GrammaticalGender.Feminine)]
96+
[InlineData(2000, "dos mil", GrammaticalGender.Masculine)]
97+
[InlineData(2100, "dos mil cent", GrammaticalGender.Masculine)]
98+
[InlineData(3500, "tres mil cinc-cents", GrammaticalGender.Masculine)]
99+
[InlineData(3500, "tres mil cinc-centes", GrammaticalGender.Feminine)]
100+
[InlineData(100000, "cent mil", GrammaticalGender.Masculine)]
101+
[InlineData(100001, "cent mil un", GrammaticalGender.Masculine)]
102+
[InlineData(100001, "cent mil una", GrammaticalGender.Feminine)]
103+
[InlineData(100002, "cent mil dos", GrammaticalGender.Masculine)]
104+
[InlineData(100002, "cent mil dues", GrammaticalGender.Feminine)]
105+
[InlineData(100021, "cent mil vint-i-un", GrammaticalGender.Masculine)]
106+
[InlineData(100021, "cent mil vint-i-una", GrammaticalGender.Feminine)]
107+
[InlineData(200000, "dos-cents mil", GrammaticalGender.Masculine)]
108+
[InlineData(200000, "dues-centes mil", GrammaticalGender.Feminine)]
109+
[InlineData(200121, "dos-cents mil cent vint-i-un", GrammaticalGender.Masculine)]
110+
[InlineData(200121, "dues-centes mil cent vint-i-una", GrammaticalGender.Feminine)]
111+
[InlineData(1000000, "un milió", GrammaticalGender.Masculine)]
112+
[InlineData(1000001, "un milió un", GrammaticalGender.Masculine)]
113+
[InlineData(1000001, "un milió una", GrammaticalGender.Feminine)]
114+
[InlineData(2000000, "dos milions", GrammaticalGender.Masculine)]
115+
[InlineData(2000001, "dos milions un", GrammaticalGender.Masculine)]
116+
[InlineData(2000001, "dos milions una", GrammaticalGender.Feminine)]
117+
[InlineData(200000121, "dos-cents milions cent vint-i-un", GrammaticalGender.Masculine)]
118+
[InlineData(200000121, "dos-cents milions cent vint-i-una", GrammaticalGender.Feminine)]
119+
public void ToOrdinalWords(int number, string words, GrammaticalGender gender) =>
120+
Assert.Equal(words, number.ToOrdinalWords(gender));
121+
122+
[Theory]
123+
[InlineData(1, WordForm.Abbreviation, GrammaticalGender.Masculine, "1r")]
124+
[InlineData(1, WordForm.Abbreviation, GrammaticalGender.Feminine, "1a")]
125+
[InlineData(2, WordForm.Abbreviation, GrammaticalGender.Masculine, "2n")]
126+
[InlineData(2, WordForm.Abbreviation, GrammaticalGender.Feminine, "2a")]
127+
[InlineData(3, WordForm.Abbreviation, GrammaticalGender.Masculine, "3r")]
128+
[InlineData(3, WordForm.Abbreviation, GrammaticalGender.Feminine, "3a")]
129+
[InlineData(11, WordForm.Abbreviation, GrammaticalGender.Masculine, "11è")]
130+
[InlineData(11, WordForm.Abbreviation, GrammaticalGender.Feminine, "11a")]
131+
[InlineData(22, WordForm.Abbreviation, GrammaticalGender.Masculine, "22n")]
132+
[InlineData(22, WordForm.Abbreviation, GrammaticalGender.Feminine, "22a")]
133+
[InlineData(31, WordForm.Abbreviation, GrammaticalGender.Masculine, "31r")]
134+
[InlineData(31, WordForm.Abbreviation, GrammaticalGender.Feminine, "31a")]
135+
[InlineData(100, WordForm.Abbreviation, GrammaticalGender.Masculine, "100è")]
136+
[InlineData(100, WordForm.Abbreviation, GrammaticalGender.Feminine, "100a")]
137+
[InlineData(101, WordForm.Abbreviation, GrammaticalGender.Masculine, "101r")]
138+
[InlineData(101, WordForm.Abbreviation, GrammaticalGender.Feminine, "101a")]
139+
[InlineData(999, WordForm.Abbreviation, GrammaticalGender.Masculine, "999è")]
140+
[InlineData(999, WordForm.Abbreviation, GrammaticalGender.Feminine, "999a")]
141+
public void ToOrdinalWordsWithWordForm(int number, WordForm wordForm, GrammaticalGender gender, string expected) =>
142+
Assert.Equal(expected, number.ToOrdinalWords(gender, wordForm));
143+
144+
[Theory]
145+
[InlineData(1, WordForm.Abbreviation, GrammaticalGender.Masculine, "1r")]
146+
[InlineData(1, WordForm.Abbreviation, GrammaticalGender.Feminine, "1a")]
147+
[InlineData(2, WordForm.Abbreviation, GrammaticalGender.Masculine, "2n")]
148+
[InlineData(2, WordForm.Abbreviation, GrammaticalGender.Feminine, "2a")]
149+
[InlineData(3, WordForm.Abbreviation, GrammaticalGender.Masculine, "3r")]
150+
[InlineData(3, WordForm.Abbreviation, GrammaticalGender.Feminine, "3a")]
151+
[InlineData(11, WordForm.Abbreviation, GrammaticalGender.Masculine, "11è")]
152+
[InlineData(11, WordForm.Abbreviation, GrammaticalGender.Feminine, "11a")]
153+
[InlineData(22, WordForm.Abbreviation, GrammaticalGender.Masculine, "22n")]
154+
[InlineData(22, WordForm.Abbreviation, GrammaticalGender.Feminine, "22a")]
155+
[InlineData(31, WordForm.Abbreviation, GrammaticalGender.Masculine, "31r")]
156+
[InlineData(31, WordForm.Abbreviation, GrammaticalGender.Feminine, "31a")]
157+
[InlineData(100, WordForm.Abbreviation, GrammaticalGender.Masculine, "100è")]
158+
[InlineData(100, WordForm.Abbreviation, GrammaticalGender.Feminine, "100a")]
159+
[InlineData(101, WordForm.Abbreviation, GrammaticalGender.Masculine, "101r")]
160+
[InlineData(101, WordForm.Abbreviation, GrammaticalGender.Feminine, "101a")]
161+
[InlineData(999, WordForm.Abbreviation, GrammaticalGender.Masculine, "999è")]
162+
[InlineData(999, WordForm.Abbreviation, GrammaticalGender.Feminine, "999a")]
163+
public void ToOrdinalWordsWithWordFormAndGender(int number, WordForm wordForm, GrammaticalGender gender, string expected) =>
164+
Assert.Equal(expected, number.ToOrdinalWords(gender, wordForm));
165+
166+
[Theory]
167+
[InlineData(0, "zero vegades")]
168+
[InlineData(2, "doble")]
169+
[InlineData(100, "cent vegades")]
170+
public void ToTuple(int number, string expected)
171+
=> Assert.Equal(expected, number.ToTuple());
172+
173+
[Theory]
174+
[InlineData(0, "zero", GrammaticalGender.Masculine)]
175+
[InlineData(1, "un", GrammaticalGender.Masculine)]
176+
[InlineData(1, "una", GrammaticalGender.Feminine)]
177+
[InlineData(2, "dos", GrammaticalGender.Masculine)]
178+
[InlineData(2, "dues", GrammaticalGender.Feminine)]
179+
[InlineData(3, "tres", GrammaticalGender.Masculine)]
180+
[InlineData(3, "tres", GrammaticalGender.Feminine)]
181+
[InlineData(11, "onze", GrammaticalGender.Masculine)]
182+
[InlineData(21, "vint-i-u", GrammaticalGender.Masculine)]
183+
[InlineData(21, "vint-i-una", GrammaticalGender.Feminine)]
184+
[InlineData(31, "trenta-u", GrammaticalGender.Masculine)]
185+
[InlineData(31, "trenta-una", GrammaticalGender.Feminine)]
186+
[InlineData(81, "vuitanta-u", GrammaticalGender.Masculine)]
187+
[InlineData(81, "vuitanta-una", GrammaticalGender.Feminine)]
188+
[InlineData(101, "cent u", GrammaticalGender.Masculine)]
189+
[InlineData(101, "cent una", GrammaticalGender.Feminine)]
190+
[InlineData(500, "cinc-cents", GrammaticalGender.Masculine)]
191+
[InlineData(500, "cinc-centes", GrammaticalGender.Feminine)]
192+
[InlineData(701, "set-cents u", GrammaticalGender.Masculine)]
193+
[InlineData(701, "set-centes una", GrammaticalGender.Feminine)]
194+
[InlineData(3500, "tres mil cinc-cents", GrammaticalGender.Masculine)]
195+
[InlineData(3500, "tres mil cinc-centes", GrammaticalGender.Feminine)]
196+
[InlineData(200121, "dos-cents mil cent vint-i-u", GrammaticalGender.Masculine)]
197+
[InlineData(200121, "dues-centes mil cent vint-i-una", GrammaticalGender.Feminine)]
198+
[InlineData(200000121, "dos-cents milions cent vint-i-u", GrammaticalGender.Masculine)]
199+
[InlineData(200000121, "dos-cents milions cent vint-i-una", GrammaticalGender.Feminine)]
200+
[InlineData(1000001, "un milió u", GrammaticalGender.Masculine)]
201+
[InlineData(1000001, "un milió una", GrammaticalGender.Feminine)]
202+
[InlineData(-15, "menys quinze", GrammaticalGender.Masculine)]
203+
[InlineData(-123, "menys cent vint-i-tres", GrammaticalGender.Masculine)]
204+
public void ToWords(long number, string expected, GrammaticalGender gender = GrammaticalGender.Masculine) =>
205+
Assert.Equal(expected, number.ToWords(gender));
206+
207+
}

0 commit comments

Comments
 (0)