@ihabdevteam/core 0.109.0 → 0.111.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.
@@ -1,16 +1,9 @@
1
1
  {
2
2
  "common": {
3
- "sortSelect": "Sort by",
4
3
  "statusFilter": "Filter by status",
5
4
  "pageSizeSelect": "Items per page",
6
5
  "selectedCount_one": "{{count}} selected",
7
6
  "selectedCount_other": "{{count}} selected",
8
- "skipToContent": "Skip to main content",
9
- "discardConfirm": {
10
- "title": "Discard your changes?",
11
- "body": "Anything you have entered will be lost if you leave without saving.",
12
- "confirm": "Discard"
13
- },
14
7
  "moreFor": "More options for {{name}}",
15
8
  "cancel": "Cancel",
16
9
  "info": "Info",
@@ -19,24 +12,17 @@
19
12
  "retry": "Try again"
20
13
  },
21
14
  "save": "Save",
22
- "saving": "Saving…",
23
- "saved": "✓ Saved",
24
15
  "confirm": "Confirm",
25
16
  "close": "Close",
26
17
  "back": "Back",
27
- "training": "Training",
28
18
  "emptyTrainingName": "Training name is empty.",
29
19
  "remove": "Remove",
30
20
  "image": "Image",
31
- "add": "Add",
32
- "edit": "Edit",
33
21
  "delete": "Delete",
34
- "deleting": "Deleting",
35
22
  "reset": "Reset",
36
23
  "update": "Update",
37
24
  "download": "Download",
38
25
  "search": "Search",
39
- "loading": "Loading…",
40
26
  "empty": "No data.",
41
27
  "yes": "Yes",
42
28
  "no": "No",
@@ -48,10 +34,6 @@
48
34
  "retry": "Try Again",
49
35
  "prevPage": "Previous page",
50
36
  "nextPage": "Next page",
51
- "language": {
52
- "ko": "한국어",
53
- "en": "English"
54
- },
55
37
  "play": "Play",
56
38
  "pause": "Pause",
57
39
  "playPause": "Play / Pause",
@@ -69,29 +51,13 @@
69
51
  "totalCountSuffix": "",
70
52
  "expand": "Expand",
71
53
  "collapse": "Collapse",
72
- "searching": "Loading…",
73
- "goBack": "Go back",
74
- "copy": "Copy",
75
- "other": "Other",
76
54
  "popup": "Popup",
77
- "hoursShort": "{{count}} hr",
78
- "minutesShort": "{{count}} min",
79
- "error": {
80
- "loginRequired": "Please log in.",
81
- "network": "Your connection looks unstable. Check it and try again.",
82
- "generic": "Something went wrong. Please refresh and try again."
83
- },
84
55
  "more": "More",
85
56
  "codeBlock": "Code block",
86
57
  "totalPrefix": "",
87
58
  "copyCode": "Copy code",
88
59
  "copied": "Copied",
89
60
  "col": {
90
- "round": "Round",
91
- "judge": "Rating",
92
- "scoredAt": "Answered at",
93
- "table": "Table",
94
- "recent": "Last",
95
61
  "problem": "Question"
96
62
  },
97
63
  "phonetics": {
@@ -118,12 +84,6 @@
118
84
  }
119
85
  }
120
86
  },
121
- "plan": {
122
- "customerSearchPlaceholder": "Search by name or contact",
123
- "customerEmpty": "No customers registered",
124
- "customerCount": "{n} customers total",
125
- "maxCustomers": "You can select up to {{max}} customers."
126
- },
127
87
  "calendar": {
128
88
  "rangeSelect": "Select period",
129
89
  "dow": [
@@ -196,147 +156,38 @@
196
156
  "goToMalgwi": "Go to Malgwi",
197
157
  "modeLabelManager": "Malgwi Manager",
198
158
  "modeLabelMalgwi": "Malgwi",
199
- "today": "Today's Listening",
200
- "homework": "Homework",
201
159
  "training": "Training",
202
- "customers": "Customers",
203
- "visits": "Visits",
204
160
  "settings": "Settings",
205
161
  "notifications": "Notifications",
206
162
  "account": "Account",
207
163
  "help": "Help",
208
164
  "debug": "Debug",
209
- "payment": "Buy Subscription",
210
165
  "coupons": "Coupons",
211
- "usage": "Subscription",
212
166
  "topic": "By Topic",
213
167
  "trainingType": "By Training Type",
214
- "sentenceTraining": "Sentence Training",
215
- "wordTraining": "Word Training",
216
- "game": "Games",
217
- "dashboard": "Dashboard",
218
168
  "wordPairs": "Word Pairs",
219
169
  "wordSearch": "Word Search",
220
- "wordManagement": "Word Management",
221
- "wordSuggestion": "Word Suggestions",
222
170
  "wordTable": "Word Table Creator",
223
- "myWordTable": "My Word Tables",
224
- "myWordTraining": "My Word Training",
225
- "trainingSet": "Training Set Builder",
226
- "trainingSettings": "Training Settings",
227
- "trainingStatus": "Training Status",
228
- "visitHistory": "Visit History",
229
171
  "company": "Company Info",
230
- "trainingStore": "Training Store",
231
- "wordPairsTableChild": "Word Pairs Table",
232
- "wordSearchTableChild": "Word Table",
233
172
  "more": "More",
234
173
  "moreMenu": "More menu"
235
174
  },
236
175
  "settings": {
237
- "title": "Settings",
238
- "subtitle": "Manage your app preferences",
239
176
  "language": {
240
- "title": "Language",
241
- "display": {
242
- "label": "Display Language",
243
- "sub": "Language used for menus, buttons and UI"
244
- },
245
177
  "training": {
246
178
  "label": "Training Language",
247
179
  "sub": "Language used for training words and speech"
248
180
  }
249
181
  },
250
- "trainingDefaults": {
251
- "title": "Training",
252
- "playVolume": {
253
- "sub": "Default playback volume for sentence audio."
254
- },
255
- "playSpeed": {
256
- "sub": "Default playback speed for sentence audio."
257
- },
258
- "noiseLevel": {
259
- "sub": "Default background noise level during training."
260
- },
261
- "noiseType": {
262
- "sub": "Default background noise type used during training."
263
- }
264
- },
265
182
  "notifications": {
266
- "title": "Notifications",
267
- "itemsTitle": "Notification Items",
268
- "methodsTitle": "Notification Methods",
269
- "visit": {
270
- "label": "Visit Reminder",
271
- "sub": "Sent the day before a scheduled visit."
272
- },
273
- "notice": {
274
- "label": "Announcements",
275
- "sub": "Receive service notices and update news."
276
- },
277
- "homework": {
278
- "label": "Homework Alerts",
279
- "sub": "Notified when new homework is assigned or due."
280
- },
281
- "email": {
282
- "label": "Email",
283
- "sub": "Sent to your registered email address."
284
- },
285
- "sms": {
286
- "label": "SMS",
287
- "sub": "Sent to your registered phone number."
288
- },
289
- "kakao": {
290
- "label": "KakaoTalk",
291
- "sub": "Sent via KakaoTalk notification."
292
- }
183
+ "title": "Notifications"
293
184
  },
294
185
  "display": {
295
- "title": "Display",
296
186
  "fontSize": {
297
- "label": "Font Size",
298
- "sub": "Adjust the font size across the app",
299
187
  "small": "Small",
300
- "medium": "Medium",
301
188
  "large": "Large"
302
189
  }
303
190
  },
304
- "sentenceData": {
305
- "title": "Sentence Data",
306
- "audio": {
307
- "label": "Sentence Audio Data",
308
- "sub": "Training sentence audio files",
309
- "value": "Automatically managed — no manual cleanup needed."
310
- }
311
- },
312
- "wordData": {
313
- "title": "Word Data",
314
- "localVersion": "Local Version",
315
- "remoteVersion": "Server Version",
316
- "pairMatching": "Word Pair Matching",
317
- "imageMatching": "Image Matching",
318
- "checkUpdate": {
319
- "label": "Check for Word Data Update",
320
- "sub": "Check the server for the latest word version.",
321
- "button": "Check Update",
322
- "checking": "Checking…",
323
- "toast": "Server version checked."
324
- },
325
- "update": {
326
- "progressTitle": "Updating Word Data",
327
- "toast": "Word data has been updated."
328
- },
329
- "pairPending": "Not analyzed",
330
- "imagePending": "Not checked",
331
- "updateButton": "Update",
332
- "clear": {
333
- "label": "Reset Word Data",
334
- "sub": "Delete locally cached word data",
335
- "button": "Reset",
336
- "progressTitle": "Resetting Word Data",
337
- "toast": "Word data has been reset."
338
- }
339
- },
340
191
  "cache": {
341
192
  "title": "Cache Management",
342
193
  "confirmMessage": "Delete cache ({{size}}). Do you want to continue?",
@@ -362,35 +213,14 @@
362
213
  }
363
214
  }
364
215
  },
365
- "security": {
366
- "title": "Security · Data",
367
- "autoBackup": {
368
- "label": "Auto Backup",
369
- "sub": "Automatically back up data periodically"
370
- },
371
- "autoLogout": {
372
- "label": "Auto Logout",
373
- "sub": "Auto logout time when inactive",
374
- "15min": "15 min",
375
- "30min": "30 min",
376
- "1hour": "1 hour",
377
- "2hour": "2 hours"
378
- }
379
- },
380
216
  "button": {
381
- "reset": "Reset",
382
217
  "save": "Save Settings"
383
218
  },
384
219
  "popup": {
385
- "cancel": "Cancel",
386
220
  "clear": {
387
- "title": "Reset Word Data",
388
- "message": "All local data will be deleted and word data, pairs, and image matching will be rebuilt. Continue?",
389
221
  "confirm": "Reset"
390
222
  },
391
223
  "update": {
392
- "title": "Update Word Data",
393
- "message": "Cache will be cleared and the latest data will be fetched. Continue?",
394
224
  "confirm": "Update"
395
225
  },
396
226
  "cache": {
@@ -399,111 +229,26 @@
399
229
  }
400
230
  },
401
231
  "saved": "✓ Saved",
402
- "saveError": "Failed to save settings.",
403
- "loginRequired": "Login required.",
404
232
  "account": {
405
233
  "title": "Account",
406
234
  "delete": {
407
- "label": "Delete Account",
408
- "sub": "You can restore your account within 30 days of withdrawal.",
409
- "button": "Delete",
410
- "popup": {
411
- "title": "Delete your account?",
412
- "message": "You will be logged out immediately, and all data will be permanently deleted after 30 days. This cannot be undone.",
413
- "passwordLabel": "Current password",
414
- "passwordPlaceholder": "Enter your current password",
415
- "reauthGuide": "This account was created with a social login and has no password. Sign in with Kakao again to verify it is you, then continue.",
416
- "reauthDone": "Identity verified via Kakao. Press \"Delete\" below to continue.",
417
- "reauthButton": "Sign in with Kakao again",
418
- "reauthRedirecting": "Redirecting to Kakao…"
419
- }
235
+ "sub": "You can restore your account within 30 days of withdrawal."
420
236
  }
421
- },
422
- "theme": {
423
- "title": "Theme",
424
- "light": "Light",
425
- "dark": "Dark",
426
- "auto": "Auto",
427
- "sub": "Select the app color theme"
428
237
  }
429
238
  },
430
239
  "usage": {
431
- "loadFailed": "Couldn't load your passes. Check your connection and refresh.",
432
- "title": "Subscription",
433
- "subtitle": "Check your subscriptions and usage status",
434
240
  "addButton": "Add Subscription",
435
241
  "couponButton": "Enter Coupon",
436
242
  "active": {
437
- "title": "Active passes",
438
- "disc": "This subscription is currently active and in use.",
439
243
  "infoTitle": "Subscription Info",
440
244
  "refund": "Request Refund",
441
- "empty": "No active subscription.",
442
- "emptyUseHeld": "Activate one of your held passes.",
443
- "emptyBuy": "Please purchase a pass.",
444
- "buyButton": "Buy a pass",
445
245
  "startDate": "Start Date",
446
246
  "endDate": "End Date",
447
247
  "remaining": "Remaining"
448
248
  },
449
249
  "pending": {
450
250
  "title": "Pending",
451
- "titleSpeechear": "Held Malgwi passes",
452
- "titleManager": "Held Malgwi Manager passes",
453
- "disc": "This subscription has been purchased but not yet started. It will activate automatically after the current subscription expires.",
454
- "autoUse": "Auto Activate",
455
- "empty": "No pending subscriptions.",
456
- "emptySpeechear": "No held Malgwi passes.",
457
- "emptyManager": "No held Malgwi Manager passes."
458
- },
459
- "expired": {
460
- "title": "Expired passes",
461
- "disc": "These subscriptions have reached their end date.",
462
- "empty": "No expired subscriptions."
463
- },
464
- "refund": {
465
- "confirmTitle": "Request Refund",
466
- "confirmMessage": "Are you sure you want to request a refund for {{plan}}?",
467
- "confirm": "Submit Request",
468
- "delete": "Delete",
469
- "sourceLabel": "Purchase source",
470
- "dateLabel": "Purchase date",
471
- "reason": {
472
- "not_purchase": "Only purchased passes can be refunded.",
473
- "window_expired": "Refunds are only available within 3 days of purchase."
474
- }
475
- },
476
- "source": {
477
- "purchase": "Purchase",
478
- "coupon": "Coupon",
479
- "admin": "Free grant"
480
- },
481
- "deleteConfirm": {
482
- "title": "Delete pass",
483
- "message": "This can't be undone. Delete it?"
484
- },
485
- "toast": {
486
- "couponAdded": "{{plan}} has been added to your passes.",
487
- "useFailed": "Failed to activate the pass.",
488
- "switched": "{{prev}} has been moved to your held passes.",
489
- "refundFailed": "Failed to process the refund.",
490
- "deleteFailed": "Failed to delete the pass."
491
- },
492
- "error": {
493
- "invalidCode": "This coupon is not valid.",
494
- "alreadyUsed": "This coupon has already been used.",
495
- "codeExhausted": "This code has reached its maximum number of uses.",
496
- "couponExpired": "This coupon has expired.",
497
- "couponNotStarted": "This coupon is not active yet.",
498
- "passLimitReached": "You already have a pass of the same type, so this coupon can't be used.",
499
- "groupLimitReached": "You've already used the maximum number of coupons available in this promotion.",
500
- "notFound": "Pass not found.",
501
- "notPending": "This pass has already been processed. Please refresh and check again.",
502
- "invalidDuration": "The pass's duration information is invalid.",
503
- "switchCooldown": "You can only switch passes once per day. Please try again later.",
504
- "switchCooldownWithTime": "You can only switch passes once per day. Please try again in {{time}}.",
505
- "notRefundable": "This pass can't be refunded.",
506
- "notDeletable": "This pass is still in progress and can't be deleted."
251
+ "empty": "No pending subscriptions."
507
252
  },
508
253
  "loading": "Loading…",
509
254
  "segment": {
@@ -518,393 +263,39 @@
518
263
  "startDate": "Start Date",
519
264
  "endDate": "End Date",
520
265
  "remaining": "Remaining",
521
- "duration": "Duration",
522
- "daysAdded": "+{{n}} days"
523
- },
524
- "history": {
525
- "title": "Usage History",
526
- "disc": "Record of organization plan registrations and extensions.",
527
- "empty": "No usage history."
528
- },
529
- "actions": {
530
- "created": "New Registration",
531
- "extended": "Extended",
532
- "granted": "Free Grant",
533
- "refunded": "Refunded",
534
- "activated": "Activated",
535
- "paused": "Moved to held"
266
+ "duration": "Duration"
536
267
  }
537
268
  },
538
269
  "account": {
539
- "title": "Account",
540
- "subtitle": "Manage your account information",
541
- "actions": {
542
- "editBasicInfo": "Edit Basic Info",
543
- "editCompany": "Edit Company Info",
544
- "registerManager": "Apply for Malgwi Manager",
545
- "unregisterManager": "Leave Malgwi Manager"
546
- },
547
- "signOut": {
548
- "confirmTitle": "Sign Out",
549
- "confirmMessage": "Are you sure you want to sign out?"
550
- },
551
- "unregister": {
552
- "title": "Leave Malgwi Manager",
553
- "question": "Are you sure you want to leave Malgwi Manager?",
554
- "warning": "Company info will be deleted. This cannot be undone.",
555
- "processing": "Processing…",
556
- "confirm": "Confirm",
557
- "success": "You have left Malgwi Manager."
558
- },
559
- "register": {
560
- "success": "Malgwi Manager registration complete."
561
- },
562
270
  "profile": {
563
- "signOut": "Sign Out",
564
271
  "planSuffix": "",
565
272
  "plan": "Plan"
566
273
  },
567
274
  "basicInfo": {
568
- "title": "Basic Info",
569
275
  "name": {
570
- "label": "Name",
571
276
  "placeholder": "John Doe"
572
- },
573
- "email": {
574
- "label": "Email"
575
- },
576
- "phone": {
577
- "label": "Phone",
578
- "placeholder": "010-0000-0000"
579
- },
580
- "joinDate": {
581
- "label": "Join Date"
582
- },
583
- "emailReadonly": "Email cannot be changed.",
584
- "birth": {
585
- "yearLabel": "{{y}}",
586
- "monthLabel": "{{n}}",
587
- "dayLabel": "{{n}}",
588
- "yearPlaceholder": "Year",
589
- "monthPlaceholder": "Month",
590
- "dayPlaceholder": "Day"
591
- },
592
- "errors": {
593
- "nameRequired": "Please enter your name.",
594
- "phoneRequired": "Please enter your phone number.",
595
- "birthRequired": "Please select your date of birth.",
596
- "genderRequired": "Please select your gender."
597
- },
598
- "saving": "Saving…",
599
- "loginMethod": {
600
- "label": "Login Method",
601
- "email": "Email",
602
- "kakao": "Kakao",
603
- "google": "Google",
604
- "apple": "Apple",
605
- "naver": "Naver",
606
- "socialOnly": "Social login account — no password is set."
607
277
  }
608
278
  },
609
279
  "security": {
610
280
  "title": "Security",
611
281
  "password": {
612
- "label": "Password",
613
- "changeButton": "Change Password"
282
+ "label": "Password"
614
283
  },
615
284
  "twoFactor": {
616
285
  "label": "Two-Factor Authentication",
617
286
  "sub": "Strengthen your account security"
618
287
  }
619
- },
620
- "passwordModal": {
621
- "title": "Change Password",
622
- "currentPassword": "Current Password",
623
- "newPassword": "New Password",
624
- "confirmPassword": "Confirm New Password",
625
- "submit": "Change",
626
- "submitting": "Processing…"
627
288
  }
628
289
  },
629
290
  "help": {
630
- "title": "Help",
631
- "subtitle": "Learn how to use the service and find answers to common questions",
632
291
  "guide": {
633
- "title": "User Guide",
634
- "start": {
635
- "title": "Getting Started",
636
- "desc": "Step-by-step guide for first-time users"
637
- },
638
- "quickStart": {
639
- "title": "Quick Start",
640
- "desc": "Complete your first listening training in 5 minutes"
641
- },
642
- "admin": {
643
- "title": "Admin Guide",
644
- "desc": "How to use customer management and training settings"
645
- },
646
292
  "faq": {
647
293
  "title": "FAQ",
648
294
  "desc": "View all frequently asked questions"
649
295
  }
650
- },
651
- "faq": {
652
- "title": "Frequently Asked Questions",
653
- "items": [
654
- {
655
- "q": "Who is the Malgwi service suitable for?",
656
- "a": "It is suitable for hearing aid users, people with hearing loss, and those who need auditory rehabilitation."
657
- },
658
- {
659
- "q": "Does Today's Listening provide new questions every day?",
660
- "a": "Yes, Today's Listening is refreshed daily."
661
- },
662
- {
663
- "q": "Where can I check training results?",
664
- "a": "You can check your score on the result screen after completing each training."
665
- },
666
- {
667
- "q": "How do I enter a coupon code?",
668
- "a": "Go to the [Coupons] page in the side menu, enter the code and press Apply."
669
- },
670
- {
671
- "q": "Can I export customer data to Excel?",
672
- "a": "Click the Download button at the top of the [Customers] page to export the current list as a CSV file."
673
- },
674
- {
675
- "q": "Can I view previous months in the visit history calendar?",
676
- "a": "Yes, use the arrow buttons at the top of the calendar to navigate to previous/next months."
677
- }
678
- ]
679
- },
680
- "support": {
681
- "title": "Customer Support",
682
- "email": {
683
- "label": "Email",
684
- "value": "support@malgwi.kr"
685
- },
686
- "phone": {
687
- "label": "Phone",
688
- "hours": "(Weekdays 09:00–18:00)",
689
- "value": "02-1234-5678 (Weekdays 09:00–18:00)"
690
- },
691
- "kakao": {
692
- "label": "KakaoTalk",
693
- "value": "@malgwi"
694
- }
695
- },
696
- "contact": {
697
- "title": "Contact Us",
698
- "subject": {
699
- "label": "Subject *",
700
- "placeholder": "Inquiry subject"
701
- },
702
- "email": {
703
- "label": "Reply Email",
704
- "invalid": "That doesn't look like an email address. Enter it correctly to receive a reply."
705
- },
706
- "body": {
707
- "label": "Message *",
708
- "placeholder": "Enter your message"
709
- },
710
- "submit": "Send Inquiry",
711
- "successMessage": "✓ Your inquiry has been received. We will reply within 1–2 business days.",
712
- "submitError": "Failed to submit your inquiry.",
713
- "submitting": "Sending…",
714
- "status": {
715
- "pending": "Awaiting reply",
716
- "inProgress": "In progress",
717
- "answered": "Answered"
718
- }
719
- },
720
- "inquiryHistory": {
721
- "title": "Inquiry History",
722
- "loadingAttachments": "Loading attachments…",
723
- "attachmentsFailed": "Could not load attachments."
724
296
  }
725
297
  },
726
- "notifications": {
727
- "title": "Notifications",
728
- "subtitle": "Check service notifications and announcements",
729
- "filter": {
730
- "all": "All",
731
- "unread": "Unread"
732
- },
733
- "markAllRead": "Mark all as read",
734
- "empty": "No notifications",
735
- "done": "Done",
736
- "deleteAriaLabel": "Delete",
737
- "deleteItemAriaLabel": "Delete notification: {{title}}",
738
- "action": {
739
- "open": "Go",
740
- "detail": "View details",
741
- "homework": "Do homework",
742
- "usage": "View subscription"
743
- },
744
- "missing": {
745
- "badge": "Expired",
746
- "title": "Homework not found.",
747
- "body": "This homework was deleted or its link has expired."
748
- },
749
- "type": {
750
- "notice": "Notice",
751
- "homework": "Homework",
752
- "subscription": "Pass",
753
- "linkRequest": "Link",
754
- "wordSuggestion": "Suggestion",
755
- "info": "Info",
756
- "visit": "Visit",
757
- "system": "System",
758
- "coupon": "Coupon"
759
- },
760
- "items": [
761
- {
762
- "type": "visit",
763
- "title": "Visit Scheduled",
764
- "body": "Customer Kim Min-jun is scheduled to visit at 2pm today.",
765
- "time": "10 min ago",
766
- "read": false
767
- },
768
- {
769
- "type": "coupon",
770
- "title": "Coupon Expiring Soon",
771
- "body": "Coupon CPN003 expires in 3 days.",
772
- "time": "1 hr ago",
773
- "read": false
774
- },
775
- {
776
- "type": "info",
777
- "title": "May Notice",
778
- "body": "Malgwi service maintenance on May 20, 02:00–04:00.",
779
- "time": "Yesterday",
780
- "read": true
781
- },
782
- {
783
- "type": "system",
784
- "title": "Data Sync Complete",
785
- "body": "Word data has been updated to the latest version.",
786
- "time": "Yesterday",
787
- "read": true
788
- },
789
- {
790
- "type": "visit",
791
- "title": "Visit Complete",
792
- "body": "Customer Lee Seo-yeon's visit was processed successfully.",
793
- "time": "2 days ago",
794
- "read": true
795
- },
796
- {
797
- "type": "info",
798
- "title": "April Update Notice",
799
- "body": "Word pair search feature has been improved.",
800
- "time": "5 days ago",
801
- "read": true
802
- }
803
- ],
804
- "homework": {
805
- "title": "New homework: \"{{planName}}\"",
806
- "titleDefault": "New homework arrived",
807
- "body": "{{sender}} sent you {{kind}} homework. Start now!",
808
- "bodyNoSender": "You received {{kind}} homework. Start now!",
809
- "kind": {
810
- "sentence": "sentence training",
811
- "word": "word training"
812
- }
813
- }
814
- },
815
- "wordSuggestion": {
816
- "title": "Word Suggestions",
817
- "subtitle": "Suggest words you need and vote. The top {{n}} each week get added.",
818
- "form": {
819
- "title": "Suggest a word",
820
- "wordLabel": "Word",
821
- "pronunciationLabel": "Pronunciation",
822
- "pronunciationPlaceholder": "e.g. kkochi",
823
- "pronunciationHelp": "Filled in automatically as you type. Correct it if it differs.",
824
- "colloquialLabel": "Colloquial",
825
- "colloquialPlaceholder": "How it is actually said (optional)",
826
- "meaningLabel": "Meaning",
827
- "meaningPlaceholder": "What does the word mean?",
828
- "gradeLabel": "Grade / POS / Origin",
829
- "gradeOption": "Grade {{n}}",
830
- "gradeAria": "Grade",
831
- "posAria": "Part of speech",
832
- "wordTypeAria": "Word origin",
833
- "fieldLabel": "Field",
834
- "fieldPlaceholder": "e.g. medicine, botany (optional)",
835
- "homonumLabel": "Homonym no.",
836
- "homonumPlaceholder": "e.g. 1",
837
- "homonumHelp": "Only if another word shares the same spelling.",
838
- "homonumChip": "Homonym {{n}}",
839
- "colloquialChip": "Spoken {{v}}",
840
- "unset": "Not set",
841
- "wordPlaceholder": "Word to suggest",
842
- "noteLabel": "Reason",
843
- "notePlaceholder": "Why is it needed? (optional)",
844
- "submit": "Suggest",
845
- "submitting": "Submitting…",
846
- "alreadyInPool": "“{{word}}” is already in the word list.",
847
- "alreadyVoted": "“{{word}}” has already been suggested ({{n}} votes) and you have already voted for it.",
848
- "alreadySuggested": "“{{word}}” has already been suggested ({{n}} votes). Submitting will vote for it."
849
- },
850
- "tab": {
851
- "voting": "Vote",
852
- "mine": "My suggestions"
853
- },
854
- "status": {
855
- "voting": "Voting",
856
- "selected": "Scheduled",
857
- "added": "Added",
858
- "rejected": "Rejected"
859
- },
860
- "empty": {
861
- "voting": "No suggestions yet.",
862
- "mine": "You haven’t suggested any words yet."
863
- },
864
- "badge": {
865
- "mine": "Mine",
866
- "thisWeek": "This week"
867
- },
868
- "detail": {
869
- "status": "Status",
870
- "votes": "Votes",
871
- "createdAt": "Suggested",
872
- "rejectReason": "Reason for rejection"
873
- },
874
- "sort": {
875
- "label": "Sort",
876
- "votes": "Most votes",
877
- "recent": "Newest",
878
- "alpha": "A–Z"
879
- },
880
- "votes": "{{n}} votes",
881
- "quota": "{{remaining}}/{{limit}} suggestions left",
882
- "vote": "Vote",
883
- "voted": "Voted",
884
- "voteAria": "Vote for {{word}}",
885
- "votedAria": "Remove your vote for {{word}}",
886
- "rejectedReason": "Reason: {{reason}}",
887
- "toast": {
888
- "submitted": "Suggestion submitted.",
889
- "votedExisting": "Voted for the existing suggestion.",
890
- "voteFailed": "Could not record your vote."
891
- },
892
- "error": {
893
- "EMPTY_WORD": "Please enter a word.",
894
- "WORD_TOO_LONG": "Words must be 20 characters or fewer.",
895
- "ALREADY_SELECTED": "This word is already scheduled for this week.",
896
- "ALREADY_ADDED": "This word has already been added.",
897
- "ALREADY_REJECTED": "This word was reviewed and will not be added.",
898
- "RATE_LIMITED": "You've used all {{n}} of your suggestions.",
899
- "UNAUTHENTICATED": "Please sign in.",
900
- "NETWORK": "Your connection looks unstable. Check it and try again.",
901
- "UNKNOWN": "Could not submit the suggestion."
902
- },
903
- "tabGroupLabel": "View type"
904
- },
905
298
  "training": {
906
- "title": "Word Training",
907
- "subtitle": "Set difficulty and consonant, then choose a training type",
908
299
  "settings": "Settings",
909
300
  "start": {
910
301
  "title": "Start Word Training",
@@ -928,39 +319,17 @@
928
319
  "phonemeGroup": "Training phonemes",
929
320
  "noLimit": "Any",
930
321
  "codaExclude": "Exclude",
931
- "viewChar": "Choose Letters",
932
- "viewPron": "Choose Sound",
933
- "viewDirect": "Type Letters",
934
- "patternInputLabel": "Type Letters",
935
- "patternInputInfo": [
936
- "Separate syllables with a comma (,). E.g. 'ㄱ,ㄱ' = words where the initial 'ㄱ' occurs twice in a row (가구, 고기…).",
937
- "A consonant matches the onset of that position, a vowel matches the nucleus. E.g. ㅏ = nucleus ㅏ.",
938
- "Use '_' to specify the onset/nucleus/coda position. E.g. 'ㄱ_ㄱ' = onset ㄱ + coda ㄱ (각, 국…), '__ㄱ' = coda ㄱ.",
939
- "You can also use complete characters. E.g. '고,기' = words containing '고기'."
940
- ],
941
- "patternPlaceholder": "e.g. ㄱ,ㄱ or ㄱ_ㄱ",
942
- "patternInputError": "Invalid input format. Use only complete characters, consonants/vowels, or the '__ㄱ' template.",
943
- "patternInputUsageLabel": "Usage",
944
322
  "gradeLabel": "Grade",
945
323
  "excludeImageInfo": "Only words with images: keeps only results with a registered word image.",
946
324
  "sameStructureInfo": "Only same phoneme structure: keeps only pairs where the correct and wrong answers share the same syllable structure (length, batchim, etc.).",
947
- "wordSearchOptions": "Word Selection",
948
325
  "selectSection": "Select",
949
326
  "excludeImage": "Only words with images",
950
- "sameStructure": "Only same phoneme structure",
951
- "changeSyllableLabel": "Syllable to Change",
952
- "phonemePosFilterInfo1": "Specify which syllable of the word the selected training phoneme must be in.",
953
- "changeSyllablePosFilterInfo1": "Specify the position of the syllable (or root) to change or drop in the question.",
954
- "posInfo2": "Start=first syllable, Middle=middle, End=last syllable, 'Any'=no position restriction.",
955
- "headRoot": "Initial Root",
956
- "tailRoot": "Final Root"
327
+ "sameStructure": "Only same phoneme structure"
957
328
  },
958
329
  "noQuestions": "No questions available.",
959
330
  "countQuestions": "{{n}} questions",
960
331
  "countSentences": "{{n}} sentences",
961
- "wordCountAvailable": "{{n}} words available",
962
332
  "comingSoon": "Coming Soon",
963
- "noConditionMatch": "No matching items",
964
333
  "nextQuestion": "Next",
965
334
  "noiseLevelTitle": "Noise Level",
966
335
  "noiseTypeTitle": "Noise Type",
@@ -997,21 +366,6 @@
997
366
  },
998
367
  "listenTitle": "Please listen to the sentence.",
999
368
  "listenButton": "Listen",
1000
- "listenQuestionBtn": "Listen to question",
1001
- "listenSoundBtn": "Listen to sound",
1002
- "selectCorrectAnswer": "Select the correct answer.",
1003
- "listenSentence": "Please listen to the sentence.",
1004
- "listenQuestion": "Please listen to the question.",
1005
- "selectAnswer": "Please select the answer.",
1006
- "listenLongStory": "Listen carefully to the long story and answer the questions below.",
1007
- "listenSound": "Please listen to the sound.",
1008
- "listenTwoSounds": "Please listen to both sounds.",
1009
- "areTwoSoundsSame": "Were the two sounds the same or different?",
1010
- "pickSameCard": "Look at the cards and pick the same sound.",
1011
- "pickSameSoundCard": "Pick the word card that matches the sound.",
1012
- "pickIncludedCard": "Pick the word card that includes the sound.",
1013
- "pickStartsWithCard": "Pick the word card that starts with the same sound.",
1014
- "listenInOrder": "Listen to the sounds in order.",
1015
369
  "playSound": "Play Sound",
1016
370
  "playAll": "Play All",
1017
371
  "stop": "Stop",
@@ -1028,8 +382,6 @@
1028
382
  "cardInstructions": "Look at the word card, listen to the sound, and check it.",
1029
383
  "noCards": "No cards.",
1030
384
  "audioFetchError": "Failed to load the sound source.",
1031
- "selectInOrder": "Select the cards in the order you heard.",
1032
- "orderSentence": "Drag the sentences to arrange them in the order you heard.",
1033
385
  "selectConfirm": "Look at the question and select the answer.",
1034
386
  "orderListDefault": "Arrange the sentences in the order you heard.",
1035
387
  "result": {
@@ -1055,225 +407,45 @@
1055
407
  "prev": "Previous",
1056
408
  "listenLabel": "Listen",
1057
409
  "sourcePlay": "Play source {{n}}",
1058
- "listenSentenceBtn": "Listen to Sentence",
1059
- "listenQuestionBtn2": "Listen to Question",
1060
- "listen": "Listen",
1061
- "popup": {
1062
- "wordManipulation": "Word manipulation training",
1063
- "orderListening": "Sentence order listening"
1064
- }
410
+ "listen": "Listen"
1065
411
  },
1066
412
  "trainingSettings": {
1067
- "title": "My Sentence Training",
1068
413
  "totalCount": " training bundles",
1069
- "search": {
1070
- "placeholder": "Search by training bundle name"
1071
- },
1072
- "addButton": "Add Training Bundle",
1073
- "empty": "No training bundles registered.",
1074
414
  "sort": {
1075
- "id": "No.",
1076
- "name": "Card Name",
1077
- "customers": "Customers",
1078
- "createdAt": "Created Date"
1079
- },
1080
- "pageSize": {
1081
- "10": "Show 10",
1082
- "25": "Show 25",
1083
- "50": "Show 50",
1084
- "100": "Show 100"
1085
- },
1086
- "totalPrefix": "",
1087
- "totalSuffix": " training bundle(s)",
1088
- "sub": "Create sentence training bundles and organize them into groups.",
1089
- "noItems": "No training items",
1090
- "sortPlaceholder": "Sort",
1091
- "duplicated": "Training bundle copied and saved as {{name}}.",
1092
- "duplicateError": "Failed to copy training bundle.",
1093
- "saveError": "Failed to save training bundle.",
1094
- "deleteError": "Failed to delete training bundle.",
1095
- "moveError": "Failed to save group move.",
1096
- "linkCopied": "Link copied.",
1097
- "linkCreated": "Link created.",
1098
- "linkError": "Failed to create link.",
1099
- "groupRemoveError": "Failed to delete some groups.",
1100
- "deleteConfirm": {
1101
- "title": "Delete Training Bundle",
1102
- "body": "Delete '{{name}}'?",
1103
- "bodyNoName": "Delete this training bundle?",
1104
- "confirm": "Delete"
1105
- },
1106
- "deleteGroupConfirm": {
1107
- "title": "Delete Group",
1108
- "body": "Delete group '{{name}}'? Training bundles in this group will be moved to 'No Group'."
415
+ "customers": "Customers"
1109
416
  },
1110
417
  "copyLink": "Copy Link",
1111
418
  "removeLink": "Remove Link",
1112
419
  "linkRemoved": "Link removed.",
1113
- "linkCreating": "Creating link…",
1114
420
  "linkSaveFirst": "Please save the training bundle first.",
1115
421
  "linkSaveFirstHint": "You can only create a shared link from a saved training bundle.",
1116
422
  "linkCopySelect": "Copy blocked — link selected. Press Ctrl/⌘+C to copy.",
1117
423
  "nameRequired": "Please enter a training bundle name.",
1118
424
  "itemRequired": "Please add at least one training item.",
1119
425
  "randomAdd": "Random Add",
1120
- "store": {
1121
- "badge": "Training Store",
1122
- "unpublishTitle": "Remove from Training Store",
1123
- "unpublishConfirm": "Remove",
1124
- "unpublishMessage": "Remove '{{name}}' from the Training Store?",
1125
- "unpublishWarning": {
1126
- "title": "The following data will be reset:",
1127
- "likes": "Like count",
1128
- "downloads": "Download count",
1129
- "likeHistory": "Like history (including other users' likes)",
1130
- "publisherInfo": "Publisher info, description, and tags",
1131
- "note": "All stats start from zero when re-published."
1132
- },
1133
- "publishTitle": "Add to Training Store",
1134
- "publishConfirm": "Publish",
1135
- "publishMessage": "Add '{{name}}' to the Training Store?"
1136
- },
1137
- "startCustomer": {
1138
- "title": "Start Customer Training",
1139
- "buttonLabel": "Start Customer Training",
1140
- "startButtonLabel": "Start Training",
1141
- "searchPlaceholder": "Search by name or contact",
1142
- "countLabel": "Total {n}",
1143
- "emptyText": "No customers registered."
1144
- },
1145
- "sendHomework": {
1146
- "title": "Send Homework",
1147
- "buttonLabel": "Send Homework",
1148
- "searchPlaceholder": "Search by name or contact",
1149
- "countLabel": "Total {n}",
1150
- "emptyText": "No customers registered.",
1151
- "hwNotifyTooltip": "Send homework notification to linked member"
1152
- },
1153
426
  "menu": {
1154
427
  "publish": "Post to Store",
1155
- "copyLink": "Copy Link",
1156
- "delete": "Delete",
1157
428
  "duplicate": "Duplicate Training Bundle",
1158
429
  "edit": "Edit Training Bundle",
1159
- "editTraining": "Edit",
1160
430
  "move": "Move Group",
1161
- "publishStore": "Post to Training Store",
1162
- "rename": "Rename",
1163
- "unpublishStore": "Remove from Training Store"
431
+ "rename": "Rename"
1164
432
  },
1165
- "toast": {
1166
- "published": "Posted to Training Store.",
1167
- "unpublished": "Removed from Training Store.",
1168
- "hwRegFailed": "Failed to assign homework. Please try again later.",
1169
- "hwRegNoMember": "Homework assigned. (No linked member — notification not sent)",
1170
- "sessionStartError": "Failed to start customer training session.",
1171
- "hwSent": "Sent",
1172
- "hwSend": "Send",
1173
- "hwRegSentFmt": "Homework sent to {{name}}.",
1174
- "sessionStarted": "Training started for {{name}}."
1175
- },
1176
- "addGroupButton": "Add Group",
1177
- "addPlanToGroup": "Add training bundle to this group",
1178
- "deleteGroup": "Delete Group",
1179
- "groupEmpty": "No training bundles.",
1180
- "groupNameDuplicate": "A group with this name already exists.",
1181
- "groupNamePlaceholder": "Enter a group name",
1182
- "groupNameRequired": "Please enter a group name.",
1183
433
  "itemCount": "Number of Items",
1184
- "renameGroup": "Rename Group",
1185
- "loadFailed": "Could not load training bundles."
434
+ "renameGroup": "Rename Group"
1186
435
  },
1187
436
  "customers": {
1188
- "tabs": {
1189
- "customerList": "Customers",
1190
- "visits": "Visit History",
1191
- "homeworkManage": "Homework",
1192
- "invite": "Invites",
1193
- "groupLabel": "Customer section"
1194
- },
1195
- "title": "Customers",
1196
- "searchFailed": "Couldn't search. Showing matches from the list already loaded.",
1197
- "subtitle": "Manage your customer list, visit history, and homework in one place.",
1198
437
  "totalCount": " customers",
1199
- "totalPrefix": "",
1200
- "totalSuffix": " customers",
1201
- "search": {
1202
- "placeholder": "Search by name or phone"
1203
- },
1204
- "downloadButton": "Download",
1205
- "addButton": "Add Customer",
1206
- "empty": "No customers registered.",
1207
438
  "loadError": "Failed to load list",
1208
- "loadErrorDesc": "Please check your network and try again.",
1209
- "sort": {
1210
- "name": "Name",
1211
- "gender": "Gender",
1212
- "birthDate": "Date of Birth",
1213
- "phone": "Phone",
1214
- "joinDate": "Join Date"
1215
- },
1216
- "pageSize": {
1217
- "10": "Show 10",
1218
- "25": "Show 25",
1219
- "50": "Show 50",
1220
- "100": "Show 100"
1221
- },
1222
- "gender": {
1223
- "male": "M",
1224
- "female": "F"
1225
- },
1226
- "modal": {
1227
- "addTitle": "Add Customer",
1228
- "editTitle": "Edit {{name}}"
1229
- },
1230
- "form": {
1231
- "name": "Name *",
1232
- "namePlaceholder": "John Doe",
1233
- "gender": "Gender",
1234
- "birthDate": "Date of Birth",
1235
- "birthYearPlaceholder": "Select year",
1236
- "phone": "Phone *",
1237
- "phoneFormatError": "Invalid phone number format",
1238
- "nameRequired": "Please enter a name",
1239
- "phoneRequired": "Please enter a phone number",
1240
- "nameTooLong": "Name can be at most {{max}} characters.",
1241
- "submitFailed": "Couldn't save. Please try again."
1242
- },
1243
- "button": {
1244
- "cancel": "Cancel",
1245
- "save": "Save",
1246
- "add": "Add"
1247
- },
1248
439
  "basicInfo": {
1249
- "title": "Basic Info",
1250
- "editTooltip": "Edit",
1251
- "serialNo": "Serial No.",
1252
- "age": "Age",
1253
- "memo": "Memo"
440
+ "editTooltip": "Edit"
1254
441
  },
1255
442
  "member": {
1256
- "label": "App Member",
1257
443
  "placeholder": "Email or phone",
1258
444
  "link": "Link",
1259
- "linking": "Linking…",
1260
- "linked": "Linked",
1261
- "notLinked": "Not linked",
1262
- "unlink": "Unlink",
1263
- "unlinkConfirm": "Unlinking means the member must accept a new request to reconnect. Unlink?",
1264
- "defaultName": "Member",
1265
- "searchPlaceholder": "Search by name, email, or phone",
1266
- "selectRequired": "Please select a member to link.",
1267
- "tabManual": "Enter Manually",
1268
- "tabSearch": "Find App Member",
1269
- "unit": " member(s)",
1270
- "appEmail": "App Email",
1271
- "emailLoading": "Loading…",
1272
- "noResults": "No results found."
445
+ "linking": "Linking…"
1273
446
  },
1274
447
  "device": {
1275
448
  "title": "Hearing Devices",
1276
- "titleInUse": "Devices in use",
1277
449
  "addTooltip": "Add New",
1278
450
  "addButton": "Add device",
1279
451
  "listTooltip": "View List",
@@ -1294,245 +466,42 @@
1294
466
  "addTooltip": "Add Schedule",
1295
467
  "listTooltip": "View All",
1296
468
  "empty": "No upcoming visits",
1297
- "editTitle": " Schedule Edit",
1298
- "detailTitle": " Schedule Detail",
1299
469
  "registerTitle": " Register Schedule",
1300
- "scheduledDate": "Scheduled Date",
1301
- "memoPlaceholder": "Enter a memo for this visit.",
1302
- "visited": "Visited",
1303
- "noVisit": "No Visit",
1304
- "editButton": "Edit"
470
+ "memoPlaceholder": "Enter a memo for this visit."
1305
471
  },
1306
472
  "visitHistory": {
1307
473
  "title": "Visit History",
1308
474
  "addTooltip": "Add Visit",
1309
475
  "empty": "No visit history yet",
1310
476
  "popupTitle": " Visit History",
1311
- "memoSearch": "Search memo",
1312
- "noResults": "No matching visit records",
1313
- "noMemo": "No memo",
1314
- "visitDatetime": "Visit Date & Time",
1315
- "visitTime": "Visit Time",
1316
- "memo": "Memo",
1317
- "editTitle": " Visit Edit",
1318
- "detailTitle": " Visit Detail",
1319
- "registerTitle": " Register Visit",
1320
- "editButton": "Edit",
1321
- "statsButton": "Training Stats",
1322
- "memoPlaceholder": "Enter a visit memo.",
1323
- "noTrainingPlan": "No Plan",
1324
- "trainingPlan": "Training Plan"
477
+ "registerTitle": " Register Visit"
1325
478
  },
1326
479
  "moreItems": "more",
1327
480
  "viewAll": "View All",
1328
- "suffix": "",
1329
- "age": "{{years}}y {{months}}m",
1330
481
  "visits": {
1331
- "title": "Visits",
1332
- "badgeScheduled": "Scheduled",
1333
- "badgeVisited": "Visited",
1334
- "badgeNoShow": "No-show",
1335
- "registerTitle": " Register Visit",
1336
- "registerVisited": "Mark as visited",
1337
- "colStatus": "Status",
1338
- "saveFailed": "Failed to save visit: {{error}}",
1339
- "saveFailedGeneric": "Failed to save visit. Please try again.",
1340
- "addButton": "Add visit",
1341
- "viewTable": "Table",
1342
- "viewCalendar": "Calendar"
482
+ "title": "Visits"
1343
483
  },
1344
484
  "trainingRecord": {
1345
- "title": "Customer Training Records",
1346
- "empty": "No customer training sessions yet.",
1347
- "unitRun": " runs",
1348
- "colStartedAt": "Started",
1349
- "colStatus": "Status",
1350
- "colDone": "Solved",
1351
- "colDuration": "Duration",
1352
- "ended": "Ended",
1353
- "doneFmt": "{{done}}/{{total}}",
1354
- "kindLabel": "Training kind",
1355
- "sentence": "Sentences",
1356
- "table": "Word tables",
1357
- "pairTable": "Word pair tables"
1358
- },
1359
- "link": {
1360
- "title": "Link App Member",
1361
- "connectTitle": "Link Existing Account",
1362
- "emailLabel": "Email",
1363
- "emailPlaceholder": "Enter email",
1364
- "inviteTitle": "Send Invite Link",
1365
- "inviteLinkLabel": "Invite Link",
1366
- "linking": "Linking…",
1367
- "link": "Link",
1368
- "linkSuccess": "{{name}} linked",
1369
- "linkPending": "Request sent. The member will be linked once they accept.",
1370
- "defaultMemberName": "member",
1371
- "linkError": "Link failed",
1372
- "inviteLoading": "Generating link…",
1373
- "inviteError": "Unable to load link",
1374
- "copied": "Copied ✓",
1375
- "copy": "Copy",
1376
- "inviteDesc": "Share this link with customers who don't have the app yet to let them sign up and join your organization."
485
+ "title": "Customer Training Records"
1377
486
  },
1378
487
  "status": {
1379
- "trainingSubtitle": "Training Status",
1380
- "notLinkedTitle": "No statistics yet",
1381
- "notLinkedMessage": "Statistics collect the training this customer does on their own in the Malgwi app. They appear here once the customer is linked to a member account.",
1382
- "notLinkedHint": "Training done here together is in the Training tab. Link the customer from the invite link on the Profile tab."
488
+ "trainingSubtitle": "Training Status"
1383
489
  },
1384
- "viewStatus": "View Status",
1385
- "linkMember": "Link Member",
1386
490
  "detail": {
1387
- "statsSub": "The customer's training records by period",
1388
- "deleteConfirm": "Delete customer '{{name}}'? Their visit history, homework, and link will also be deleted and this cannot be undone.",
1389
- "inviteLink": {
1390
- "loading": "Generating link…",
1391
- "copied": "Copied ✓",
1392
- "send": "Send Invite Link"
1393
- },
1394
491
  "session": {
1395
- "inProgress": "In progress",
1396
- "completedFmt": "Done {{done}}/{{total}} · {{duration}}",
1397
- "forceEnd": "End",
1398
- "forceEndConfirm": "This session is still marked active, likely due to a refresh or device issue. Force-end it now? Until it ends, this customer cannot sign in to their own account.",
1399
- "forceEndTitle": "Force end session"
492
+ "completedFmt": "Done {{done}}/{{total}} · {{duration}}"
1400
493
  },
1401
- "visitSuffix": " visits",
1402
- "deleteTitle": "Delete customer",
1403
- "tabs": {
1404
- "info": "Profile",
1405
- "record": "Training details",
1406
- "groupLabel": "Customer detail view",
1407
- "visit": "Visits",
1408
- "device": "Devices",
1409
- "homework": "Homework",
1410
- "stats": "Training dashboard"
1411
- },
1412
- "editCustomer": "Edit customer info",
1413
- "deleteCustomer": "Delete customer",
1414
- "startTraining": "Start training",
1415
- "startTrainingBusy": "A customer training session is already in progress",
1416
- "startTrainingTitle": "Start training",
1417
- "startTrainingSub": "Choose the training to do with {{name}}",
1418
- "startTrainingNoPlan": "No training plans yet. Create a training plan first.",
1419
- "startTrainingItems": "{{count}} items",
1420
- "startTrainingGo": "Start",
1421
- "startTrainingNoSuchPlan": "Training plan not found.",
1422
- "startTrainingFailed": "Could not start the customer training session.",
1423
- "startTrainingUnit": "",
1424
- "startTrainingSearch": "Search plan name",
1425
- "startTrainingNoMatch": "No training plan matches that name."
494
+ "visitSuffix": " visits"
1426
495
  },
1427
- "csvFilename": "customers.csv",
1428
496
  "homework": {
1429
497
  "active": "Active",
1430
498
  "copied": "Link copied.",
1431
499
  "copy": "Copy Link",
1432
- "send": "Send homework",
1433
- "sendSub": "Choose the training to send to {{name}}",
1434
- "sendGo": "Send",
1435
- "sent": "Homework sent to {{name}}.",
1436
- "deactivate": "Deactivate",
1437
- "done_one": "Completed {{count}} time",
1438
- "done_other": "Completed {{count}} times",
1439
500
  "inactive": "Inactive",
1440
- "noLinks": "No homework links created yet.",
1441
- "notDone": "Not Completed",
1442
- "planLabel": "Training Plan",
1443
- "title": "Homework Progress",
1444
- "groupOngoing": "In progress",
1445
- "groupDone": "Done",
1446
- "personal": "Personal link",
1447
- "public": "Public link",
1448
- "linkTitle": "Link {{token}}"
1449
- }
1450
- },
1451
- "today": {
1452
- "title": "Today's Listening",
1453
- "titleYesterday": "Yesterday's Listening",
1454
- "daySwitchLabel": "Day to view",
1455
- "subtitle": "Select a topic to start listening practice.",
1456
- "badge": "{{n}} days trained",
1457
- "toast": {
1458
- "switchedToToday": "Switched to today's training.",
1459
- "switchedToYesterday": "Switched to yesterday's training."
1460
- },
1461
- "menu": {
1462
- "viewWords": "View Key Words"
1463
- },
1464
- "notice": {
1465
- "actionLink": "Go",
1466
- "actionPopup": "View Details",
1467
- "copyCoupon": "Copy coupon code",
1468
- "copyCouponDone": "Coupon code copied.",
1469
- "copyCouponFailed": "Failed to copy."
501
+ "title": "Homework Progress"
1470
502
  }
1471
503
  },
1472
504
  "payment": {
1473
- "service": {
1474
- "speechear": "Malgwi",
1475
- "manager": "Malgwi Manager"
1476
- },
1477
- "title": "Buy Subscription",
1478
- "subtitle": "Choose a Malgwi subscription plan",
1479
- "segment": {
1480
- "personal": "Malgwi",
1481
- "org": "Malgwi Manager"
1482
- },
1483
- "modal": {
1484
- "title": "Confirm Payment",
1485
- "confirmText": "Purchase the pass above?",
1486
- "confirmButton": "Pay"
1487
- },
1488
- "confirmed": "✓ Payment complete!",
1489
- "purchaseFailed": "Purchase failed.",
1490
- "error": {
1491
- "productNotFound": "Product not found.",
1492
- "invalidDuration": "The product's duration information is invalid.",
1493
- "purchaseLimitReached": "The launch special can only be purchased once per account.",
1494
- "notConfigured": "Could not load the payment module. Please try again shortly. (If it keeps happening, let our support team know.)"
1495
- },
1496
- "success": {
1497
- "title": "Confirming payment",
1498
- "checking": "Confirming your payment. Please wait a moment.",
1499
- "done": "Payment complete. Activate your pass from the usage page.",
1500
- "subscriptionDelayed": "Your payment was completed, but applying the pass is delayed. If it doesn't appear on the usage page, please contact support.",
1501
- "error": "Something went wrong while confirming your payment. Please contact support.",
1502
- "goToUsage": "Go to usage"
1503
- },
1504
- "fail": {
1505
- "title": "Payment failed.",
1506
- "retry": "Try again",
1507
- "back": "Back to purchase"
1508
- },
1509
- "managerGate": {
1510
- "title": "Malgwi Manager registration required",
1511
- "message": "Malgwi Manager passes can be purchased after registering as a Malgwi Manager. Please register first.",
1512
- "register": "Register as Manager"
1513
- },
1514
- "faq": {
1515
- "title": "Have any\nquestions?",
1516
- "contactButton": "Contact Us",
1517
- "items": [
1518
- {
1519
- "q": "Can I cancel at any time?",
1520
- "a": "Yes, all plans can be cancelled without commitment. Annual subscriptions qualify for a full refund within 14 days; monthly within 3 days of sign-up."
1521
- },
1522
- {
1523
- "q": "How are refunds processed?",
1524
- "a": "Refund requests can be submitted via Customer Support or Account > Payment, and are processed within 3–5 business days."
1525
- },
1526
- {
1527
- "q": "How do I change my payment method?",
1528
- "a": "Payment methods can be added or changed in Account Settings > Payment Info. Your card is encrypted and stored securely."
1529
- },
1530
- {
1531
- "q": "Is corporate/group payment available?",
1532
- "a": "Yes. For corporate plans or separate invoicing, please contact us via the Company Info page or Customer Support."
1533
- }
1534
- ]
1535
- },
1536
505
  "plan": {
1537
506
  "recommendedFor": "Recommended for",
1538
507
  "features": "Key Features",
@@ -1542,230 +511,10 @@
1542
511
  "openPromo": "Launch offer"
1543
512
  },
1544
513
  "products": {
1545
- "discount50": "50% OFF",
1546
- "free": {
1547
- "title": "Free",
1548
- "quote": "Open to everyone",
1549
- "tier": "Free",
1550
- "subtitle": "Try the basic features for free. Some features may be limited.",
1551
- "recommendedFor": [
1552
- "Users who want to try the service first",
1553
- "Individuals who only need basic features"
1554
- ],
1555
- "features": [
1556
- "Basic listening training",
1557
- "Access to some topic content",
1558
- "Basic statistics"
1559
- ],
1560
- "tiers": {
1561
- "basic": {
1562
- "label": "Free"
1563
- }
1564
- }
1565
- },
1566
- "standard": {
1567
- "title": "Malgwi Standard",
1568
- "tier": "Standard",
1569
- "quote": "All Malgwi features!",
1570
- "cardBadge": "Recommended",
1571
- "subtitle": "A paid plan that gives unlimited access to all Malgwi content.",
1572
- "recommendedFor": [
1573
- "Individual users",
1574
- "Service users / customers"
1575
- ],
1576
- "features": [
1577
- "Today's listening training",
1578
- "Topic-based listening",
1579
- "Listening training through games"
1580
- ],
1581
- "tiers": {
1582
- "monthly30": {
1583
- "label": "30-Day Plan",
1584
- "price": "₩15,000"
1585
- },
1586
- "yearly30": {
1587
- "price": "₩180,000"
1588
- },
1589
- "openMonthly30": {
1590
- "label": "Open Special 30-Day Plan",
1591
- "price": "₩7,500"
1592
- },
1593
- "openYearly30": {
1594
- "price": "₩90,000"
1595
- },
1596
- "yearly": {
1597
- "label": "1-Year Plan"
1598
- },
1599
- "yearlyPrice": "₩90,000",
1600
- "yearlyOriginal": "₩180,000"
1601
- }
1602
- },
1603
- "mgrFree": {
1604
- "title": "Free",
1605
- "quote": "Open to everyone",
1606
- "tier": {
1607
- "label": "Free",
1608
- "price": "₩0"
1609
- },
1610
- "subtitle": "For those starting out with Malgwi Manager",
1611
- "recommendedFor": [
1612
- "Solo operators managing a few clients",
1613
- "Those who want to try the features first"
1614
- ],
1615
- "features": [
1616
- "Manage up to 3 clients",
1617
- "Basic training assignment",
1618
- "View training results"
1619
- ]
1620
- },
1621
- "mgrStandard": {
1622
- "title": "Standard",
1623
- "tier": "Standard",
1624
- "subtitle": "For operators actively managing clients",
1625
- "recommendedFor": [
1626
- "Growing centers and classrooms",
1627
- "Those managing multiple clients regularly"
1628
- ],
1629
- "features": [
1630
- "Manage up to 30 clients",
1631
- "Conversation & training history",
1632
- "Basic reports",
1633
- "Word/sentence data management"
1634
- ],
1635
- "tiers": {
1636
- "monthly30": {
1637
- "label": "30-Day Plan",
1638
- "price": "₩20,000"
1639
- },
1640
- "yearly30": {
1641
- "price": "₩240,000"
1642
- },
1643
- "openMonthly30": {
1644
- "label": "Open Special 30-Day Plan",
1645
- "price": "₩10,000"
1646
- },
1647
- "openYearly30": {
1648
- "price": "₩120,000"
1649
- },
1650
- "yearly": {
1651
- "label": "1-Year Plan"
1652
- },
1653
- "yearlyPrice": "₩120,000",
1654
- "yearlyOriginal": "₩240,000"
1655
- },
1656
- "quote": "For serious operations"
1657
- },
1658
- "mgrPro": {
1659
- "title": "Pro",
1660
- "tier": "Pro",
1661
- "quote": "For professional institutions",
1662
- "cardBadge": "Recommended",
1663
- "subtitle": "All features including advanced analytics.",
1664
- "recommendedFor": [
1665
- "Institutions managing many clients",
1666
- "Professionals who need advanced analytics"
1667
- ],
1668
- "features": [
1669
- "Unlimited clients",
1670
- "Advanced statistics & reports",
1671
- "Auto-classification of repeated questions/issues",
1672
- "Custom training plans",
1673
- "Priority support"
1674
- ],
1675
- "tiers": {
1676
- "monthly30": {
1677
- "label": "30-Day Plan",
1678
- "price": "₩30,000"
1679
- },
1680
- "yearly30": {
1681
- "price": "₩360,000"
1682
- },
1683
- "openMonthly30": {
1684
- "label": "Open Special 30-Day Plan",
1685
- "price": "₩15,000"
1686
- },
1687
- "openYearly30": {
1688
- "price": "₩180,000"
1689
- },
1690
- "yearly": {
1691
- "label": "1-Year Plan"
1692
- },
1693
- "yearlyPrice": "₩180,000",
1694
- "yearlyOriginal": "₩360,000"
1695
- }
1696
- },
1697
514
  "mgrEnterprise": {
1698
- "title": "Enterprise",
1699
- "quote": "For multi-site organizations",
1700
- "subtitle": "Large institutions & custom rollout",
1701
- "recommendedFor": [
1702
- "Multi-site / large institutions",
1703
- "Those needing custom features or contracts"
1704
- ],
1705
- "features": [
1706
- "Everything in Pro",
1707
- "Multi-account / multi-site management",
1708
- "Custom feature development",
1709
- "Dedicated support & separate billing"
1710
- ],
1711
515
  "tier": {
1712
- "label": "Custom quote",
1713
516
  "price": "Contact us"
1714
517
  }
1715
- },
1716
- "mgrLight": {
1717
- "title": "Light",
1718
- "tier": "Light",
1719
- "subtitle": "A practical starting plan for small-scale operators.",
1720
- "recommendedFor": [
1721
- "Solo operators managing a small group",
1722
- "Those considering upgrading features"
1723
- ],
1724
- "features": [
1725
- "Manage up to 10 clients",
1726
- "Training assignment & result view",
1727
- "Basic history storage"
1728
- ],
1729
- "tiers": {
1730
- "monthly30": {
1731
- "label": "30-Day Plan",
1732
- "price": "₩10,000"
1733
- },
1734
- "yearly30": {
1735
- "price": "₩120,000"
1736
- },
1737
- "openMonthly30": {
1738
- "label": "Open Special 30-Day Plan",
1739
- "price": "₩5,000"
1740
- },
1741
- "openYearly30": {
1742
- "price": "₩60,000"
1743
- },
1744
- "yearly": {
1745
- "label": "1-Year Plan"
1746
- },
1747
- "yearlyPrice": "₩60,000",
1748
- "yearlyOriginal": "₩120,000"
1749
- },
1750
- "quote": "For a small start"
1751
- }
1752
- },
1753
- "refund": {
1754
- "period": {
1755
- "title": "Refund Request Period",
1756
- "body": "Refunds are available only if requested within 3 days of purchase. Requests made after this period are generally not eligible."
1757
- },
1758
- "process": {
1759
- "title": "Refund Processing Method & Time",
1760
- "body": "Approved refunds are processed within 7–10 business days via the original payment method. Actual timing may vary by payment method or financial institution."
1761
- },
1762
- "company": {
1763
- "title": "Refunds Due to Company Fault",
1764
- "body": "If an issue arises from service failure, system error, or a major defect, a refund may be issued at the company's discretion regardless of the refund period."
1765
- },
1766
- "other": {
1767
- "title": "Other Matters",
1768
- "body": "Matters not specified in this refund policy are governed by applicable laws and company's internal operating policies."
1769
518
  }
1770
519
  }
1771
520
  },
@@ -1793,76 +542,19 @@
1793
542
  }
1794
543
  },
1795
544
  "visits": {
1796
- "title": "Visit History",
1797
- "subtitle": "Check monthly visit schedules",
1798
545
  "unitVisit": "",
1799
546
  "periodAll": "All",
1800
- "showN": "Show {{n}}",
1801
- "empty": "No visit records.",
1802
- "loadError": "Failed to load visit records",
1803
- "loadErrorDesc": "Please check your network and try again.",
1804
- "addButton": "Add Visit",
1805
- "addTitle": "Add Visit",
1806
- "form": {
1807
- "customer": "Customer",
1808
- "customerPlaceholder": "Enter customer name",
1809
- "customerSelect": "Select customer",
1810
- "visitedAt": "Visit Date & Time",
1811
- "memo": "Memo",
1812
- "memoPlaceholder": "Enter memo"
1813
- }
547
+ "showN": "Show {{n}}"
1814
548
  },
1815
549
  "company": {
1816
- "title": "Company Info",
1817
550
  "subtitle": "Manage company and business information",
1818
551
  "editButton": "Edit Info",
1819
552
  "basicInfo": {
1820
- "title": "Basic Info",
1821
- "companyId": "Company ID",
1822
- "companyName": "Company Name",
1823
- "companyType": "Company Type",
1824
- "bizNumber": "Business Registration No."
553
+ "title": "Basic Info"
1825
554
  },
1826
555
  "contactInfo": {
1827
- "title": "Contact Info",
1828
- "tel": "Phone",
1829
- "address": "Address",
1830
- "website": "Website"
1831
- },
1832
- "type": {
1833
- "operation": "Operation",
1834
- "clinic": "Clinic",
1835
- "agency": "Agency",
1836
- "partner": "Partner",
1837
- "audiologist": "Private Audiologist",
1838
- "slp": "Private SLP",
1839
- "hospital": "Hospital",
1840
- "hearing": "Hearing Aid Center",
1841
- "public": "Public Institution / Welfare / Rehab",
1842
- "university": "University / Research",
1843
- "special": "Special Education School",
1844
- "other": "Other"
1845
- },
1846
- "editPopup": {
1847
- "title": "Edit Company Info",
1848
- "submit": "Save Changes",
1849
- "zipCode": "Zip Code",
1850
- "addressPlaceholder": "Enter address.",
1851
- "addressDetail": "Address Detail",
1852
- "errors": {
1853
- "telRequired": "Please enter a phone number.",
1854
- "telFormat": "Please enter a valid phone number.",
1855
- "bizRequired": "Please enter a business registration number."
1856
- },
1857
- "addressDetailPlaceholder": "Enter detailed address."
1858
- },
1859
- "saveSuccess": "Saved.",
1860
- "saveError": "Save failed."
1861
- },
1862
- "sentenceTraining": {
1863
- "title": "Sentence Training",
1864
- "byTopic": "By Topic",
1865
- "byType": "By Type"
556
+ "title": "Contact Info"
557
+ }
1866
558
  },
1867
559
  "trainingType": {
1868
560
  "title": "Training by Type",
@@ -1961,137 +653,31 @@
1961
653
  }
1962
654
  },
1963
655
  "myWordTraining": {
1964
- "title": "My Word Training",
1965
- "subtitle": "Organize your word training.",
1966
- "comingSoon": "Word training is coming soon.",
1967
- "storeBadge": "Training Store",
1968
- "sortPlaceholder": "Sort",
1969
- "deleteGroupTitle": "Delete Group",
1970
- "deleteGroupMessage": "Items in this group will be moved to 'No Group'.",
1971
- "deleteSetConfirm": "Delete '{{name}}'?",
1972
- "deleteSetConfirmDefault": "Delete this word training?",
1973
- "sort": {
1974
- "createdAtDesc": "Date ↓",
1975
- "createdAtAsc": "Date ↑",
1976
- "nameAsc": "Name ↑",
1977
- "nameDesc": "Name ↓"
1978
- },
1979
- "toast": {
1980
- "loadError": "Failed to load the training list. Please refresh",
1981
- "renameError": "Failed to rename",
1982
- "saveError": "Failed to save",
1983
- "deleteError": "Failed to delete",
1984
- "linkCreateError": "Failed to create link. Please try again.",
1985
- "hwLinkCopied": "Link copied. Please paste it in KakaoTalk to send.",
1986
- "hwLinkCopyError": "Failed to copy link. Please check the homework manager.",
1987
- "sessionStartError": "Failed to start customer training session.",
1988
- "shareLinkError": "Failed to create share link",
1989
- "shareLinkCopied": "Link copied",
1990
- "shareLinkCreated": "Link created",
1991
- "duplicateError": "Failed to duplicate",
1992
- "unpublishError": "Failed to unpublish from store",
1993
- "unpublished": "Unpublished from store",
1994
- "groupMoveError": "Failed to move to group",
1995
- "groupAddError": "Failed to add group",
1996
- "groupDeleteError": "Failed to delete group",
1997
- "sessionStarted": "Training started for {{name}}.",
1998
- "hwSms": {
1999
- "body": "Here is your word training homework.\n{{url}}"
2000
- },
2001
- "shareLinkCreating": "Creating link…"
2002
- },
2003
- "colName": "Name",
2004
- "colBirthDate": "DOB",
2005
- "colPhone": "Phone",
2006
- "sendSms": "Send via SMS",
2007
- "copyLink": "Copy Link",
2008
- "copyLinkTooltip": "Copy link (paste in KakaoTalk)",
2009
- "addCard": "Add Word Training Bundle",
2010
- "addGroup": "Add Group",
2011
- "addGroupDesc": "Enter a name for the new group.",
2012
- "cardGroupEmpty": "No cards in this group",
2013
- "cardSearchPlaceholder": "Search by card name",
2014
- "copySuffix": "{{name}} (Copy)",
2015
- "defaultDescCount": "{{count}} word trainings",
2016
- "cardsEmpty": "No word training bundles created yet.",
2017
- "create": "Add Word Training",
2018
- "empty": "No word training created yet.",
2019
- "groupEmpty": "No word training in this group",
2020
- "groupNamePlaceholder": "Group name",
2021
- "noGroup": "No Group",
2022
- "searchPlaceholder": "Search by training name",
2023
- "tab": {
2024
- "cards": "Word Training Bundles",
2025
- "training": "Word Training"
2026
- },
2027
- "totalPrefix": "",
2028
- "totalSuffix": " word trainings",
2029
- "renameCardAriaLabel": "Rename {{name}}",
2030
- "viewLabel": "View type"
656
+ "comingSoon": "Word training is coming soon."
2031
657
  },
2032
658
  "myWordTable": {
2033
- "title": "My Word Tables",
2034
- "subtitle": "Manage your saved word tables.",
2035
- "searchPlaceholder": "Search by name",
2036
659
  "colName": "Table Name",
2037
660
  "open": "Open",
2038
- "deleteConfirm": "Delete this word table?",
2039
- "addButton": "Add Table",
2040
- "deleted": "Word table deleted.",
2041
- "empty": "No saved word tables.",
2042
661
  "countSuffix": " tables",
2043
- "sort": {
2044
- "newest": "Newest",
2045
- "oldest": "Oldest",
2046
- "name": "Name",
2047
- "count": "Word count"
2048
- },
2049
- "addPairButton": "Add Contrast Pair Table",
2050
- "groupNamePlaceholder": "Group name",
2051
- "groupAddTitle": "Add Group",
2052
- "groupAddButton": "Add",
2053
- "groupNameRequired": "Please enter a group name.",
2054
- "groupNameDuplicate": "A group with this name already exists.",
2055
- "groupDeleteMessage": "Word tables in this group will be moved to 'No Group'.",
2056
- "deleteGroupConfirmTitle": "Delete the '{{group}}' group?",
2057
- "storeBadge": "Training Store",
2058
662
  "addCard": "Add Word Table Card",
2059
- "addGroup": "Add Group",
2060
663
  "cardsEmpty": "No word table cards created yet.",
2061
- "deleteGroup": "Delete Group",
2062
- "duplicated": "Word table duplicated.",
2063
- "groupEmpty": "No word tables.",
2064
664
  "menu": {
2065
- "copyLink": "Copy Link",
2066
- "deactivateLink": "Deactivate Share Link",
2067
- "duplicate": "Copy",
2068
- "openBuilder": "Edit",
2069
- "openNewTab": "Open in New Tab",
2070
665
  "publishStore": "Post to Training Store",
2071
666
  "unpublishStore": "Remove from Training Store"
2072
667
  },
2073
- "sharedBadge": "Shared",
2074
668
  "newBadge": "Newly created",
2075
- "renameGroup": "Rename Group",
2076
669
  "tab": {
2077
670
  "cards": "Word Table Cards",
2078
671
  "tables": "Word Tables"
2079
- },
2080
- "publishDefaultDesc": "{{count}} words"
672
+ }
2081
673
  },
2082
674
  "keyWords": {
2083
675
  "title": "Key Words",
2084
- "empty": "No key words available.",
2085
- "tableTitle": "'{{name}}' Key Word Table",
2086
- "print": "Print",
2087
- "saveToMyTable": "Save to My Tables",
2088
- "saved": "Saved to My Tables.",
2089
- "wordTableName": "{{name}} Key Words"
676
+ "empty": "No key words available."
2090
677
  },
2091
678
  "wordTable": {
2092
679
  "defaultName": "Word Table",
2093
680
  "title": "Word Table Builder",
2094
- "createTitlePair": "Compose Contrast Pair Table",
2095
681
  "subtitle": "Set columns and add words to build a table.",
2096
682
  "filterTitle": "Table Settings",
2097
683
  "filter": {
@@ -2169,21 +755,11 @@
2169
755
  "empty": "No word tables in this card."
2170
756
  },
2171
757
  "toast": {
2172
- "loadError": "Failed to load the word table list. Please refresh",
2173
758
  "renameError": "Failed to rename",
2174
759
  "saveError": "Failed to save",
2175
760
  "deleteError": "Failed to delete",
2176
- "shareLinkError": "Failed to create link",
2177
- "shareLinkCopied": "Link copied",
2178
- "shareLinkCreated": "Link created",
2179
- "shareLinkDeactivated": "Share link deactivated.",
2180
- "shareLinkDeactivateError": "Failed to deactivate share link.",
2181
- "customWordNotShareable": "This contains words you added yourself, so it cannot be shared -- others do not have them.",
2182
761
  "duplicateError": "Failed to duplicate",
2183
- "unpublishError": "Failed to remove from Training Store",
2184
- "unpublished": "Removed from Training Store",
2185
- "saveSuccess": "Word table saved.",
2186
- "shareLinkCreating": "Creating link…"
762
+ "saveSuccess": "Word table saved."
2187
763
  },
2188
764
  "scoring": {
2189
765
  "o": "{{word}} correct",
@@ -2212,42 +788,15 @@
2212
788
  }
2213
789
  },
2214
790
  "wordSearch": {
2215
- "editTitle": "Edit '{{name}}'",
2216
791
  "editBanner": {
2217
792
  "message": "Saving will update the word table you're editing."
2218
793
  },
2219
- "subtitle": "Select filters to search for words.",
2220
794
  "filterTitle": "Word Search Settings",
2221
- "searchOptionsTitle": "Search Options",
2222
795
  "filter": {
2223
- "wordInput": "Word Input",
2224
- "wordInputShort": "Input",
2225
- "wordInputInfo": [
2226
- "Finds words containing the full syllables you type. A syllable typed without a final consonant matches any final (수 → 수·술·숙·순…).",
2227
- "Mix syllables and phonemes in one search. [ㄱ수 → any word containing a syllable with initial 'ㄱ' immediately followed by '수' — 국수·검수…]",
2228
- "Use commas (,) to separate syllable positions. Each position can be a full syllable or a single consonant/vowel; leave it empty for unconstrained. ['가,ㄴ,,다' → any word containing '가' · initial 'ㄴ' · any · '다' in a row]",
2229
- "Use underscores (_) for initial/medial/final positions ('_' = unconstrained; trailing positions may be omitted). ['ㄱ_' → words containing a syllable with initial 'ㄱ' / '_ㅏ' → medial 'ㅏ' / '__ㄱ,고' → a syllable with final 'ㄱ' immediately followed by '고']"
2230
- ],
2231
- "wordPlaceholder": "Enter characters",
2232
- "wordInputError": "Invalid input format. Use only complete characters, consonants/vowels, or the '__ㄱ' (onset·nucleus·coda) template.",
2233
- "wordInputUsageLabel": "Usage",
2234
- "viewChar": "Choose Letters",
2235
- "viewPron": "Choose Sound",
2236
- "viewDirect": "Type Letters",
2237
- "inputMode": "Input mode",
2238
- "phonemeCho": "Initial",
2239
- "phonemeJung": "Vowel",
2240
- "phonemeJong": "Final",
2241
- "phonemePosition": "Position",
2242
796
  "positionAny": "Any",
2243
797
  "positionHead": "Start",
2244
798
  "positionMid": "Middle",
2245
799
  "positionTail": "End",
2246
- "phonemeModeInfo": [
2247
- "Find words by initial, vowel, or final consonant alone — no typing needed.",
2248
- "Selecting multiple values matches any one of them.",
2249
- "Narrowing position to Start/Middle/End checks only that syllable (first, middle, or last)."
2250
- ],
2251
800
  "difficulty": "Grade",
2252
801
  "grade": "Grade {{n}}",
2253
802
  "syllables": "Syllables",
@@ -2267,10 +816,7 @@
2267
816
  "mixed": "Hybrid"
2268
817
  },
2269
818
  "exclude": "Exclude",
2270
- "excludeNoImage": "No Image",
2271
- "selectLabel": "Select",
2272
- "onlyHasImage": "Only words with images",
2273
- "onlyHasImageInfo": "Only words with images: keeps only results with a registered word image."
819
+ "excludeNoImage": "No Image"
2274
820
  },
2275
821
  "searchButton": "Search",
2276
822
  "resultUnit": "words",
@@ -2279,7 +825,6 @@
2279
825
  "resultTitlePrefix": "",
2280
826
  "resultTitleSuffix": " {{unit}} found.",
2281
827
  "emptyResult": "No results found.",
2282
- "emptyMidNeedsThree": "There is no word-medial position in the syllable counts you picked — it only exists from 3 syllables up. Try 3+ syllables, or switch the position to initial or final.",
2283
828
  "groupCount": "{{count}}",
2284
829
  "sort": {
2285
830
  "aria": "Sort",
@@ -2293,55 +838,12 @@
2293
838
  },
2294
839
  "pageSize": "Show {{count}}",
2295
840
  "pageSizeAria": "Page size",
2296
- "loadError": "Failed to load word data. Please refresh.",
2297
- "loadErrorButton": "Failed to load data — Refresh",
2298
- "checkingImages": "Checking images…",
2299
- "maxSelectReached": "Cannot select more.",
2300
- "printBlockTitle": "Word Table Preview",
2301
841
  "popup": {
2302
842
  "title": "Select a word for cell {{n}}"
2303
- },
2304
- "title": "Create Word Table",
2305
- "imageFilterOn": "Showing only words that have an image — about 7% of all words have one, and roughly one in four at level 1. Turn that option off in Search options to see more."
2306
- },
2307
- "wordManagement": {
2308
- "title": "Word Management",
2309
- "subtitle": "Review all words in a table, exclude individual words, or add new ones to build your own word pool.",
2310
- "noSelection": "None",
2311
- "gradeSuffix": "grade",
2312
- "includeInSearch": "Include in search",
2313
- "searchPlaceholder": "Search word or pronunciation",
2314
- "add": "Add Word",
2315
- "addTitle": "Add Word",
2316
- "addConfirm": "Add",
2317
- "listTitle": "Word List",
2318
- "empty": "No matching words.",
2319
- "removeAdded": "Delete",
2320
- "addedBadge": "Added",
2321
- "view": {
2322
- "all": "All",
2323
- "excluded": "Excluded",
2324
- "added": "Added"
2325
- },
2326
- "col": {
2327
- "exclude": "Exclude",
2328
- "word": "Word",
2329
- "pron": "Pronunciation",
2330
- "colloquialPron": "Colloquial Pronunciation",
2331
- "grade": "Grade",
2332
- "pos": "POS",
2333
- "wordType": "Type",
2334
- "meaning": "Meaning"
2335
- },
2336
- "toast": {
2337
- "duplicate": "This word already exists.",
2338
- "added": "Word added."
2339
- },
2340
- "viewLabel": "View type"
843
+ }
2341
844
  },
2342
845
  "wordPrint": {
2343
846
  "clearAllSelection": "Clear All Selections",
2344
- "scrollToTable": "Go to Word Table",
2345
847
  "divLine": "Contrast Line",
2346
848
  "removePair": "Remove pair",
2347
849
  "removeWord": "Remove word"
@@ -2408,46 +910,6 @@
2408
910
  "GESPKL": "Sports Facts"
2409
911
  }
2410
912
  },
2411
- "passwordExpiry": {
2412
- "title": "Password Change Required",
2413
- "subtitleMustChange": "You signed in with a temporary password issued by an administrator. You must set a new password to continue.",
2414
- "subtitleExpired": "Your password has expired per security policy. You must set a new password to continue.",
2415
- "currentPassword": "Current Password",
2416
- "newPassword": "New Password",
2417
- "confirmPassword": "Confirm New Password",
2418
- "changing": "Changing…",
2419
- "submit": "Change Password",
2420
- "error": {
2421
- "currentRequired": "Please enter your current password.",
2422
- "mismatch": "New passwords do not match.",
2423
- "sameAsCurrent": "Please use a different password from your current one.",
2424
- "reused": "You can't reuse a recently used password.",
2425
- "reusedWithCount": "You can't reuse your last {{count}} passwords.",
2426
- "tooShort": "Password is too short.",
2427
- "currentIncorrect": "Current password is incorrect.",
2428
- "unauthorized": "Please sign in again.",
2429
- "unknown": "Failed to change your password. Please try again in a moment."
2430
- }
2431
- },
2432
- "feedbackWidget": {
2433
- "memoLabel": "Feedback message",
2434
- "reportBug": "Report a bug",
2435
- "title": "Send feedback",
2436
- "cropHint": "Drag to select an area · click to capture the whole screen",
2437
- "captureFull": "Capture all",
2438
- "memoPlaceholder": "Describe the issue",
2439
- "memoPlaceholderOptional": "Briefly describe the issue (optional)",
2440
- "retake": "Retake",
2441
- "addScreenshot": "Add screenshot",
2442
- "send": "Send",
2443
- "sending": "Sending…",
2444
- "sent": "✓ Sent!",
2445
- "captureError": "An error occurred while capturing.",
2446
- "sendFailed": "Failed to send",
2447
- "errorPrefix": "Error",
2448
- "menuCapture": "Capture screenshot",
2449
- "menuTextOnly": "Text only"
2450
- },
2451
913
  "accessLinkManager": {
2452
914
  "maxUses": "Max uses (leave blank for unlimited)",
2453
915
  "redirect": "Redirect URL (leave blank for app home)",
@@ -2470,178 +932,10 @@
2470
932
  "inactive": "Inactive"
2471
933
  }
2472
934
  },
2473
- "wordRecommend": {
2474
- "title": "Word suggestions"
2475
- },
2476
- "subscriptionExpiry": {
2477
- "scope": {
2478
- "user": "Your pass",
2479
- "org": "Your organization pass"
2480
- },
2481
- "expired": {
2482
- "title": "{{scope}} has expired",
2483
- "message": "{{plan}} (ended {{date}}) — purchase a pass to keep using it."
2484
- },
2485
- "today": {
2486
- "title": "{{scope}} expires today"
2487
- },
2488
- "tomorrow": {
2489
- "title": "{{scope}} expires tomorrow"
2490
- },
2491
- "soon": {
2492
- "title": "{{scope}} expires in {{days}} days",
2493
- "message": "{{plan}} ends on {{date}}. Purchase a pass before it expires."
2494
- },
2495
- "action": "Buy a pass"
2496
- },
2497
- "customerTrainingBanner": {
2498
- "inProgress": "Training with {{name}}",
2499
- "endFailed": "Couldn't end the session. Please try again.",
2500
- "ending": "Ending…",
2501
- "end": "End Training",
2502
- "endConfirm": "End this training session? It will be recorded in the visit history.",
2503
- "endConfirmTitle": "End session"
2504
- },
2505
935
  "login": {
2506
- "tab": {
2507
- "login": "Sign In",
2508
- "signup": "Sign Up"
2509
- },
2510
- "email": "Email",
2511
- "username": "Username",
2512
- "password": "Password",
2513
- "passwordPlaceholder": "Enter password",
2514
- "confirmPassword": "Confirm Password",
2515
- "submitSignup": "Sign Up",
2516
- "processing": "Processing…",
2517
- "signupSuccess": "A confirmation email has been sent. Please check your inbox.",
2518
- "backToLogin": "Back to sign in",
2519
- "resetPassword": {
2520
- "link": "Forgot password?",
2521
- "title": "Reset Password",
2522
- "desc": "Enter the email address you signed up with and we'll send you a password reset link.",
2523
- "button": "Send reset link",
2524
- "success": "A reset link has been sent to your email.\nPlease check your inbox.",
2525
- "failed": "Failed to send the reset link. Please try again later."
2526
- },
2527
- "error": {
2528
- "emailRequired": "Please enter your email.",
2529
- "signupDisabled": "Self sign-up is currently disabled. Please join through an invitation.",
2530
- "lockedWithMinutes": "Your account is locked after {{count}} failed sign-in attempts. Try again in {{minutes}} minutes.",
2531
- "lockedContactAdmin": "Your account is locked after {{count}} failed sign-in attempts. Please contact an administrator.",
2532
- "attemptsLeft": "{{message}} ({{count}} attempts left)",
2533
- "passwordRequired": "Please enter your password.",
2534
- "usernameRequired": "Please enter a username.",
2535
- "passwordMinLength": "Password must be at least 6 characters.",
2536
- "passwordMinLengthN": "Password must be at least {{n}} characters.",
2537
- "passwordMismatch": "Passwords do not match.",
2538
- "invalidCredentials": "Incorrect email or password.",
2539
- "emailNotConfirmed": "Email verification is not complete. Please check your inbox.",
2540
- "invalidEmailFormat": "Invalid email format.",
2541
- "termsRequired": "Please agree to the Terms of Use.",
2542
- "privacyRequired": "Please agree to the Privacy Policy.",
2543
- "emailFormat": "This is not a valid email format.",
2544
- "usernameMaxLength": "Username must be at most 12 characters.",
2545
- "serviceUnavailable": "Can't reach the service right now. Please try again shortly, and contact an administrator if it continues.",
2546
- "unknown": "Sign-in failed. Please try again shortly, and contact an administrator if it continues."
2547
- },
2548
- "agreement": {
2549
- "termsTitle": "Terms of Use",
2550
- "privacyTitle": "Privacy Policy",
2551
- "termsLabel": "I agree to the Terms of Use.",
2552
- "privacyLabel": "I agree to the Privacy Policy.",
2553
- "view": "View",
2554
- "loadError": "Failed to load the document."
2555
- },
2556
- "resetPage": {
2557
- "title": "Reset Password",
2558
- "sessionChecking": "Checking session…",
2559
- "accessDenied": "This page can only be accessed via the reset link in your email. If the link has expired, please request a new one.",
2560
- "newPassword": "New password",
2561
- "confirmPassword": "Confirm new password",
2562
- "mismatch": "Passwords do not match.",
2563
- "reused": "You cannot reuse your last {{count}} passwords.",
2564
- "submit": "Reset password",
2565
- "submitting": "Resetting…",
2566
- "done": "Your password has been reset. Please go to the homepage and sign in again.",
2567
- "goHome": "Go to homepage"
2568
- },
2569
- "emailPlaceholder": "Enter your email",
2570
- "passwordNewPlaceholder": "Enter your password",
2571
- "usernamePlaceholder": "Enter your username",
2572
- "orDivider": "or",
2573
- "kakaoStart": "Continue with Kakao"
2574
- },
2575
- "kakaoLink": {
2576
- "title": "Kakao login linked",
2577
- "messageWithEmail": "Kakao login was added to {{email}}. You can now sign in either way.",
2578
- "message": "Kakao login was added to your existing account with the same email. You can now sign in either way.",
2579
- "keep": "OK",
2580
- "unlink": "Unlink",
2581
- "unlinkFailed": "Could not unlink."
2582
- },
2583
- "agreementGate": {
2584
- "title": "Agreement required",
2585
- "subtitle": "Please agree to the Terms of Use and Privacy Policy to continue using the service.",
2586
- "submit": "Agree and continue",
2587
- "processing": "Processing…",
2588
- "error": "Failed to save your agreement. Please try again later."
2589
- },
2590
- "addressSearch": {
2591
- "title": "Address Search",
2592
- "loadError": "Failed to load Daum Postcode script"
2593
- },
2594
- "trainingPlan": {
2595
- "addTitle": "Add Training Bundle",
2596
- "editTitle": "Edit Training Bundle",
2597
- "nameLabel": "Training Bundle Name",
2598
- "namePlaceholder": "Enter training bundle name",
2599
- "basketLabel": "Selected Training",
2600
- "selectLabel": "Select Training",
2601
- "customerSelect": "Select Customers",
2602
- "tab": {
2603
- "byTopic": "By Topic",
2604
- "byType": "By Type"
2605
- },
2606
- "toast": {
2607
- "maxItems": "You can select up to 10 items per training type.",
2608
- "noItemsToAdd": "No items available to add."
2609
- },
2610
- "descLabel": "Description",
2611
- "descPlaceholder": "Briefly describe this training (optional)",
2612
- "copyLink": "Copy Link",
2613
- "removeLink": "Remove Link",
2614
- "linkCopied": "Link copied.",
2615
- "linkCreated": "Link created.",
2616
- "linkRemoved": "Link removed.",
2617
- "linkCreating": "Creating…",
2618
- "linkError": "Failed to create link.",
2619
- "linkSaveFirst": "Please save the training bundle first.",
2620
- "linkSaveFirstHint": "You can only create a shared link from a saved training bundle.",
2621
- "linkCopySelect": "Copy blocked — link selected. Press Ctrl/⌘+C to copy.",
2622
- "nameRequired": "Please enter a training bundle name.",
2623
- "itemRequired": "Please add at least one training item.",
2624
- "randomAdd": "Random Add",
2625
- "shareLinkLabel": "Shared Link",
2626
- "basketEmpty": "No training selected",
2627
- "basketPerTypeMax": "/ max 10 each",
2628
- "clearAll": "Clear All",
2629
- "removeLinkConfirm": {
2630
- "title": "Remove Shared Link",
2631
- "body": "Remove this shared link? It will no longer be accessible.",
2632
- "confirm": "Remove"
2633
- },
2634
- "groupLabel": "Group",
2635
- "groupPlaceholder": "Group name (optional)",
2636
- "noGroup": "No Group",
2637
- "shareLink": "Create Link"
936
+ "passwordPlaceholder": "Enter password"
2638
937
  },
2639
938
  "device": {
2640
- "type": {
2641
- "hearingAid": "Hearing Aid",
2642
- "cochlearImplant": "Cochlear Implant",
2643
- "other": "Other"
2644
- },
2645
939
  "direction": {
2646
940
  "left": "L",
2647
941
  "right": "R",
@@ -2652,33 +946,17 @@
2652
946
  "brand": "Brand",
2653
947
  "fitType": "Fit Type",
2654
948
  "productName": "Product Name",
2655
- "productNamePlaceholder": "Enter product name",
2656
- "registerTitle": "Device Registration",
2657
949
  "validationError": {
2658
- "brandAndProduct": "Please enter brand and product name.",
2659
- "wornYear": "Worn year must be between {{min}} and {{max}}.",
2660
- "brand": "Choose a brand.",
2661
- "productName": "Enter a product name."
950
+ "brandAndProduct": "Please enter brand and product name."
2662
951
  },
2663
952
  "addNew": "Add New Device",
2664
953
  "selectFromList": "Select from List",
2665
- "removeDevice": "Remove",
2666
- "editTitle": "Edit device",
2667
- "editSubmit": "Save device",
2668
- "deleteSubmit": "Delete device"
954
+ "removeDevice": "Remove"
2669
955
  },
2670
956
  "manager": {
2671
957
  "stat": {
2672
958
  "totalCustomers": "Total Customers",
2673
- "monthlyTraining": "This Month's Training",
2674
- "monthlyVisits": "This Month's Visits",
2675
- "savedWordTables": "Saved Word Tables",
2676
- "todayVisits": "Today's Visits",
2677
- "todayVisitsEmpty": "No visits scheduled today",
2678
- "subscription": "Subscription Status",
2679
- "subscriptionRemaining": "In Use",
2680
- "subscriptionTotal": "Total",
2681
- "subscriptionHeld": "Held"
959
+ "monthlyVisits": "This Month's Visits"
2682
960
  },
2683
961
  "chart": {
2684
962
  "visitDetail": "Visit Details",
@@ -2696,9 +974,6 @@
2696
974
  "weekRange": "{{start}}–{{end}}",
2697
975
  "week": "W{{n}}"
2698
976
  },
2699
- "moreItems": "+ {{count}} more",
2700
- "headerBadge": "Pre-Open 30 days",
2701
- "greeting": "{{name}}",
2702
977
  "subscriptionStatus": {
2703
978
  "active": "{{pct}}% Active",
2704
979
  "expired": "{{pct}}% Expired",
@@ -2706,16 +981,11 @@
2706
981
  }
2707
982
  },
2708
983
  "wordPairs": {
2709
- "title": "Word Pairs",
2710
- "editTitle": "Edit '{{name}}'",
2711
984
  "editBanner": {
2712
985
  "message": "Saving will update the contrast pair table you're editing."
2713
986
  },
2714
- "subtitle": "Select phonemes to search for minimal pairs.",
2715
987
  "phonemeSelect": {
2716
988
  "title": "Phoneme Selection",
2717
- "emptySummary": "Select a phoneme.",
2718
- "needsContrast": "Select the contrast phoneme.",
2719
989
  "vs": "vs"
2720
990
  },
2721
991
  "caution": "Caution",
@@ -2754,7 +1024,6 @@
2754
1024
  "onset": "Onset",
2755
1025
  "vowel": "Vowel",
2756
1026
  "coda": "Coda",
2757
- "glide": "Glide",
2758
1027
  "filter": {
2759
1028
  "searchOptionsTitle": "Contrast Settings",
2760
1029
  "searchModeLabel": "Contrast Mode",
@@ -2766,33 +1035,15 @@
2766
1035
  "Any: the differing position doesn't matter."
2767
1036
  ],
2768
1037
  "orderAny": "Any",
2769
- "noCoda": "None",
2770
- "noCodaTip": "Find only words without a final consonant",
2771
1038
  "orderMatch": "Match",
2772
1039
  "difficultyInfo": "Reflects the National Institute of Korean Language's basic vocabulary grade.",
2773
1040
  "selectLabel": "Select",
2774
- "selectInfo": [
2775
- "Only words with images: keeps only results with a registered word image.",
2776
- "Only same phoneme structure: keeps only pairs where both words have the same syllable structure (length, batchim, etc.)."
2777
- ],
2778
1041
  "onlyHasImage": "Only words with images",
2779
- "onlySameStructure": "Only same phoneme structure",
2780
- "scopeSearchWordOnly": "Search word only"
2781
- },
2782
- "resultUnit": "pairs",
2783
- "group": {
2784
- "onset": "Onset Contrast",
2785
- "vowel": "Vowel Contrast",
2786
- "glide": "Glide Contrast",
2787
- "coda": "Coda Contrast"
2788
- },
2789
- "toast": {
2790
- "samePhonemesError": "The base phoneme and the contrast phoneme must be different."
1042
+ "onlySameStructure": "Only same phoneme structure"
2791
1043
  },
2792
1044
  "searchLabel": {
2793
1045
  "error": "Failed to load data",
2794
- "loading": "Loading…",
2795
- "checking": "Checking images"
1046
+ "loading": "Loading…"
2796
1047
  },
2797
1048
  "confirmMessage": "The word table with {{count}} selected {{unit}} will be lost.",
2798
1049
  "resetOptions": "Reset Options",
@@ -2802,118 +1053,13 @@
2802
1053
  "Initial consonant 'ㅇ' cannot be selected. ㅇ at the start of a word is effectively silent.",
2803
1054
  "If only onset and coda are selected, the vowel is automatically displayed as 'ㅏ'.",
2804
1055
  "Increasing the phoneme count searches for minimal pairs between each phoneme."
2805
- ],
2806
- "imageFilterOn": "Showing only words that have an image — a pair needs an image for both words, so far fewer pairs remain. Turn that option off in Search options to see more."
1056
+ ]
2807
1057
  },
2808
1058
  "game": {
2809
- "title": "Games",
2810
- "subtitle": "Train your listening with fun games",
2811
- "scoreSaveFailed": "Failed to save your score. Please try again.",
2812
- "endsIn": "Ends in {{days}}d {{hours}}h",
2813
- "bestScore": "Best Score",
2814
- "totalScore": "Total score",
2815
- "rank": "Rank",
2816
- "leaderboard": {
2817
- "title": "Ranking",
2818
- "loading": "Loading the ranking…",
2819
- "empty": "No scores yet. Be the first!",
2820
- "unavailable": "Couldn't load the ranking. Try reopening in a moment.",
2821
- "me": "You",
2822
- "anonymous": "Anonymous",
2823
- "score": "{{score}} pts",
2824
- "chase": "{{points}} more points to reach #{{rank}}.",
2825
- "top": "You're #1! Now defend it."
2826
- },
2827
- "crossword": {
2828
- "title": "Crossword Puzzle",
2829
- "desc": "Listen to each word and fill the grid with letter tiles.",
2830
- "tip1": "Tap a numbered square to hear the word that goes there (both in turn if it starts two).",
2831
- "tip2": "Tap the letter tiles below to fill the blanks",
2832
- "tip3": "Fill in all cells, then tap 'Check answer' to see your result",
2833
- "scoreTitle": "Scoring",
2834
- "score1": "10 points per correct cell, nothing deducted for wrong ones.",
2835
- "score2": "Speed and difficulty don't raise it.",
2836
- "score3": "Rounds add up, so the more you play the higher you climb.",
2837
- "playHint": "Tap a numbered square to hear the word there. (If a square has two numbers, in the order you tap.)",
2838
- "pickCellFirst": "Pick a square to fill first. Squares with a number play the word for that spot. (Two numbers: in the order you tap them.)",
2839
- "levelIntro": "Pick a difficulty and get a fresh puzzle every time.",
2840
- "wordsLoading": "Loading words…",
2841
- "alertNoPuzzle": "Could not build a puzzle. Please try again.",
2842
- "level": {
2843
- "basic": "Basic",
2844
- "intermediate": "Intermediate",
2845
- "advanced": "Advanced"
2846
- },
2847
- "levelDesc": {
2848
- "basic": "Start with easy words",
2849
- "intermediate": "A bit more challenging",
2850
- "advanced": "The hardest words"
2851
- },
2852
- "alertFillAll": "Please fill in all cells.",
2853
- "undo": "↩ Undo",
2854
- "checkAnswer": "✓ Check",
2855
- "cellEmpty": "empty",
2856
- "cellCorrect": "correct",
2857
- "cellWrong": "wrong",
2858
- "hintLabel": "{{label}} {{number}}",
2859
- "horizontal": "Across",
2860
- "vertical": "Down"
2861
- },
2862
- "reflex": {
2863
- "title": "Reflex Game",
2864
- "desc": "Listen and quickly click the correct word.",
2865
- "roundCount": "{{total}} rounds · {{timeLimit}}s each",
2866
- "tip1": "Click the correct answer from 4 choices when you hear the word",
2867
- "tip2": "Click the question to hear the word again",
2868
- "tip3": "Answer within {{timeLimit}} seconds",
2869
- "accuracy": "{{pct}}% accuracy",
2870
- "avgTime": "avg {{time}}s",
2871
- "timeout": "(timeout)",
2872
- "correctMsg": "✓ Correct! {{time}}s",
2873
- "wrongMsg": "✗ Answer: {{word}}"
2874
- },
2875
- "typing": {
2876
- "title": "Word Typing",
2877
- "desc": "Listen and type the word within the time limit.",
2878
- "roundCount": "{{rounds}} rounds · {{timeLimit}}s each",
2879
- "placeholder": "Type the word you heard",
2880
- "tip1": "Listen and type the word within the time limit",
2881
- "tip2": "Tap 'Listen again' to hear the word again",
2882
- "tip3": "Press Enter or the Confirm button to submit",
2883
- "accuracy": "{{pct}}% accuracy",
2884
- "notEntered": "(not entered)",
2885
- "correctMsg": "✓ Correct!",
2886
- "wrongMsg": "✗ Answer: {{word}}"
2887
- },
2888
1059
  "sentenceTyping": {
2889
- "title": "Sentence Typing",
2890
- "desc": "Listen and type the sentence within the time limit.",
2891
- "roundCount": "{{rounds}} rounds · {{timeLimit}}s each",
2892
- "placeholder": "Type the sentence you heard",
2893
- "tip1": "Listen and type the sentence within the time limit",
2894
- "tip2": "Tap 'Listen again' to hear the sentence again",
2895
- "tip3": "Press Enter or the Confirm button to submit"
1060
+ "roundCount": "{{rounds}} rounds · {{timeLimit}}s each"
2896
1061
  },
2897
1062
  "wordDefense": {
2898
- "inputLabel": "Type the word you heard",
2899
- "title": "Word Defense",
2900
- "desc": "Type incoming words to defeat them.",
2901
- "introTitle": "Space Defense",
2902
- "introDesc": "A word plays whenever an alien appears.",
2903
- "introDesc2": "Type the word you heard to defeat the alien!",
2904
- "tip1": "Click alien / Spacebar → hear the word again",
2905
- "tip2": "Aliens come from all directions",
2906
- "tip3": "The invasion speed increases over time",
2907
- "gameoverTitle": "Base Destroyed!",
2908
- "killCount": "Aliens defeated: {{count}}",
2909
- "msgPerfect": "Perfect space defense!",
2910
- "msgGood": "Well fought!",
2911
- "msgTryAgain": "Keep practicing!",
2912
- "dailyBest": "Today's Best",
2913
- "replayBtn": "Listen Again",
2914
- "energyBtn": "Use Energy",
2915
- "energyTitle": "Activate energy (Tab) — remove all enemies",
2916
- "clickToPlay": "Click to play immediately",
2917
1063
  "me": "Me"
2918
1064
  },
2919
1065
  "dictation": {
@@ -2923,32 +1069,10 @@
2923
1069
  },
2924
1070
  "result": {
2925
1071
  "heading": "Level {{number}} Answer",
2926
- "allCorrect": "Clap clap clap — All correct!",
2927
- "scoreEarned": "You scored {{score}}",
2928
- "scoreSummary": "{{correct}} of {{total}} cells correct",
2929
- "retry": "Try Again",
2930
- "next": "Next Quiz"
1072
+ "retry": "Try Again"
2931
1073
  },
2932
1074
  "common": {
2933
- "howToPlay": "How to Play",
2934
- "start": "Start",
2935
- "retry": "Play Again",
2936
- "confirm": "Confirm",
2937
- "listenAgain": "Listen Again",
2938
- "result": "Result",
2939
- "score": "Score {{score}}",
2940
- "timerSec": "{{sec}}s",
2941
- "progressFilled": "Progress — {{filled}} of {{total}} cells filled",
2942
- "roundCorrect": "Round {{n}} correct",
2943
- "roundWrong": "Round {{n}} incorrect",
2944
- "accuracy": "{{pct}}% accuracy",
2945
- "rankChecking": "Checking rank…",
2946
- "rankValue": "Rank #{{rank}}",
2947
- "bestScore": "Best {{score}} pts",
2948
- "newRecord": "New record",
2949
- "dialogIntro": "{{game}} — how to play",
2950
- "dialogResult": "{{game}} — results",
2951
- "dialogPlay": "{{game}} — in progress"
1075
+ "accuracy": "{{pct}}% accuracy"
2952
1076
  },
2953
1077
  "soundMatch": {
2954
1078
  "title": "Sound Match",
@@ -3012,147 +1136,7 @@
3012
1136
  "addressValue": "302, 3F, Haechan Bldg, 32 Siocheong-gil, Chuncheon, Gangwon, Korea"
3013
1137
  },
3014
1138
  "landing": {
3015
- "nav": {
3016
- "programs": "Programs",
3017
- "manager": "Manager",
3018
- "themes": "Training Topics",
3019
- "plans": "Pricing",
3020
- "login": "Log in",
3021
- "menuOpen": "Open menu",
3022
- "menuClose": "Close menu"
3023
- },
3024
- "hero": {
3025
- "eyebrow": "Auditory Training by Hearing Professionals",
3026
- "title": "Practice <em>hearing speech</em><br/>with programs made by<br/>hearing professionals.",
3027
- "sub": "IHAB 말귀 is an auditory training program designed to support everyday communication for hearing aid wearers, with a variety of listening scenarios and engaging content.",
3028
- "ctaPrimary": "Start for free"
3029
- },
3030
- "marquee": [
3031
- "4,460 listening contents",
3032
- "Audiology expert advisory",
3033
- "Everyday recovery for hearing aid users",
3034
- "Daily updates",
3035
- "9 topic categories",
3036
- "Noise environment simulation"
3037
- ],
3038
- "counter": {
3039
- "prefix": "A total of",
3040
- "unit": "",
3041
- "unitSuffix": "",
3042
- "suffix": "vast training contents.",
3043
- "trainingCardSuffix": " sent.",
3044
- "cap": "With 4,000+ listening contents updated daily, no two listening experiences are ever repeated.",
3045
- "chips": [
3046
- {
3047
- "num": "1,284",
3048
- "label": "Sentence listening in noise"
3049
- },
3050
- {
3051
- "num": "1,612",
3052
- "label": "Short story listening"
3053
- },
3054
- {
3055
- "num": "986",
3056
- "label": "Long story listening"
3057
- },
3058
- {
3059
- "num": "578",
3060
- "label": "Sentence ordering"
3061
- }
3062
- ]
3063
- },
3064
- "features": {
3065
- "title": "All the <em>auditory training</em> you need, <em>in one place</em>",
3066
- "sub": "From today's listening to noise training, word discrimination, and games—<br/>experience everything you need for auditory rehabilitation with 말귀.",
3067
- "items": [
3068
- {
3069
- "title": "Today's Listening",
3070
- "desc": "Fresh daily listening training to support consistent auditory rehabilitation."
3071
- },
3072
- {
3073
- "title": "Topic Training",
3074
- "desc": "Improve real-life listening ability with topics like daily life, news, and weather."
3075
- },
3076
- {
3077
- "title": "Word Training",
3078
- "desc": "Focused training to distinguish phonemes by comparing onset, vowel, and coda differences."
3079
- },
3080
- {
3081
- "title": "Listening in Noise",
3082
- "desc": "Build adaptability to clearly distinguish speech in various noise environments."
3083
- },
3084
- {
3085
- "title": "Games",
3086
- "desc": "Keep up with auditory training without getting bored through fun game formats."
3087
- },
3088
- {
3089
- "title": "Training Log",
3090
- "desc": "Track your auditory rehabilitation progress at a glance with history and statistics."
3091
- },
3092
- {
3093
- "title": "Expert Management",
3094
- "desc": "Audiologists and hearing aid centers can manage patient training settings and visit history together."
3095
- }
3096
- ]
3097
- },
3098
- "programs": {
3099
- "title": "Auditory training program designed for<br/><em>diverse listening</em> situations and <em>engagement</em>",
3100
- "sub": "Consistent auditory rehabilitation improves auditory attention and cognitive ability.",
3101
- "steps": [
3102
- {
3103
- "n": "01",
3104
- "variant": "start",
3105
- "title": "Listen",
3106
- "desc": "Training to hear sentences in real everyday noise environments"
3107
- },
3108
- {
3109
- "n": "02",
3110
- "variant": "feedback",
3111
- "title": "Remember",
3112
- "desc": "Review the sentence and check which parts you heard clearly"
3113
- },
3114
- {
3115
- "n": "03",
3116
- "variant": "done",
3117
- "title": "Confirm",
3118
- "desc": "Save accuracy and trends per session to inform the next training"
3119
- }
3120
- ]
3121
- },
3122
- "themes": {
3123
- "title": "Auditory training with <em>topics</em><br/>you're <em>interested</em> in",
3124
- "sub": "Organized by topics you encounter in everyday life so you can practice listening naturally.",
3125
- "sentenceSuffix": " sentences",
3126
- "items": {
3127
- "weather": "Weather",
3128
- "food": "Food",
3129
- "people": "People",
3130
- "koreanCulture": "Korean Culture",
3131
- "stories": "Stories",
3132
- "locations": "Locations",
3133
- "societyArts": "Society & Arts",
3134
- "natureScience": "Nature & Science",
3135
- "sports": "Sports",
3136
- "health": "Health"
3137
- }
3138
- },
3139
- "manager": {
3140
- "title": "Manager features for<br/><em>auditory training professionals</em>",
3141
- "sub": "We provide a manager page service that lets you manage customers and set up personalized auditory training.",
3142
- "footText": "Save your preferred training directly to set up your own custom preset.",
3143
- "footBtn": "Apply for 말귀 Manager"
3144
- },
3145
- "pricing": {
3146
- "title": "Enjoy all 말귀 content<br/>without limits"
3147
- },
3148
- "cta": {
3149
- "eyebrow": "Start right now",
3150
- "title": "10 minutes a day — regain<br/>confidence in daily communication.",
3151
- "sub": "Log in with your IHAB account to start training immediately<br/>with the first-visit customer preset.",
3152
- "btn": "Log in with IHAB and start 말귀"
3153
- },
3154
1139
  "trainingPhone": {
3155
- "title": "Sentence Listening in Noise",
3156
1140
  "topic": "Gardening",
3157
1141
  "prev": "Prev",
3158
1142
  "next": "Next",
@@ -3169,312 +1153,33 @@
3169
1153
  "heardWell": "Heard clearly",
3170
1154
  "listenAgain": "Listen again"
3171
1155
  }
3172
- },
3173
- "stickyCta": "Log in and start 말귀",
3174
- "stickyTaglinePrefix": "'s ",
3175
- "stickyTaglineHighlight": "auditory training",
3176
- "stickyTaglineSuffix": " — ready to start?",
3177
- "forceLogout": {
3178
- "duplicateSession": "You were signed out because this account signed in on another device.",
3179
- "sessionExpired": "Your session expired, so you were signed out."
3180
1156
  }
3181
1157
  },
3182
1158
  "date": {
3183
- "yearField": "Year",
3184
- "monthField": "Month",
3185
- "dayField": "Day",
3186
- "yearLabel": "{{y}}",
3187
- "monthLabel": "{{m}}",
3188
- "hourLabel": "{{h}}:00",
3189
- "daySuffix": "",
3190
- "minuteSuffix": "",
3191
- "dayLabel": "{{n}}",
3192
1159
  "timeHM": "{{hh}}:{{mm}}",
3193
1160
  "timeH": "{{hh}}:{{mm}}"
3194
1161
  },
3195
- "trainingGroup": {
3196
- "discrimination": {
3197
- "label": "Discrimination Training",
3198
- "disc": "Training to distinguish whether two sounds are the same or different.",
3199
- "types": {
3200
- "SAME_SOUND_PICK": {
3201
- "label": "Listen & Pick Same Sound",
3202
- "sub": "Pick the word card that matches the sound you heard.",
3203
- "setupSub": "Choose a target word and distractors to create a same-sound picking question.",
3204
- "step1": "Select the target word.",
3205
- "step2": "Select other words to present alongside it."
3206
- },
3207
- "SAME_OR_DIFF": {
3208
- "label": "Same or Different?",
3209
- "sub": "Decide whether the two sounds are the same or different.",
3210
- "setupSub": "Choose two words to compare and create a same-or-different question.",
3211
- "step1": "Listen to the two sounds.",
3212
- "step2": "Are they the same or different?",
3213
- "choiceSame": "Same",
3214
- "choiceDiff": "Different"
3215
- },
3216
- "HEAR_AND_PICK_SAME": {
3217
- "label": "Hear & Match the Word",
3218
- "sub": "Pick the word card that matches what you heard.",
3219
- "setupSub": "Choose a target word and distractors to create a word-matching question.",
3220
- "step1": "Listen to the word.",
3221
- "step2": "Select the matching word card."
3222
- },
3223
- "HEAR_AND_PICK_INCLUDED": {
3224
- "label": "Hear & Pick Word with Syllable",
3225
- "sub": "Pick the word card that contains the syllable you heard.",
3226
- "setupSub": "Create a question using a target with the syllable and distractors without it.",
3227
- "step1": "Listen to the syllable.",
3228
- "step2": "Select the word that contains this syllable."
3229
- },
3230
- "STARTS_WITH_SAME_SOUND": {
3231
- "label": "Hear & Pick Same Starting Sound",
3232
- "sub": "Pick the word that starts with the same sound as the one you heard.",
3233
- "setupSub": "Create a question using words that start with the same sound and distractors that don't.",
3234
- "step1": "Listen to the word.",
3235
- "step2": "Select the word starting with the same sound."
3236
- }
3237
- }
3238
- },
3239
- "synthesis": {
3240
- "label": "Synthesis Training",
3241
- "disc": "Training to combine two or more syllables or phonemes into a word.",
3242
- "types": {
3243
- "MERGE_2_SYLLABLES": {
3244
- "label": "Combine 2 Syllables",
3245
- "sub": "What word do you get when you combine these 2 syllables?",
3246
- "setupSub": "Choose a target word and it will be split into 2 syllables for the question.",
3247
- "step1": "Listen to the 2 syllables.",
3248
- "step2": "What word do they make?"
3249
- },
3250
- "MERGE_3_SYLLABLES": {
3251
- "label": "Combine 3 Syllables",
3252
- "sub": "What word do you get when you combine these 3 syllables?",
3253
- "setupSub": "Choose a target word and it will be split into 3 syllables for the question.",
3254
- "step1": "Listen to the 3 syllables.",
3255
- "step2": "What word do they make?"
3256
- },
3257
- "MERGE_2_PHONEMES": {
3258
- "label": "Combine 2 Phonemes",
3259
- "sub": "What sound do you get when you combine these 2 phonemes?",
3260
- "setupSub": "Choose a target sound and create a 2-phoneme combination question.",
3261
- "step1": "Listen to the 2 phonemes.",
3262
- "step2": "What sound do they make?"
3263
- },
3264
- "MERGE_3_PHONEMES": {
3265
- "label": "Combine 3 Phonemes",
3266
- "sub": "What sound do you get when you combine these 3 phonemes?",
3267
- "setupSub": "Choose a target sound and create a 3-phoneme combination question.",
3268
- "step1": "Listen to the 3 phonemes.",
3269
- "step2": "What sound do they make?"
3270
- }
3271
- }
3272
- },
3273
- "deletion": {
3274
- "label": "Deletion Training",
3275
- "disc": "Training to identify the remaining sound after removing a syllable or phoneme.",
3276
- "types": {
3277
- "DROP_1_FROM_2SYLL": {
3278
- "label": "Drop 1 Syllable from 2-Syllable Word",
3279
- "sub": "What sound is left when you remove one syllable from a 2-syllable word?",
3280
- "setupSub": "Choose a 2-syllable target word and create a syllable-deletion question.",
3281
- "step1": "Listen to the word.",
3282
- "step2": "What sound remains when one syllable is removed?"
3283
- },
3284
- "DROP_1_FROM_3SYLL": {
3285
- "label": "Drop 1 Syllable from 3-Syllable Word",
3286
- "sub": "What sound is left when you remove one syllable from a 3-syllable word?",
3287
- "setupSub": "Choose a 3-syllable target word and create a syllable-deletion question.",
3288
- "step1": "Listen to the word.",
3289
- "step2": "What sound remains when one syllable is removed?"
3290
- },
3291
- "DROP_PART_FROM_COMPOUND": {
3292
- "label": "Drop Part of Compound Word",
3293
- "sub": "What word is left when you remove part of a compound word?",
3294
- "setupSub": "Choose a compound word and create a partial-deletion question.",
3295
- "step1": "Listen to the compound word.",
3296
- "step2": "What word remains when part is removed?"
3297
- },
3298
- "DROP_FINAL_CONSONANT_FROM_1SYLL": {
3299
- "label": "Drop Final Consonant",
3300
- "sub": "What sound is left when you remove the final consonant?",
3301
- "setupSub": "Choose a 1-syllable word with a final consonant and create a deletion question.",
3302
- "step1": "Listen to the word.",
3303
- "step2": "What sound remains when the coda is removed?"
3304
- },
3305
- "REMOVE_CONSONANT_AND_IDENTIFY_PHONEME": {
3306
- "label": "Drop Consonant from 1-Syllable Word",
3307
- "sub": "What sound remains after removing the consonant?",
3308
- "setupSub": "Choose a 1-syllable word and create a consonant-removal question.",
3309
- "step1": "Listen to the word.",
3310
- "step2": "What sound remains when the consonant is removed?"
3311
- }
3312
- }
3313
- },
3314
- "substitution": {
3315
- "label": "Substitution Training",
3316
- "disc": "Training to create new sounds by substituting syllables or phonemes.",
3317
- "types": {
3318
- "CHANGE_1_SYLL_IN_2SYLL": {
3319
- "label": "Change 1 Syllable in 2-Syllable Word",
3320
- "sub": "Change one syllable of a 2-syllable word to make a new word.",
3321
- "setupSub": "Choose a 2-syllable target word and create a syllable-substitution question.",
3322
- "step1": "Listen to the word.",
3323
- "step2": "Change one syllable to make a new word."
3324
- },
3325
- "CHANGE_1_SYLL_IN_3SYLL": {
3326
- "label": "Change 1 Syllable in 3-Syllable Word",
3327
- "sub": "Change one syllable of a 3-syllable word to make a new word.",
3328
- "setupSub": "Choose a 3-syllable target word and create a syllable-substitution question.",
3329
- "step1": "Listen to the word.",
3330
- "step2": "Change one syllable to make a new word."
3331
- },
3332
- "CHANGE_1_PHONEME_IN_1SYLL": {
3333
- "label": "Change 1 Phoneme in 1-Syllable Word",
3334
- "sub": "Change one phoneme of a 1-syllable word to make a new sound.",
3335
- "setupSub": "Choose a 1-syllable target word and create a phoneme-substitution question.",
3336
- "step1": "Listen to the word.",
3337
- "step2": "Change one phoneme to make a new sound."
3338
- },
3339
- "CHANGE_1_PHONEME_IN_2SYLL": {
3340
- "label": "Change 1 Phoneme in 2-Syllable Word",
3341
- "sub": "Change one phoneme of a 2-syllable word to make a new word.",
3342
- "setupSub": "Choose a 2-syllable target word and create a phoneme-substitution question.",
3343
- "step1": "Listen to the word.",
3344
- "step2": "Change one phoneme to make a new word."
3345
- }
3346
- }
3347
- },
3348
- "attention": {
3349
- "label": "Auditory Attention Training",
3350
- "disc": "Training attention and short-term memory by listening to and recalling sequences of sounds.",
3351
- "types": {
3352
- "LISTEN_AND_REMEMBER_ORDER": {
3353
- "label": "Listen & Recall in Order",
3354
- "sub": "Select the three word cards in the order you heard them.",
3355
- "setupSub": "Choose three words to present and create a recall-in-order question.",
3356
- "step1": "Listen to the three words.",
3357
- "step2": "Select them in the order you heard them."
3358
- }
3359
- }
3360
- }
3361
- },
3362
1162
  "trainingSetPage": {
3363
- "subtitle": "Select a training type",
3364
- "resultUnit": "word set",
3365
- "nameLabel": "Name",
3366
- "namePlaceholder": "Enter training name",
3367
1163
  "options": "Training Options",
3368
1164
  "difficulty": "Difficulty",
3369
1165
  "exclude": "Exclude",
3370
1166
  "chosung": "Initial Consonant",
3371
- "save": "Save",
3372
- "preview": "Preview",
3373
1167
  "excludeOptions": {
3374
1168
  "none": "None",
3375
1169
  "noImage": "No Image"
3376
- },
3377
- "toast": {
3378
- "nameRequired": "Please enter a set name.",
3379
- "noWords": "No words selected.",
3380
- "noProblem": "Please complete at least one question.",
3381
- "loginRequired": "Login required.",
3382
- "saveFailed": "Failed to save.",
3383
- "saveSuccess": "\"{{name}}\" set saved ({{count}} questions).",
3384
- "saveSuccessWithIncomplete": "\"{{name}}\" set saved ({{count}} questions, {{incomplete}} incomplete excluded).",
3385
- "bundleApplied": "Applied to the current question."
3386
- },
3387
- "suggest": {
3388
- "noCoda": "No batchim",
3389
- "syllable": "{{n}} syllable(s)"
3390
1170
  }
3391
1171
  },
3392
1172
  "wordTrainingPreview": {
3393
- "namePlaceholder": "Enter a training name.",
3394
- "trainingTitle": "'{{name}}' Word Training",
3395
- "questionInput": "Enter a word",
3396
1173
  "answer": "Answer",
3397
- "distractor": "Distractor",
3398
- "groupStep": "Select the word set for the problem.",
3399
- "pickWordStep": "Choose the word to use in the question.",
3400
- "groupStepSub": "The correct answer and distractors are chosen at random from the selected set.",
3401
- "sameOrDiffStepSub": "Chosen at random from the selected word set.",
3402
- "problemNav": "Q {{current}} / {{count}}",
3403
- "problemNum": "Q {{n}}",
3404
- "clearQuestion": "Deselect",
3405
- "removeQuestion": "Remove Question",
3406
- "addQuestion": "Add Question",
3407
- "noWords": "No words match the selected filters.",
3408
- "validOk": "Valid word.",
3409
- "validNoImage": "No image for this word.",
3410
- "validNeed1SyllCoda": "Only 1-syllable words with a final consonant are allowed.",
3411
- "validNeed1SyllNoCoda": "Only 1-syllable words without a final consonant are allowed (excluding words starting with ㅇ).",
3412
- "validNeed2Syll": "Only 2-syllable words are allowed.",
3413
- "validNeed3Syll": "Only 3-syllable words are allowed.",
3414
- "manualOnlyHint": "This type doesn't support automatic suggestions yet. Please enter the question word manually."
3415
- },
3416
- "error": {
3417
- "unexpectedTitle": "Something went wrong",
3418
- "unexpectedMessage": "An unexpected error occurred. Please try again.",
3419
- "retry": "Try Again"
1174
+ "distractor": "Distractor"
3420
1175
  },
3421
1176
  "wordData": {
3422
- "loadError": "Word Data Load Failed",
3423
- "loadErrorMessage": "Failed to load word data. Please check your network and try again.",
3424
- "updateAvailable": "Word Data v{{version}}",
3425
- "updateMessage": "New word data is available.",
3426
1177
  "phaseWordDownload": "Download Word Data",
3427
1178
  "phaseImageCheck": "Check Images",
3428
1179
  "phasePairAnalysis": "Analyze Word Pairs",
3429
1180
  "downloadingCount": "Downloading {{n}} words",
3430
1181
  "checkingPage": "Checking page {{page}} list",
3431
- "imageCount": "{{done}} / {{total}} items",
3432
- "update": {
3433
- "title": "Word Data Update"
3434
- }
3435
- },
3436
- "infoInput": {
3437
- "title": "Apply for Malgwi Manager",
3438
- "submitting": "Submitting…",
3439
- "submit": "Apply",
3440
- "promo": {
3441
- "title": "3-Day Free Trial for Malgwi Manager",
3442
- "desc": "Register now and try Malgwi Manager free for 3 days!",
3443
- "action": "View Info Page"
3444
- },
3445
- "applicantEmail": "Applicant Email",
3446
- "companyId": {
3447
- "label": "Company ID",
3448
- "placeholder": "e.g. ACME01 (uppercase letters & numbers)",
3449
- "helper": "Company ID cannot be changed after creation. Only uppercase letters, numbers, _, - are allowed.",
3450
- "errors": {
3451
- "required": "Please enter a company ID",
3452
- "startWithLetter": "Company ID must start with an uppercase letter.",
3453
- "tooLong": "Company ID must be 12 characters or fewer."
3454
- }
3455
- },
3456
- "companyName": {
3457
- "label": "Company / Username",
3458
- "placeholder": "Enter company name or username",
3459
- "errors": {
3460
- "required": "Please enter a company name",
3461
- "tooLong": "Company / Username must be 12 characters or fewer."
3462
- }
3463
- },
3464
- "companyType": {
3465
- "label": "Company Type",
3466
- "placeholder": "Select company type",
3467
- "errors": {
3468
- "required": "Please select a company type"
3469
- }
3470
- },
3471
- "phone": {
3472
- "label": "Phone",
3473
- "errors": {
3474
- "required": "Please enter a phone number",
3475
- "format": "Please enter a valid phone number"
3476
- }
3477
- }
1182
+ "imageCount": "{{done}} / {{total}} items"
3478
1183
  },
3479
1184
  "textField": {
3480
1185
  "clearAriaLabel": "Clear input"
@@ -3494,30 +1199,6 @@
3494
1199
  "ariaLabel": "User avatar"
3495
1200
  },
3496
1201
  "myHomework": {
3497
- "title": "Homework",
3498
- "subtitle": "Check and do the homework your manager sent you.",
3499
- "completed": "Done",
3500
- "inProgress": "In progress",
3501
- "fromManager": "Manager",
3502
- "received": "received",
3503
- "recordExpired": "The homework has expired, so the result was not recorded. Please contact your manager.",
3504
- "segment": {
3505
- "all": "All",
3506
- "new": "New",
3507
- "inprogress": "In Progress",
3508
- "done": "Done"
3509
- },
3510
- "pageSize": {
3511
- "10": "Show 10",
3512
- "20": "Show 20",
3513
- "50": "Show 50"
3514
- },
3515
- "searchPlaceholder": "Search homework name",
3516
- "sort": {
3517
- "newest": "Newest",
3518
- "oldest": "Oldest",
3519
- "title": "Title"
3520
- },
3521
1202
  "relativeDay": {
3522
1203
  "today": "Today",
3523
1204
  "yesterday": "Yesterday",
@@ -3527,8 +1208,7 @@
3527
1208
  "notLoggedIn": "Login required."
3528
1209
  },
3529
1210
  "list": {
3530
- "title": "Received Homework",
3531
- "empty": "No homework received."
1211
+ "title": "Received Homework"
3532
1212
  },
3533
1213
  "status": {
3534
1214
  "expired": "Expired",
@@ -3537,37 +1217,19 @@
3537
1217
  }
3538
1218
  },
3539
1219
  "trainingStatus": {
3540
- "title": "Training Status",
3541
- "sub": "View your hearing training records",
3542
1220
  "weekly": {
3543
1221
  "title": "Weekly Training",
3544
1222
  "daily": "Daily Listening",
3545
- "crossword": "Crossword",
3546
- "trainingTime": "Training Time",
3547
- "timeAvg": "Avg time",
3548
- "accuracy": "Accuracy",
3549
- "unit": " times"
3550
- },
3551
- "sentence": {
3552
- "title": "Sentence Training"
3553
- },
3554
- "word": {
3555
- "title": "Word Training"
1223
+ "crossword": "Crossword"
3556
1224
  },
3557
1225
  "homework": {
3558
1226
  "title": "Homework Progress",
3559
1227
  "totalRate": "Overall rate",
3560
1228
  "count": "Total",
3561
1229
  "done": "Done",
3562
- "remaining": "Remaining",
3563
- "unit": ""
1230
+ "remaining": "Remaining"
3564
1231
  },
3565
1232
  "today": {
3566
- "title": "Today's Listening",
3567
- "progress": "Progress",
3568
- "accuracy": "Accuracy",
3569
- "progressAvg": "Avg progress",
3570
- "unitPct": "%",
3571
1233
  "tooltipTotal": "Total",
3572
1234
  "tooltipDone": "Done"
3573
1235
  },
@@ -3575,13 +1237,8 @@
3575
1237
  "countSuffix": " sessions"
3576
1238
  },
3577
1239
  "time": {
3578
- "title": "Training Time",
3579
1240
  "countLabel": "{{n}} sessions",
3580
- "empty": "No training records",
3581
- "sec": "{{n}}s",
3582
- "min": "{{n}}m",
3583
- "hourMin": "{{h}}h {{m}}m",
3584
- "hour": "{{h}}h"
1241
+ "empty": "No training records"
3585
1242
  },
3586
1243
  "daily": {
3587
1244
  "title": "Today's Listening Record",
@@ -3595,130 +1252,16 @@
3595
1252
  "title": "Linked Visit Records"
3596
1253
  },
3597
1254
  "detail": "Details",
3598
- "detailEmpty": "No training records for this period.",
3599
- "detailError": "Could not load training records. Please try again shortly.",
3600
- "col": {
3601
- "date": "Date",
3602
- "type": "Type",
3603
- "score": "Score",
3604
- "time": "Time"
3605
- },
3606
1255
  "trainingType": {
3607
1256
  "LISTEN_IN_NOISE": "Sentence in Noise",
3608
1257
  "SHORT_STORY": "Short Story",
3609
1258
  "LONG_STORY": "Long Story",
3610
1259
  "ORDERING_SENTENCE": "Sentence Ordering"
3611
- },
3612
- "accuracy": {
3613
- "overall": "Overall accuracy",
3614
- "itemUnit": " items",
3615
- "skipped": "{{n}} had no accuracy record and were left out of this count."
3616
- },
3617
- "insight": {
3618
- "title": "Sentence training analysis",
3619
- "sub": "Accuracy of the four sentence-training types, compared with the previous period",
3620
- "strong": "Doing well",
3621
- "weak": "Struggling",
3622
- "improving": "Improving",
3623
- "declining": "Slipping",
3624
- "stale": "Not lately",
3625
- "vsBefore": "vs. previous {{delta}}",
3626
- "thin": "Not enough sessions to compare yet ({{n}})",
3627
- "colTrend": "Change",
3628
- "reasonWeak": "Accuracy is low",
3629
- "reasonDeclining": "Getting worse lately",
3630
- "reasonStale": "Not done lately",
3631
- "items": "{{n}} items",
3632
- "noRuns": "No sessions in this period"
3633
- },
3634
- "noise": {
3635
- "title": "Hearing by noise condition",
3636
- "heard": "Heard",
3637
- "basis": "All in-person sessions · {{n}} items",
3638
- "condition": "Noise {{noise}}% · Volume {{volume}}%",
3639
- "limit": "Heard up to: noise {{noise}}% · volume {{volume}}%",
3640
- "noLimit": "No condition heard above {{pct}}% yet",
3641
- "empty": "No records with noise settings yet"
3642
- },
3643
- "analysis": {
3644
- "result": "Result",
3645
- "reason": "Why",
3646
- "sound": "Misheard the sound",
3647
- "meaning": "Missed the content",
3648
- "soundTag": "Sound",
3649
- "meaningTag": "Content",
3650
- "pairs": "Confused options",
3651
- "shortSub": "Wrong picks tell why",
3652
- "longSub": "Memory and understanding, separately",
3653
- "orderingSub": "How many sentences, and which positions slip",
3654
- "recall": "Keyword recall",
3655
- "understand": "Understanding",
3656
- "byOrder": "By question order",
3657
- "orderNo": "No. {{n}}",
3658
- "limitSize": "Orders up to {{n}} sentences",
3659
- "noLimitSize": "No set size ordered above {{pct}}% yet",
3660
- "bySize": "All correct by set size",
3661
- "size": "{{n}} sentences",
3662
- "runs": "{{n}} runs",
3663
- "byPosition": "By position",
3664
- "neighbor": "Swapped with a neighbor",
3665
- "far": "Misplaced far",
3666
- "empty": "No in-person session records yet",
3667
- "subhead": "By type · all in-person sessions",
3668
- "position": {
3669
- "first": "First",
3670
- "middle": "Middle",
3671
- "last": "Last"
3672
- },
3673
- "verdict": {
3674
- "noMiss": "No wrong answers",
3675
- "sound": "Mostly misheard sounds — pair it with word discrimination training",
3676
- "meaning": "Mostly missed content — pause the story and recap",
3677
- "recall": "Recalls few keywords — widen memory span with short stories first",
3678
- "drop": "Drops on later questions — holding on to what was heard is the task",
3679
- "neighbor": "Neighboring sentences get swapped — point out how they connect",
3680
- "far": "Sentences land far off — reduce the set size and build up again",
3681
- "position": "Often misses the {{position}} position"
3682
- }
3683
1260
  }
3684
1261
  },
3685
1262
  "store": {
3686
- "title": "Training Store",
3687
- "subtitle": "Browse trainings shared by other managers and add them to your list.",
3688
- "searchPlaceholder": "Search by training name or publisher",
3689
- "category": {
3690
- "word": "Word Tables",
3691
- "wordTraining": "Word Training",
3692
- "sentence": "Sentence Training"
3693
- },
3694
- "sort": {
3695
- "newest": "Newest",
3696
- "likes": "Most liked",
3697
- "downloads": "Most downloaded"
3698
- },
3699
- "wordKind": {
3700
- "pair": "Pairs",
3701
- "single": "Words",
3702
- "emptyHintToSingle": "No pair tables here, but the 'Words' tab has some.",
3703
- "emptyHintToPair": "No word tables here, but the 'Pairs' tab has some."
3704
- },
3705
- "pageSize": "{{n}} per page",
3706
- "countPrefix": "Total ",
3707
- "countSuffix": " trainings",
3708
- "notice": "Log in with a manager account to add trainings to your list.",
3709
- "empty": "No trainings have been published yet.",
3710
- "emptyHint": "You can publish your own trainings from the Training Settings page.",
3711
- "like": "Like",
3712
- "unlike": "Unlike",
3713
- "loginRequired": "Login required",
3714
1263
  "import": "Add to my trainings",
3715
- "importButton": "Import",
3716
1264
  "publisher": "Publisher",
3717
- "importFail": "Import failed: {{error}}",
3718
- "importSuccess": "Added '{{title}}' to your training list.",
3719
- "dupTitle": "Same content already exists",
3720
- "dupMessageOne": "Same content as <m>{{title}}</m>. Import anyway?",
3721
- "dupMessageMany": "Same content as <m>{{title}}</m> and <m>{{n}}</m> more. Import anyway?",
3722
1265
  "time": {
3723
1266
  "justNow": "just now",
3724
1267
  "minutesAgo": "{{n}}m ago",
@@ -3731,274 +1274,44 @@
3731
1274
  "badge": {
3732
1275
  "shared": "Store"
3733
1276
  },
3734
- "unpublishOnDelete": "The store listing will also be deleted.",
3735
1277
  "publish": {
3736
- "confirmLabel": "Post",
3737
- "confirmLoading": "Posting…",
3738
- "descPlaceholder": "One-line description for the Training Store (optional)",
3739
- "dialogTitle": "Post to Training Store",
3740
- "message": "Publish '{{name}}' to the Training Store."
3741
- },
3742
- "categoryLabel": "Resource type",
3743
- "toast": {
3744
- "registered": "Published to the Malgue Library",
3745
- "registerError": "Failed to publish to the Malgue Library"
3746
- }
3747
- },
3748
- "cardPopup": {
3749
- "common": {
3750
- "cardName": "Card Name",
3751
- "cardNamePlaceholder": "Enter card name",
3752
- "group": "Group",
3753
- "groupPlaceholder": "Group name (optional)",
3754
- "description": "Description",
3755
- "descriptionPlaceholder": "Briefly describe this card (optional)",
3756
- "nameRequired": "Please enter a card name.",
3757
- "removeAll": "Remove All",
3758
- "deleteConfirm": "Delete '{{name}}'?",
3759
- "deleteConfirmDefault": "Delete this card?"
3760
- },
3761
- "wordTrainingCard": {
3762
- "createTitle": "Create Word Training Bundle",
3763
- "editTitle": "Edit Word Training Bundle",
3764
- "deleteTitle": "Delete Word Training Bundle",
3765
- "selectSection": "Select Trainings",
3766
- "defaultSection": "Default Trainings",
3767
- "defaultSectionDesc": "Words are filled automatically when you add a standard training",
3768
- "mySection": "My Trainings",
3769
- "noTrainingsEmpty": "Please create a word training first.",
3770
- "adding": "Adding…",
3771
- "add": "Add",
3772
- "basket": "Selected Trainings",
3773
- "basketEmpty": "No trainings selected",
3774
- "trainingRequired": "Please add at least one training.",
3775
- "maxTrainingsAlert": "You can add up to {{max}} trainings",
3776
- "notEnoughWords": "Not enough words to generate questions",
3777
- "addSaveError": "Failed to save the training. Please try again",
3778
- "complete": {
3779
- "message": "All done! Great job!",
3780
- "button": "Done"
3781
- }
3782
- },
3783
- "shareLink": {
3784
- "saveCardFirst": "Save the card first.",
3785
- "copied": "Link copied",
3786
- "created": "Link created",
3787
- "createFailed": "Failed to create link",
3788
- "copyBlocked": "Copying was blocked, so the link is selected. Press Ctrl/⌘+C to copy",
3789
- "removed": "Link removed",
3790
- "removeFailed": "Failed to remove link"
1278
+ "descPlaceholder": "One-line description for the Training Store (optional)"
3791
1279
  }
3792
1280
  },
3793
1281
  "homework": {
3794
1282
  "manage": {
3795
- "title": "Homework",
3796
- "sub": "View shared training links and submission status.",
3797
- "searchPlaceholder": "Search by title or recipient",
3798
- "emptySearch": "No results found.",
3799
- "emptyLinks": "No shared homework links yet.",
3800
- "unit": "item(s)",
3801
- "loadFailed": "Could not load homework links."
3802
- },
3803
- "card": {
3804
- "deleteTitle": "Delete Homework Link",
3805
- "deleteMessage": "Delete this homework link? Submitted results will also be removed."
3806
- },
3807
- "status": {
3808
- "inactive": "Inactive",
3809
- "expired": "Expired",
3810
- "active": "Active",
3811
- "noTarget": "No Target",
3812
- "sentFmt": "{{target}} · sent {{date}}"
3813
- },
3814
- "menu": {
3815
- "activate": "Activate",
3816
- "deactivate": "Deactivate"
3817
- },
3818
- "personalLinkTitle": "Personal link"
3819
- },
3820
- "invite": {
3821
- "title": "Invitations",
3822
- "sub": "Create and manage invite links — no customer info needed.",
3823
- "copyAriaLabel": "Copy link",
3824
- "deleteAriaLabel": "Delete",
3825
- "deleteConfirmTitle": "Delete invite link",
3826
- "deleteConfirmMessage": "Delete this invite link? Any link already shared will stop working."
3827
- },
3828
- "wordTraining": {
3829
- "card": {
3830
- "sub": "Word Training Bundle",
3831
- "empty": "No word training in this card."
1283
+ "unit": "item(s)"
3832
1284
  }
3833
1285
  },
3834
1286
  "inquiry": {
3835
- "ariaLabel": "Contact Us",
3836
- "emailPlaceholder": "Email for reply",
3837
- "contentPlaceholder": "Please enter your inquiry.",
3838
- "cancelLabel": "Cancel",
3839
- "submitLabel": "Send",
3840
- "title": "Contact Us",
3841
- "emailLabel": "Email",
3842
- "contentLabel": "Inquiry",
3843
- "successMsg": "✓ Your inquiry has been submitted.",
3844
- "submitError": "Failed to submit your inquiry.",
3845
- "subText": "Send us a message about purchasing a subscription plan. We will respond within 1–2 business days."
3846
- },
3847
- "exam": {
3848
- "inProgress": "Exam in progress"
3849
- },
3850
- "inviteManage": {
3851
- "countSuffix": "",
3852
- "searchPlaceholder": "Search links",
3853
- "creating": "Creating…",
3854
- "create": "Create Link",
3855
- "colLink": "Link",
3856
- "colCreatedAt": "Created At",
3857
- "empty": "No items.",
3858
- "loadFailed": "Could not load invitations."
1287
+ "cancelLabel": "Cancel"
3859
1288
  },
3860
1289
  "trainingPlanRun": {
3861
- "empty": "No training items to run.",
3862
- "loading": "Loading training data…",
3863
- "subtitle": "Select a topic to start listening practice.",
3864
- "title": "Run Training"
3865
- },
3866
- "orgInvitePage": {
3867
- "reason": {
3868
- "invalid": "This invite has expired or is no longer valid.",
3869
- "notFound": "This invite does not exist.",
3870
- "notLoggedIn": "Please sign in.",
3871
- "rateLimited": "Please try again in a moment."
3872
- },
3873
- "defaultOrgName": "the organization",
3874
- "loading": "Loading…",
3875
- "invalidTitle": "Can't open this invite",
3876
- "acceptError": "Failed to accept the invite.",
3877
- "alreadyConnected": "already connected.",
3878
- "connected": "connected.",
3879
- "doneMessage": "{{orgName}} — {{suffix}}",
3880
- "doneSub": "You can now receive homework from your manager.",
3881
- "goToHomework": "Go to homework",
3882
- "failedTitle": "Couldn't accept the invite",
3883
- "home": "Home",
3884
- "readyTitle": "Invite from {{orgName}}",
3885
- "readySub": "Register as a customer of {{orgName}} and start receiving homework?",
3886
- "accepting": "Connecting…",
3887
- "acceptButton": "Accept invite"
3888
- },
3889
- "linkGate": {
3890
- "reason": {
3891
- "notFound": "This link does not exist.",
3892
- "inactive": "This link has been deactivated.",
3893
- "expired": "This link has expired.",
3894
- "maxUses": "This link has reached its maximum uses.",
3895
- "missingToken": "This link is invalid.",
3896
- "default": "This link is not valid.",
3897
- "unavailable": "We can't check this link right now."
3898
- },
3899
- "checking": "Checking the link…",
3900
- "validBadge": "Valid link",
3901
- "availableUntil": "Available until {{date}}",
3902
- "redirecting": "Redirecting…",
3903
- "redirectingIn3s": "Redirecting to the app in 3 seconds.",
3904
- "enterNow": "Enter now",
3905
- "invalidBadge": "Unavailable",
3906
- "expiredAt": "Expired: {{date}}",
3907
- "contactAdmin": "If you believe this link should still work, please contact your administrator.",
3908
- "unavailableBadge": "Cannot check",
3909
- "unavailableHint": "Check your connection and open the link again. The link itself is still fine."
3910
- },
3911
- "homeworkGate": {
3912
- "loading": "Loading…",
3913
- "invalidTitle": "Can't open this link",
3914
- "invalidMessage": "This shared link doesn't exist, or has expired or been deactivated.",
3915
- "goToMyHomework": "Go to My Homework",
3916
- "recordFailed": "This homework link has expired, so your result wasn't saved. Please contact your manager."
3917
- },
3918
- "wordTableView": {
3919
- "defaultTitle": "Word Table"
3920
- },
3921
- "shareLinkFooter": {
3922
- "label": "Share link",
3923
- "copyAriaLabel": "Copy link",
3924
- "removeAriaLabel": "Remove link",
3925
- "creating": "Creating…",
3926
- "hint": "You can only create a share link for a saved card.",
3927
- "removeConfirmTitle": "Remove share link",
3928
- "removeConfirmMessage": "Remove this share link? The existing link will stop working."
3929
- },
3930
- "linkRequestGate": {
3931
- "title": "Organization link request",
3932
- "subtitle": "The organization below wants to register you as their customer. Please confirm this is an organization you actually use before choosing.",
3933
- "registeredName": "Registered as: {{name}}",
3934
- "decline": "Decline",
3935
- "accept": "Accept",
3936
- "error": "Failed to process: {{message}} — please try again."
1290
+ "subtitle": "Select a topic to start listening practice."
3937
1291
  },
3938
1292
  "progress": {
3939
1293
  "steps": "Step {{current}} of {{total}}"
3940
1294
  },
3941
- "nextTraining": {
3942
- "title": "Build the next training",
3943
- "lead": "Sets containing items {{name}} has not caught yet. Only these go in.",
3944
- "planGroup": "Into a training plan",
3945
- "bundleGroup": "Into a word-training bundle",
3946
- "pending": "{{count}} left",
3947
- "unknownSet": "Set name not found",
3948
- "confirm": "Create",
3949
- "newBase": "{{name}} training",
3950
- "planDesc": "{{count}} set(s) holding items {{name}} got wrong",
3951
- "bundleDesc": "{{count}} word training(s) holding items {{name}} got wrong",
3952
- "madePlan": "{{count}} training plan(s)",
3953
- "madeBundle": "{{count}} word-training bundle(s)",
3954
- "created": "Created '{{name}}' — {{what}}",
3955
- "nothingMade": "No set could be included, so nothing was created.",
3956
- "noSetNote": "{{n}} item(s) could not be included — the record does not say which set they came from.",
3957
- "emptyTitle": "Nothing to build right now",
3958
- "emptyAllClear": "No items are still being missed.",
3959
- "emptyNoSet": "{{n}} item(s) are still missed, but the records do not say which set they came from, so they cannot be pulled back. One more training run will start recording it."
3960
- },
3961
1295
  "trainingMiss": {
3962
1296
  "panelTitle": "Training misses",
3963
1297
  "viewItems": "Items",
3964
1298
  "viewTypes": "Types",
3965
- "grainLabel": "View by",
3966
- "grainRun": "By problem",
3967
- "grainItem": "By item",
3968
- "colTitle": "Title",
3969
- "colWhen": "When",
3970
- "colScore": "Correct",
3971
- "correct": "Right",
3972
- "wrong": "Wrong",
3973
- "colDuration": "Duration",
3974
- "scoreFmt": "{{correct}}/{{total}}",
3975
- "unitRun": " runs",
3976
- "runsEmpty": "No training recorded yet.",
3977
- "colType": "Type",
3978
- "colRate": "Accuracy",
3979
- "colTried": "Tries",
3980
- "colLatest": "Latest",
3981
1299
  "colPending": "Left",
3982
1300
  "colTrend": "Change",
3983
1301
  "colRuns": "Runs",
3984
1302
  "unitItem": " items",
3985
- "empty": "No training misses recorded yet.",
3986
- "loadFailed": "Could not load the training records.",
3987
1303
  "skippedOnly": "{{n}} older record(s) were excluded — they do not say what was answered.",
3988
1304
  "summaryLabel": "Recorded",
3989
1305
  "summaryValue": "{{items}} items · {{pending}} still missed",
3990
1306
  "nextLabel": "Next to work on",
3991
1307
  "nextCount": "{{count}}",
3992
1308
  "nextCountCapped": "{{shown}} of {{total}}",
3993
- "allClear": "All caught up",
3994
- "tried": "{{count}}x",
3995
1309
  "picked": "→ {{what}}",
3996
1310
  "typeClear": "All caught up",
3997
1311
  "typePending": "{{pending}} of {{total}} left",
3998
1312
  "flat": "no change",
3999
1313
  "runs": "{{count}} run(s)",
4000
- "avgDuration": "{{sec}}s avg",
4001
- "truncated": "Only the most recent {{n}} items were loaded — the counts below cover just those."
1314
+ "avgDuration": "{{sec}}s avg"
4002
1315
  },
4003
1316
  "table": {
4004
1317
  "resetColumns": "Reset column widths"
@@ -4007,51 +1320,18 @@
4007
1320
  "panelTitle": "Word table scores",
4008
1321
  "viewWords": "Words",
4009
1322
  "viewTables": "Tables",
4010
- "colWord": "Word",
4011
- "colRate": "Accuracy",
4012
- "colTried": "Tries",
4013
1323
  "colLatest": "When",
4014
1324
  "colTrend": "Change",
4015
1325
  "unitTime": " times",
4016
- "empty": "No word tables scored yet.",
4017
1326
  "summaryLabel": "Scored",
4018
1327
  "summaryValue": "{{times}} times · {{words}} words",
4019
1328
  "nextLabel": "Focus next",
4020
1329
  "nextCount": "{{count}}",
4021
1330
  "allClear": "All correct last time.",
4022
- "tried": "{{count}}x",
4023
1331
  "times": "{{count}}x",
4024
1332
  "flat": "no change",
4025
1333
  "recentLabel": "Recent scorings",
4026
- "deleteOne": "Delete “{{name}}” scoring",
4027
- "deleteTitle": "Delete this scoring?",
4028
- "deleteMessage": "Deletes the “{{name}}” scoring from {{when}}. This cannot be undone.",
4029
- "nextCountCapped": "{{shown}} of {{total}}",
4030
- "loadFailed": "Could not load word scores."
4031
- },
4032
- "nextTable": {
4033
- "title": "What to train next?",
4034
- "subtitle": "Picked for the {{count}} words {{name}} has not mastered yet.",
4035
- "allClear": "All correct last time. Nothing to focus on right now.",
4036
- "noMatch": "None of your tables contain these words.",
4037
- "coverage": "{{covered}} of {{total}} cells",
4038
- "uncovered": "{{count}} words not in any table",
4039
- "makeNew": "Make a new table from these {{count}}",
4040
- "newTableBase": "{{name}} focus",
4041
- "newTableDesc": "The {{count}} words {{name}} has not mastered yet.",
4042
- "created": "Created “{{name}}” — {{count}} cells.",
4043
- "button": "Suggest next table"
4044
- },
4045
- "draft": {
4046
- "hint": "Pin what you want to keep; the rest can be redrawn.",
4047
- "pin": "Pin “{{name}}”",
4048
- "unpin": "Unpin “{{name}}”",
4049
- "remove": "Remove “{{name}}”",
4050
- "regenerate": "Redraw the rest",
4051
- "regenerating": "Drawing…",
4052
- "save": "Create as shown",
4053
- "count": "{{total}} · {{pinned}} pinned",
4054
- "empty": "Nothing left. At least one is needed."
1334
+ "nextCountCapped": "{{shown}} of {{total}}"
4055
1335
  },
4056
1336
  "topBanner": {
4057
1337
  "ariaLabel": "Banner",
@@ -4071,44 +1351,13 @@
4071
1351
  "menu": "Menu"
4072
1352
  },
4073
1353
  "phonemeProfile": {
4074
- "title": "Word training analysis",
4075
- "sub": "Breaks word-table and pair-table scores into onsets, vowels and codas to find weak sounds and suggest the next training",
4076
- "basis": "Based on all {{n}} scorings",
4077
- "thin": "Not enough scorings to break down yet ({{n}})",
4078
- "byPhoneme": "Accuracy by phoneme",
4079
- "untried": "Not seen yet",
4080
- "weak": "Weak sounds",
4081
- "contrast": "Discrimination (pairs)",
4082
- "suggest": "Suggested next training",
4083
- "goal": "Goal {{pct}}%",
4084
- "suggestPair": "Pair table: {{a}} vs {{b}}",
4085
- "suggestWords": "Word table with {{jamo}}",
4086
- "moreWords": "and {{n}} more",
4087
- "devOrder": "Ordered by acquisition",
4088
- "devFull": "Fully acquired by {{age}}",
4089
- "devMaster": "Mastered by {{age}}",
4090
- "devLate": "Late for age",
4091
- "devInStage": "In the mastery stage",
4092
- "devNotYet": "Not expected yet",
4093
1354
  "devNone": "No acquisition data",
4094
- "ageBasis": "Based on age {{age}}",
4095
- "devSummary": "{{m}} of {{n}} weak sounds are {{group}}",
4096
1355
  "place": {
4097
1356
  "labial": "Bilabial",
4098
1357
  "alveolar": "Alveolar",
4099
1358
  "palatal": "Palatal",
4100
1359
  "velar": "Velar",
4101
1360
  "glottal": "Glottal"
4102
- },
4103
- "manner": {
4104
- "nasal": "Nasal",
4105
- "plosive": "Plosive",
4106
- "liquid": "Liquid",
4107
- "fricative": "Fricative",
4108
- "affricate": "Affricate"
4109
- },
4110
- "suggestSentence": "Sentence set {{name}} ({{jamo}} ×{{n}})",
4111
- "sentenceMiss": "Words confused in sentence training",
4112
- "sentenceMissSub": "Where the chosen option differed from the answer — from story and ordering records"
1361
+ }
4113
1362
  }
4114
1363
  }