5582 grammar tweaks (#5594)

* feat: add hint counter for grammar activities

- fade out hint button to morph info in category questions

- animated transitions for smoother hint display

* chore: copy change and variable completion message

* chore: only fetch necessary types in fetchErrors

to end up with more grammar errors, but still only use one getUses call

* translations

---------

Co-authored-by: ggurdin <ggurdin@gmail.com>
This commit is contained in:
avashilling 2026-02-09 10:32:50 -05:00 committed by GitHub
parent 27740f2967
commit 27776a2896
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
60 changed files with 1360 additions and 742 deletions

View file

@ -1,6 +1,6 @@
{
"@@locale": "ar",
"@@last_modified": "2026-02-05 10:09:56.397837",
"@@last_modified": "2026-02-09 10:31:06.969392",
"about": "حول",
"@about": {
"type": "String",
@ -10954,8 +10954,6 @@
"congratulations": "مبروك!",
"anotherRound": "جولة أخرى",
"noActivityRequest": "لا يوجد طلب نشاط حالي.",
"quit": "خروج",
"congratulationsYouveCompletedPractice": "تهانينا! لقد أكملت جلسة التدريب.",
"mustHave10Words": "يجب أن يكون لديك على الأقل 10 كلمات مفردات لممارستها. حاول التحدث إلى صديق أو بوت بانجيا لاكتشاف المزيد!",
"botSettings": "إعدادات البوت",
"activitySettingsOverrideWarning": "اللغة ومستوى اللغة محددان بواسطة خطة النشاط",
@ -11004,14 +11002,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11201,5 +11191,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "ممارسة مثالية!",
"greatPractice": "ممارسة رائعة!",
"usedNoHints": "عمل رائع بعدم استخدام أي تلميحات!",
"youveCompletedPractice": "لقد أكملت الممارسة، استمر في ذلك لتحسين مهاراتك!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1908,7 +1908,7 @@
"playWithAI": "Пакуль гуляйце з ШІ",
"courseStartDesc": "Pangea Bot гатовы да працы ў любы час!\n\n...але навучанне лепш з сябрамі!",
"@@locale": "be",
"@@last_modified": "2026-02-05 10:09:46.469770",
"@@last_modified": "2026-02-09 10:30:56.849128",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11836,8 +11836,6 @@
"congratulations": "Сардэчна віншуем!",
"anotherRound": "Яшчэ адзін раунд",
"noActivityRequest": "Няма бягучага запыту на актыўнасць.",
"quit": "Выйсці",
"congratulationsYouveCompletedPractice": "Сардэчна віншуем! Вы завяршылі сесію практыкі.",
"mustHave10Words": "Вы павінны мець не менш за 10 слоў для практыкавання. Паспрабуйце пагаварыць з сябрам або Pangea Bot, каб даведацца больш!",
"botSettings": "Налады бота",
"activitySettingsOverrideWarning": "Мова і ўзровень мовы вызначаюцца планам актыўнасці",
@ -11886,14 +11884,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12083,5 +12073,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Ідэальная практыка!",
"greatPractice": "Выдатная практыка!",
"usedNoHints": "Малайчына, што не карыстаўся падказкамі!",
"youveCompletedPractice": "Вы завяршылі практыку, працягвайце, каб стаць лепшым!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:10:08.830801",
"@@last_modified": "2026-02-09 10:31:21.327976",
"about": "সম্পর্কে",
"@about": {
"type": "String",
@ -11841,8 +11841,6 @@
"congratulations": "অভিনন্দন!",
"anotherRound": "আরেকটি রাউন্ড",
"noActivityRequest": "বর্তমান কোন কার্যকলাপের অনুরোধ নেই।",
"quit": "বিরতি",
"congratulationsYouveCompletedPractice": "অভিনন্দন! আপনি অনুশীলন সেশন সম্পন্ন করেছেন।",
"mustHave10Words": "আপনার অনুশীলনের জন্য অন্তত 10টি শব্দ থাকতে হবে। আরও জানার জন্য একটি বন্ধুর সাথে কথা বলুন বা Pangea Bot এর সাথে কথা বলুন!",
"botSettings": "বট সেটিংস",
"activitySettingsOverrideWarning": "কার্যকলাপ পরিকল্পনার দ্বারা নির্ধারিত ভাষা এবং ভাষার স্তর",
@ -11891,14 +11889,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12088,5 +12078,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "পারফেক্ট প্র্যাকটিস!",
"greatPractice": "দারুণ প্র্যাকটিস!",
"usedNoHints": "কোনো হিন্ট ব্যবহার না করার জন্য ভালো কাজ!",
"youveCompletedPractice": "আপনি প্র্যাকটিস সম্পন্ন করেছেন, উন্নতির জন্য এভাবে চালিয়ে যান!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4276,7 +4276,7 @@
"joinPublicTrip": "མི་ཚེས་ལ་ལོག་འབད།",
"startOwnTrip": "ངེད་རང་གི་ལོག་ལ་སྦྱོར་བཅོས།",
"@@locale": "bo",
"@@last_modified": "2026-02-05 10:10:06.262776",
"@@last_modified": "2026-02-09 10:31:18.713273",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -10491,8 +10491,6 @@
"congratulations": "Čestitamo!",
"anotherRound": "Još jedan krug",
"noActivityRequest": "Ninguna solicitud de actividad actual.",
"quit": "Salir",
"congratulationsYouveCompletedPractice": "¡Felicidades! Has completado la sesión de práctica.",
"mustHave10Words": "Debes tener al menos 10 palabras de vocabulario para practicarlas. ¡Intenta hablar con un amigo o con Pangea Bot para descubrir más!",
"botSettings": "Configuraciones del Bot",
"activitySettingsOverrideWarning": "Idioma y nivel de idioma determinados por el plan de actividad",
@ -10541,14 +10539,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10738,5 +10728,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Perfekta praktik!",
"greatPractice": "Stora praktik!",
"usedNoHints": "Bra jobbat utan att använda några ledtrådar!",
"youveCompletedPractice": "Du har slutfört praktiken, fortsätt så för att bli bättre!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:47.712187",
"@@last_modified": "2026-02-09 10:30:58.877498",
"about": "Quant a",
"@about": {
"type": "String",
@ -10761,8 +10761,6 @@
"congratulations": "Felicitats!",
"anotherRound": "Una altra ronda",
"noActivityRequest": "No hi ha cap sol·licitud d'activitat actual.",
"quit": "Sortir",
"congratulationsYouveCompletedPractice": "Felicitats! Has completat la sessió de pràctica.",
"mustHave10Words": "Has de tenir almenys 10 paraules de vocabulari per practicar-les. Prova a parlar amb un amic o amb el Pangea Bot per descobrir-ne més!",
"botSettings": "Configuració del Bot",
"activitySettingsOverrideWarning": "Idioma i nivell d'idioma determinats pel pla d'activitat",
@ -10811,14 +10809,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11008,5 +10998,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Pràctica perfecta!",
"greatPractice": "Gran pràctica!",
"usedNoHints": "Bon treball sense utilitzar cap pista!",
"youveCompletedPractice": "Has completat la pràctica, continua així per millorar!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "cs",
"@@last_modified": "2026-02-05 10:09:43.831148",
"@@last_modified": "2026-02-09 10:30:53.085602",
"about": "O aplikaci",
"@about": {
"type": "String",
@ -11344,8 +11344,6 @@
"congratulations": "Gratulujeme!",
"anotherRound": "Další kolo",
"noActivityRequest": "Žádná aktuální žádost o aktivitu.",
"quit": "Ukončit",
"congratulationsYouveCompletedPractice": "Gratulujeme! Dokončili jste cvičební sezení.",
"mustHave10Words": "Musíte mít alespoň 10 slovní zásoby, abyste je mohli procvičovat. Zkuste si promluvit s přítelem nebo Pangea Botem, abyste objevili více!",
"botSettings": "Nastavení bota",
"activitySettingsOverrideWarning": "Jazyk a jazyková úroveň určené plánem aktivity",
@ -11394,14 +11392,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11591,5 +11581,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Dokonalá praxe!",
"greatPractice": "Skvělá praxe!",
"usedNoHints": "Dobrá práce, že jsi nepoužil žádné nápovědy!",
"youveCompletedPractice": "Dokončil jsi praxi, pokračuj v tom, abys se zlepšil!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1927,7 +1927,7 @@
"playWithAI": "Leg med AI for nu",
"courseStartDesc": "Pangea Bot er klar til at starte når som helst!\n\n...men læring er bedre med venner!",
"@@locale": "da",
"@@last_modified": "2026-02-05 10:09:17.541713",
"@@last_modified": "2026-02-09 10:30:26.547080",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
@ -11798,8 +11798,6 @@
"congratulations": "Tillykke!",
"anotherRound": "En runde mere",
"noActivityRequest": "Ingen aktuelle aktivitetsanmodning.",
"quit": "Afslut",
"congratulationsYouveCompletedPractice": "Tillykke! Du har gennemført øvelsessessionen.",
"mustHave10Words": "Du skal have mindst 10 ordforrådsord for at øve dem. Prøv at tale med en ven eller Pangea Bot for at opdage mere!",
"botSettings": "Botindstillinger",
"activitySettingsOverrideWarning": "Sprog og sprogniveau bestemt af aktivitetsplan",
@ -11848,14 +11846,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12045,5 +12035,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Perfekt praksis!",
"greatPractice": "God praksis!",
"usedNoHints": "Godt klaret uden at bruge nogen hints!",
"youveCompletedPractice": "Du har gennemført praksis, bliv ved med det for at blive bedre!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "de",
"@@last_modified": "2026-02-05 10:09:37.665075",
"@@last_modified": "2026-02-09 10:30:45.424459",
"alwaysUse24HourFormat": "true",
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
@ -10744,8 +10744,6 @@
"congratulations": "Herzlichen Glückwunsch!",
"anotherRound": "Eine weitere Runde",
"noActivityRequest": "Keine aktuellen Aktivitätsanfragen.",
"quit": "Beenden",
"congratulationsYouveCompletedPractice": "Herzlichen Glückwunsch! Sie haben die Übungssitzung abgeschlossen.",
"mustHave10Words": "Sie müssen mindestens 10 Vokabeln haben, um sie zu üben. Versuchen Sie, mit einem Freund oder dem Pangea Bot zu sprechen, um mehr zu entdecken!",
"botSettings": "Bot-Einstellungen",
"activitySettingsOverrideWarning": "Sprache und Sprachniveau werden durch den Aktivitätsplan bestimmt",
@ -10794,14 +10792,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10991,5 +10981,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Perfekte Übung!",
"greatPractice": "Großartige Übung!",
"usedNoHints": "Gut gemacht, keine Hinweise zu verwenden!",
"youveCompletedPractice": "Du hast die Übung abgeschlossen, mach weiter so, um besser zu werden!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4453,7 +4453,7 @@
"playWithAI": "Παίξτε με την Τεχνητή Νοημοσύνη προς το παρόν",
"courseStartDesc": "Ο Pangea Bot είναι έτοιμος να ξεκινήσει οποιαδήποτε στιγμή!\n\n...αλλά η μάθηση είναι καλύτερη με φίλους!",
"@@locale": "el",
"@@last_modified": "2026-02-05 10:10:14.390437",
"@@last_modified": "2026-02-09 10:31:27.836094",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11795,8 +11795,6 @@
"congratulations": "Συγχαρητήρια!",
"anotherRound": "Μια ακόμη γύρος",
"noActivityRequest": "Δεν υπάρχει τρέχουσα αίτηση δραστηριότητας.",
"quit": "Έξοδος",
"congratulationsYouveCompletedPractice": "Συγχαρητήρια! Έχετε ολοκληρώσει την πρακτική συνεδρία.",
"mustHave10Words": "Πρέπει να έχετε τουλάχιστον 10 λέξεις λεξιλογίου για να τις εξασκήσετε. Δοκιμάστε να μιλήσετε με έναν φίλο ή με τον Pangea Bot για να ανακαλύψετε περισσότερα!",
"botSettings": "Ρυθμίσεις Bot",
"activitySettingsOverrideWarning": "Η γλώσσα και το επίπεδο γλώσσας καθορίζονται από το σχέδιο δραστηριότητας",
@ -11845,14 +11843,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12042,5 +12032,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Τέλεια πρακτική!",
"greatPractice": "Υπέροχη πρακτική!",
"usedNoHints": "Καλή δουλειά που δεν χρησιμοποίησες καθόλου υποδείξεις!",
"youveCompletedPractice": "Έχεις ολοκληρώσει την πρακτική, συνέχισε έτσι για να γίνεις καλύτερος!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -5027,8 +5027,6 @@
"genericWebRecordingError": "Something went wrong. We recommend using the Chrome browser when recording messages.",
"screenSizeWarning": "For the best experience using this application, please expand your screen size.",
"noActivityRequest": "No current activity request.",
"quit": "Quit",
"congratulationsYouveCompletedPractice": "Congratulations! You've completed the practice session.",
"activitiesToUnlockTopicTitle": "Activities to Unlock Next Topic",
"activitiesToUnlockTopicDesc": "Set the number of activities to unlock the next course topic",
"mustHave10Words": "You must have at least 10 vocab words to practice them. Try talking to a friend or Pangea Bot to discover more!",
@ -5073,5 +5071,9 @@
"supportSubtitle": "Questions? We're here to help!",
"autoIGCToolName": "Enable writing assistance",
"autoIGCToolDescription": "Automatically run Pangea Chat tools to correct sent messages to target language.",
"emptyAudioError": "Recording failed. Please check your audio permissions and try again."
"emptyAudioError": "Recording failed. Please check your audio permissions and try again.",
"perfectPractice": "Perfect practice!",
"greatPractice": "Great practice!",
"usedNoHints": "Nice job not using any hints!",
"youveCompletedPractice": "You've completed practice, keep it up to get better!"
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:10:17.896498",
"@@last_modified": "2026-02-09 10:31:32.343732",
"about": "Prio",
"@about": {
"type": "String",
@ -11826,8 +11826,6 @@
"congratulations": "Gratulon!",
"anotherRound": "Alia rundo",
"noActivityRequest": "Neniu aktuala aktivitecpeticio.",
"quit": "Eliri",
"congratulationsYouveCompletedPractice": "Gratulojn! Vi kompletigis la praktikadon.",
"mustHave10Words": "Vi devas havi almenaŭ 10 vortojn por praktiki ilin. Provu paroli kun amiko aŭ Pangea Bot por malkovri pli!",
"botSettings": "Botaj Agordoj",
"activitySettingsOverrideWarning": "Lingvo kaj lingvonivelo determinita de la aktiviteca plano",
@ -11876,14 +11874,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12073,5 +12063,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Perfekta praktiko!",
"greatPractice": "Granda praktiko!",
"usedNoHints": "Bonega laboro ne uzi iujn sugestojn!",
"youveCompletedPractice": "Vi finis la praktikon, daŭrigu por pliboniĝi!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "es",
"@@last_modified": "2026-02-05 10:09:12.250951",
"@@last_modified": "2026-02-09 10:30:21.560804",
"about": "Acerca de",
"@about": {
"type": "String",
@ -7979,8 +7979,6 @@
"congratulations": "¡Felicidades!",
"anotherRound": "Otra ronda",
"noActivityRequest": "No hay solicitudes de actividad actuales.",
"quit": "Salir",
"congratulationsYouveCompletedPractice": "¡Felicidades! Has completado la sesión de práctica.",
"mustHave10Words": "Debes tener al menos 10 palabras de vocabulario para practicarlas. ¡Intenta hablar con un amigo o con Pangea Bot para descubrir más!",
"botSettings": "Configuración del Bot",
"activitySettingsOverrideWarning": "Idioma y nivel de idioma determinados por el plan de actividad",
@ -8029,14 +8027,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -8226,5 +8216,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "¡Práctica perfecta!",
"greatPractice": "¡Gran práctica!",
"usedNoHints": "¡Buen trabajo no usando ninguna pista!",
"youveCompletedPractice": "¡Has completado la práctica, sigue así para mejorar!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "et",
"@@last_modified": "2026-02-05 10:09:36.127342",
"@@last_modified": "2026-02-09 10:30:44.206560",
"about": "Rakenduse teave",
"@about": {
"type": "String",
@ -11008,8 +11008,6 @@
"congratulations": "Palju õnne!",
"anotherRound": "Veel üks voor",
"noActivityRequest": "Praegu ei ole aktiivsuse taotlust.",
"quit": "Välju",
"congratulationsYouveCompletedPractice": "Palju õnne! Olete lõpetanud harjut seansi.",
"mustHave10Words": "Te peate omama vähemalt 10 sõnavara sõna, et neid harjutada. Proovige rääkida sõbraga või Pangea Botiga, et rohkem avastada!",
"botSettings": "Boti seaded",
"activitySettingsOverrideWarning": "Keele ja keele taseme määrab tegevusplaan",
@ -11058,14 +11056,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11255,5 +11245,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Täiuslik harjutamine!",
"greatPractice": "Suurepärane harjutamine!",
"usedNoHints": "Hea töö, et ei kasutanud mingeid vihjeid!",
"youveCompletedPractice": "Oled harjutamise lõpetanud, jätka samas vaimus, et paremaks saada!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "eu",
"@@last_modified": "2026-02-05 10:09:33.401642",
"@@last_modified": "2026-02-09 10:30:41.236742",
"about": "Honi buruz",
"@about": {
"type": "String",
@ -10737,8 +10737,6 @@
"congratulations": "Zorionak!",
"anotherRound": "Beste txanda bat",
"noActivityRequest": "Ez dago egungo jarduera eskaerarik.",
"quit": "Irten",
"congratulationsYouveCompletedPractice": "Zorionak! Praktika saioa amaitu duzu.",
"mustHave10Words": "Gutxienez 10 hiztegi hitz izan behar dituzu praktikan jartzeko. Saiatu lagun batekin edo Pangea Bot-ekin hitz egiten gehiago ezagutzeko!",
"botSettings": "Botaren Ezarpenak",
"activitySettingsOverrideWarning": "Jarduera planak zehaztutako hizkuntza eta hizkuntza maila",
@ -10787,14 +10785,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10984,5 +10974,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Praktika perfektua!",
"greatPractice": "Praktika handia!",
"usedNoHints": "Lan ona, ez duzu inolako iradokizunik erabili!",
"youveCompletedPractice": "Praktika amaitu duzu, jarraitu horrela hobetzeko!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:10:10.668033",
"@@last_modified": "2026-02-09 10:31:23.313797",
"repeatPassword": "تکرار رمزعبور",
"@repeatPassword": {},
"about": "درباره",
@ -11469,8 +11469,6 @@
"congratulations": "تبریک می‌گویم!",
"anotherRound": "یک دور دیگر",
"noActivityRequest": "درخواست فعالیت فعلی وجود ندارد.",
"quit": "خروج",
"congratulationsYouveCompletedPractice": "تبریک! شما جلسه تمرین را کامل کرده‌اید.",
"mustHave10Words": "شما باید حداقل 10 کلمه واژگان برای تمرین داشته باشید. سعی کنید با یک دوست یا ربات پانژیا صحبت کنید تا بیشتر کشف کنید!",
"botSettings": "تنظیمات ربات",
"activitySettingsOverrideWarning": "زبان و سطح زبان تعیین شده توسط برنامه فعالیت",
@ -11519,14 +11517,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11716,5 +11706,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "تمرین عالی!",
"greatPractice": "تمرین فوق‌العاده!",
"usedNoHints": "کار خوبی کردید که از هیچ راهنمایی استفاده نکردید!",
"youveCompletedPractice": "شما تمرین را کامل کردید، ادامه دهید تا بهتر شوید!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4006,7 +4006,7 @@
"playWithAI": "Leiki tekoälyn kanssa nyt",
"courseStartDesc": "Pangea Bot on valmis milloin tahansa!\n\n...mutta oppiminen on parempaa ystävien kanssa!",
"@@locale": "fi",
"@@last_modified": "2026-02-05 10:09:16.239112",
"@@last_modified": "2026-02-09 10:30:24.862038",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11360,8 +11360,6 @@
"congratulations": "Onnittelut!",
"anotherRound": "Toinen kierros",
"noActivityRequest": "Ei nykyistä aktiviteettipyyntöä.",
"quit": "Poistu",
"congratulationsYouveCompletedPractice": "Onnittelut! Olet suorittanut harjoitussession.",
"mustHave10Words": "Sinulla on oltava vähintään 10 sanastoa harjoiteltavaksi. Yritä puhua ystävän tai Pangea Botin kanssa löytääksesi lisää!",
"botSettings": "Bottiasetukset",
"activitySettingsOverrideWarning": "Kieli ja kielitaso määräytyvät aktiviteettisuunnitelman mukaan",
@ -11410,14 +11408,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11607,5 +11597,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Täydellinen harjoittelu!",
"greatPractice": "Loistava harjoittelu!",
"usedNoHints": "Hyvä työ, ettet käyttänyt mitään vihjeitä!",
"youveCompletedPractice": "Olet suorittanut harjoituksen, jatka samaan malliin parantuaksesi!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2784,7 +2784,7 @@
"selectAll": "Piliin lahat",
"deselectAll": "Huwag piliin lahat",
"@@locale": "fil",
"@@last_modified": "2026-02-05 10:09:53.428313",
"@@last_modified": "2026-02-09 10:31:04.579384",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}
@ -11713,8 +11713,6 @@
"congratulations": "Binabati kita!",
"anotherRound": "Isa pang round",
"noActivityRequest": "Walang kasalukuyang kahilingan sa aktibidad.",
"quit": "Lumabas",
"congratulationsYouveCompletedPractice": "Binabati kita! Natapos mo na ang sesyon ng pagsasanay.",
"mustHave10Words": "Dapat mayroon kang hindi bababa sa 10 salita ng bokabularyo upang sanayin ang mga ito. Subukan mong makipag-usap sa isang kaibigan o sa Pangea Bot upang matuklasan pa!",
"botSettings": "Mga Setting ng Bot",
"activitySettingsOverrideWarning": "Wika at antas ng wika na tinutukoy ng plano ng aktibidad",
@ -11763,14 +11761,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11960,5 +11950,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Perpektong pagsasanay!",
"greatPractice": "Mahusay na pagsasanay!",
"usedNoHints": "Magandang trabaho sa hindi paggamit ng anumang mga pahiwatig!",
"youveCompletedPractice": "Natapos mo na ang pagsasanay, ipagpatuloy mo lang ito upang maging mas mahusay!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "fr",
"@@last_modified": "2026-02-05 10:10:24.987990",
"@@last_modified": "2026-02-09 10:31:39.092623",
"about": "À propos",
"@about": {
"type": "String",
@ -11061,8 +11061,6 @@
"congratulations": "Félicitations !",
"anotherRound": "Un autre tour",
"noActivityRequest": "Aucune demande d'activité en cours.",
"quit": "Quitter",
"congratulationsYouveCompletedPractice": "Félicitations ! Vous avez terminé la session de pratique.",
"mustHave10Words": "Vous devez avoir au moins 10 mots de vocabulaire à pratiquer. Essayez de parler à un ami ou au Pangea Bot pour en découvrir plus !",
"botSettings": "Paramètres du bot",
"activitySettingsOverrideWarning": "Langue et niveau de langue déterminés par le plan d'activité",
@ -11111,14 +11109,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11308,5 +11298,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Pratique parfaite !",
"greatPractice": "Super pratique !",
"usedNoHints": "Bien joué de ne pas avoir utilisé d'indices !",
"youveCompletedPractice": "Vous avez terminé la pratique, continuez comme ça pour vous améliorer !",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4514,7 +4514,7 @@
"playWithAI": "Imir le AI faoi láthair",
"courseStartDesc": "Tá Bot Pangea réidh chun dul am ar bith!\n\n...ach is fearr foghlaim le cairde!",
"@@locale": "ga",
"@@last_modified": "2026-02-05 10:10:23.901035",
"@@last_modified": "2026-02-09 10:31:37.968813",
"@customReaction": {
"type": "String",
"placeholders": {}
@ -10735,8 +10735,6 @@
"congratulations": "Comhghairdeas!",
"anotherRound": "Ciorcal eile",
"noActivityRequest": "Níl aon iarratas gníomhaíochta reatha.",
"quit": "Dícheangail",
"congratulationsYouveCompletedPractice": "Comhghairdeas! Tá an seisiún cleachtaidh críochnaithe agat.",
"mustHave10Words": "Caithfidh go mbeidh 10 focal le haghaidh cleachtaidh agat ar a laghad. Bain triail as labhairt le cara nó le Pangea Bot chun tuilleadh a fháil amach!",
"botSettings": "Socruithe an Bhot",
"activitySettingsOverrideWarning": "Teanga agus leibhéal teanga a chinneadh de réir plean gníomhaíochta",
@ -10785,14 +10783,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10982,5 +10972,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Cleachtadh foirfe!",
"greatPractice": "Cleachtadh iontach!",
"usedNoHints": "Obair mhaith gan aon leideanna a úsáid!",
"youveCompletedPractice": "Tá do chleachtadh críochnaithe, coinnigh ort chun feabhsú!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "gl",
"@@last_modified": "2026-02-05 10:09:14.434046",
"@@last_modified": "2026-02-09 10:30:23.363980",
"about": "Acerca de",
"@about": {
"type": "String",
@ -10734,8 +10734,6 @@
"congratulations": "Parabéns!",
"anotherRound": "Outra ronda",
"noActivityRequest": "Non hai solicitudes de actividade actuais.",
"quit": "Saír",
"congratulationsYouveCompletedPractice": "Parabéns! Completaches a sesión de práctica.",
"mustHave10Words": "Debes ter polo menos 10 palabras de vocabulario para practicálas. Intenta falar cun amigo ou co Pangea Bot para descubrir máis!",
"botSettings": "Configuración do Bot",
"activitySettingsOverrideWarning": "Idioma e nivel de idioma determinados polo plan de actividade",
@ -10784,14 +10782,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10981,5 +10971,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Práctica perfecta!",
"greatPractice": "Gran práctica!",
"usedNoHints": "Bo traballo sen usar pistas!",
"youveCompletedPractice": "Completaches a práctica, segue así para mellorar!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:28.796405",
"@@last_modified": "2026-02-09 10:30:36.836306",
"about": "אודות",
"@about": {
"type": "String",
@ -11786,8 +11786,6 @@
"congratulations": "מזל טוב!",
"anotherRound": "סיבוב נוסף",
"noActivityRequest": "אין בקשת פעילות נוכחית.",
"quit": "צא",
"congratulationsYouveCompletedPractice": "מזל טוב! סיימת את מושב האימון.",
"mustHave10Words": "עליך שיהיו לפחות 10 מילים לאוצר מילים כדי לתרגל אותן. נסה לדבר עם חבר או עם פנגיאה בוט כדי לגלות עוד!",
"botSettings": "הגדרות בוט",
"activitySettingsOverrideWarning": "שפה ורמת שפה נקבעות על ידי תוכנית הפעילות",
@ -11836,14 +11834,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12033,5 +12023,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "תרגול מושלם!",
"greatPractice": "תרגול נהדר!",
"usedNoHints": "עבודה טובה שלא השתמשת ברמזים!",
"youveCompletedPractice": "סיימת את התרגול, המשך כך כדי להשתפר!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4480,7 +4480,7 @@
"playWithAI": "अभी के लिए एआई के साथ खेलें",
"courseStartDesc": "पैंजिया बॉट कभी भी जाने के लिए तैयार है!\n\n...लेकिन दोस्तों के साथ सीखना बेहतर है!",
"@@locale": "hi",
"@@last_modified": "2026-02-05 10:10:16.696075",
"@@last_modified": "2026-02-09 10:31:30.698303",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11822,8 +11822,6 @@
"congratulations": "बधाई हो!",
"anotherRound": "एक और राउंड",
"noActivityRequest": "कोई वर्तमान गतिविधि अनुरोध नहीं है।",
"quit": "बंद करें",
"congratulationsYouveCompletedPractice": "बधाई हो! आपने अभ्यास सत्र पूरा कर लिया है।",
"mustHave10Words": "आपके पास उन्हें अभ्यास करने के लिए कम से कम 10 शब्द होने चाहिए। अधिक जानने के लिए किसी मित्र या Pangea Bot से बात करने की कोशिश करें!",
"botSettings": "बॉट सेटिंग्स",
"activitySettingsOverrideWarning": "भाषा और भाषा स्तर गतिविधि योजना द्वारा निर्धारित किया गया है",
@ -11872,14 +11870,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12069,5 +12059,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "संपूर्ण अभ्यास!",
"greatPractice": "महान अभ्यास!",
"usedNoHints": "कोई संकेत न उपयोग करने के लिए अच्छा काम!",
"youveCompletedPractice": "आपने अभ्यास पूरा कर लिया है, बेहतर होने के लिए इसे जारी रखें!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "hr",
"@@last_modified": "2026-02-05 10:09:27.459987",
"@@last_modified": "2026-02-09 10:30:35.547762",
"about": "Informacije",
"@about": {
"type": "String",
@ -11109,8 +11109,6 @@
"congratulations": "Čestitamo!",
"anotherRound": "Još jedan krug",
"noActivityRequest": "Nema trenutnog zahtjeva za aktivnost.",
"quit": "Izlaz",
"congratulationsYouveCompletedPractice": "Čestitamo! Završili ste sesiju vježbanja.",
"mustHave10Words": "Morate imati najmanje 10 riječi za vokabular kako biste ih vježbali. Pokušajte razgovarati s prijateljem ili Pangea Botom kako biste otkrili više!",
"botSettings": "Postavke Bota",
"activitySettingsOverrideWarning": "Jezik i razina jezika određeni planom aktivnosti",
@ -11159,14 +11157,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11356,5 +11346,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Savršena praksa!",
"greatPractice": "Sjajna praksa!",
"usedNoHints": "Odlično, niste koristili nikakve savjete!",
"youveCompletedPractice": "Završili ste praksu, nastavite tako da postanete bolji!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "hu",
"@@last_modified": "2026-02-05 10:09:19.675804",
"@@last_modified": "2026-02-09 10:30:28.032874",
"about": "Névjegy",
"@about": {
"type": "String",
@ -10738,8 +10738,6 @@
"congratulations": "Gratulálunk!",
"anotherRound": "Még egy kör",
"noActivityRequest": "Jelenleg nincs aktivitás kérés.",
"quit": "Kilépés",
"congratulationsYouveCompletedPractice": "Gratulálunk! Befejezted a gyakorló ülést.",
"mustHave10Words": "Legalább 10 szókincsszót kellene gyakorolnod. Próbálj meg beszélni egy baráttal vagy a Pangea Bot-tal, hogy többet felfedezhess!",
"botSettings": "Bot beállítások",
"activitySettingsOverrideWarning": "A nyelvet és a nyelvi szintet az aktivitási terv határozza meg",
@ -10788,14 +10786,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10985,5 +10975,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Tökéletes gyakorlás!",
"greatPractice": "Nagyszerű gyakorlás!",
"usedNoHints": "Jó munka, hogy nem használtál semmilyen tippet!",
"youveCompletedPractice": "Befejezted a gyakorlást, folytasd így, hogy jobb legyél!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1955,7 +1955,7 @@
"playWithAI": "Joca con le IA pro ora",
"courseStartDesc": "Pangea Bot es preste a comenzar a qualunque momento!\n\n...ma apprender es melior con amicos!",
"@@locale": "ia",
"@@last_modified": "2026-02-05 10:09:29.962506",
"@@last_modified": "2026-02-09 10:30:38.575679",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11815,8 +11815,6 @@
"congratulations": "Gratulon!",
"anotherRound": "Alia rundo",
"noActivityRequest": "Ninguna solicitud de actividad actual.",
"quit": "Salir",
"congratulationsYouveCompletedPractice": "¡Felicidades! Has completado la sesión de práctica.",
"mustHave10Words": "Debes tener al menos 10 palabras de vocabulario para practicarlas. ¡Intenta hablar con un amigo o con Pangea Bot para descubrir más!",
"botSettings": "Configuraciones del Bot",
"activitySettingsOverrideWarning": "Idioma y nivel de idioma determinados por el plan de actividad",
@ -11865,14 +11863,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12062,5 +12052,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Praktiko perfekta!",
"greatPractice": "Praktiko granda!",
"usedNoHints": "Bonega laboro ne uzante iujn indikojn!",
"youveCompletedPractice": "Vi finis la praktikon, daŭrigu por pliboniĝi!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:21.065759",
"@@last_modified": "2026-02-09 10:30:29.458472",
"setAsCanonicalAlias": "Atur sebagai alias utama",
"@setAsCanonicalAlias": {
"type": "String",
@ -10728,8 +10728,6 @@
"congratulations": "Selamat!",
"anotherRound": "Putaran lain",
"noActivityRequest": "Tidak ada permintaan aktivitas saat ini.",
"quit": "Keluar",
"congratulationsYouveCompletedPractice": "Selamat! Anda telah menyelesaikan sesi latihan.",
"mustHave10Words": "Anda harus memiliki setidaknya 10 kata kosakata untuk berlatih. Cobalah berbicara dengan teman atau Pangea Bot untuk menemukan lebih banyak!",
"botSettings": "Pengaturan Bot",
"activitySettingsOverrideWarning": "Bahasa dan tingkat bahasa ditentukan oleh rencana aktivitas",
@ -10778,14 +10776,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10975,5 +10965,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Latihan yang sempurna!",
"greatPractice": "Latihan yang hebat!",
"usedNoHints": "Kerja bagus tidak menggunakan petunjuk!",
"youveCompletedPractice": "Anda telah menyelesaikan latihan, teruskan untuk menjadi lebih baik!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4369,7 +4369,7 @@
"playWithAI": "Joca con AI pro ora",
"courseStartDesc": "Pangea Bot es preste a partir a qualunque momento!\n\n...ma apprender es melior con amicos!",
"@@locale": "ie",
"@@last_modified": "2026-02-05 10:09:26.195275",
"@@last_modified": "2026-02-09 10:30:34.375227",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11711,8 +11711,6 @@
"congratulations": "Gratulon!",
"anotherRound": "Alia rundo",
"noActivityRequest": "Ninguna solicitud de actividad actual.",
"quit": "Salir",
"congratulationsYouveCompletedPractice": "¡Felicidades! Has completado la sesión de práctica.",
"mustHave10Words": "Debes tener al menos 10 palabras de vocabulario para practicarlas. ¡Intenta hablar con un amigo o con Pangea Bot para descubrir más!",
"botSettings": "Configuración del Bot",
"activitySettingsOverrideWarning": "Idioma y nivel de idioma determinados por el plan de actividad",
@ -11761,14 +11759,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11958,5 +11948,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Praktika perfekt!",
"greatPractice": "Praktika granda!",
"usedNoHints": "Bonega laboro ne uzante iujn indicojn!",
"youveCompletedPractice": "Vi kompletigis la praktikon, daŭrigu por pliboniĝi!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:41.124551",
"@@last_modified": "2026-02-09 10:30:49.194487",
"about": "Informazioni",
"@about": {
"type": "String",
@ -10740,8 +10740,6 @@
"congratulations": "Congratulazioni!",
"anotherRound": "Un altro turno",
"noActivityRequest": "Nessuna richiesta di attività attuale.",
"quit": "Esci",
"congratulationsYouveCompletedPractice": "Congratulazioni! Hai completato la sessione di pratica.",
"mustHave10Words": "Devi avere almeno 10 parole di vocabolario per praticarle. Prova a parlare con un amico o con Pangea Bot per scoprire di più!",
"botSettings": "Impostazioni del Bot",
"activitySettingsOverrideWarning": "Lingua e livello di lingua determinati dal piano di attività",
@ -10790,14 +10788,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10987,5 +10977,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Pratica perfetta!",
"greatPractice": "Ottima pratica!",
"usedNoHints": "Ottimo lavoro non usando suggerimenti!",
"youveCompletedPractice": "Hai completato la pratica, continua così per migliorare!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "ja",
"@@last_modified": "2026-02-05 10:10:15.587333",
"@@last_modified": "2026-02-09 10:31:29.266500",
"about": "このアプリについて",
"@about": {
"type": "String",
@ -11527,8 +11527,6 @@
"congratulations": "おめでとうございます!",
"anotherRound": "もう一回",
"noActivityRequest": "現在のアクティビティリクエストはありません。",
"quit": "終了",
"congratulationsYouveCompletedPractice": "おめでとうございます!練習セッションを完了しました。",
"mustHave10Words": "練習するには、少なくとも10語の語彙が必要です。友達やPangea Botに話しかけて、もっと発見してみてください",
"botSettings": "ボット設定",
"activitySettingsOverrideWarning": "アクティビティプランによって決定された言語と言語レベル",
@ -11577,14 +11575,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11774,5 +11764,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "完璧な練習!",
"greatPractice": "素晴らしい練習!",
"usedNoHints": "ヒントを使わずによくやった!",
"youveCompletedPractice": "練習を完了しました。これを続けて上達してください!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2591,7 +2591,7 @@
"playWithAI": "ამ დროისთვის ითამაშეთ AI-თან",
"courseStartDesc": "Pangea Bot მზადაა ნებისმიერ დროს გასასვლელად!\n\n...მაგრამ სწავლა უკეთესია მეგობრებთან ერთად!",
"@@locale": "ka",
"@@last_modified": "2026-02-05 10:10:20.523925",
"@@last_modified": "2026-02-09 10:31:35.201910",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11767,8 +11767,6 @@
"congratulations": "გილოცავთ!",
"anotherRound": "მეორე რაუნდი",
"noActivityRequest": "ამჟამად აქტივობის მოთხოვნა არ არის.",
"quit": "გამოსვლა",
"congratulationsYouveCompletedPractice": "გილოცავთ! თქვენ დაასრულეთ პრაქტიკის სესია.",
"mustHave10Words": "თქვენ უნდა გქონდეთ მინიმუმ 10 სიტყვა, რომ მათ პრაქტიკაში გამოიყენოთ. სცადეთ მეგობართან ან Pangea Bot-თან საუბარი, რომ მეტი აღმოაჩინოთ!",
"botSettings": "ბოტის პარამეტრები",
"activitySettingsOverrideWarning": "ენასა და ენების დონეს განსაზღვრავს აქტივობის გეგმა",
@ -11817,14 +11815,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12014,5 +12004,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "შესანიშნავი პრაქტიკა!",
"greatPractice": "დიდებული პრაქტიკა!",
"usedNoHints": "კარგი საქმე, რომ არ გამოიყენე არცერთი მინიშნება!",
"youveCompletedPractice": "თქვენ დაასრულეთ პრაქტიკა, გააგრძელეთ ასე, რომ უკეთესი გახდეთ!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:10.325473",
"@@last_modified": "2026-02-09 10:30:18.919050",
"about": "소개",
"@about": {
"type": "String",
@ -10845,8 +10845,6 @@
"congratulations": "축하합니다!",
"anotherRound": "또 다른 라운드",
"noActivityRequest": "현재 활동 요청이 없습니다.",
"quit": "종료",
"congratulationsYouveCompletedPractice": "축하합니다! 연습 세션을 완료했습니다.",
"mustHave10Words": "연습할 단어가 최소 10개 이상 있어야 합니다. 친구나 Pangea Bot과 대화하여 더 많은 것을 발견해 보세요!",
"botSettings": "봇 설정",
"activitySettingsOverrideWarning": "활동 계획에 의해 결정된 언어 및 언어 수준",
@ -10895,14 +10893,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11092,5 +11082,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "완벽한 연습!",
"greatPractice": "훌륭한 연습!",
"usedNoHints": "힌트를 사용하지 않아서 잘했어요!",
"youveCompletedPractice": "연습을 완료했습니다. 계속해서 더 나아지세요!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -3858,7 +3858,7 @@
"playWithAI": "Žaiskite su dirbtiniu intelektu dabar",
"courseStartDesc": "Pangea botas pasiruošęs bet kada pradėti!\n\n...bet mokymasis yra geresnis su draugais!",
"@@locale": "lt",
"@@last_modified": "2026-02-05 10:10:01.069181",
"@@last_modified": "2026-02-09 10:31:13.179961",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11542,8 +11542,6 @@
"congratulations": "Sveikiname!",
"anotherRound": "Dar viena raundas",
"noActivityRequest": "Nėra dabartinio veiklos prašymo.",
"quit": "Išeiti",
"congratulationsYouveCompletedPractice": "Sveikiname! Jūs baigėte praktikos sesiją.",
"mustHave10Words": "Turite turėti bent 10 žodžių, kad galėtumėte juos praktikuoti. Pabandykite pasikalbėti su draugu arba Pangea Bot, kad sužinotumėte daugiau!",
"botSettings": "Roboto nustatymai",
"activitySettingsOverrideWarning": "Kalba ir kalbos lygis nustatomi pagal veiklos planą",
@ -11592,14 +11590,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11789,5 +11779,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Tobulas praktika!",
"greatPractice": "Puiki praktika!",
"usedNoHints": "Puikus darbas, kad nenaudojote jokių užuominų!",
"youveCompletedPractice": "Jūs baigėte praktiką, tęskite, kad taptumėte geresni!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4480,7 +4480,7 @@
"playWithAI": "Tagad spēlējiet ar AI",
"courseStartDesc": "Pangea bots ir gatavs jebkurā laikā!\n\n...bet mācīties ir labāk ar draugiem!",
"@@locale": "lv",
"@@last_modified": "2026-02-05 10:09:54.766036",
"@@last_modified": "2026-02-09 10:31:05.908661",
"analyticsInactiveTitle": "Pieprasījumi neaktīviem lietotājiem nevar tikt nosūtīti",
"analyticsInactiveDesc": "Neaktīvi lietotāji, kuri nav pieteikušies kopš šīs funkcijas ieviešanas, neredzēs jūsu pieprasījumu.\n\nPieprasījuma poga parādīsies, kad viņi atgriezīsies. Jūs varat atkārtoti nosūtīt pieprasījumu vēlāk, noklikšķinot uz pieprasījuma pogas viņu vārdā, kad tā būs pieejama.",
"accessRequestedTitle": "Pieprasījums piekļūt analītikai",
@ -10723,8 +10723,6 @@
"congratulations": "Apsveicam!",
"anotherRound": "Vēl viena kārta",
"noActivityRequest": "Nav pašreizējo aktivitāšu pieprasījumu.",
"quit": "Iziet",
"congratulationsYouveCompletedPractice": "Apsveicam! Jūs esat pabeidzis prakses sesiju.",
"mustHave10Words": "Jums jābūt vismaz 10 vārdiem, lai tos praktizētu. Mēģiniet parunāt ar draugu vai Pangea Bot, lai uzzinātu vairāk!",
"botSettings": "Bota iestatījumi",
"activitySettingsOverrideWarning": "Valoda un valodas līmenis, ko nosaka aktivitāšu plāns",
@ -10773,14 +10771,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10970,5 +10960,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Lieliska prakse!",
"greatPractice": "Lieliska prakse!",
"usedNoHints": "Lieliski, ka neizmantoji nevienu padomu!",
"youveCompletedPractice": "Tu esi pabeidzis praksi, turpini tādā garā, lai uzlabotos!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:45.325631",
"@@last_modified": "2026-02-09 10:30:55.280815",
"about": "Om",
"@about": {
"type": "String",
@ -11830,8 +11830,6 @@
"congratulations": "Gratulerer!",
"anotherRound": "En runde til",
"noActivityRequest": "Ingen nåværende aktivitetsforespørsel.",
"quit": "Avslutt",
"congratulationsYouveCompletedPractice": "Gratulerer! Du har fullført økt med øvelser.",
"mustHave10Words": "Du må ha minst 10 ordforråd for å øve på dem. Prøv å snakke med en venn eller Pangea Bot for å oppdage mer!",
"botSettings": "Bot-innstillinger",
"activitySettingsOverrideWarning": "Språk og språknivå bestemt av aktivitetsplan",
@ -11880,14 +11878,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12077,5 +12067,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Perfekt øvelse!",
"greatPractice": "Flott øvelse!",
"usedNoHints": "Bra jobba med å ikke bruke noen hint!",
"youveCompletedPractice": "Du har fullført øvelsen, fortsett slik for å bli bedre!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:10:04.986596",
"@@last_modified": "2026-02-09 10:31:17.188799",
"about": "Over ons",
"@about": {
"type": "String",
@ -10737,8 +10737,6 @@
"congratulations": "Gefeliciteerd!",
"anotherRound": "Nog een ronde",
"noActivityRequest": "Geen huidige activiteit aanvraag.",
"quit": "Afsluiten",
"congratulationsYouveCompletedPractice": "Gefeliciteerd! Je hebt de oefensessie voltooid.",
"mustHave10Words": "Je moet minstens 10 vocabulairewoorden hebben om ze te oefenen. Probeer met een vriend of Pangea Bot te praten om meer te ontdekken!",
"botSettings": "Botinstellingen",
"activitySettingsOverrideWarning": "Taal en taalniveau bepaald door het activiteitenplan",
@ -10787,14 +10785,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10984,5 +10974,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Perfecte oefening!",
"greatPractice": "Geweldige oefening!",
"usedNoHints": "Goed gedaan, geen hints gebruikt!",
"youveCompletedPractice": "Je hebt de oefening voltooid, ga zo door om beter te worden!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "pl",
"@@last_modified": "2026-02-05 10:10:11.791789",
"@@last_modified": "2026-02-09 10:31:24.557539",
"about": "O aplikacji",
"@about": {
"type": "String",
@ -10735,8 +10735,6 @@
"congratulations": "Gratulacje!",
"anotherRound": "Kolejna runda",
"noActivityRequest": "Brak bieżącego żądania aktywności.",
"quit": "Zakończ",
"congratulationsYouveCompletedPractice": "Gratulacje! Ukończyłeś sesję ćwiczeń.",
"mustHave10Words": "Musisz mieć co najmniej 10 słówek do ćwiczenia. Spróbuj porozmawiać z przyjacielem lub Pangea Bot, aby odkryć więcej!",
"botSettings": "Ustawienia bota",
"activitySettingsOverrideWarning": "Język i poziom językowy określone przez plan aktywności",
@ -10785,14 +10783,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10982,5 +10972,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Idealna praktyka!",
"greatPractice": "Świetna praktyka!",
"usedNoHints": "Dobra robota, że nie korzystałeś z żadnych wskazówek!",
"youveCompletedPractice": "Ukończyłeś praktykę, kontynuuj, aby się poprawić!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:34.897101",
"@@last_modified": "2026-02-09 10:30:42.465226",
"copiedToClipboard": "Copiada para a área de transferência",
"@copiedToClipboard": {
"type": "String",
@ -11837,8 +11837,6 @@
"congratulations": "Parabéns!",
"anotherRound": "Outra rodada",
"noActivityRequest": "Nenhum pedido de atividade atual.",
"quit": "Sair",
"congratulationsYouveCompletedPractice": "Parabéns! Você completou a sessão de prática.",
"mustHave10Words": "Você deve ter pelo menos 10 palavras de vocabulário para praticá-las. Tente conversar com um amigo ou com o Pangea Bot para descobrir mais!",
"botSettings": "Configurações do Bot",
"activitySettingsOverrideWarning": "Idioma e nível de idioma determinados pelo plano de atividade",
@ -11887,14 +11885,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12084,5 +12074,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Prática perfeita!",
"greatPractice": "Ótima prática!",
"usedNoHints": "Bom trabalho em não usar dicas!",
"youveCompletedPractice": "Você completou a prática, continue assim para melhorar!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:31.755690",
"@@last_modified": "2026-02-09 10:30:39.705540",
"about": "Sobre",
"@about": {
"type": "String",
@ -11095,8 +11095,6 @@
"congratulations": "Parabéns!",
"anotherRound": "Outra rodada",
"noActivityRequest": "Nenhum pedido de atividade atual.",
"quit": "Sair",
"congratulationsYouveCompletedPractice": "Parabéns! Você completou a sessão de prática.",
"mustHave10Words": "Você deve ter pelo menos 10 palavras de vocabulário para praticá-las. Tente conversar com um amigo ou com o Pangea Bot para descobrir mais!",
"botSettings": "Configurações do Bot",
"activitySettingsOverrideWarning": "Idioma e nível de idioma determinados pelo plano de atividade",
@ -11145,14 +11143,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11342,5 +11332,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Prática perfeita!",
"greatPractice": "Ótima prática!",
"usedNoHints": "Bom trabalho não usando dicas!",
"youveCompletedPractice": "Você completou a prática, continue assim para melhorar!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -3328,7 +3328,7 @@
"selectAll": "Selecionar tudo",
"deselectAll": "Desmarcar tudo",
"@@locale": "pt_PT",
"@@last_modified": "2026-02-05 10:09:50.725651",
"@@last_modified": "2026-02-09 10:31:01.370163",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11766,8 +11766,6 @@
"congratulations": "Parabéns!",
"anotherRound": "Outra rodada",
"noActivityRequest": "Nenhum pedido de atividade atual.",
"quit": "Sair",
"congratulationsYouveCompletedPractice": "Parabéns! Você completou a sessão de prática.",
"mustHave10Words": "Você deve ter pelo menos 10 palavras de vocabulário para praticar. Tente conversar com um amigo ou com o Pangea Bot para descobrir mais!",
"botSettings": "Configurações do Bot",
"activitySettingsOverrideWarning": "Idioma e nível de idioma determinados pelo plano de atividade",
@ -11816,14 +11814,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12013,5 +12003,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Prática perfeita!",
"greatPractice": "Ótima prática!",
"usedNoHints": "Bom trabalho em não usar dicas!",
"youveCompletedPractice": "Você completou a prática, continue assim para melhorar!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:23.119007",
"@@last_modified": "2026-02-09 10:30:31.024987",
"about": "Despre",
"@about": {
"type": "String",
@ -11472,8 +11472,6 @@
"congratulations": "Felicitări!",
"anotherRound": "Încă o rundă",
"noActivityRequest": "Nu există cereri de activitate curente.",
"quit": "Ieși",
"congratulationsYouveCompletedPractice": "Felicitări! Ai completat sesiunea de practică.",
"mustHave10Words": "Trebuie să ai cel puțin 10 cuvinte de vocabular pentru a le exersa. Încearcă să vorbești cu un prieten sau cu Pangea Bot pentru a descoperi mai multe!",
"botSettings": "Setări Bot",
"activitySettingsOverrideWarning": "Limba și nivelul de limbă sunt determinate de planul de activitate",
@ -11522,14 +11520,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11719,5 +11709,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Practica perfectă!",
"greatPractice": "Practica grozavă!",
"usedNoHints": "Bravo că nu ai folosit niciun indiciu!",
"youveCompletedPractice": "Ai finalizat practica, continuă așa pentru a te îmbunătăți!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "ru",
"@@last_modified": "2026-02-05 10:10:19.334362",
"@@last_modified": "2026-02-09 10:31:33.668055",
"about": "О проекте",
"@about": {
"type": "String",
@ -10826,8 +10826,6 @@
"congratulations": "Поздравляем!",
"anotherRound": "Еще один раунд",
"noActivityRequest": "Нет текущего запроса на активность.",
"quit": "Выйти",
"congratulationsYouveCompletedPractice": "Поздравляем! Вы завершили практическую сессию.",
"mustHave10Words": "Вы должны иметь как минимум 10 слов для практики. Попробуйте поговорить с другом или Pangea Bot, чтобы узнать больше!",
"botSettings": "Настройки бота",
"activitySettingsOverrideWarning": "Язык и уровень языка определяются планом активности",
@ -10876,14 +10874,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11092,5 +11082,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Идеальная практика!",
"greatPractice": "Отличная практика!",
"usedNoHints": "Хорошая работа, что не использовали подсказки!",
"youveCompletedPractice": "Вы завершили практику, продолжайте в том же духе, чтобы стать лучше!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "sk",
"@@last_modified": "2026-02-05 10:09:24.752898",
"@@last_modified": "2026-02-09 10:30:32.743132",
"about": "O aplikácii",
"@about": {
"type": "String",
@ -11821,8 +11821,6 @@
"congratulations": "Gratulujeme!",
"anotherRound": "Ďalšie kolo",
"noActivityRequest": "Žiadna aktuálna požiadavka na aktivitu.",
"quit": "Ukončiť",
"congratulationsYouveCompletedPractice": "Gratulujeme! Dokončili ste cvičebnú reláciu.",
"mustHave10Words": "Musíte mať aspoň 10 slovíčok na precvičovanie. Skúste sa porozprávať s priateľom alebo Pangea Botom, aby ste objavili viac!",
"botSettings": "Nastavenia bota",
"activitySettingsOverrideWarning": "Jazyk a jazyková úroveň určené plánom aktivity",
@ -11871,14 +11869,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12068,5 +12058,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Dokonalá prax!",
"greatPractice": "Skvelá prax!",
"usedNoHints": "Dobrý výkon, že si nepoužil žiadne nápovedy!",
"youveCompletedPractice": "Dokončil si prax, pokračuj v tom, aby si sa zlepšil!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2461,7 +2461,7 @@
"playWithAI": "Za zdaj igrajte z AI-jem",
"courseStartDesc": "Pangea Bot je pripravljen kadarkoli!\n\n...ampak je bolje učiti se s prijatelji!",
"@@locale": "sl",
"@@last_modified": "2026-02-05 10:09:38.721866",
"@@last_modified": "2026-02-09 10:30:46.615986",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11818,8 +11818,6 @@
"congratulations": "Čestitamo!",
"anotherRound": "Še en krog",
"noActivityRequest": "Trenutno ni zahtevka za aktivnost.",
"quit": "Izhod",
"congratulationsYouveCompletedPractice": "Čestitamo! Zaključili ste vadbeno sejo.",
"mustHave10Words": "Imeti morate vsaj 10 besed za besedišče, da jih lahko vadite. Poskusite se pogovoriti s prijateljem ali Pangea Botom, da odkrijete več!",
"botSettings": "Nastavitve bota",
"activitySettingsOverrideWarning": "Jezik in jezikovna raven sta določena z načrtom aktivnosti",
@ -11868,14 +11866,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12065,5 +12055,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Popolna praksa!",
"greatPractice": "Super praksa!",
"usedNoHints": "Odlično, da niste uporabili nobenih namigov!",
"youveCompletedPractice": "Zaključili ste prakso, nadaljujte tako, da boste boljši!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:10:22.625655",
"@@last_modified": "2026-02-09 10:31:36.571438",
"about": "О програму",
"@about": {
"type": "String",
@ -11839,8 +11839,6 @@
"congratulations": "Čestitamo!",
"anotherRound": "Još jedan krug",
"noActivityRequest": "Nema trenutnog zahteva za aktivnost.",
"quit": "Izlaz",
"congratulationsYouveCompletedPractice": "Čestitamo! Završili ste sesiju vežbanja.",
"mustHave10Words": "Morate imati najmanje 10 reči za rečnik da biste ih vežbali. Pokušajte da razgovarate sa prijateljem ili Pangea Bot-om da biste otkrili više!",
"botSettings": "Podešavanja Bota",
"activitySettingsOverrideWarning": "Jezik i nivo jezika određeni planom aktivnosti",
@ -11889,14 +11887,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12086,5 +12076,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Savršena praksa!",
"greatPractice": "Sjajna praksa!",
"usedNoHints": "Odlično, niste koristili nikakve savete!",
"youveCompletedPractice": "Završili ste praksu, nastavite tako da postanete bolji!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:10:13.035755",
"@@last_modified": "2026-02-09 10:31:25.986941",
"about": "Om",
"@about": {
"type": "String",
@ -11215,8 +11215,6 @@
"congratulations": "Grattis!",
"anotherRound": "En runda till",
"noActivityRequest": "Ingen aktuell aktivitetsförfrågan.",
"quit": "Avsluta",
"congratulationsYouveCompletedPractice": "Grattis! Du har slutfört övningssessionen.",
"mustHave10Words": "Du måste ha minst 10 ord för att öva dem. Försök att prata med en vän eller Pangea Bot för att upptäcka mer!",
"botSettings": "Botinställningar",
"activitySettingsOverrideWarning": "Språk och språknivå bestäms av aktivitetsplanen",
@ -11265,14 +11263,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11462,5 +11452,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Perfekt träning!",
"greatPractice": "Bra träning!",
"usedNoHints": "Bra jobbat utan att använda några ledtrådar!",
"youveCompletedPractice": "Du har slutfört träningen, fortsätt så för att bli bättre!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:10:03.555298",
"@@last_modified": "2026-02-09 10:31:16.047418",
"acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது",
"@acceptedTheInvitation": {
"type": "String",
@ -10961,8 +10961,6 @@
"congratulations": "வாழ்த்துகள்!",
"anotherRound": "மற்றொரு சுற்று",
"noActivityRequest": "தற்போதைய செயல்பாட்டுக்கான கோரிக்கை இல்லை.",
"quit": "விலகுங்கள்",
"congratulationsYouveCompletedPractice": "வாழ்த்துகள்! நீங்கள் பயிற்சி அமர்வை முடித்துவிட்டீர்கள்.",
"mustHave10Words": "நீங்கள் பயிற்சிக்காக குறைந்தது 10 சொற்களை வைத்திருக்க வேண்டும். மேலும் கண்டுபிடிக்க நண்பருடன் அல்லது பாஙோ பாட்டுடன் பேச முயற்சிக்கவும்!",
"botSettings": "பாடல் அமைப்புகள்",
"activitySettingsOverrideWarning": "செயல்பாட்டு திட்டத்தால் நிர்ணயிக்கப்பட்ட மொழி மற்றும் மொழி நிலை",
@ -11011,14 +11009,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11208,5 +11198,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "சரியான பயிற்சி!",
"greatPractice": "மிகவும் நல்ல பயிற்சி!",
"usedNoHints": "எந்த உதவியையும் பயன்படுத்தாததற்கு நல்ல வேலை!",
"youveCompletedPractice": "நீங்கள் பயிற்சியை முடித்துவிட்டீர்கள், மேலும் மேம்பட தொடர்ந்து முயற்சிக்கவும்!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1917,7 +1917,7 @@
"playWithAI": "ఇప్పుడే AI తో ఆడండి",
"courseStartDesc": "పాంజియా బాట్ ఎప్పుడైనా సిద్ధంగా ఉంటుంది!\n\n...కానీ స్నేహితులతో నేర్చుకోవడం మెరుగైనది!",
"@@locale": "te",
"@@last_modified": "2026-02-05 10:09:59.064928",
"@@last_modified": "2026-02-09 10:31:11.484072",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}
@ -11826,8 +11826,6 @@
"congratulations": "అభినందనలు!",
"anotherRound": "మరొక రౌండ్",
"noActivityRequest": "ప్రస్తుతం ఎలాంటి కార్యకలాపం అభ్యర్థన లేదు.",
"quit": "విడుదల",
"congratulationsYouveCompletedPractice": "అభినందనలు! మీరు అభ్యాస సెషన్‌ను పూర్తి చేశారు.",
"mustHave10Words": "మీరు వాటిని అభ్యాసం చేయడానికి కనీసం 10 పదాలను కలిగి ఉండాలి. మరింత తెలుసుకోవడానికి మీ స్నేహితుడితో లేదా పాంజియా బాట్‌తో మాట్లాడండి!",
"botSettings": "బాట్ సెట్టింగులు",
"activitySettingsOverrideWarning": "కార్యకలాపం ప్రణాళిక ద్వారా నిర్ణయించబడిన భాష మరియు భాష స్థాయి",
@ -11876,14 +11874,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12073,5 +12063,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "సంపూర్ణ అభ్యాసం!",
"greatPractice": "మంచి అభ్యాసం!",
"usedNoHints": "ఏ సూచనలు ఉపయోగించకపోవడం మంచి పని!",
"youveCompletedPractice": "మీరు అభ్యాసం పూర్తి చేసారు, మెరుగుపడటానికి ఇలాగే కొనసాగించండి!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4453,7 +4453,7 @@
"playWithAI": "เล่นกับ AI ชั่วคราว",
"courseStartDesc": "Pangea Bot พร้อมที่จะเริ่มต้นได้ทุกเมื่อ!\n\n...แต่การเรียนรู้ดีกว่ากับเพื่อน!",
"@@locale": "th",
"@@last_modified": "2026-02-05 10:09:49.236652",
"@@last_modified": "2026-02-09 10:31:00.286726",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11795,8 +11795,6 @@
"congratulations": "ขอแสดงความยินดี!",
"anotherRound": "อีกหนึ่งรอบ",
"noActivityRequest": "ไม่มีคำขอทำกิจกรรมในขณะนี้",
"quit": "ออก",
"congratulationsYouveCompletedPractice": "ขอแสดงความยินดี! คุณได้เสร็จสิ้นการฝึกฝนแล้ว",
"mustHave10Words": "คุณต้องมีคำศัพท์อย่างน้อย 10 คำเพื่อฝึกฝน ลองพูดคุยกับเพื่อนหรือ Pangea Bot เพื่อค้นพบเพิ่มเติม!",
"botSettings": "การตั้งค่า Bot",
"activitySettingsOverrideWarning": "ภาษาและระดับภาษาที่กำหนดโดยแผนกิจกรรม",
@ -11845,14 +11843,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12042,5 +12032,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "การฝึกฝนที่สมบูรณ์แบบ!",
"greatPractice": "การฝึกฝนที่ยอดเยี่ยม!",
"usedNoHints": "ทำได้ดีที่ไม่ใช้คำใบ้ใด ๆ!",
"youveCompletedPractice": "คุณได้ทำการฝึกฝนเสร็จสิ้นแล้ว ทำต่อไปเพื่อให้ดีขึ้น!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "tr",
"@@last_modified": "2026-02-05 10:09:57.710087",
"@@last_modified": "2026-02-09 10:31:10.118107",
"about": "Hakkında",
"@about": {
"type": "String",
@ -10959,8 +10959,6 @@
"congratulations": "Tebrikler!",
"anotherRound": "Bir tur daha",
"noActivityRequest": "Şu anda etkinlik talebi yok.",
"quit": "Çık",
"congratulationsYouveCompletedPractice": "Tebrikler! Pratik oturumunu tamamladınız.",
"mustHave10Words": "Pratik yapmak için en az 10 kelimeye sahip olmalısınız. Daha fazla keşfetmek için bir arkadaşınızla veya Pangea Bot ile konuşmayı deneyin!",
"botSettings": "Bot Ayarları",
"activitySettingsOverrideWarning": "Etkinlik planı tarafından belirlenen dil ve dil seviyesi",
@ -11009,14 +11007,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -11206,5 +11196,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Mükemmel pratik!",
"greatPractice": "Harika pratik!",
"usedNoHints": "Hiç ipucu kullanmadığın için iyi iş çıkardın!",
"youveCompletedPractice": "Pratiği tamamladın, daha iyi olmak için devam et!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "uk",
"@@last_modified": "2026-02-05 10:09:42.549877",
"@@last_modified": "2026-02-09 10:30:50.645170",
"about": "Про застосунок",
"@about": {
"type": "String",
@ -10731,8 +10731,6 @@
"congratulations": "Вітаємо!",
"anotherRound": "Ще один раунд",
"noActivityRequest": "Немає поточного запиту на активність.",
"quit": "Вийти",
"congratulationsYouveCompletedPractice": "Вітаємо! Ви завершили практичну сесію.",
"mustHave10Words": "Вам потрібно мати принаймні 10 слів для практики. Спробуйте поговорити з другом або Pangea Bot, щоб дізнатися більше!",
"botSettings": "Налаштування бота",
"activitySettingsOverrideWarning": "Мова та рівень мови визначаються планом активності",
@ -10781,14 +10779,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10978,5 +10968,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Ідеальна практика!",
"greatPractice": "Чудова практика!",
"usedNoHints": "Чудова робота, що не використовували підказки!",
"youveCompletedPractice": "Ви завершили практику, продовжуйте в тому ж дусі, щоб покращитися!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:10:02.295528",
"@@last_modified": "2026-02-09 10:31:14.436728",
"about": "Giới thiệu",
"@about": {
"type": "String",
@ -6315,8 +6315,6 @@
"congratulations": "Chúc mừng!",
"anotherRound": "Một vòng nữa",
"noActivityRequest": "Không có yêu cầu hoạt động nào hiện tại.",
"quit": "Thoát",
"congratulationsYouveCompletedPractice": "Chúc mừng! Bạn đã hoàn thành buổi thực hành.",
"mustHave10Words": "Bạn phải có ít nhất 10 từ vựng để thực hành. Hãy thử nói chuyện với một người bạn hoặc Pangea Bot để khám phá thêm!",
"botSettings": "Cài đặt Bot",
"activitySettingsOverrideWarning": "Ngôn ngữ và cấp độ ngôn ngữ được xác định bởi kế hoạch hoạt động",
@ -6365,14 +6363,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -6562,5 +6552,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "Thực hành hoàn hảo!",
"greatPractice": "Thực hành tuyệt vời!",
"usedNoHints": "Làm tốt lắm khi không sử dụng bất kỳ gợi ý nào!",
"youveCompletedPractice": "Bạn đã hoàn thành thực hành, hãy tiếp tục để cải thiện!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1853,7 +1853,7 @@
"selectAll": "全選",
"deselectAll": "取消全選",
"@@locale": "yue",
"@@last_modified": "2026-02-05 10:09:39.916672",
"@@last_modified": "2026-02-09 10:30:47.898227",
"@ignoreUser": {
"type": "String",
"placeholders": {}
@ -11828,8 +11828,6 @@
"congratulations": "恭喜!",
"anotherRound": "再來一輪",
"noActivityRequest": "目前沒有活動請求。",
"quit": "退出",
"congratulationsYouveCompletedPractice": "恭喜!你已完成練習課程。",
"mustHave10Words": "你必須至少有 10 個詞彙來練習它們。試著和朋友或 Pangea Bot 談談以發現更多!",
"botSettings": "機械人設置",
"activitySettingsOverrideWarning": "活動計劃決定的語言和語言水平",
@ -11878,14 +11876,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -12075,5 +12065,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "完美的練習!",
"greatPractice": "很棒的練習!",
"usedNoHints": "不使用任何提示,做得好!",
"youveCompletedPractice": "你已經完成了練習,繼續努力以變得更好!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "zh",
"@@last_modified": "2026-02-05 10:10:07.531332",
"@@last_modified": "2026-02-09 10:31:19.946784",
"about": "关于",
"@about": {
"type": "String",
@ -10728,8 +10728,6 @@
"congratulations": "恭喜!",
"anotherRound": "再来一轮",
"noActivityRequest": "当前没有活动请求。",
"quit": "退出",
"congratulationsYouveCompletedPractice": "恭喜!您已完成练习课程。",
"mustHave10Words": "您必须至少有 10 个词汇来进行练习。尝试与朋友或 Pangea Bot 交谈以发现更多!",
"botSettings": "机器人设置",
"activitySettingsOverrideWarning": "活动计划确定的语言和语言级别",
@ -10778,14 +10776,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10975,5 +10965,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "完美的练习!",
"greatPractice": "很棒的练习!",
"usedNoHints": "很好,没使用任何提示!",
"youveCompletedPractice": "你已经完成了练习,继续努力以变得更好!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-02-05 10:09:52.100652",
"@@last_modified": "2026-02-09 10:31:02.904070",
"about": "關於",
"@about": {
"type": "String",
@ -10735,8 +10735,6 @@
"congratulations": "恭喜!",
"anotherRound": "再來一輪",
"noActivityRequest": "目前沒有活動請求。",
"quit": "退出",
"congratulationsYouveCompletedPractice": "恭喜!您已完成練習課程。",
"mustHave10Words": "您必須至少有 10 個詞彙來進行練習。嘗試與朋友或 Pangea Bot 交談以發現更多!",
"botSettings": "機器人設定",
"activitySettingsOverrideWarning": "語言和語言級別由活動計劃決定",
@ -10785,14 +10783,6 @@
"type": "String",
"placeholders": {}
},
"@quit": {
"type": "String",
"placeholders": {}
},
"@congratulationsYouveCompletedPractice": {
"type": "String",
"placeholders": {}
},
"@mustHave10Words": {
"type": "String",
"placeholders": {}
@ -10982,5 +10972,25 @@
"@grammarCopyPOScompn": {
"type": "String",
"placeholders": {}
},
"perfectPractice": "完美的練習!",
"greatPractice": "很棒的練習!",
"usedNoHints": "不使用任何提示,做得好!",
"youveCompletedPractice": "你已完成練習,繼續努力以變得更好!",
"@perfectPractice": {
"type": "String",
"placeholders": {}
},
"@greatPractice": {
"type": "String",
"placeholders": {}
},
"@usedNoHints": {
"type": "String",
"placeholders": {}
},
"@youveCompletedPractice": {
"type": "String",
"placeholders": {}
}
}

View file

@ -241,7 +241,7 @@ class AnalyticsDataService {
int? count,
String? roomId,
DateTime? since,
ConstructUseTypeEnum? type,
List<ConstructUseTypeEnum>? types,
bool filterCapped = true,
}) async {
await _ensureInitialized();
@ -249,7 +249,7 @@ class AnalyticsDataService {
count: count,
roomId: roomId,
since: since,
type: type,
types: types,
);
final blocked = blockedConstructs;

View file

@ -204,7 +204,7 @@ class AnalyticsDatabase with DatabaseFileStorage {
int? count,
String? roomId,
DateTime? since,
ConstructUseTypeEnum? type,
List<ConstructUseTypeEnum>? types,
}) async {
final stopwatch = Stopwatch()..start();
final results = <OneConstructUse>[];
@ -216,7 +216,7 @@ class AnalyticsDatabase with DatabaseFileStorage {
if (roomId != null && use.metadata.roomId != roomId) {
return true; // skip but continue
}
if (type != null && use.useType != type) {
if (types != null && !types.contains(use.useType)) {
return true; // skip but continue
}

View file

@ -13,6 +13,7 @@ import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart';
import 'package:fluffychat/pangea/analytics_misc/example_message_util.dart';
import 'package:fluffychat/pangea/analytics_practice/analytics_practice_constants.dart';
import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_model.dart';
import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_repo.dart';
import 'package:fluffychat/pangea/analytics_practice/analytics_practice_view.dart';
@ -101,6 +102,8 @@ class AnalyticsPracticeState extends State<AnalyticsPractice>
ValueNotifier<SelectedMorphChoice?>(null);
final ValueNotifier<bool> hintPressedNotifier = ValueNotifier<bool>(false);
final ValueNotifier<int> hintsUsedNotifier = ValueNotifier<int>(0);
static const int maxHints = 5;
final Map<String, Map<String, String>> _choiceTexts = {};
final Map<String, Map<String, String?>> _choiceEmojis = {};
@ -127,6 +130,7 @@ class AnalyticsPracticeState extends State<AnalyticsPractice>
enableChoicesNotifier.dispose();
selectedMorphChoice.dispose();
hintPressedNotifier.dispose();
hintsUsedNotifier.dispose();
super.dispose();
}
@ -213,6 +217,7 @@ class AnalyticsPracticeState extends State<AnalyticsPractice>
activityTarget.value = null;
selectedMorphChoice.value = null;
hintPressedNotifier.value = false;
hintsUsedNotifier.value = 0;
enableChoicesNotifier.value = true;
progressNotifier.value = 0.0;
_queue.clear();
@ -483,7 +488,11 @@ class AnalyticsPracticeState extends State<AnalyticsPractice>
}
void onHintPressed() {
hintPressedNotifier.value = !hintPressedNotifier.value;
if (hintsUsedNotifier.value >= maxHints) return;
if (!hintPressedNotifier.value) {
hintsUsedNotifier.value++;
}
hintPressedNotifier.value = true;
}
Future<void> onSelectChoice(
@ -556,6 +565,36 @@ class AnalyticsPracticeState extends State<AnalyticsPractice>
Future<DerivedAnalyticsDataModel> get derivedAnalyticsData =>
_analyticsService.derivedData;
/// Returns congratulations message based on performance
String getCompletionMessage(BuildContext context) {
final accuracy = _sessionLoader.value?.state.accuracy ?? 0;
final hasTimeBonus = (_sessionLoader.value?.state.elapsedSeconds ?? 0) <=
AnalyticsPracticeConstants.timeForBonus;
final hintsUsed = hintsUsedNotifier.value;
final bool perfectAccuracy = accuracy == 100;
final bool noHintsUsed = hintsUsed == 0;
final bool hintsAvailable = widget.type == ConstructTypeEnum.morph;
//check how many conditions for bonuses the user met and return message accordingly
final conditionsMet = [
perfectAccuracy,
!hintsAvailable || noHintsUsed,
hasTimeBonus,
].where((c) => c).length;
if (conditionsMet == 3) {
return L10n.of(context).perfectPractice;
}
if (conditionsMet >= 2) {
return L10n.of(context).greatPractice;
}
if (hintsAvailable && noHintsUsed) {
return L10n.of(context).usedNoHints;
}
return L10n.of(context).youveCompletedPractice;
}
@override
Widget build(BuildContext context) => AnalyticsPracticeView(this);
}

View file

@ -242,17 +242,24 @@ class AnalyticsPracticeSessionRepo {
}
static Future<List<AnalyticsActivityTarget>> _fetchErrors() async {
// Fetch all recent uses in one call (not filtering blocked constructs)
final allRecentUses = await MatrixState
.pangeaController.matrixState.analyticsDataService
.getUses(count: 200, filterCapped: false);
.getUses(
count: 300,
filterCapped: false,
types: [
ConstructUseTypeEnum.ga,
ConstructUseTypeEnum.corGE,
ConstructUseTypeEnum.incGE,
],
);
// Filter for grammar error uses
final grammarErrorUses = allRecentUses
.where((use) => use.useType == ConstructUseTypeEnum.ga)
.toList();
// Create list of recently used constructs
// Create list of recently practiced constructs (last 24 hours)
final cutoffTime = DateTime.now().subtract(const Duration(hours: 24));
final recentlyPracticedConstructs = allRecentUses
.where(

View file

@ -121,6 +121,12 @@ class _AnalyticsActivityView extends StatelessWidget {
return ListView(
children: [
//Hints counter bar for grammar activities only
if (controller.widget.type == ConstructTypeEnum.morph)
Padding(
padding: const EdgeInsets.only(bottom: 16.0),
child: _HintsCounterBar(controller: controller),
),
//per-activity instructions, add switch statement once there are more types
const InstructionsInlineTooltip(
instructionsEnum: InstructionsEnum.selectMeaning,
@ -160,6 +166,10 @@ class _AnalyticsActivityView extends StatelessWidget {
child: _AnalyticsPracticeCenterContent(controller: controller),
),
const SizedBox(height: 16.0),
(controller.widget.type == ConstructTypeEnum.morph)
? Center(child: _HintSection(controller: controller))
: const SizedBox.shrink(),
const SizedBox(height: 16.0),
_ActivityChoicesWidget(controller),
const SizedBox(height: 16.0),
_WrongAnswerFeedback(controller: controller),
@ -181,50 +191,35 @@ class _AnalyticsPracticeCenterContent extends StatelessWidget {
valueListenable: controller.activityTarget,
builder: (context, target, __) => switch (target?.target.activityType) {
null => const SizedBox(),
ActivityTypeEnum.grammarError => SizedBox(
height: 160.0,
child: SingleChildScrollView(
child: ValueListenableBuilder(
valueListenable: controller.activityState,
builder: (context, state, __) => switch (state) {
AsyncLoaded(
value: final GrammarErrorPracticeActivityModel activity
) =>
Column(
mainAxisSize: MainAxisSize.min,
children: [
_ErrorBlankWidget(
key: ValueKey(
'${activity.eventID}_${activity.errorOffset}_${activity.errorLength}',
),
activity: activity,
),
const SizedBox(height: 12),
],
),
_ => const SizedBox(),
},
),
ActivityTypeEnum.grammarError => SingleChildScrollView(
child: ListenableBuilder(
listenable: Listenable.merge([
controller.activityState,
controller.hintPressedNotifier,
]),
builder: (context, __) {
final state = controller.activityState.value;
if (state
is! AsyncLoaded<MultipleChoicePracticeActivityModel>) {
return const SizedBox();
}
final activity = state.value;
if (activity is! GrammarErrorPracticeActivityModel) {
return const SizedBox();
}
return _ErrorBlankWidget(
key: ValueKey(
'${activity.eventID}_${activity.errorOffset}_${activity.errorLength}',
),
activity: activity,
showTranslation: controller.hintPressedNotifier.value,
);
},
),
),
ActivityTypeEnum.grammarCategory => Center(
child: Column(
children: [
_CorrectAnswerHint(controller: controller),
_ExampleMessageWidget(
controller.getExampleMessage(target!),
),
const SizedBox(height: 12),
ValueListenableBuilder(
valueListenable: controller.hintPressedNotifier,
builder: (context, hintPressed, __) {
return HintButton(
depressed: hintPressed,
onPressed: controller.onHintPressed,
);
},
),
],
child: _ExampleMessageWidget(
controller.getExampleMessage(target!),
),
),
_ => SizedBox(
@ -281,45 +276,96 @@ class _ExampleMessageWidget extends StatelessWidget {
}
}
class _CorrectAnswerHint extends StatelessWidget {
class _HintsCounterBar extends StatelessWidget {
final AnalyticsPracticeState controller;
const _CorrectAnswerHint({
required this.controller,
});
const _HintsCounterBar({required this.controller});
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: controller.hintPressedNotifier,
builder: (context, hintPressed, __) {
if (!hintPressed) {
valueListenable: controller.hintsUsedNotifier,
builder: (context, hintsUsed, __) {
return Padding(
padding: const EdgeInsets.only(top: 4.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(
AnalyticsPracticeState.maxHints,
(index) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 4.0),
child: Icon(
index < hintsUsed ? Icons.lightbulb : Icons.lightbulb_outline,
size: 18,
color: Theme.of(context).colorScheme.primary,
),
),
),
),
);
},
);
}
}
class _HintSection extends StatelessWidget {
final AnalyticsPracticeState controller;
const _HintSection({required this.controller});
@override
Widget build(BuildContext context) {
return ListenableBuilder(
listenable: Listenable.merge([
controller.activityState,
controller.hintPressedNotifier,
controller.hintsUsedNotifier,
]),
builder: (context, __) {
final state = controller.activityState.value;
if (state is! AsyncLoaded<MultipleChoicePracticeActivityModel>) {
return const SizedBox.shrink();
}
return ValueListenableBuilder(
valueListenable: controller.activityState,
builder: (context, state, __) {
if (state is! AsyncLoaded<MultipleChoicePracticeActivityModel>) {
return const SizedBox.shrink();
}
final activity = state.value;
final hintPressed = controller.hintPressedNotifier.value;
final hintsUsed = controller.hintsUsedNotifier.value;
final maxHintsReached = hintsUsed >= AnalyticsPracticeState.maxHints;
final activity = state.value;
if (activity is! MorphPracticeActivityModel) {
return const SizedBox.shrink();
}
return ConstrainedBox(
constraints: const BoxConstraints(
minHeight: 50.0,
),
child: Builder(
builder: (context) {
// For grammar category: fade out button and show hint content
if (activity is MorphPracticeActivityModel) {
return AnimatedCrossFade(
duration: const Duration(milliseconds: 200),
crossFadeState: hintPressed
? CrossFadeState.showSecond
: CrossFadeState.showFirst,
firstChild: HintButton(
onPressed:
maxHintsReached ? () {} : controller.onHintPressed,
depressed: maxHintsReached,
),
secondChild: MorphMeaningWidget(
feature: activity.morphFeature,
tag: activity.multipleChoiceContent.answers.first,
),
);
}
final correctAnswerTag =
activity.multipleChoiceContent.answers.first;
return Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: MorphMeaningWidget(
feature: activity.morphFeature,
tag: correctAnswerTag,
),
);
},
// For grammar error: button stays pressed, hint shows in ErrorBlankWidget
return HintButton(
onPressed: (hintPressed || maxHintsReached)
? () {}
: controller.onHintPressed,
depressed: hintPressed || maxHintsReached,
);
},
),
);
},
);
@ -371,33 +417,21 @@ class _WrongAnswerFeedback extends StatelessWidget {
}
}
class _ErrorBlankWidget extends StatefulWidget {
class _ErrorBlankWidget extends StatelessWidget {
final GrammarErrorPracticeActivityModel activity;
final bool showTranslation;
const _ErrorBlankWidget({
super.key,
required this.activity,
required this.showTranslation,
});
@override
State<_ErrorBlankWidget> createState() => _ErrorBlankWidgetState();
}
class _ErrorBlankWidgetState extends State<_ErrorBlankWidget> {
late final String translation = widget.activity.translation;
bool _showTranslation = false;
void _toggleTranslation() {
setState(() {
_showTranslation = !_showTranslation;
});
}
@override
Widget build(BuildContext context) {
final text = widget.activity.text;
final errorOffset = widget.activity.errorOffset;
final errorLength = widget.activity.errorLength;
final text = activity.text;
final errorOffset = activity.errorOffset;
final errorLength = activity.errorLength;
const maxContextChars = 50;
@ -444,66 +478,72 @@ class _ErrorBlankWidgetState extends State<_ErrorBlankWidget> {
final after = chars.skip(errorEnd).take(afterEnd - errorEnd).toString();
return Column(
children: [
Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 8,
),
decoration: BoxDecoration(
color: Color.alphaBlend(
Colors.white.withAlpha(180),
ThemeData.dark().colorScheme.primary,
),
borderRadius: BorderRadius.circular(16),
),
child: Column(
children: [
RichText(
text: TextSpan(
style: TextStyle(
color: Theme.of(context).colorScheme.onPrimaryFixed,
fontSize:
AppConfig.fontSizeFactor * AppConfig.messageFontSize,
),
children: [
if (trimmedBefore) const TextSpan(text: ''),
if (before.isNotEmpty) TextSpan(text: before),
WidgetSpan(
child: Container(
height: 4.0,
width: (errorLength * 8).toDouble(),
padding: const EdgeInsets.only(bottom: 2.0),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.primary,
),
),
),
if (after.isNotEmpty) TextSpan(text: after),
if (trimmedAfter) const TextSpan(text: ''),
],
),
),
const SizedBox(height: 8),
_showTranslation
? Text(
translation,
style: TextStyle(
color: Theme.of(context).colorScheme.onPrimaryFixed,
fontSize: AppConfig.fontSizeFactor *
AppConfig.messageFontSize,
fontStyle: FontStyle.italic,
),
textAlign: TextAlign.left,
)
: const SizedBox.shrink(),
],
),
return Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 8,
),
decoration: BoxDecoration(
color: Color.alphaBlend(
Colors.white.withAlpha(180),
ThemeData.dark().colorScheme.primary,
),
const SizedBox(height: 8),
HintButton(depressed: _showTranslation, onPressed: _toggleTranslation),
],
borderRadius: BorderRadius.circular(16),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
RichText(
text: TextSpan(
style: TextStyle(
color: Theme.of(context).colorScheme.onPrimaryFixed,
fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize,
),
children: [
if (trimmedBefore) const TextSpan(text: ''),
if (before.isNotEmpty) TextSpan(text: before),
WidgetSpan(
child: Container(
height: 4.0,
width: (errorLength * 8).toDouble(),
padding: const EdgeInsets.only(bottom: 2.0),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.primary,
),
),
),
if (after.isNotEmpty) TextSpan(text: after),
if (trimmedAfter) const TextSpan(text: ''),
],
),
),
AnimatedSize(
duration: const Duration(milliseconds: 200),
curve: Curves.easeInOut,
alignment: Alignment.topCenter,
child: showTranslation
? Column(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(height: 8),
Text(
activity.translation,
style: TextStyle(
color: Theme.of(context).colorScheme.onPrimaryFixed,
fontSize: AppConfig.fontSizeFactor *
AppConfig.messageFontSize,
fontStyle: FontStyle.italic,
),
textAlign: TextAlign.center,
maxLines: 3,
overflow: TextOverflow.ellipsis,
),
],
)
: const SizedBox.shrink(),
),
],
),
);
}
}

View file

@ -47,7 +47,7 @@ class CompletedActivitySessionView extends StatelessWidget {
child: Column(
children: [
Text(
L10n.of(context).congratulationsYouveCompletedPractice,
controller.getCompletionMessage(context),
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
),
@ -171,7 +171,7 @@ class CompletedActivitySessionView extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
L10n.of(context).quit,
L10n.of(context).done,
),
],
),