language_cards 0.3.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +20 -0
  3. data/CHANGELOG.md +31 -0
  4. data/README.md +80 -22
  5. data/bin/language_cards +7 -1
  6. data/cards/en/arabic.yml +370 -0
  7. data/cards/en/armenian.yml +406 -0
  8. data/cards/en/bengali.yml +395 -0
  9. data/cards/en/chinese-hsk1.yml +157 -0
  10. data/cards/en/chinese-hsk2.yml +154 -0
  11. data/cards/en/chinese-hsk3.yml +305 -0
  12. data/cards/en/chinese-hsk4.yml +605 -0
  13. data/cards/en/georgian.yml +362 -0
  14. data/cards/en/greek.yml +379 -0
  15. data/cards/en/hebrew.yml +355 -0
  16. data/cards/en/hindi.yml +412 -0
  17. data/cards/en/japanese-01-hiragana.yml +227 -0
  18. data/cards/en/japanese-02-katakana.yml +296 -0
  19. data/cards/en/japanese-03-keyboard-mappings.yml +357 -0
  20. data/cards/en/japanese-10-kanji-jlpt-n5.yml +86 -0
  21. data/cards/en/japanese-11-kanji-jlpt-n4.yml +173 -0
  22. data/cards/en/japanese-12-kanji-jlpt-n3.yml +374 -0
  23. data/cards/en/japanese-13-kanji-jlpt-n2.yml +374 -0
  24. data/cards/en/japanese-14-kanji-jlpt-n1.yml +1239 -0
  25. data/cards/en/japanese-20-vocabulary-jlpt-n5.yml +708 -0
  26. data/cards/en/japanese-21-vocabulary-jlpt-n4.yml +668 -0
  27. data/cards/en/japanese-22-vocabulary-jlpt-n3.yml +2108 -0
  28. data/cards/en/japanese-23-vocabulary-jlpt-n2.yml +1738 -0
  29. data/cards/en/japanese-24-vocabulary-jlpt-n1.yml +2689 -0
  30. data/cards/en/korean.yml +534 -0
  31. data/cards/en/persian.yml +370 -0
  32. data/cards/en/punjabi.yml +393 -0
  33. data/cards/en/russian.yml +398 -0
  34. data/cards/en/tamil.yml +405 -0
  35. data/cards/en/thai.yml +408 -0
  36. data/cards/en/ukrainian.yml +398 -0
  37. data/cards/en/urdu.yml +374 -0
  38. data/language_cards.gemspec +7 -6
  39. data/lib/language_cards/card_set_builder.rb +11 -0
  40. data/lib/language_cards/controllers/application_controller.rb +2 -0
  41. data/lib/language_cards/controllers/game.rb +10 -6
  42. data/lib/language_cards/controllers/main_menu.rb +20 -3
  43. data/lib/language_cards/defaults.rb +33 -0
  44. data/lib/language_cards/helpers/view_helper.rb +3 -2
  45. data/lib/language_cards/menu_builder.rb +11 -0
  46. data/lib/language_cards/menu_node.rb +9 -4
  47. data/lib/language_cards/models/card.rb +18 -0
  48. data/lib/language_cards/models/card_set.rb +15 -16
  49. data/lib/language_cards/modes/game.rb +15 -4
  50. data/lib/language_cards/modes/translate.rb +12 -1
  51. data/lib/language_cards/modes/typing_practice.rb +5 -1
  52. data/lib/language_cards/paginator.rb +59 -0
  53. data/lib/language_cards/user_interface.rb +84 -52
  54. data/lib/language_cards/version.rb +1 -1
  55. data/lib/language_cards/view/main_menu.erb +3 -1
  56. data/lib/language_cards/yaml_loader.rb +5 -3
  57. data/lib/language_cards.rb +7 -24
  58. data/locales/en.yml +11 -0
  59. metadata +69 -42
  60. data/.travis.yml +0 -5
  61. data/cards/en/japanese-hiragana.yml +0 -149
  62. data/cards/en/japanese-kanji-jlpt-n5.yml +0 -107
  63. data/cards/en/japanese-katakana.yml +0 -366
  64. data/lib/language_cards/grapheme_builder.rb +0 -12
  65. data/lib/language_cards/language_cards.rb +0 -25
  66. data/lib/language_cards/models/grapheme.rb +0 -18
data/cards/en/urdu.yml ADDED
@@ -0,0 +1,374 @@
1
+ ---
2
+ # Urdu: Alphabet (39), Numbers (23), Numerals (10), Common Words (248), Phrases (41)
3
+ Urdu:
4
+ Alphabet:
5
+ mapping: { Urdu script: [Latin, Letter name] }
6
+ ا: [a, aa, alif]
7
+ ب: [b, be]
8
+ پ: [p, pe]
9
+ ت: [t, te]
10
+ ٹ: [t, tt, te, retroflex te]
11
+ ث: [s, se]
12
+ ج: [j, jim, jeem]
13
+ چ: [ch, che]
14
+ ح: [h, bari he, he]
15
+ خ: [kh, khe]
16
+ د: [d, dal]
17
+ ڈ: [d, dd, dal, retroflex dal]
18
+ ذ: [z, zal]
19
+ ر: [r, re]
20
+ ڑ: [r, rr, re, retroflex re]
21
+ ز: [z, ze]
22
+ ژ: [zh, zhe]
23
+ س: [s, sin, seen]
24
+ ش: [sh, shin, sheen]
25
+ ص: [s, suad, swad]
26
+ ض: [z, zuad, zwad]
27
+ ط: [t, toe]
28
+ ظ: [z, zoe]
29
+ ع: [ain, ayn]
30
+ غ: [gh, ghain]
31
+ ف: [f, fe]
32
+ ق: [q, qaf, qaaf]
33
+ ک: [k, kaf, kaaf]
34
+ گ: [g, gaf, gaaf]
35
+ ل: [l, lam, laam]
36
+ م: [m, mim, meem]
37
+ ن: ['n', nun, noon]
38
+ ں: ['n', nun ghunna, noon ghunna]
39
+ و: [w, v, wao, vao]
40
+ ہ: [h, choti he, chhoti he]
41
+ ھ: [h, do chashmi he, do-chashmi he]
42
+ ء: [hamza, hamzah]
43
+ ی: ['y', i, choti ye, ye]
44
+ ے: [e, ay, bari ye, badi ye]
45
+ Numbers:
46
+ mapping: { Urdu: [Latin, English] }
47
+ صفر: [sifar, zero, '0']
48
+ ایک: [ek, aik, one, '1']
49
+ دو: [do, two, '2']
50
+ تین: [teen, tin, three, '3']
51
+ چار: [chaar, char, four, '4']
52
+ پانچ: [paanch, panch, five, '5']
53
+ چھ: [chhe, chay, six, '6']
54
+ سات: [saat, sat, seven, '7']
55
+ آٹھ: [aath, ath, eight, '8']
56
+ نو: [nau, nine, '9']
57
+ دس: [das, ten, '10']
58
+ گیارہ: [gyaarah, gyarah, eleven, '11']
59
+ بارہ: [baarah, barah, twelve, '12']
60
+ بیس: [bees, bis, twenty, '20']
61
+ تیس: [tees, tis, thirty, '30']
62
+ چالیس: [chaalees, chalis, forty, '40']
63
+ پچاس: [pachaas, pachas, fifty, '50']
64
+ ساٹھ: [saath, sath, sixty, '60']
65
+ ستر: [sattar, seventy, '70']
66
+ اسی: [assi, eighty, '80']
67
+ نوے: [nawway, nabbe, ninety, '90']
68
+ سو: [sau, hundred, one hundred, '100']
69
+ ہزار: [hazaar, hazar, thousand, one thousand, '1000']
70
+ Numerals:
71
+ mapping: { Urdu digits: [Digit, English] }
72
+ '۰': ['0', zero]
73
+ '۱': ['1', one]
74
+ '۲': ['2', two]
75
+ '۳': ['3', three]
76
+ '۴': ['4', four]
77
+ '۵': ['5', five]
78
+ '۶': ['6', six]
79
+ '۷': ['7', seven]
80
+ '۸': ['8', eight]
81
+ '۹': ['9', nine]
82
+ Common Words:
83
+ mapping: { Urdu: [Latin, English] }
84
+ میں: [main, mein, I, in]
85
+ تم: [tum, you]
86
+ آپ: [aap, you]
87
+ وہ: [woh, he, she, that]
88
+ ہم: [hum, we]
89
+ یہ: [yeh, this, he, she]
90
+ باپ: [baap, father]
91
+ ماں: [maan, mother]
92
+ بھائی: [bhaai, bhai, brother]
93
+ بہن: [behen, bahan, sister]
94
+ بیٹا: [beta, son]
95
+ بیٹی: [beti, daughter]
96
+ شوہر: [shohar, husband]
97
+ بیوی: [biwi, wife]
98
+ دادا: [daada, dada, grandfather]
99
+ دادی: [daadi, dadi, grandmother]
100
+ خاندان: [khaandaan, khandan, family]
101
+ بچہ: [bachcha, bacha, child, kid]
102
+ لڑکا: [larka, boy]
103
+ لڑکی: [larki, girl]
104
+ آدمی: [aadmi, man, person]
105
+ عورت: [aurat, woman]
106
+ دوست: [dost, friend]
107
+ لوگ: [log, people]
108
+ استاد: [ustaad, ustad, teacher]
109
+ طالب علم: [taalib-e-ilm, talib ilm, student]
110
+ ڈاکٹر: [daaktar, doctor]
111
+ سر: [sar, head]
112
+ آنکھ: [aankh, eye]
113
+ کان: [kaan, ear]
114
+ ناک: [naak, nose]
115
+ منہ: [munh, mouth, face]
116
+ ہاتھ: [haath, hand]
117
+ پاؤں: [paaon, paon, foot]
118
+ بال: [baal, hair]
119
+ دل: [dil, heart]
120
+ چہرہ: [chehra, face]
121
+ دانت: [daant, tooth]
122
+ پیٹ: [pet, stomach, belly]
123
+ پانی: [paani, pani, water]
124
+ کھانا: [khaana, khana, food, eat, meal]
125
+ روٹی: [roti, bread, flatbread]
126
+ چاول: [chaawal, chawal, rice]
127
+ گوشت: [gosht, meat]
128
+ مرغی: [murghi, chicken, hen]
129
+ مچھلی: [machhli, fish]
130
+ دودھ: [doodh, milk]
131
+ کافی: [kaafi, coffee, enough, quite]
132
+ چائے: [chaae, chai, tea]
133
+ انڈا: [anda, egg]
134
+ پھل: [phal, fruit]
135
+ سیب: [seb, apple]
136
+ کیلا: [kela, banana]
137
+ سبزی: [sabzi, vegetable, vegetables]
138
+ نمک: [namak, salt]
139
+ چینی: [cheeni, sugar, Chinese]
140
+ کتا: [kutta, dog]
141
+ بلی: [billi, cat]
142
+ گھوڑا: [ghora, horse]
143
+ پرندہ: [parinda, bird]
144
+ گائے: [gaae, gaay, cow]
145
+ جانور: [jaanwar, janwar, animal]
146
+ لال: [laal, lal, red]
147
+ نیلا: [neela, blue]
148
+ ہرا: [hara, green]
149
+ پیلا: [peela, yellow]
150
+ سفید: [safed, white]
151
+ کالا: [kaala, kala, black]
152
+ بھورا: [bhoora, brown]
153
+ رنگ: [rang, color, colour]
154
+ دن: [din, day]
155
+ رات: [raat, night]
156
+ صبح: [subah, morning]
157
+ شام: [shaam, evening]
158
+ آج: [aaj, today]
159
+ کل: [kal, tomorrow, yesterday]
160
+ اب: [ab, now]
161
+ گھنٹہ: [ghanta, hour]
162
+ منٹ: [minat, minute]
163
+ ہفتہ: [hafta, week, Saturday]
164
+ مہینہ: [maheena, mahina, month]
165
+ سال: [saal, year]
166
+ وقت: [waqt, time]
167
+ اتوار: [itwaar, itwar, Sunday]
168
+ پیر: [peer, Monday]
169
+ منگل: [mangal, Tuesday]
170
+ بدھ: [budh, Wednesday]
171
+ جمعرات: [jumeraat, jumerat, Thursday]
172
+ جمعہ: [juma, jumma, Friday]
173
+ گھر: [ghar, house, home]
174
+ اسکول: [iskool, school]
175
+ ہسپتال: [haspataal, hospital]
176
+ بازار: [baazaar, bazaar, market]
177
+ ہوٹل: [hotal, hotel, restaurant]
178
+ شہر: [shehar, shahar, city]
179
+ سڑک: [sarak, road, street]
180
+ مسجد: [masjid, mosque]
181
+ دفتر: [daftar, office]
182
+ بینک: [baink, bank]
183
+ کمرہ: [kamra, room]
184
+ غسل خانہ: [ghusl khaana, ghusalkhana, bathroom]
185
+ ملک: [mulk, country]
186
+ سمندر: [samandar, sea, ocean]
187
+ جگہ: [jagah, place, space]
188
+ دروازہ: [darwaaza, darwaza, door]
189
+ کھڑکی: [khirki, window]
190
+ میز: [mez, table]
191
+ کرسی: [kursi, chair]
192
+ بستر: [bistar, bed]
193
+ کتاب: [kitaab, kitab, book]
194
+ قلم: [qalam, pen]
195
+ فون: [fon, phone]
196
+ گاڑی: [gaari, car, vehicle, train]
197
+ چابی: [chaabi, key]
198
+ کپڑے: [kapre, clothes]
199
+ پیسے: [paise, money]
200
+ پینا: [peena, drink]
201
+ جانا: [jaana, go]
202
+ آنا: [aana, come]
203
+ لکھنا: [likhna, write]
204
+ پڑھنا: [parhna, read, study]
205
+ بولنا: [bolna, speak, say]
206
+ کہنا: [kehna, say, tell]
207
+ دیکھنا: [dekhna, see, look, watch]
208
+ سننا: [sunna, hear, listen]
209
+ جاننا: [jaanna, know]
210
+ سمجھنا: [samajhna, understand]
211
+ پسند کرنا: [pasand karna, like]
212
+ چاہنا: [chaahna, want, love]
213
+ کام کرنا: [kaam karna, work]
214
+ سونا: [sona, sleep, gold]
215
+ بیٹھنا: [baithna, sit]
216
+ چلنا: [chalna, walk, move]
217
+ دوڑنا: [daurna, run]
218
+ کھولنا: [kholna, open]
219
+ بند کرنا: [band karna, close, shut, turn off]
220
+ دینا: [dena, give]
221
+ لینا: [lena, take]
222
+ خریدنا: [khareedna, buy]
223
+ بیچنا: [bechna, sell]
224
+ رہنا: [rehna, live, stay]
225
+ سیکھنا: [seekhna, learn]
226
+ مدد کرنا: [madad karna, help]
227
+ کھیلنا: [khelna, play]
228
+ پوچھنا: [poochhna, puchna, ask]
229
+ انتظار کرنا: [intezaar karna, wait]
230
+ ڈھونڈنا: [dhoondna, search, look for]
231
+ ملنا: [milna, meet, get]
232
+ سکنا: [sakna, can, be able]
233
+ ہونا: [hona, be, happen]
234
+ کرنا: [karna, do, make]
235
+ واپس آنا: [waapas aana, come back, return]
236
+ سفر کرنا: [safar karna, travel]
237
+ سوچنا: [sochna, think]
238
+ بھولنا: [bhoolna, forget]
239
+ یاد کرنا: [yaad karna, remember, memorize, miss]
240
+ شروع کرنا: [shuru karna, start, begin]
241
+ ختم کرنا: [khatam karna, finish, end]
242
+ لانا: [laana, bring]
243
+ ہنسنا: [hansna, laugh]
244
+ رونا: [rona, cry]
245
+ گانا: [gaana, sing, song]
246
+ پہننا: [pehenna, wear, put on]
247
+ رکھنا: [rakhna, put, keep, place]
248
+ بڑا: [bara, big, large, elder]
249
+ چھوٹا: [chhota, chota, small, little, younger]
250
+ نیا: [naya, new]
251
+ پرانا: [puraana, purana, old]
252
+ اچھا: [achchha, acha, good, okay, nice]
253
+ برا: [bura, bad]
254
+ خوبصورت: [khoobsoorat, khubsurat, beautiful]
255
+ لمبا: [lamba, long, tall]
256
+ گرم: [garam, hot, warm]
257
+ ٹھنڈا: [thanda, cold, cool]
258
+ آسان: [aasaan, asan, easy]
259
+ مشکل: [mushkil, difficult, hard]
260
+ تیز: [tez, fast, quick, sharp]
261
+ آہستہ: [aahista, ahista, slow, slowly]
262
+ زیادہ: [zyaada, zyada, more, a lot, too much]
263
+ کم: [kam, less, few, little]
264
+ خوش: [khush, happy, glad]
265
+ اداس: [udaas, udas, sad]
266
+ بھوکا: [bhooka, bhuka, hungry]
267
+ پیاسا: [pyaasa, pyasa, thirsty]
268
+ بیمار: [beemaar, bimar, sick, ill]
269
+ صاف: [saaf, clean, clear]
270
+ گندا: [ganda, dirty]
271
+ قریب: [qareeb, near, close]
272
+ دور: [door, far]
273
+ کھلا: [khula, open]
274
+ بند: [band, closed, shut]
275
+ سستا: [sasta, cheap]
276
+ مہنگا: [mehenga, mehnga, expensive]
277
+ صحیح: [sahih, sahi, correct, right]
278
+ ضروری: [zaroori, necessary, important]
279
+ بوڑھا: [boorha, old, elderly]
280
+ جوان: [jawaan, jawan, young]
281
+ سب: [sab, all, everyone, everything]
282
+ کیا: [kya, what]
283
+ کون: [kaun, who]
284
+ کہاں: [kahaan, kahan, where]
285
+ کب: [kab, when]
286
+ کیوں: [kyun, kyon, why]
287
+ کیسے: [kaise, how]
288
+ کتنا: [kitna, how much, how many]
289
+ کون سا: [kaun sa, which]
290
+ ہاں: [haan, han, 'yes']
291
+ جی: [jee, ji, 'yes', sir]
292
+ نہیں: [nahin, nahi, 'no', not]
293
+ اور: [aur, and, more]
294
+ یا: [ya, or]
295
+ لیکن: [lekin, but]
296
+ پر: [par, 'on', at, but]
297
+ سے: [se, from, with, than]
298
+ ساتھ: [saath, with, together]
299
+ یہاں: [yahaan, yahan, here]
300
+ وہاں: [wahaan, wahan, there]
301
+ بہت: [bohat, bahut, very, a lot, much]
302
+ بھی: [bhi, also, too, even]
303
+ سورج: [sooraj, suraj, sun]
304
+ چاند: [chaand, chand, moon]
305
+ زمین: [zameen, earth, ground, land]
306
+ بارش: [baarish, barish, rain]
307
+ درخت: [darakht, tree]
308
+ پھول: [phool, flower]
309
+ آگ: [aag, fire]
310
+ ہوا: [hawa, air, wind]
311
+ پہاڑ: [pahaar, mountain]
312
+ راستہ: [raasta, rasta, way, path, road]
313
+ نام: [naam, name]
314
+ زبان: [zabaan, zaban, language, tongue]
315
+ لفظ: [lafz, word]
316
+ سوال: [sawaal, sawal, question]
317
+ جواب: [jawaab, jawab, answer, reply]
318
+ اردو: urdu
319
+ انگریزی: [angrezi, English]
320
+ چیز: [cheez, thing]
321
+ زندگی: [zindagi, life]
322
+ محبت: [mohabbat, love]
323
+ بس: [bas, bus, enough]
324
+ ہوائی جہاز: [hawaai jahaaz, hawai jahaz, airplane, plane]
325
+ قیمت: [qeemat, keemat, price]
326
+ موسم: [mausam, weather, season]
327
+ اوپر: [oopar, upar, up, above]
328
+ نیچے: [neeche, niche, down, below, under]
329
+ پہلے: [pehle, before, first, earlier]
330
+ بعد: [baad, after, later]
331
+ کام: [kaam, work, job]
332
+ Phrases:
333
+ mapping: { Urdu: [Latin, English] }
334
+ السلام علیکم: [assalam-o-alaikum, assalamu alaikum, hello, peace be upon you]
335
+ وعلیکم السلام: [walaikum assalam, wa alaikum assalam, and peace be upon you, hello]
336
+ آداب: [aadaab, adab, greetings, hello]
337
+ صبح بخیر: [subah bakhair, good morning]
338
+ شب بخیر: [shab bakhair, good night]
339
+ خدا حافظ: [khuda hafiz, goodbye, bye]
340
+ اللہ حافظ: [allah hafiz, goodbye, bye]
341
+ شکریہ: [shukriya, thank you, thanks]
342
+ بہت شکریہ: [bohat shukriya, bahut shukriya, thank you very much, thanks a lot]
343
+ کوئی بات نہیں: [koi baat nahin, no problem, it's okay, you're welcome]
344
+ براہ مہربانی: [baraae meherbani, barae meharbani, please]
345
+ معاف کیجیے: [maaf kijiye, excuse me, sorry, pardon me]
346
+ مجھے افسوس ہے: [mujhe afsos hai, I'm sorry, I am sorry]
347
+ جی ہاں: [jee haan, ji haan, 'yes']
348
+ جی نہیں: [jee nahin, ji nahin, 'no']
349
+ آپ کیسے ہیں: [aap kaise hain, how are you]
350
+ کیا حال ہے: [kya haal hai, kya hal hai, how are you, how's it going]
351
+ میں ٹھیک ہوں: [main theek hoon, main thik hun, I'm fine, I'm okay]
352
+ آپ کا نام کیا ہے: [aap ka naam kya hai, what is your name, what's your name]
353
+ میرا نام علی ہے: [mera naam ali hai, my name is Ali]
354
+ آپ سے مل کر خوشی ہوئی: [aap se mil kar khushi hui, nice to meet you, pleased to meet you]
355
+ مجھے سمجھ نہیں آیا: [mujhe samajh nahin aaya, I don't understand, I didn't understand]
356
+ مجھے نہیں معلوم: [mujhe nahin maloom, mujhe nahi malum, I don't know]
357
+ کیا آپ انگریزی بولتے ہیں: [kya aap angrezi bolte hain, do you speak English]
358
+ میں تھوڑی اردو بولتا ہوں: [main thori urdu bolta hoon, I speak a little Urdu]
359
+ آہستہ بولیں: [aahista bolein, ahista bolen, speak slowly, please speak slowly]
360
+ باتھ روم کہاں ہے: [baathroom kahaan hai, bathroom kahan hai, where is the bathroom, where is the toilet]
361
+ اسٹیشن کہاں ہے: [station kahaan hai, station kahan hai, where is the station]
362
+ یہ کتنے کا ہے: [yeh kitne ka hai, how much is this, how much is it]
363
+ آپ کہاں سے ہیں: [aap kahaan se hain, aap kahan se hain, where are you from]
364
+ میں امریکہ سے ہوں: [main amreeka se hoon, main amrika se hun, I'm from America, I am from America]
365
+ مجھے پانی چاہیے: [mujhe paani chahiye, mujhe pani chahiye, I want water, I need water]
366
+ مدد کریں: [madad karein, madad karen, help, please help]
367
+ کیا وقت ہوا ہے: [kya waqt hua hai, what time is it]
368
+ خوش آمدید: [khush aamdeed, khush amdid, welcome]
369
+ ٹھیک ہے: [theek hai, thik hai, okay, alright, fine]
370
+ سب ٹھیک ہے: [sab theek hai, sab thik hai, everything is fine, all good]
371
+ ان شاء اللہ: [inshallah, in sha allah, God willing, hopefully]
372
+ مبارک ہو: [mubarak ho, congratulations]
373
+ میں آپ سے محبت کرتا ہوں: [main aap se mohabbat karta hoon, I love you]
374
+ پھر ملیں گے: [phir milenge, phir milen ge, see you again, see you later]
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ['Daniel P. Clark']
10
10
  spec.email = ['6ftdan@gmail.com']
11
11
 
12
- spec.summary = %q{Flashcard game for language learning.}
13
- spec.description = %q{Flashcard game for language learning. Make your own cards or translations as well.}
12
+ spec.summary = %q{Terminal flashcard game for learning languages with foreign scripts.}
13
+ spec.description = %q{Flashcard game for language learning: Japanese (kana, JLPT N5-N1 kanji and vocabulary), Chinese (HSK 1-4), Korean, Russian, Arabic, Hindi and many more. Make your own cards or translations as well.}
14
14
  spec.homepage = 'http://github.com/danielpclark/language_cards'
15
15
  spec.license = 'MIT'
16
16
 
@@ -21,10 +21,11 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = ['language_cards']
22
22
  spec.require_paths = ['lib','cards']
23
23
 
24
- spec.add_dependency 'highline', '~> 1.7'
25
- spec.add_dependency 'i18n', '~> 0.7'
24
+ spec.required_ruby_version = '>= 2.5'
25
+
26
+ spec.add_dependency 'highline', '>= 2.0', '< 4'
27
+ spec.add_dependency 'i18n', '>= 1.0', '< 2'
26
28
  spec.add_dependency 'slop', '~> 4.6'
27
- spec.add_development_dependency 'bundler', '~> 1.13'
28
- spec.add_development_dependency 'rake', '~> 12.3'
29
+ spec.add_development_dependency 'rake', '~> 13.0'
29
30
  spec.add_development_dependency 'minitest', '~> 5.10'
30
31
  end
@@ -0,0 +1,11 @@
1
+ require 'language_cards/models/card'
2
+
3
+ module LanguageCards
4
+ module CardSetBuilder
5
+ def card_set_builder(translation_cards = {})
6
+ translation_cards.each_with_object([]) do |(key, value), memo|
7
+ memo << Card.new(key, value)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,5 @@
1
+ require 'erb'
2
+
1
3
  module LanguageCards
2
4
  module Controllers
3
5
  class ApplicationController
@@ -8,13 +8,13 @@ module LanguageCards
8
8
  def render(correct:, incorrect:, title:, timer:, last:)
9
9
  _score = t('Game.ScoreMenu.Score') + ": %0.2d%%" % calc_score(correct, incorrect)
10
10
  _timer = [((t('Timer.Timer') + ": " + timer.ha) if timer.time?), nil, timer.h]
11
- _mexit = t 'Menu.Exit'
11
+ _mexit = t 'Game.Exit'
12
12
 
13
13
  super(binding)
14
14
  end
15
15
 
16
- def process(cards, mode)
17
- ic = struct_data.new(cards, mode)
16
+ def process(cards)
17
+ ic = struct_data.new(cards)
18
18
  ic.get_input
19
19
  {
20
20
  correct: ic.valid?,
@@ -23,7 +23,7 @@ module LanguageCards
23
23
  end
24
24
 
25
25
  def struct_data
26
- Struct.new(:card_set, :mode) do
26
+ Struct.new(:game) do
27
27
  def input
28
28
  @input
29
29
  end
@@ -33,13 +33,17 @@ module LanguageCards
33
33
  end
34
34
 
35
35
  def card
36
- @card ||= card_set.sample.current
36
+ @card ||= game.sample.current
37
37
  end
38
38
 
39
39
  def display
40
40
  "#{card}"
41
41
  end
42
42
 
43
+ def mode
44
+ game.mode
45
+ end
46
+
43
47
  def expected
44
48
  case mode
45
49
  when :translate
@@ -62,7 +66,7 @@ module LanguageCards
62
66
  end
63
67
 
64
68
  def valid?
65
- card_set.match? input
69
+ game.match? input
66
70
  end
67
71
  end
68
72
  end
@@ -3,19 +3,36 @@ require 'language_cards/controllers/application_controller'
3
3
  module LanguageCards
4
4
  module Controllers
5
5
  class MainMenu < ApplicationController
6
- def render(courses:, mode:)
6
+ # @param courses [Array<String>] labels for the entries on the current page
7
+ # @param offset [Integer] number of entries on the pages before this one
8
+ # @param pages [Paginator, nil] used to show page navigation when needed
9
+ def render(courses:, mode:, offset: 0, heading: nil, pages: nil, back: false)
7
10
  _title = t 'Menu.Title'
8
- _select = t 'Menu.Choose'
11
+ _select = heading || t('Menu.Choose')
9
12
  _mode = t('Menu.GameMode') + case mode.peek
10
13
  when :translate then t 'Menu.ModeTranslate'
11
14
  when :typing_practice then t 'Menu.ModeTyping'
12
15
  end
13
16
  _toggle = "m: " + t('Menu.ToggleGameMode')
14
- _courses = courses.each.with_index.map {|item,index| "#{index + 1}: #{item}" }
17
+ width = (offset + courses.length).to_s.length
18
+ _courses = courses.each.with_index(offset + 1).map {|item, number| "#{number.to_s.rjust(width)}: #{item}" }
19
+ _page = page_line(pages)
20
+ _back = ("b: " + t('Menu.Back') if back)
21
+ _quit = "q: " + t('Menu.Quit')
15
22
  _mexit = t 'Menu.Exit'
16
23
 
17
24
  super(binding)
18
25
  end
26
+
27
+ private
28
+ def page_line(pages)
29
+ return unless pages && pages.paginated?
30
+
31
+ nav = []
32
+ nav << "p: " + t('Menu.PreviousPage') if pages.previous_page?
33
+ nav << "n: " + t('Menu.NextPage') if pages.next_page?
34
+ [t('Menu.Page', page: pages.page + 1, pages: pages.pages), nav.join(' ')]
35
+ end
19
36
  end
20
37
  end
21
38
  end
@@ -0,0 +1,33 @@
1
+ require 'highline'
2
+ require 'slop'
3
+ require 'i18n'
4
+
5
+ module LanguageCards
6
+ # Card files and terminal input are UTF-8 even when the locale isn't set.
7
+ Encoding.default_external = Encoding::UTF_8 unless Encoding.default_external == Encoding::UTF_8
8
+
9
+ OPTS = Slop.parse(suppress_errors: true) do |args|
10
+ args.banner = 'usage: language_cards [options]'
11
+ args.string '-l', '--language', 'language (default: en)', default: 'en'
12
+ args.bool '-v', '--version', 'print the version'
13
+ args.bool '-h', '--help', 'print this help'
14
+ end
15
+
16
+ CARD_LANGUAGE = OPTS[:language]
17
+
18
+ module ESC
19
+ CLEAR = (ERASE_SCOLLBACK = "\e[3J") + (CURSOR_HOME = "\e[H") + (ERASE_DISPLAY = "\e[2J")
20
+ end
21
+
22
+ CLI = HighLine.new
23
+ JOIN = " - "
24
+
25
+ SUBMENUWIDTH = 60
26
+
27
+ # Menu entries shown per page before paginating.
28
+ PER_PAGE = 10
29
+
30
+ ::I18n.config.available_locales = :en
31
+ ::I18n.load_path = Dir[File.join(File.expand_path(File.join('..','..'), __dir__), 'locales', '*.yml')]
32
+ ::I18n.load_path += Dir[File.join(File.expand_path(ENV['HOME']), '.language_cards', 'locales', '*.yml')] if ENV['HOME']
33
+ end
@@ -5,14 +5,15 @@ module LanguageCards
5
5
  '~' * SUBMENUWIDTH
6
6
  end
7
7
 
8
- def t str
9
- I18n.t str
8
+ def t str, **options
9
+ I18n.t str, **options
10
10
  end
11
11
 
12
12
  def draw left=nil, center=nil, right=nil
13
13
  width = SUBMENUWIDTH
14
14
  str = left.to_s
15
15
  str = str + center.to_s.rjust(width/2 - str.length + center.to_s.length/2)
16
+ str = str.rstrip + ' ' if str.length + right.to_s.length > width && !str.strip.empty?
16
17
  str + right.to_s.rjust(width - str.length)
17
18
  end
18
19
 
@@ -0,0 +1,11 @@
1
+ require 'language_cards/menu_node'
2
+
3
+ module LanguageCards
4
+ def self.menu_builder(cards_yaml)
5
+ cards_yaml.each_with_object([]) do |(language, values), memo|
6
+ values.each do |category_with_card_set|
7
+ memo << MenuNode.new(language, category_with_card_set)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -12,13 +12,18 @@ module LanguageCards
12
12
  end
13
13
  end
14
14
 
15
- def title(fmt = ' - ', rng = 0..-1)
15
+ def title(fmt = JOIN, rng = 0..-1)
16
16
  label[rng].delete_if(&:empty?).join(fmt)
17
17
  end
18
18
 
19
19
  # @return <Mode<CardSet> < Game>
20
- def mode(game_mode)
21
- child.mode(game_mode)
20
+ def game(mode)
21
+ child.game(mode)
22
+ end
23
+
24
+ # @return Integer number of cards in the card set
25
+ def size
26
+ child.size
22
27
  end
23
28
 
24
29
  # This is the preferred method for the view as this object shouldn't
@@ -29,7 +34,7 @@ module LanguageCards
29
34
  end
30
35
 
31
36
  def to_s
32
- label.delete_if(&:empty?).join(' - ')
37
+ label.delete_if(&:empty?).join(JOIN)
33
38
  end
34
39
 
35
40
  private
@@ -0,0 +1,18 @@
1
+
2
+ module LanguageCards
3
+ class Card
4
+ attr_reader :translation
5
+ def initialize card, translation
6
+ @card = card.to_s
7
+ @translation = Array(translation).map(&:to_s)
8
+ end
9
+
10
+ def display
11
+ @card
12
+ end
13
+
14
+ def to_s
15
+ @card
16
+ end
17
+ end
18
+ end
@@ -1,28 +1,24 @@
1
- require 'language_cards/models/grapheme'
2
- require 'language_cards/grapheme_builder'
1
+ require 'language_cards/models/card'
2
+ require 'language_cards/card_set_builder'
3
3
  require 'language_cards/modes/typing_practice'
4
4
  require 'language_cards/modes/translate'
5
5
 
6
6
  module LanguageCards
7
7
  class CardSet
8
- attr_reader :graphemes
9
- def initialize(grapheme_hash)
10
- @graphemes = GraphemeBuilder.(grapheme_hash)
8
+ include CardSetBuilder
9
+ attr_reader :cards
10
+ def initialize(card_hash)
11
+ @cards = card_set_builder(card_hash)
11
12
  end
12
13
 
13
- def sample
14
- @graphemes.sample
14
+ def game(mode)
15
+ Modes.public_send mode, self
16
+ rescue NoMethodError
17
+ raise InvalidGameMode, "Invalid Game Mode!"
15
18
  end
16
19
 
17
- def mode(mode)
18
- case mode
19
- when :translate
20
- Modes::Translate.new(self)
21
- when :typing_practice
22
- Modes::TypingPractice.new(self)
23
- else
24
- raise "Invalid Game Mode!"
25
- end
20
+ def size
21
+ cards.length
26
22
  end
27
23
 
28
24
  # So as to not interfere with menu naming as this is not meant to
@@ -34,5 +30,8 @@ module LanguageCards
34
30
  def label
35
31
  []
36
32
  end
33
+
34
+ private
35
+ class InvalidGameMode < StandardError; end
37
36
  end
38
37
  end