langcoach 0.0.0-stage → 0.3.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.
@@ -0,0 +1,1117 @@
1
+ {
2
+ "extName": {
3
+ "message": "LangCoach",
4
+ "description": "Extension name"
5
+ },
6
+ "extDescription": {
7
+ "message": "Streaks, daily plan and spaced-repetition review for Little Language Lessons (Google Labs). Not affiliated with Google.",
8
+ "description": "Extension description (max 132 chars)"
9
+ },
10
+ "toastSaved": {
11
+ "message": "✓ $COUNT$ words saved to LangCoach",
12
+ "placeholders": {
13
+ "count": {
14
+ "content": "$1"
15
+ }
16
+ }
17
+ },
18
+ "toastAlready": {
19
+ "message": "Already in your deck"
20
+ },
21
+ "toastUndo": {
22
+ "message": "Undo"
23
+ },
24
+ "toastOpen": {
25
+ "message": "Open"
26
+ },
27
+ "toastRemoved": {
28
+ "message": "Removed"
29
+ },
30
+ "toastSaveN": {
31
+ "message": "Save $COUNT$ words",
32
+ "placeholders": {
33
+ "count": {
34
+ "content": "$1"
35
+ }
36
+ }
37
+ },
38
+ "toastSavedManual": {
39
+ "message": "✓ Saved to LangCoach"
40
+ },
41
+ "toastXp": {
42
+ "message": "+$XP$ XP",
43
+ "placeholders": {
44
+ "xp": {
45
+ "content": "$1"
46
+ }
47
+ }
48
+ },
49
+ "menuSave": {
50
+ "message": "Save to LangCoach"
51
+ },
52
+ "tabToday": {
53
+ "message": "Today"
54
+ },
55
+ "tabReview": {
56
+ "message": "Review"
57
+ },
58
+ "tabPlan": {
59
+ "message": "Plan"
60
+ },
61
+ "tabProgress": {
62
+ "message": "Progress"
63
+ },
64
+ "tabSettings": {
65
+ "message": "Settings"
66
+ },
67
+ "loading": {
68
+ "message": "Loading..."
69
+ },
70
+ "onboardTitle": {
71
+ "message": "Set up your language coach"
72
+ },
73
+ "onboardSubtitle": {
74
+ "message": "Personalize your weekly plan and spaced-repetition deck."
75
+ },
76
+ "fieldTargetLang": {
77
+ "message": "Language I'm learning"
78
+ },
79
+ "fieldNativeLang": {
80
+ "message": "My native language"
81
+ },
82
+ "fieldLevel": {
83
+ "message": "Current level"
84
+ },
85
+ "levelUnsure": {
86
+ "message": "Not sure (start at A2)"
87
+ },
88
+ "fieldGoal": {
89
+ "message": "Main goal"
90
+ },
91
+ "goalTravel": {
92
+ "message": "Travel"
93
+ },
94
+ "goalWork": {
95
+ "message": "Work"
96
+ },
97
+ "goalStudy": {
98
+ "message": "Study"
99
+ },
100
+ "goalMoving": {
101
+ "message": "Moving abroad"
102
+ },
103
+ "goalFamily": {
104
+ "message": "Family & friends"
105
+ },
106
+ "goalFun": {
107
+ "message": "Fun & culture"
108
+ },
109
+ "fieldMinutes": {
110
+ "message": "Minutes per day"
111
+ },
112
+ "fieldDays": {
113
+ "message": "Days per week"
114
+ },
115
+ "fieldCamera": {
116
+ "message": "I have a camera (include Word Cam)"
117
+ },
118
+ "btnStartPlan": {
119
+ "message": "Create my plan"
120
+ },
121
+ "todayHeading": {
122
+ "message": "Today's Tasks"
123
+ },
124
+ "todayRingLabel": {
125
+ "message": "Daily goal"
126
+ },
127
+ "todayStreak": {
128
+ "message": "Day streak"
129
+ },
130
+ "todayThemeLabel": {
131
+ "message": "Suggested Tiny Lesson theme"
132
+ },
133
+ "btnCopy": {
134
+ "message": "Copy"
135
+ },
136
+ "btnCopied": {
137
+ "message": "Copied"
138
+ },
139
+ "btnNextTheme": {
140
+ "message": "Another idea"
141
+ },
142
+ "btnOpenLll": {
143
+ "message": "Open"
144
+ },
145
+ "taskTinyLesson": {
146
+ "message": "Tiny Lesson"
147
+ },
148
+ "taskSlangHang": {
149
+ "message": "Slang Hang"
150
+ },
151
+ "taskWordCam": {
152
+ "message": "Word Cam"
153
+ },
154
+ "taskReview": {
155
+ "message": "Flashcard Review"
156
+ },
157
+ "taskQuiz": {
158
+ "message": "Weekly Quiz Review"
159
+ },
160
+ "taskStatusDone": {
161
+ "message": "Done"
162
+ },
163
+ "taskStatusTodo": {
164
+ "message": "To do"
165
+ },
166
+ "minutesShort": {
167
+ "message": "$MIN$ min",
168
+ "placeholders": {
169
+ "min": {
170
+ "content": "$1"
171
+ }
172
+ }
173
+ },
174
+ "todayNoTasks": {
175
+ "message": "No tasks scheduled for today. Do any lesson or review to build your streak!"
176
+ },
177
+ "lastCaptureHeading": {
178
+ "message": "Last captured lesson"
179
+ },
180
+ "grammarHeading": {
181
+ "message": "Recent grammar notes"
182
+ },
183
+ "reviewHeading": {
184
+ "message": "Spaced-Repetition Review"
185
+ },
186
+ "reviewDueBadge": {
187
+ "message": "$COUNT$ due",
188
+ "placeholders": {
189
+ "count": {
190
+ "content": "$1"
191
+ }
192
+ }
193
+ },
194
+ "reviewEmptyTitle": {
195
+ "message": "All caught up for now!"
196
+ },
197
+ "reviewEmptyBody": {
198
+ "message": "Do a lesson on Little Language Lessons to add new words to your deck."
199
+ },
200
+ "btnShowAnswer": {
201
+ "message": "Show answer"
202
+ },
203
+ "btnListen": {
204
+ "message": "Listen"
205
+ },
206
+ "rateAgain": {
207
+ "message": "Again"
208
+ },
209
+ "rateHard": {
210
+ "message": "Hard"
211
+ },
212
+ "rateGood": {
213
+ "message": "Good"
214
+ },
215
+ "rateEasy": {
216
+ "message": "Easy"
217
+ },
218
+ "btnEditCard": {
219
+ "message": "Edit translation"
220
+ },
221
+ "btnSaveCard": {
222
+ "message": "Save"
223
+ },
224
+ "placeholderTranslation": {
225
+ "message": "Add translation..."
226
+ },
227
+ "btnFinishReview": {
228
+ "message": "Finish session"
229
+ },
230
+ "planHeading": {
231
+ "message": "Weekly Plan"
232
+ },
233
+ "planTheme": {
234
+ "message": "Theme"
235
+ },
236
+ "planEmpty": {
237
+ "message": "No plan for this week yet."
238
+ },
239
+ "progressHeading": {
240
+ "message": "Your Progress"
241
+ },
242
+ "statStreak": {
243
+ "message": "Day Streak"
244
+ },
245
+ "statTotalXp": {
246
+ "message": "Total XP"
247
+ },
248
+ "statLevel": {
249
+ "message": "Level"
250
+ },
251
+ "statWordsLearned": {
252
+ "message": "Words Learned"
253
+ },
254
+ "statDueCount": {
255
+ "message": "Cards Due"
256
+ },
257
+ "statWeeklyGoal": {
258
+ "message": "Weekly Study Days"
259
+ },
260
+ "achievementsHeading": {
261
+ "message": "Achievements"
262
+ },
263
+ "ach_first_lesson": {
264
+ "message": "First Step (1 lesson)"
265
+ },
266
+ "ach_streak_3": {
267
+ "message": "3-Day Streak"
268
+ },
269
+ "ach_streak_7": {
270
+ "message": "7-Day Streak"
271
+ },
272
+ "ach_streak_30": {
273
+ "message": "30-Day Streak"
274
+ },
275
+ "ach_cards_50": {
276
+ "message": "50 Words Collected"
277
+ },
278
+ "ach_cards_100": {
279
+ "message": "100 Words Collected"
280
+ },
281
+ "ach_cards_500": {
282
+ "message": "500 Words Collected"
283
+ },
284
+ "ach_reviews_100": {
285
+ "message": "100 Card Reviews"
286
+ },
287
+ "settingsHeading": {
288
+ "message": "Settings"
289
+ },
290
+ "settingsProfileSection": {
291
+ "message": "Learning Profile"
292
+ },
293
+ "btnSaveProfile": {
294
+ "message": "Save profile"
295
+ },
296
+ "settingsPrefsSection": {
297
+ "message": "Preferences"
298
+ },
299
+ "fieldAutoSave": {
300
+ "message": "Auto-save lessons on Little Language Lessons"
301
+ },
302
+ "fieldReminder": {
303
+ "message": "Daily study reminder time"
304
+ },
305
+ "reminderOff": {
306
+ "message": "Off"
307
+ },
308
+ "fieldUiLang": {
309
+ "message": "Interface language"
310
+ },
311
+ "uiLangAuto": {
312
+ "message": "Auto (browser)"
313
+ },
314
+ "settingsDataSection": {
315
+ "message": "Your Data"
316
+ },
317
+ "btnExport": {
318
+ "message": "Export JSON backup"
319
+ },
320
+ "btnImport": {
321
+ "message": "Import JSON backup"
322
+ },
323
+ "btnReset": {
324
+ "message": "Reset all data"
325
+ },
326
+ "btnResetConfirm1": {
327
+ "message": "Click again to confirm reset"
328
+ },
329
+ "btnResetConfirm2": {
330
+ "message": "Confirm permanent reset"
331
+ },
332
+ "settingsAboutSection": {
333
+ "message": "About LangCoach"
334
+ },
335
+ "aboutDisclaimer": {
336
+ "message": "LangCoach is an independent open-source project and is not affiliated with, endorsed by, or sponsored by Google."
337
+ },
338
+ "aboutGithub": {
339
+ "message": "GitHub Repository"
340
+ },
341
+ "aboutSupport": {
342
+ "message": "Support the project"
343
+ },
344
+ "reminderTitle": {
345
+ "message": "Time for your language practice!"
346
+ },
347
+ "reminderBody": {
348
+ "message": "Your 5-minute lesson on LangCoach is waiting to keep your streak alive."
349
+ },
350
+ "btnFillTheme": {
351
+ "message": "Fill page"
352
+ },
353
+ "btnFilled": {
354
+ "message": "Filled!"
355
+ },
356
+ "tabModeList": {
357
+ "message": "Word List"
358
+ },
359
+ "tabModeCards": {
360
+ "message": "Cards"
361
+ },
362
+ "searchPlaceholder": {
363
+ "message": "Search words or translation..."
364
+ },
365
+ "statusLearned": {
366
+ "message": "Learned"
367
+ },
368
+ "statusNew": {
369
+ "message": "New"
370
+ },
371
+ "btnCancel": {
372
+ "message": "Cancel"
373
+ },
374
+ "noTranslation": {
375
+ "message": "No translation yet (click edit)"
376
+ },
377
+ "themeCopiedPaste": {
378
+ "message": "Copied — paste it into the box"
379
+ },
380
+ "loadErrorBody": {
381
+ "message": "LangCoach could not load your data: $MSG$",
382
+ "placeholders": {
383
+ "msg": {
384
+ "content": "$1"
385
+ }
386
+ }
387
+ },
388
+ "btnRetry": {
389
+ "message": "Retry"
390
+ },
391
+ "corruptTitle": {
392
+ "message": "Your saved data is damaged"
393
+ },
394
+ "corruptBody": {
395
+ "message": "LangCoach could not read your saved data. Nothing was deleted: you can import a backup file, or reset to start fresh."
396
+ },
397
+ "corruptPreserved": {
398
+ "message": "A copy of the damaged data was kept in browser storage under the key: $KEY$",
399
+ "placeholders": {
400
+ "key": {
401
+ "content": "$1"
402
+ }
403
+ }
404
+ },
405
+ "importReplaceWarning": {
406
+ "message": "Importing replaces your whole current deck. A backup of the current data is kept."
407
+ },
408
+ "importCounts": {
409
+ "message": "Current deck: $CURRENT$ cards · File: $FILE$ cards",
410
+ "placeholders": {
411
+ "current": {
412
+ "content": "$1"
413
+ },
414
+ "file": {
415
+ "content": "$2"
416
+ }
417
+ }
418
+ },
419
+ "btnImportReplace": {
420
+ "message": "Replace"
421
+ },
422
+ "exportCardsSection": {
423
+ "message": "Export cards"
424
+ },
425
+ "exportCardsHint": {
426
+ "message": "Take your cards to other apps. Scheduling is not exported; cards start fresh there."
427
+ },
428
+ "btnExportAnki": {
429
+ "message": "Anki"
430
+ },
431
+ "btnExportQuizlet": {
432
+ "message": "Quizlet"
433
+ },
434
+ "btnExportCsv": {
435
+ "message": "CSV"
436
+ },
437
+ "exportCardsDone": {
438
+ "message": "Exported $COUNT$ cards to $FILE$.",
439
+ "placeholders": {
440
+ "count": {
441
+ "content": "$1"
442
+ },
443
+ "file": {
444
+ "content": "$2"
445
+ }
446
+ }
447
+ },
448
+ "exportCardsNone": {
449
+ "message": "No cards to export yet."
450
+ },
451
+ "importDone": {
452
+ "message": "Imported $CARDS$ cards from $LESSONS$ lessons.",
453
+ "placeholders": {
454
+ "cards": {
455
+ "content": "$1"
456
+ },
457
+ "lessons": {
458
+ "content": "$2"
459
+ }
460
+ }
461
+ },
462
+ "importFailed": {
463
+ "message": "Import failed: $MSG$",
464
+ "placeholders": {
465
+ "msg": {
466
+ "content": "$1"
467
+ }
468
+ }
469
+ },
470
+ "actionFailed": {
471
+ "message": "Something went wrong: $MSG$",
472
+ "placeholders": {
473
+ "msg": {
474
+ "content": "$1"
475
+ }
476
+ }
477
+ },
478
+ "nativeBannerTitle": {
479
+ "message": "Meanings in your language"
480
+ },
481
+ "nativeDownloadBtn": {
482
+ "message": "Download translations (one-time, on-device)"
483
+ },
484
+ "nativeDownloadBody": {
485
+ "message": "$COUNT$ words can also be shown in $LANG$. Chrome translates them on this device; nothing is sent anywhere.",
486
+ "placeholders": {
487
+ "count": {
488
+ "content": "$1"
489
+ },
490
+ "lang": {
491
+ "content": "$2"
492
+ }
493
+ }
494
+ },
495
+ "nativeDownloading": {
496
+ "message": "Downloading translations… $PERCENT$%",
497
+ "placeholders": {
498
+ "percent": {
499
+ "content": "$1"
500
+ }
501
+ }
502
+ },
503
+ "nativeDownloadingWait": {
504
+ "message": "Chrome is downloading translations. They will appear here when ready."
505
+ },
506
+ "nativeTranslating": {
507
+ "message": "Translating $COUNT$ words into $LANG$…",
508
+ "placeholders": {
509
+ "count": {
510
+ "content": "$1"
511
+ },
512
+ "lang": {
513
+ "content": "$2"
514
+ }
515
+ }
516
+ },
517
+ "nativeUnavailable": {
518
+ "message": "Your browser can't translate $SOURCE$→$TARGET$ on-device yet; showing English.",
519
+ "placeholders": {
520
+ "source": {
521
+ "content": "$1"
522
+ },
523
+ "target": {
524
+ "content": "$2"
525
+ }
526
+ }
527
+ },
528
+ "fieldShowNativeOnPage": {
529
+ "message": "Show my language on the page"
530
+ },
531
+ "nativeDownloadFailed": {
532
+ "message": "Download didn't finish — try again"
533
+ },
534
+ "nativeDismiss": {
535
+ "message": "Hide"
536
+ },
537
+ "tabPractice": {
538
+ "message": "Practice"
539
+ },
540
+ "pxCtaTitle": {
541
+ "message": "Practice now"
542
+ },
543
+ "pxCtaDue": {
544
+ "message": "$COUNT$ words are waiting · about 3 minutes",
545
+ "placeholders": {
546
+ "count": {
547
+ "content": "$1"
548
+ }
549
+ }
550
+ },
551
+ "pxCtaBody": {
552
+ "message": "A quick, fun round with your own words"
553
+ },
554
+ "pxStartTitle": {
555
+ "message": "Ready to practice?"
556
+ },
557
+ "pxStatDue": {
558
+ "message": "due now"
559
+ },
560
+ "pxStatWords": {
561
+ "message": "words in your deck"
562
+ },
563
+ "pxStartBody": {
564
+ "message": "$COUNT$ short exercises with the words you collected. Mistakes come back once at the end, so you can nail them.",
565
+ "placeholders": {
566
+ "count": {
567
+ "content": "$1"
568
+ }
569
+ }
570
+ },
571
+ "pxKindsLabel": {
572
+ "message": "Exercise types"
573
+ },
574
+ "pxKindMeaning": {
575
+ "message": "Meanings"
576
+ },
577
+ "pxKindListen": {
578
+ "message": "Listening"
579
+ },
580
+ "pxKindMatch": {
581
+ "message": "Matching"
582
+ },
583
+ "pxKindType": {
584
+ "message": "Typing"
585
+ },
586
+ "pxKindBlank": {
587
+ "message": "Fill in the blank"
588
+ },
589
+ "pxStart": {
590
+ "message": "Start practice"
591
+ },
592
+ "pxEmptyTitle": {
593
+ "message": "Let's collect some words first"
594
+ },
595
+ "pxEmptyBody": {
596
+ "message": "Do a Tiny Lesson to collect at least $COUNT$ words — then come back and practice them here.",
597
+ "placeholders": {
598
+ "count": {
599
+ "content": "$1"
600
+ }
601
+ }
602
+ },
603
+ "pxEmptyCta": {
604
+ "message": "Open Tiny Lesson"
605
+ },
606
+ "pxAskMeaning": {
607
+ "message": "What does this mean?"
608
+ },
609
+ "pxAskReverse": {
610
+ "message": "Pick the right word"
611
+ },
612
+ "pxAskListen": {
613
+ "message": "What do you hear?"
614
+ },
615
+ "pxAskBlank": {
616
+ "message": "Fill in the blank"
617
+ },
618
+ "pxBlankGap": {
619
+ "message": "blank"
620
+ },
621
+ "pxAskMatch": {
622
+ "message": "Match the pairs"
623
+ },
624
+ "pxMatchWords": {
625
+ "message": "Words"
626
+ },
627
+ "pxMatchMeanings": {
628
+ "message": "Meanings"
629
+ },
630
+ "pxAskType": {
631
+ "message": "Type it in your target language"
632
+ },
633
+ "pxTypePlaceholder": {
634
+ "message": "Type your answer"
635
+ },
636
+ "pxCheck": {
637
+ "message": "Check"
638
+ },
639
+ "pxContinue": {
640
+ "message": "Continue"
641
+ },
642
+ "pxPraise1": {
643
+ "message": "Nice!"
644
+ },
645
+ "pxPraise2": {
646
+ "message": "Great job!"
647
+ },
648
+ "pxPraise3": {
649
+ "message": "You got it!"
650
+ },
651
+ "pxWrongTitle": {
652
+ "message": "Not quite"
653
+ },
654
+ "pxCorrectAnswer": {
655
+ "message": "Correct answer:"
656
+ },
657
+ "pxAlmostTitle": {
658
+ "message": "Almost!"
659
+ },
660
+ "pxAlmostBody": {
661
+ "message": "Watch the spelling:"
662
+ },
663
+ "pxMatchAlmost": {
664
+ "message": "All matched — a few slips"
665
+ },
666
+ "pxRetry": {
667
+ "message": "One more try"
668
+ },
669
+ "pxCombo": {
670
+ "message": "$COUNT$ in a row",
671
+ "placeholders": {
672
+ "count": {
673
+ "content": "$1"
674
+ }
675
+ }
676
+ },
677
+ "pxQuit": {
678
+ "message": "Quit (nothing is saved)"
679
+ },
680
+ "pxProgress": {
681
+ "message": "Session progress"
682
+ },
683
+ "pxEndTitle": {
684
+ "message": "Session complete!"
685
+ },
686
+ "pxEndPerfect": {
687
+ "message": "Perfect session!"
688
+ },
689
+ "pxEndXp": {
690
+ "message": "XP earned"
691
+ },
692
+ "pxEndAccuracy": {
693
+ "message": "Accuracy"
694
+ },
695
+ "pxEndWords": {
696
+ "message": "Words strengthened"
697
+ },
698
+ "pxGoalLine": {
699
+ "message": "$XP$ / $GOAL$ XP today",
700
+ "placeholders": {
701
+ "xp": {
702
+ "content": "$1"
703
+ },
704
+ "goal": {
705
+ "content": "$2"
706
+ }
707
+ }
708
+ },
709
+ "pxSaveFailed": {
710
+ "message": "Couldn't save this session: $ERROR$",
711
+ "placeholders": {
712
+ "error": {
713
+ "content": "$1"
714
+ }
715
+ }
716
+ },
717
+ "pxAgain": {
718
+ "message": "Practice again"
719
+ },
720
+ "pxDone": {
721
+ "message": "Done"
722
+ },
723
+ "pxLeaveUnsaved": {
724
+ "message": "Your results aren't saved yet. Press again to leave without saving, or tap Retry."
725
+ },
726
+ "fieldSoundEffects": {
727
+ "message": "Sound effects in practice"
728
+ },
729
+ "pxPerfectBonus": {
730
+ "message": "+$XP$ XP perfect bonus",
731
+ "placeholders": {
732
+ "xp": {
733
+ "content": "$1"
734
+ }
735
+ }
736
+ },
737
+ "level1": {
738
+ "message": "Newcomer"
739
+ },
740
+ "level2": {
741
+ "message": "Explorer"
742
+ },
743
+ "level3": {
744
+ "message": "Learner"
745
+ },
746
+ "level4": {
747
+ "message": "Speaker"
748
+ },
749
+ "level5": {
750
+ "message": "Conversationalist"
751
+ },
752
+ "level6": {
753
+ "message": "Storyteller"
754
+ },
755
+ "level7": {
756
+ "message": "Fluent Friend"
757
+ },
758
+ "level8": {
759
+ "message": "Polyglot"
760
+ },
761
+ "level9": {
762
+ "message": "Master"
763
+ },
764
+ "level10": {
765
+ "message": "Legend"
766
+ },
767
+ "ach_perfect_session": {
768
+ "message": "Perfect session"
769
+ },
770
+ "ach_xp_100_day": {
771
+ "message": "100 XP in one day"
772
+ },
773
+ "ach_sessions_10": {
774
+ "message": "10 practice sessions"
775
+ },
776
+ "ach_first_match": {
777
+ "message": "First match game"
778
+ },
779
+ "tabWords": {
780
+ "message": "Words"
781
+ },
782
+ "wordsHeading": {
783
+ "message": "Your words"
784
+ },
785
+ "wordsModeLabel": {
786
+ "message": "How to show your words"
787
+ },
788
+ "wordsFilterLabel": {
789
+ "message": "Filter words"
790
+ },
791
+ "wordsFilterAll": {
792
+ "message": "All"
793
+ },
794
+ "wordsFilterDue": {
795
+ "message": "Due"
796
+ },
797
+ "wordsFilterNew": {
798
+ "message": "New"
799
+ },
800
+ "wordsFilterWeak": {
801
+ "message": "Weak"
802
+ },
803
+ "wordsFilterFavorites": {
804
+ "message": "Favorites"
805
+ },
806
+ "wordsFilterMastered": {
807
+ "message": "Mastered"
808
+ },
809
+ "wordsOtherGroup": {
810
+ "message": "Other words"
811
+ },
812
+ "wordsNoMatch": {
813
+ "message": "No words match. Try another search or filter."
814
+ },
815
+ "wordsEmptyTitle": {
816
+ "message": "No words yet"
817
+ },
818
+ "wordsShowMore": {
819
+ "message": "Show more ($COUNT$ left)",
820
+ "placeholders": {
821
+ "count": {
822
+ "content": "$1"
823
+ }
824
+ }
825
+ },
826
+ "wordsFavorite": {
827
+ "message": "Favorite: $TERM$",
828
+ "placeholders": {
829
+ "term": {
830
+ "content": "$1"
831
+ }
832
+ }
833
+ },
834
+ "wordsFavoriteAdded": {
835
+ "message": "$TERM$ added to favorites",
836
+ "placeholders": {
837
+ "term": {
838
+ "content": "$1"
839
+ }
840
+ }
841
+ },
842
+ "wordsFavoriteRemoved": {
843
+ "message": "$TERM$ removed from favorites",
844
+ "placeholders": {
845
+ "term": {
846
+ "content": "$1"
847
+ }
848
+ }
849
+ },
850
+ "wordsListenTo": {
851
+ "message": "Listen: $TERM$",
852
+ "placeholders": {
853
+ "term": {
854
+ "content": "$1"
855
+ }
856
+ }
857
+ },
858
+ "wordsKnowThis": {
859
+ "message": "I know this"
860
+ },
861
+ "wordsKnowThisLabel": {
862
+ "message": "I know this: $TERM$",
863
+ "placeholders": {
864
+ "term": {
865
+ "content": "$1"
866
+ }
867
+ }
868
+ },
869
+ "wordsKnown": {
870
+ "message": "Known"
871
+ },
872
+ "wordsKnownXp": {
873
+ "message": "Known · +$XP$ XP",
874
+ "placeholders": {
875
+ "xp": {
876
+ "content": "$1"
877
+ }
878
+ }
879
+ },
880
+ "wordsKnownStatus": {
881
+ "message": "$TERM$ marked as known, +$XP$ XP",
882
+ "placeholders": {
883
+ "term": {
884
+ "content": "$1"
885
+ },
886
+ "xp": {
887
+ "content": "$2"
888
+ }
889
+ }
890
+ },
891
+ "wordsEditNative": {
892
+ "message": "In my language"
893
+ },
894
+ "wordsEditEnglish": {
895
+ "message": "Meaning (lesson)"
896
+ },
897
+ "wordsEditLabel": {
898
+ "message": "Edit meanings of $TERM$",
899
+ "placeholders": {
900
+ "term": {
901
+ "content": "$1"
902
+ }
903
+ }
904
+ },
905
+ "placeholderNative": {
906
+ "message": "Meaning in your language"
907
+ },
908
+ "strengthLabel": {
909
+ "message": "Strength $VALUE$ of $MAX$",
910
+ "placeholders": {
911
+ "value": {
912
+ "content": "$1"
913
+ },
914
+ "max": {
915
+ "content": "$2"
916
+ }
917
+ }
918
+ },
919
+ "todayGoalMet": {
920
+ "message": "Daily goal reached!"
921
+ },
922
+ "streakFreezesLabel": {
923
+ "message": "Streak freezes: $COUNT$ (protect a missed day)",
924
+ "placeholders": {
925
+ "count": {
926
+ "content": "$1"
927
+ }
928
+ }
929
+ },
930
+ "bannerFreezeUsed": {
931
+ "message": "A streak freeze kept your streak alive on $DATE$.",
932
+ "placeholders": {
933
+ "date": {
934
+ "content": "$1"
935
+ }
936
+ }
937
+ },
938
+ "bannerFreezeEarned": {
939
+ "message": "7 days in a row! You earned a streak freeze."
940
+ },
941
+ "bannerDismiss": {
942
+ "message": "Dismiss"
943
+ },
944
+ "practiceTheseWords": {
945
+ "message": "Practice these $COUNT$ new words",
946
+ "placeholders": {
947
+ "count": {
948
+ "content": "$1"
949
+ }
950
+ }
951
+ },
952
+ "practiceTheseBody": {
953
+ "message": "Fresh from your last lesson: lock them in now."
954
+ },
955
+ "scenariosHeading": {
956
+ "message": "Start a lesson"
957
+ },
958
+ "scenariosBody": {
959
+ "message": "Pick a situation: LangCoach opens Tiny Lesson, fills it in and presses Generate for you."
960
+ },
961
+ "scenariosMore": {
962
+ "message": "More ideas"
963
+ },
964
+ "scenarioStart": {
965
+ "message": "Start"
966
+ },
967
+ "scenarioStarting": {
968
+ "message": "Starting…"
969
+ },
970
+ "scenarioStartLabel": {
971
+ "message": "Start a Tiny Lesson: $THEME$",
972
+ "placeholders": {
973
+ "theme": {
974
+ "content": "$1"
975
+ }
976
+ }
977
+ },
978
+ "scenarioCopyLabel": {
979
+ "message": "Copy: $THEME$",
980
+ "placeholders": {
981
+ "theme": {
982
+ "content": "$1"
983
+ }
984
+ }
985
+ },
986
+ "scenarioOpenTiny": {
987
+ "message": "Open Tiny Lesson"
988
+ },
989
+ "scenarioStarted": {
990
+ "message": "Your lesson is being generated in the Tiny Lesson tab."
991
+ },
992
+ "scenarioHintSplash": {
993
+ "message": "Tiny Lesson shows its welcome screen first. Click Start there (and accept the notice), then try again."
994
+ },
995
+ "scenarioHintLanguage": {
996
+ "message": "Couldn't pick your language on the page. Choose it there, then press Start again, or copy the theme."
997
+ },
998
+ "scenarioHintGenerate": {
999
+ "message": "The theme is filled in, but Generate wasn't ready. Press Generate on the page."
1000
+ },
1001
+ "scenarioHintGeneric": {
1002
+ "message": "Couldn't start it automatically. Copy the theme and paste it into Tiny Lesson."
1003
+ },
1004
+ "todayTasksHeading": {
1005
+ "message": "Today's plan"
1006
+ },
1007
+ "levelToNext": {
1008
+ "message": "$XP$ XP to $NEXT$",
1009
+ "placeholders": {
1010
+ "xp": {
1011
+ "content": "$1"
1012
+ },
1013
+ "next": {
1014
+ "content": "$2"
1015
+ }
1016
+ }
1017
+ },
1018
+ "levelMax": {
1019
+ "message": "Top level reached. Legendary!"
1020
+ },
1021
+ "levelProgressLabel": {
1022
+ "message": "Progress to the next level: $PCT$%",
1023
+ "placeholders": {
1024
+ "pct": {
1025
+ "content": "$1"
1026
+ }
1027
+ }
1028
+ },
1029
+ "weekChartHeading": {
1030
+ "message": "This week"
1031
+ },
1032
+ "weekChartLabel": {
1033
+ "message": "XP over the last 7 days: $TOTAL$ in total, daily goal $GOAL$",
1034
+ "placeholders": {
1035
+ "total": {
1036
+ "content": "$1"
1037
+ },
1038
+ "goal": {
1039
+ "content": "$2"
1040
+ }
1041
+ }
1042
+ },
1043
+ "statFreezes": {
1044
+ "message": "Streak freezes"
1045
+ },
1046
+ "achUnlocked": {
1047
+ "message": "unlocked"
1048
+ },
1049
+ "achLocked": {
1050
+ "message": "locked"
1051
+ },
1052
+ "goalPickerLabel": {
1053
+ "message": "Daily goal"
1054
+ },
1055
+ "goalCasual": {
1056
+ "message": "Casual"
1057
+ },
1058
+ "goalRegular": {
1059
+ "message": "Regular"
1060
+ },
1061
+ "goalSerious": {
1062
+ "message": "Serious"
1063
+ },
1064
+ "goalIntense": {
1065
+ "message": "Intense"
1066
+ },
1067
+ "goalXpPerDay": {
1068
+ "message": "$XP$ XP a day",
1069
+ "placeholders": {
1070
+ "xp": {
1071
+ "content": "$1"
1072
+ }
1073
+ }
1074
+ },
1075
+ "toastForwarded": {
1076
+ "message": "sent to your agent"
1077
+ },
1078
+ "bridgeSection": {
1079
+ "message": "Your AI agent"
1080
+ },
1081
+ "bridgeHint": {
1082
+ "message": "LangCoach also sends each lesson you do here to the AI agent on this computer (the langcoach MCP server), so it can remember it, plan and quiz you. It only talks to your own computer; nothing leaves it."
1083
+ },
1084
+ "bridgeConnected": {
1085
+ "message": "Connected to your agent"
1086
+ },
1087
+ "bridgeWaiting": {
1088
+ "message": "Waiting for your agent (start it to receive your lessons)"
1089
+ },
1090
+ "bridgeOff": {
1091
+ "message": "Off"
1092
+ },
1093
+ "fieldBridge": {
1094
+ "message": "Send my lessons to my AI agent"
1095
+ },
1096
+ "bridgeLearnMore": {
1097
+ "message": "Learn how to connect"
1098
+ },
1099
+ "bridgePending": {
1100
+ "message": "$COUNT$ lessons waiting to be sent",
1101
+ "placeholders": {
1102
+ "count": {
1103
+ "content": "$1",
1104
+ "example": "3"
1105
+ }
1106
+ }
1107
+ },
1108
+ "bridgeNotPaired": {
1109
+ "message": "Not paired: install the extension from your agent to connect"
1110
+ },
1111
+ "bridgeUnverified": {
1112
+ "message": "Server not verified: something on this computer answered without proving it is your LangCoach agent, so nothing was sent"
1113
+ },
1114
+ "bridgeHowToPair": {
1115
+ "message": "How to pair"
1116
+ }
1117
+ }