feat: show language mismatch popup on select message not in L2

This commit is contained in:
ggurdin 2025-12-03 11:38:36 -05:00
parent 18462ea000
commit 613a4cce9c
No known key found for this signature in database
GPG key ID: A01CB41737CBB478
60 changed files with 451 additions and 130 deletions

View file

@ -1,6 +1,6 @@
{
"@@locale": "ar",
"@@last_modified": "2025-12-03 10:30:28.531390",
"@@last_modified": "2025-12-03 11:36:55.312756",
"about": "حول",
"@about": {
"type": "String",
@ -10852,5 +10852,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "لغة الهدف الخاصة بك لا تتطابق مع هذه الرسالة. هل تريد تحديث لغة الهدف الخاصة بك؟",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1915,7 +1915,7 @@
"playWithAI": "Пакуль гуляйце з ШІ",
"courseStartDesc": "Pangea Bot гатовы да працы ў любы час!\n\n...але навучанне лепш з сябрамі!",
"@@locale": "be",
"@@last_modified": "2025-12-03 10:30:13.500676",
"@@last_modified": "2025-12-03 11:36:45.348859",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11734,5 +11734,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Ваша мэтавая мова не супадае з гэтым паведамленнем. Абнавіць вашу мэтавую мову?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:46.970936",
"@@last_modified": "2025-12-03 11:37:07.254419",
"about": "সম্পর্কে",
"@about": {
"type": "String",
@ -11739,5 +11739,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "আপনার লক্ষ্য ভাষা এই বার্তার সাথে মেলে না। আপনার লক্ষ্য ভাষা আপডেট করবেন?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4282,7 +4282,7 @@
"joinPublicTrip": "མི་ཚེས་ལ་ལོག་འབད།",
"startOwnTrip": "ངེད་རང་གི་ལོག་ལ་སྦྱོར་བཅོས།",
"@@locale": "bo",
"@@last_modified": "2025-12-03 10:30:43.532170",
"@@last_modified": "2025-12-03 11:37:05.020486",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -10385,5 +10385,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Bokmål mål språket ditt samsvarer ikke med denne meldingen. Oppdater målspråket ditt?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:15.655552",
"@@last_modified": "2025-12-03 11:36:46.628205",
"about": "Quant a",
"@about": {
"type": "String",
@ -10659,5 +10659,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "El teu idioma de destinació no coincideix amb aquest missatge. Vols actualitzar el teu idioma de destinació?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "cs",
"@@last_modified": "2025-12-03 10:30:09.271970",
"@@last_modified": "2025-12-03 11:36:43.008688",
"about": "O aplikaci",
"@about": {
"type": "String",
@ -11242,5 +11242,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Jazyk cíle neodpovídá této zprávě. Chcete aktualizovat svůj cílový jazyk?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1934,7 +1934,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": "2025-12-03 10:29:29.731950",
"@@last_modified": "2025-12-03 11:36:19.185422",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
@ -11697,5 +11697,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Dit målsprog stemmer ikke overens med denne besked. Opdater dit målsprog?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "de",
"@@last_modified": "2025-12-03 10:29:59.289566",
"@@last_modified": "2025-12-03 11:36:37.054264",
"alwaysUse24HourFormat": "true",
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
@ -10642,5 +10642,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Ihre Zielsprache stimmt nicht mit dieser Nachricht überein. Möchten Sie Ihre Zielsprache aktualisieren?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4460,7 +4460,7 @@
"playWithAI": "Παίξτε με την Τεχνητή Νοημοσύνη προς το παρόν",
"courseStartDesc": "Ο Pangea Bot είναι έτοιμος να ξεκινήσει οποιαδήποτε στιγμή!\n\n...αλλά η μάθηση είναι καλύτερη με φίλους!",
"@@locale": "el",
"@@last_modified": "2025-12-03 10:30:57.003976",
"@@last_modified": "2025-12-03 11:37:12.093444",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11693,5 +11693,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Η γλώσσα στόχου σας δεν ταιριάζει με αυτό το μήνυμα. Θέλετε να ενημερώσετε τη γλώσσα στόχου σας;",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4989,5 +4989,6 @@
}
}
},
"pickDifferentActivity": "Pick a different activity"
"pickDifferentActivity": "Pick a different activity",
"messageLanguageMismatchMessage": "Your target language doesn't match this message. Update your target language?"
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:31:03.548316",
"@@last_modified": "2025-12-03 11:37:15.815743",
"about": "Prio",
"@about": {
"type": "String",
@ -11724,5 +11724,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Via celolingvo ne kongruas kun ĉi tiu mesaĝo. Ĉu ĝisdatigi vian celolingvon?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "es",
"@@last_modified": "2025-12-03 10:29:23.778699",
"@@last_modified": "2025-12-03 11:36:15.055874",
"about": "Acerca de",
"@about": {
"type": "String",
@ -7870,5 +7870,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "El idioma de destino no coincide con este mensaje. ¿Actualizar el idioma de destino?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "et",
"@@last_modified": "2025-12-03 10:29:57.478134",
"@@last_modified": "2025-12-03 11:36:35.627602",
"about": "Rakenduse teave",
"@about": {
"type": "String",
@ -10906,5 +10906,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Teie sihtkeel ei ühti selle sõnumiga. Kas soovite oma sihtkeelt uuendada?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "eu",
"@@last_modified": "2025-12-03 10:29:53.791099",
"@@last_modified": "2025-12-03 11:36:32.505093",
"about": "Honi buruz",
"@about": {
"type": "String",
@ -10635,5 +10635,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Zure helburu hizkuntza ez da mezu honekin bat etortzen. Eguneratu al dezakezu zure helburu hizkuntza?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:49.073619",
"@@last_modified": "2025-12-03 11:37:08.469937",
"repeatPassword": "تکرار رمزعبور",
"@repeatPassword": {},
"about": "درباره",
@ -11367,5 +11367,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "زبان هدف شما با این پیام مطابقت ندارد. آیا زبان هدف خود را به‌روزرسانی کنید؟",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4013,7 +4013,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": "2025-12-03 10:29:28.000186",
"@@last_modified": "2025-12-03 11:36:17.887679",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11258,5 +11258,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Kohdekielesi ei vastaa tätä viestiä. Päivitäkö kohdekielesi?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2791,7 +2791,7 @@
"selectAll": "Piliin lahat",
"deselectAll": "Huwag piliin lahat",
"@@locale": "fil",
"@@last_modified": "2025-12-03 10:30:24.695985",
"@@last_modified": "2025-12-03 11:36:52.845643",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}
@ -11611,5 +11611,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Ang iyong target na wika ay hindi tumutugma sa mensaheng ito. I-update ang iyong target na wika?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "fr",
"@@last_modified": "2025-12-03 10:31:16.115668",
"@@last_modified": "2025-12-03 11:37:22.098085",
"about": "À propos",
"@about": {
"type": "String",
@ -10959,5 +10959,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Votre langue cible ne correspond pas à ce message. Voulez-vous mettre à jour votre langue cible ?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4521,7 +4521,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": "2025-12-03 10:31:12.355807",
"@@last_modified": "2025-12-03 11:37:21.302431",
"@customReaction": {
"type": "String",
"placeholders": {}
@ -10633,5 +10633,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Ní comhoiriúnach do theanga sprioc le haghaidh an teachtaireachta seo. An nuashonraigh do theanga sprioc?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "gl",
"@@last_modified": "2025-12-03 10:29:25.436969",
"@@last_modified": "2025-12-03 11:36:16.780690",
"about": "Acerca de",
"@about": {
"type": "String",
@ -10632,5 +10632,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "A súa lingua de destino non coincide con este mensaxe. Actualizar a súa lingua de destino?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:29:47.561493",
"@@last_modified": "2025-12-03 11:36:29.117862",
"about": "אודות",
"@about": {
"type": "String",
@ -11684,5 +11684,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "שפת היעד שלך אינה תואמת את ההודעה הזו. האם לעדכן את שפת היעד שלך?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4487,7 +4487,7 @@
"playWithAI": "अभी के लिए एआई के साथ खेलें",
"courseStartDesc": "पैंजिया बॉट कभी भी जाने के लिए तैयार है!\n\n...लेकिन दोस्तों के साथ सीखना बेहतर है!",
"@@locale": "hi",
"@@last_modified": "2025-12-03 10:31:01.035602",
"@@last_modified": "2025-12-03 11:37:14.540576",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11720,5 +11720,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "आपकी लक्षित भाषा इस संदेश से मेल नहीं खाती। क्या आप अपनी लक्षित भाषा अपडेट करना चाहेंगे?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "hr",
"@@last_modified": "2025-12-03 10:29:43.328965",
"@@last_modified": "2025-12-03 11:36:27.424602",
"about": "Informacije",
"@about": {
"type": "String",
@ -11007,5 +11007,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Vaš ciljni jezik se ne podudara s ovom porukom. Želite li ažurirati svoj ciljni jezik?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "hu",
"@@last_modified": "2025-12-03 10:29:32.057483",
"@@last_modified": "2025-12-03 11:36:20.356699",
"about": "Névjegy",
"@about": {
"type": "String",
@ -10636,5 +10636,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "A cél nyelve nem egyezik meg ezzel az üzenettel. Frissíti a cél nyelvét?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1962,7 +1962,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": "2025-12-03 10:29:49.294834",
"@@last_modified": "2025-12-03 11:36:30.210370",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11713,5 +11713,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Tua lingua target non concordat cum hoc nuntio. Renovare tuam linguam target?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:29:35.057047",
"@@last_modified": "2025-12-03 11:36:21.817521",
"setAsCanonicalAlias": "Atur sebagai alias utama",
"@setAsCanonicalAlias": {
"type": "String",
@ -10626,5 +10626,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Bahasa target Anda tidak cocok dengan pesan ini. Perbarui bahasa target Anda?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4376,7 +4376,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": "2025-12-03 10:29:41.092414",
"@@last_modified": "2025-12-03 11:36:26.117148",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11609,5 +11609,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Tua lingua target non concordat cum hoc nuntio. Renovare linguam tuam target?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:04.563615",
"@@last_modified": "2025-12-03 11:36:40.442034",
"about": "Informazioni",
"@about": {
"type": "String",
@ -10638,5 +10638,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "La tua lingua di destinazione non corrisponde a questo messaggio. Vuoi aggiornare la tua lingua di destinazione?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "ja",
"@@last_modified": "2025-12-03 10:30:59.054527",
"@@last_modified": "2025-12-03 11:37:13.415132",
"about": "このアプリについて",
"@about": {
"type": "String",
@ -11425,5 +11425,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "ターゲット言語がこのメッセージと一致しません。ターゲット言語を更新しますか?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2598,7 +2598,7 @@
"playWithAI": "ამ დროისთვის ითამაშეთ AI-თან",
"courseStartDesc": "Pangea Bot მზადაა ნებისმიერ დროს გასასვლელად!\n\n...მაგრამ სწავლა უკეთესია მეგობრებთან ერთად!",
"@@locale": "ka",
"@@last_modified": "2025-12-03 10:31:07.852817",
"@@last_modified": "2025-12-03 11:37:18.523462",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11665,5 +11665,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "თქვენი მიზნობრივი ენა არ ემთხვევა ამ შეტყობინებას. განაახლეთ თქვენი მიზნობრივი ენა?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:29:21.753863",
"@@last_modified": "2025-12-03 11:36:14.042097",
"about": "소개",
"@about": {
"type": "String",
@ -10743,5 +10743,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "대상 언어가 이 메시지와 일치하지 않습니다. 대상 언어를 업데이트하시겠습니까?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -3865,7 +3865,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": "2025-12-03 10:30:34.545170",
"@@last_modified": "2025-12-03 11:37:00.421228",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11440,5 +11440,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Jūsų tikslinė kalba nesutampa su šiuo pranešimu. Ar norite atnaujinti savo tikslinę kalbą?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4486,7 +4486,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": "2025-12-03 10:30:26.874201",
"@@last_modified": "2025-12-03 11:36:54.273221",
"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",
@ -10621,5 +10621,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Jūsu mērķa valoda nesakrīt ar šo ziņojumu. Vai vēlaties atjaunināt savu mērķa valodu?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:10.936757",
"@@last_modified": "2025-12-03 11:36:44.135739",
"about": "Om",
"@about": {
"type": "String",
@ -11728,5 +11728,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Mål språket ditt samsvarer ikke med denne meldingen. Vil du oppdatere målspråket ditt?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:41.689144",
"@@last_modified": "2025-12-03 11:37:03.689136",
"about": "Over ons",
"@about": {
"type": "String",
@ -10635,5 +10635,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Uw doeltaal komt niet overeen met dit bericht. Wilt u uw doeltaal bijwerken?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "pl",
"@@last_modified": "2025-12-03 10:30:52.793986",
"@@last_modified": "2025-12-03 11:37:09.726956",
"about": "O aplikacji",
"@about": {
"type": "String",
@ -10635,5 +10635,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Twój docelowy język nie pasuje do tej wiadomości. Zaktualizować swój docelowy język?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:29:55.539620",
"@@last_modified": "2025-12-03 11:36:34.084326",
"copiedToClipboard": "Copiada para a área de transferência",
"@copiedToClipboard": {
"type": "String",
@ -11735,5 +11735,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "O seu idioma de destino não corresponde a esta mensagem. Atualizar o seu idioma de destino?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:29:51.928516",
"@@last_modified": "2025-12-03 11:36:31.334762",
"about": "Sobre",
"@about": {
"type": "String",
@ -10993,5 +10993,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Seu idioma de destino não corresponde a esta mensagem. Atualizar seu idioma de destino?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -3335,7 +3335,7 @@
"selectAll": "Selecionar tudo",
"deselectAll": "Desmarcar tudo",
"@@locale": "pt_PT",
"@@last_modified": "2025-12-03 10:30:20.842171",
"@@last_modified": "2025-12-03 11:36:49.262059",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11664,5 +11664,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "O seu idioma de destino não corresponde a esta mensagem. Atualizar o seu idioma de destino?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:29:37.617394",
"@@last_modified": "2025-12-03 11:36:22.939099",
"about": "Despre",
"@about": {
"type": "String",
@ -11370,5 +11370,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Limba țintă nu se potrivește cu acest mesaj. Doriți să actualizați limba țintă?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "ru",
"@@last_modified": "2025-12-03 10:31:05.575917",
"@@last_modified": "2025-12-03 11:37:16.847372",
"about": "О проекте",
"@about": {
"type": "String",
@ -10740,5 +10740,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Ваш целевой язык не соответствует этому сообщению. Обновить ваш целевой язык?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "sk",
"@@last_modified": "2025-12-03 10:29:39.057337",
"@@last_modified": "2025-12-03 11:36:25.077269",
"about": "O aplikácii",
"@about": {
"type": "String",
@ -11719,5 +11719,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Vaša cieľová jazyková verzia sa nezhoduje s touto správou. Chcete aktualizovať svoju cieľovú jazykovú verziu?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2468,7 +2468,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": "2025-12-03 10:30:00.944868",
"@@last_modified": "2025-12-03 11:36:37.990886",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11716,5 +11716,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Vaš cilj jezik ne ustreza temu sporočilu. Ali želite posodobiti svoj cilj jezik?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:31:09.729056",
"@@last_modified": "2025-12-03 11:37:19.859367",
"about": "О програму",
"@about": {
"type": "String",
@ -11737,5 +11737,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Vaš ciljni jezik se ne poklapa sa ovom porukom. Da li želite da ažurirate svoj ciljni jezik?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:55.022846",
"@@last_modified": "2025-12-03 11:37:10.758797",
"about": "Om",
"@about": {
"type": "String",
@ -11113,5 +11113,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Ditt målspråk matchar inte detta meddelande. Vill du uppdatera ditt målspråk?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:40.029007",
"@@last_modified": "2025-12-03 11:37:02.609418",
"acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது",
"@acceptedTheInvitation": {
"type": "String",
@ -10859,5 +10859,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "உங்கள் இலக்கு மொழி இந்த செய்தியுடன் பொருந்தவில்லை. உங்கள் இலக்கு மொழியை புதுப்பிக்கவா?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1924,7 +1924,7 @@
"playWithAI": "ఇప్పుడే AI తో ఆడండి",
"courseStartDesc": "పాంజియా బాట్ ఎప్పుడైనా సిద్ధంగా ఉంటుంది!\n\n...కానీ స్నేహితులతో నేర్చుకోవడం మెరుగైనది!",
"@@locale": "te",
"@@last_modified": "2025-12-03 10:30:32.508974",
"@@last_modified": "2025-12-03 11:36:57.737104",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}
@ -11724,5 +11724,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "మీ లక్ష్య భాష ఈ సందేశానికి సరిపోలడం లేదు. మీ లక్ష్య భాషను నవీకరించాలా?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4460,7 +4460,7 @@
"playWithAI": "เล่นกับ AI ชั่วคราว",
"courseStartDesc": "Pangea Bot พร้อมที่จะเริ่มต้นได้ทุกเมื่อ!\n\n...แต่การเรียนรู้ดีกว่ากับเพื่อน!",
"@@locale": "th",
"@@last_modified": "2025-12-03 10:30:18.986154",
"@@last_modified": "2025-12-03 11:36:48.052510",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11693,5 +11693,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "ภาษาที่คุณเลือกไม่ตรงกับข้อความนี้ ต้องการอัปเดตภาษาที่คุณเลือกหรือไม่?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "tr",
"@@last_modified": "2025-12-03 10:30:30.590666",
"@@last_modified": "2025-12-03 11:36:56.511057",
"about": "Hakkında",
"@about": {
"type": "String",
@ -10857,5 +10857,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Hedef diliniz bu mesajla eşleşmiyor. Hedef dilinizi güncelleyebilir misiniz?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "uk",
"@@last_modified": "2025-12-03 10:30:06.811114",
"@@last_modified": "2025-12-03 11:36:41.416683",
"about": "Про застосунок",
"@about": {
"type": "String",
@ -10629,5 +10629,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Ваша цільова мова не відповідає цьому повідомленню. Оновити вашу цільову мову?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:37.893660",
"@@last_modified": "2025-12-03 11:37:01.540762",
"about": "Giới thiệu",
"@about": {
"type": "String",
@ -6205,5 +6205,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "Ngôn ngữ mục tiêu của bạn không khớp với thông điệp này. Cập nhật ngôn ngữ mục tiêu của bạn?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1860,7 +1860,7 @@
"selectAll": "全選",
"deselectAll": "取消全選",
"@@locale": "yue",
"@@last_modified": "2025-12-03 10:30:02.789794",
"@@last_modified": "2025-12-03 11:36:39.120785",
"@ignoreUser": {
"type": "String",
"placeholders": {}
@ -11726,5 +11726,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "您的目標語言與此消息不匹配。要更新您的目標語言嗎?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "zh",
"@@last_modified": "2025-12-03 10:30:45.297060",
"@@last_modified": "2025-12-03 11:37:06.135839",
"about": "关于",
"@about": {
"type": "String",
@ -10626,5 +10626,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "您的目标语言与此消息不匹配。要更新您的目标语言吗?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-12-03 10:30:22.582679",
"@@last_modified": "2025-12-03 11:36:51.200682",
"about": "關於",
"@about": {
"type": "String",
@ -10633,5 +10633,10 @@
"@pickDifferentActivity": {
"type": "String",
"placeholders": {}
},
"messageLanguageMismatchMessage": "您的目標語言與此消息不匹配。要更新您的目標語言嗎?",
"@messageLanguageMismatchMessage": {
"type": "String",
"placeholders": {}
}
}

View file

@ -29,6 +29,7 @@ import 'package:fluffychat/pages/chat/recording_dialog.dart';
import 'package:fluffychat/pages/chat_details/chat_details.dart';
import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart';
import 'package:fluffychat/pangea/activity_sessions/activity_session_chat/activity_chat_controller.dart';
import 'package:fluffychat/pangea/activity_sessions/activity_session_chat/activity_chat_extension.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart';
import 'package:fluffychat/pangea/analytics_misc/get_analytics_controller.dart';
@ -58,7 +59,6 @@ import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart';
import 'package:fluffychat/pangea/learning_settings/repo/language_mismatch_repo.dart';
import 'package:fluffychat/pangea/learning_settings/widgets/language_mismatch_popup.dart';
import 'package:fluffychat/pangea/learning_settings/widgets/p_language_dialog.dart';
import 'package:fluffychat/pangea/message_token_text/tokens_util.dart';
import 'package:fluffychat/pangea/spaces/utils/load_participants_util.dart';
@ -1994,6 +1994,26 @@ class ChatController extends State<ChatPageWithRoom>
return;
}
if (LanguageMismatchRepo.shouldShowByEvent(event.eventId) &&
pangeaMessageEvent?.originalSent?.content.langCodeMatchesL2 == false) {
LanguageMismatchRepo.setEvent(event.eventId);
OverlayUtil.showLanguageMismatchPopup(
context: context,
targetId: event.eventId,
message: L10n.of(context).messageLanguageMismatchMessage,
targetLanguage: pangeaMessageEvent!.originalSent!.langCode,
onConfirm: () => showToolbar(
event,
pangeaMessageEvent: pangeaMessageEvent,
selectedToken: selectedToken,
mode: mode,
nextEvent: nextEvent,
prevEvent: prevEvent,
),
);
return;
}
final overlayEntry = MessageSelectionOverlay(
chatController: this,
event: event,
@ -2060,8 +2080,7 @@ class ChatController extends State<ChatPageWithRoom>
// There's a listen in my_analytics_controller that decides when to auto-update
// analytics based on when / how many messages the logged in user send. This
// stream sends the data for newly sent messages.
if (originalSent?.langCode.split("-").first !=
MatrixState.pangeaController.languageController.userL2?.langCodeShort) {
if (originalSent?.langCodeMatchesL2 != true) {
return;
}
@ -2155,23 +2174,6 @@ class ChatController extends State<ChatPageWithRoom>
}
}
bool get shouldShowLanguageMismatchPopup {
if (!LanguageMismatchRepo.shouldShow) {
return false;
}
final l1 =
MatrixState.pangeaController.languageController.userL1?.langCodeShort;
final l2 =
MatrixState.pangeaController.languageController.userL2?.langCodeShort;
final activityLang = room.activityPlan?.req.targetLanguage.split('-').first;
return activityLang != null &&
l2 != null &&
l2 != activityLang &&
l1 != activityLang;
}
void showNextMatch() {
MatrixState.pAnyState.closeOverlay();
final match = choreographer.igcController.openMatches.firstOrNull;
@ -2194,7 +2196,7 @@ class ChatController extends State<ChatPageWithRoom>
bool manual = false,
bool autosend = false,
}) async {
if (shouldShowLanguageMismatchPopup) {
if (shouldShowLanguageMismatchPopupByActivity) {
return showLanguageMismatchPopup();
}
@ -2209,34 +2211,20 @@ class ChatController extends State<ChatPageWithRoom>
}
void showLanguageMismatchPopup() {
if (!shouldShowLanguageMismatchPopup) {
if (!shouldShowLanguageMismatchPopupByActivity) {
return;
}
final targetLanguage = room.activityPlan!.req.targetLanguage;
LanguageMismatchRepo.set();
OverlayUtil.showPositionedCard(
LanguageMismatchRepo.setRoom(roomId);
OverlayUtil.showLanguageMismatchPopup(
context: context,
cardToShow: LanguageMismatchPopup(
overlayId: 'language_mismatch_popup',
onConfirm: () async {
await MatrixState.pangeaController.userController.updateProfile(
(profile) {
profile.userSettings.targetLanguage = targetLanguage;
return profile;
},
waitForDataInSync: true,
);
WidgetsBinding.instance.addPostFrameCallback(
(_) => onRequestWritingAssistance(manual: false, autosend: true),
);
},
targetId: ChoreoConstants.inputTransformTargetKey,
message: L10n.of(context).languageMismatchDesc,
targetLanguage: targetLanguage,
onConfirm: () => WidgetsBinding.instance.addPostFrameCallback(
(_) => onRequestWritingAssistance(manual: false, autosend: true),
),
maxHeight: 325,
maxWidth: 325,
transformTargetId: ChoreoConstants.inputTransformTargetKey,
overlayKey: 'language_mismatch_popup',
);
}

View file

@ -4,6 +4,7 @@ import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/learning_settings/repo/language_mismatch_repo.dart';
import 'package:fluffychat/widgets/matrix.dart';
extension ActivityMenuLogic on ChatController {
@ -35,4 +36,21 @@ extension ActivityMenuLogic on ChatController {
return count >= 3;
}
bool get shouldShowLanguageMismatchPopupByActivity {
if (!LanguageMismatchRepo.shouldShowByRoom(roomId)) {
return false;
}
final l1 =
MatrixState.pangeaController.languageController.userL1?.langCodeShort;
final l2 =
MatrixState.pangeaController.languageController.userL2?.langCodeShort;
final activityLang = room.activityPlan?.req.targetLanguage.split('-').first;
return activityLang != null &&
l2 != null &&
l2 != activityLang &&
l1 != activityLang;
}
}

View file

@ -13,6 +13,7 @@ import 'package:fluffychat/pangea/common/utils/any_state_holder.dart';
import 'package:fluffychat/pangea/common/widgets/anchored_overlay_widget.dart';
import 'package:fluffychat/pangea/common/widgets/overlay_container.dart';
import 'package:fluffychat/pangea/common/widgets/transparent_backdrop.dart';
import 'package:fluffychat/pangea/learning_settings/widgets/language_mismatch_popup.dart';
import '../../../config/themes.dart';
import '../../../widgets/matrix.dart';
import 'error_handler.dart';
@ -305,4 +306,26 @@ class OverlayUtil {
ignorePointer: true,
);
}
static void showLanguageMismatchPopup({
required BuildContext context,
required String targetId,
required String message,
required String targetLanguage,
required VoidCallback onConfirm,
}) {
showPositionedCard(
context: context,
cardToShow: LanguageMismatchPopup(
message: message,
overlayId: 'language_mismatch_popup',
onConfirm: onConfirm,
targetLanguage: targetLanguage,
),
maxHeight: 325,
maxWidth: 325,
transformTargetId: targetId,
overlayKey: 'language_mismatch_popup',
);
}
}

View file

@ -9,6 +9,7 @@ import 'package:fluffychat/pangea/choreographer/igc/pangea_match_status_enum.dar
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/events/models/pangea_token_model.dart';
import 'package:fluffychat/pangea/toolbar/models/speech_to_text_models.dart';
import 'package:fluffychat/widgets/matrix.dart';
/// this class is contained within a [RepresentationEvent]
/// this event is the child of a [EventTypes.Message]
@ -91,6 +92,10 @@ class PangeaRepresentation {
return data;
}
bool get langCodeMatchesL2 =>
langCode.split("-").first ==
MatrixState.pangeaController.languageController.userL2?.langCodeShort;
/// Get construct uses for the message that weren't captured during language assistance.
/// Takes a list of tokens and a choreo record, which is searched
/// through for each token for its construct use type.

View file

@ -2,41 +2,46 @@ import 'package:get_storage/get_storage.dart';
class LanguageMismatchRepo {
static final GetStorage _storage = GetStorage('language_mismatch');
static const String key = 'shown_timestamp';
static const Duration displayInterval = Duration(minutes: 30);
static Future<void> set() async {
await _storage.write(key, DateTime.now().toIso8601String());
static String _roomKey(String roomId) => 'language_mismatch_room_$roomId';
static String _eventKey(String eventId) => 'language_mismatch_event_$eventId';
static bool shouldShowByRoom(String roomId) => _get(_roomKey(roomId));
static bool shouldShowByEvent(String eventId) => _get(_eventKey(eventId));
static Future<void> setRoom(String roomId) async => _set(_roomKey(roomId));
static Future<void> setEvent(String eventId) async =>
_set(_eventKey(eventId));
static Future<void> _set(String key) async {
await _storage.write(
key,
DateTime.now().toIso8601String(),
);
}
static DateTime? _get() {
final entry = _storage.read(key);
if (entry == null) return null;
try {
final value = DateTime.tryParse(entry);
if (value != null) {
final timeSince = DateTime.now().difference(value);
if (timeSince > displayInterval) {
_delete();
return null;
}
return value;
}
} catch (_) {
_delete();
}
return null;
}
static Future<void> _delete() async {
await _storage.remove(key);
}
static bool get shouldShow {
final lastShown = _get();
static bool _get(String key) {
final lastShown = _getCached(key);
if (lastShown == null) return true;
return DateTime.now().difference(lastShown) >= displayInterval;
}
static DateTime? _getCached(String key) {
final entry = _storage.read(key);
if (entry == null) return null;
final value = DateTime.tryParse(entry);
if (value == null) {
_storage.remove(key);
return null;
}
final timeSince = DateTime.now().difference(value);
if (timeSince > displayInterval) {
_storage.remove(key);
return null;
}
return value;
}
}

View file

@ -7,14 +7,30 @@ import 'package:fluffychat/widgets/future_loading_dialog.dart';
import 'package:fluffychat/widgets/matrix.dart';
class LanguageMismatchPopup extends StatelessWidget {
final String message;
final String overlayId;
final Future<void> Function() onConfirm;
final String targetLanguage;
final VoidCallback onConfirm;
const LanguageMismatchPopup({
super.key,
required this.message,
required this.overlayId,
required this.targetLanguage,
required this.onConfirm,
});
Future<void> _updateLanguage() async {
await MatrixState.pangeaController.userController.updateProfile(
(profile) {
profile.userSettings.targetLanguage = targetLanguage;
return profile;
},
waitForDataInSync: true,
);
onConfirm();
}
@override
Widget build(BuildContext context) {
return Column(
@ -29,7 +45,7 @@ class LanguageMismatchPopup extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text(
L10n.of(context).languageMismatchDesc,
message,
style: BotStyle.text(context),
textAlign: TextAlign.center,
),
@ -39,7 +55,7 @@ class LanguageMismatchPopup extends StatelessWidget {
onPressed: () async {
await showFutureLoadingDialog(
context: context,
future: onConfirm,
future: _updateLanguage,
);
MatrixState.pAnyState.closeOverlay(overlayId);
},