chore: onboarding updates (#5485)

This commit is contained in:
ggurdin 2026-01-28 11:28:54 -05:00 committed by GitHub
parent aae00cd1d6
commit 172f1c96f8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
61 changed files with 931 additions and 363 deletions

View file

@ -1,6 +1,6 @@
{
"@@locale": "ar",
"@@last_modified": "2026-01-27 14:02:59.727958",
"@@last_modified": "2026-01-28 11:22:30.477643",
"about": "حول",
"@about": {
"type": "String",
@ -11151,5 +11151,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "ما اللغة التي تتعلمها؟",
"searchLanguagesHint": "ابحث عن اللغات المستهدفة",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1910,7 +1910,7 @@
"playWithAI": "Пакуль гуляйце з ШІ",
"courseStartDesc": "Pangea Bot гатовы да працы ў любы час!\n\n...але навучанне лепш з сябрамі!",
"@@locale": "be",
"@@last_modified": "2026-01-27 14:02:50.270963",
"@@last_modified": "2026-01-28 11:22:20.711094",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -12033,5 +12033,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Якую мову вы вывучаеце?",
"searchLanguagesHint": "Пошук мэтавых моў",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:03:11.965364",
"@@last_modified": "2026-01-28 11:22:41.965760",
"about": "সম্পর্কে",
"@about": {
"type": "String",
@ -12038,5 +12038,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "আপনি কোন ভাষা শিখছেন?",
"searchLanguagesHint": "লক্ষ্য ভাষা অনুসন্ধান করুন",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4278,7 +4278,7 @@
"joinPublicTrip": "མི་ཚེས་ལ་ལོག་འབད།",
"startOwnTrip": "ངེད་རང་གི་ལོག་ལ་སྦྱོར་བཅོས།",
"@@locale": "bo",
"@@last_modified": "2026-01-27 14:03:09.952724",
"@@last_modified": "2026-01-28 11:22:39.504934",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -10688,5 +10688,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Kedua bahasa apa yang Anda pelajari?",
"searchLanguagesHint": "Cari bahasa target",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:51.719519",
"@@last_modified": "2026-01-28 11:22:22.285622",
"about": "Quant a",
"@about": {
"type": "String",
@ -10958,5 +10958,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Quina llengua estàs aprenent?",
"searchLanguagesHint": "Cerca llengües objectiu",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "cs",
"@@last_modified": "2026-01-27 14:02:46.567796",
"@@last_modified": "2026-01-28 11:22:18.388059",
"about": "O aplikaci",
"@about": {
"type": "String",
@ -11541,5 +11541,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Jaký jazyk se učíte?",
"searchLanguagesHint": "Hledejte cílové jazyky",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1929,7 +1929,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-01-27 14:02:21.118853",
"@@last_modified": "2026-01-28 11:21:51.175741",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
@ -11995,5 +11995,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Hvilket sprog lærer du?",
"searchLanguagesHint": "Søg efter målsprog",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "de",
"@@last_modified": "2026-01-27 14:02:39.850908",
"@@last_modified": "2026-01-28 11:22:11.549404",
"alwaysUse24HourFormat": "true",
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
@ -10941,5 +10941,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Welche Sprache lernst du?",
"searchLanguagesHint": "Zielsprachen suchen",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4455,7 +4455,7 @@
"playWithAI": "Παίξτε με την Τεχνητή Νοημοσύνη προς το παρόν",
"courseStartDesc": "Ο Pangea Bot είναι έτοιμος να ξεκινήσει οποιαδήποτε στιγμή!\n\n...αλλά η μάθηση είναι καλύτερη με φίλους!",
"@@locale": "el",
"@@last_modified": "2026-01-27 14:03:17.212773",
"@@last_modified": "2026-01-28 11:22:48.079247",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11992,5 +11992,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Ποια γλώσσα μαθαίνετε;",
"searchLanguagesHint": "Αναζητήστε γλώσσες στόχου",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -5063,5 +5063,7 @@
"publicInviteDescSpace": "Search for users to invite them to this space.",
"useActivityImageAsChatBackground": "Use activity image as chat background",
"chatWithSupport": "Chat with Support",
"newCourseAccess": "By default, courses are publicly searchable and require admin approval to join. You can edit these settings at any time."
"newCourseAccess": "By default, courses are publicly searchable and require admin approval to join. You can edit these settings at any time.",
"onboardingLanguagesTitle": "What language are you learning?",
"searchLanguagesHint": "Search target languages"
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:03:21.507072",
"@@last_modified": "2026-01-28 11:22:51.689025",
"about": "Prio",
"@about": {
"type": "String",
@ -12023,5 +12023,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Kian lingvon vi lernas?",
"searchLanguagesHint": "Serĉu celajn lingvojn",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "es",
"@@last_modified": "2026-01-27 14:02:15.353643",
"@@last_modified": "2026-01-28 11:21:46.446878",
"about": "Acerca de",
"@about": {
"type": "String",
@ -8168,5 +8168,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "¿Qué idioma estás aprendiendo?",
"searchLanguagesHint": "Buscar idiomas objetivo",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "et",
"@@last_modified": "2026-01-27 14:02:38.644251",
"@@last_modified": "2026-01-28 11:22:07.195180",
"about": "Rakenduse teave",
"@about": {
"type": "String",
@ -11205,5 +11205,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Millist keelt sa õpid?",
"searchLanguagesHint": "Otsi sihtkeeli",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "eu",
"@@last_modified": "2026-01-27 14:02:35.628448",
"@@last_modified": "2026-01-28 11:22:04.786494",
"about": "Honi buruz",
"@about": {
"type": "String",
@ -10934,5 +10934,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Zer hizkuntza ikasten ari zara?",
"searchLanguagesHint": "Bilatu helburu hizkuntzak",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:03:13.031797",
"@@last_modified": "2026-01-28 11:22:43.436826",
"repeatPassword": "تکرار رمزعبور",
"@repeatPassword": {},
"about": "درباره",
@ -11666,5 +11666,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "شما در حال یادگیری چه زبانی هستید؟",
"searchLanguagesHint": "زبان‌های هدف را جستجو کنید",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4008,7 +4008,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-01-27 14:02:18.192045",
"@@last_modified": "2026-01-28 11:21:50.004841",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11557,5 +11557,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Mitä kieltä opit?",
"searchLanguagesHint": "Etsi kohdekieliä",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2786,7 +2786,7 @@
"selectAll": "Piliin lahat",
"deselectAll": "Huwag piliin lahat",
"@@locale": "fil",
"@@last_modified": "2026-01-27 14:02:56.958154",
"@@last_modified": "2026-01-28 11:22:27.725706",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}
@ -11910,5 +11910,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Anong wika ang iyong pinag-aaralan?",
"searchLanguagesHint": "Maghanap ng mga target na wika",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "fr",
"@@last_modified": "2026-01-27 14:03:27.361514",
"@@last_modified": "2026-01-28 11:22:58.035061",
"about": "À propos",
"@about": {
"type": "String",
@ -11258,5 +11258,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Quelle langue apprenez-vous ?",
"searchLanguagesHint": "Recherchez des langues cibles",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4516,7 +4516,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-01-27 14:03:26.279031",
"@@last_modified": "2026-01-28 11:22:56.916598",
"@customReaction": {
"type": "String",
"placeholders": {}
@ -10932,5 +10932,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Cén teanga atá á foghlaim agat?",
"searchLanguagesHint": "Cuardaigh teangacha sprioc",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "gl",
"@@last_modified": "2026-01-27 14:02:17.041137",
"@@last_modified": "2026-01-28 11:21:48.193565",
"about": "Acerca de",
"@about": {
"type": "String",
@ -10931,5 +10931,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Que idioma estás aprendendo?",
"searchLanguagesHint": "Busca idiomas de destino",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:31.662677",
"@@last_modified": "2026-01-28 11:22:00.895298",
"about": "אודות",
"@about": {
"type": "String",
@ -11983,5 +11983,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "איזו שפה אתה לומד?",
"searchLanguagesHint": "חפש שפות יעד",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4482,7 +4482,7 @@
"playWithAI": "अभी के लिए एआई के साथ खेलें",
"courseStartDesc": "पैंजिया बॉट कभी भी जाने के लिए तैयार है!\n\n...लेकिन दोस्तों के साथ सीखना बेहतर है!",
"@@locale": "hi",
"@@last_modified": "2026-01-27 14:03:20.292018",
"@@last_modified": "2026-01-28 11:22:50.465177",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -12019,5 +12019,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "आप कौन सी भाषा सीख रहे हैं?",
"searchLanguagesHint": "लक्षित भाषाएँ खोजें",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "hr",
"@@last_modified": "2026-01-27 14:02:30.204264",
"@@last_modified": "2026-01-28 11:21:59.771425",
"about": "Informacije",
"@about": {
"type": "String",
@ -11306,5 +11306,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Koji jezik učite?",
"searchLanguagesHint": "Pretraži ciljne jezike",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "hu",
"@@last_modified": "2026-01-27 14:02:22.464338",
"@@last_modified": "2026-01-28 11:21:52.684213",
"about": "Névjegy",
"@about": {
"type": "String",
@ -10935,5 +10935,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Milyen nyelvet tanulsz?",
"searchLanguagesHint": "Keresd a célnyelveket",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1957,7 +1957,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-01-27 14:02:33.390978",
"@@last_modified": "2026-01-28 11:22:02.235990",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -12012,5 +12012,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Kia lingvo vi lernas?",
"searchLanguagesHint": "Serĉu celajn lingvojn",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:23.466673",
"@@last_modified": "2026-01-28 11:21:53.689466",
"setAsCanonicalAlias": "Atur sebagai alias utama",
"@setAsCanonicalAlias": {
"type": "String",
@ -10925,5 +10925,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Bahasa apa yang Anda pelajari?",
"searchLanguagesHint": "Cari bahasa target",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4371,7 +4371,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-01-27 14:02:28.999815",
"@@last_modified": "2026-01-28 11:21:58.032557",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11908,5 +11908,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Cén teanga atá á foghlaim agat?",
"searchLanguagesHint": "Cuardaigh teangacha sprioc",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:43.998266",
"@@last_modified": "2026-01-28 11:22:15.909371",
"about": "Informazioni",
"@about": {
"type": "String",
@ -10937,5 +10937,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Quale lingua stai imparando?",
"searchLanguagesHint": "Cerca lingue target",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "ja",
"@@last_modified": "2026-01-27 14:03:18.964652",
"@@last_modified": "2026-01-28 11:22:49.278909",
"about": "このアプリについて",
"@about": {
"type": "String",
@ -11724,5 +11724,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "どの言語を学んでいますか?",
"searchLanguagesHint": "ターゲット言語を検索",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2593,7 +2593,7 @@
"playWithAI": "ამ დროისთვის ითამაშეთ AI-თან",
"courseStartDesc": "Pangea Bot მზადაა ნებისმიერ დროს გასასვლელად!\n\n...მაგრამ სწავლა უკეთესია მეგობრებთან ერთად!",
"@@locale": "ka",
"@@last_modified": "2026-01-27 14:03:23.702338",
"@@last_modified": "2026-01-28 11:22:53.904103",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11964,5 +11964,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "რომელი ენა სწავლობთ?",
"searchLanguagesHint": "ძებნა მიზნობრივი ენების",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:13.792128",
"@@last_modified": "2026-01-28 11:21:45.008877",
"about": "소개",
"@about": {
"type": "String",
@ -11042,5 +11042,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "어떤 언어를 배우고 있나요?",
"searchLanguagesHint": "목표 언어 검색",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -3860,7 +3860,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-01-27 14:03:05.189233",
"@@last_modified": "2026-01-28 11:22:34.341908",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11739,5 +11739,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Kokią kalbą mokotės?",
"searchLanguagesHint": "Ieškoti tikslo kalbų",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4482,7 +4482,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-01-27 14:02:58.530525",
"@@last_modified": "2026-01-28 11:22:29.356174",
"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",
@ -10920,5 +10920,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Kuru valodu tu mācies?",
"searchLanguagesHint": "Meklēt mērķa valodas",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:48.767207",
"@@last_modified": "2026-01-28 11:22:19.521122",
"about": "Om",
"@about": {
"type": "String",
@ -12027,5 +12027,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Hvilket språk lærer du?",
"searchLanguagesHint": "Søk etter målspråk",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:03:08.964846",
"@@last_modified": "2026-01-28 11:22:38.374548",
"about": "Over ons",
"@about": {
"type": "String",
@ -10934,5 +10934,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Welke taal ben je aan het leren?",
"searchLanguagesHint": "Zoek doeltalen",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "pl",
"@@last_modified": "2026-01-27 14:03:14.463461",
"@@last_modified": "2026-01-28 11:22:45.302604",
"about": "O aplikacji",
"@about": {
"type": "String",
@ -10932,5 +10932,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Jakiego języka się uczysz?",
"searchLanguagesHint": "Szukaj języków docelowych",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:37.702228",
"@@last_modified": "2026-01-28 11:22:05.803053",
"copiedToClipboard": "Copiada para a área de transferência",
"@copiedToClipboard": {
"type": "String",
@ -12034,5 +12034,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Qual idioma você está aprendendo?",
"searchLanguagesHint": "Pesquise idiomas-alvo",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:34.316481",
"@@last_modified": "2026-01-28 11:22:03.356659",
"about": "Sobre",
"@about": {
"type": "String",
@ -11292,5 +11292,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Qual idioma você está aprendendo?",
"searchLanguagesHint": "Pesquise idiomas-alvo",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -3330,7 +3330,7 @@
"selectAll": "Selecionar tudo",
"deselectAll": "Desmarcar tudo",
"@@locale": "pt_PT",
"@@last_modified": "2026-01-27 14:02:54.292550",
"@@last_modified": "2026-01-28 11:22:25.268348",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11963,5 +11963,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Qual idioma você está aprendendo?",
"searchLanguagesHint": "Pesquise idiomas-alvo",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:25.277330",
"@@last_modified": "2026-01-28 11:21:55.514912",
"about": "Despre",
"@about": {
"type": "String",
@ -11669,5 +11669,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Ce limbă înveți?",
"searchLanguagesHint": "Caută limbi țintă",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "ru",
"@@last_modified": "2026-01-27 14:03:22.446889",
"@@last_modified": "2026-01-28 11:22:52.811123",
"about": "О проекте",
"@about": {
"type": "String",
@ -11042,5 +11042,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Какой язык вы изучаете?",
"searchLanguagesHint": "Поиск целевых языков",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "sk",
"@@last_modified": "2026-01-27 14:02:27.134602",
"@@last_modified": "2026-01-28 11:21:56.691598",
"about": "O aplikácii",
"@about": {
"type": "String",
@ -12018,5 +12018,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Aký jazyk sa učíte?",
"searchLanguagesHint": "Hľadajte cieľové jazyky",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2463,7 +2463,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-01-27 14:02:41.198883",
"@@last_modified": "2026-01-28 11:22:12.982879",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -12015,5 +12015,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Katero jezika se učiš?",
"searchLanguagesHint": "Išči ciljne jezike",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:03:24.807506",
"@@last_modified": "2026-01-28 11:22:55.286222",
"about": "О програму",
"@about": {
"type": "String",
@ -12036,5 +12036,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Koji jezik učite?",
"searchLanguagesHint": "Pretraži ciljne jezike",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:03:15.575050",
"@@last_modified": "2026-01-28 11:22:46.768605",
"about": "Om",
"@about": {
"type": "String",
@ -11412,5 +11412,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Vilket språk lär du dig?",
"searchLanguagesHint": "Sök efter målspråk",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:03:07.633079",
"@@last_modified": "2026-01-28 11:22:37.250743",
"acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது",
"@acceptedTheInvitation": {
"type": "String",
@ -11158,5 +11158,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "நீங்கள் எது மொழி கற்றுக்கொள்கிறீர்கள்?",
"searchLanguagesHint": "இலக்கு மொழிகளை தேடுங்கள்",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1919,7 +1919,7 @@
"playWithAI": "ఇప్పుడే AI తో ఆడండి",
"courseStartDesc": "పాంజియా బాట్ ఎప్పుడైనా సిద్ధంగా ఉంటుంది!\n\n...కానీ స్నేహితులతో నేర్చుకోవడం మెరుగైనది!",
"@@locale": "te",
"@@last_modified": "2026-01-27 14:03:02.156703",
"@@last_modified": "2026-01-28 11:22:33.163067",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}
@ -12023,5 +12023,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "మీరు ఏ భాష నేర్చుకుంటున్నారు?",
"searchLanguagesHint": "లక్ష్య భాషలను శోధించండి",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4455,7 +4455,7 @@
"playWithAI": "เล่นกับ AI ชั่วคราว",
"courseStartDesc": "Pangea Bot พร้อมที่จะเริ่มต้นได้ทุกเมื่อ!\n\n...แต่การเรียนรู้ดีกว่ากับเพื่อน!",
"@@locale": "th",
"@@last_modified": "2026-01-27 14:02:53.265962",
"@@last_modified": "2026-01-28 11:22:23.457945",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11992,5 +11992,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "คุณกำลังเรียนภาษาอะไรอยู่?",
"searchLanguagesHint": "ค้นหาภาษาที่ต้องการ",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "tr",
"@@last_modified": "2026-01-27 14:03:00.927147",
"@@last_modified": "2026-01-28 11:22:31.719920",
"about": "Hakkında",
"@about": {
"type": "String",
@ -11156,5 +11156,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Hangi dili öğreniyorsunuz?",
"searchLanguagesHint": "Hedef dilleri arayın",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "uk",
"@@last_modified": "2026-01-27 14:02:45.151936",
"@@last_modified": "2026-01-28 11:22:17.132130",
"about": "Про застосунок",
"@about": {
"type": "String",
@ -10928,5 +10928,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Яку мову ви вивчаєте?",
"searchLanguagesHint": "Шукати цільові мови",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:03:06.468185",
"@@last_modified": "2026-01-28 11:22:35.606622",
"about": "Giới thiệu",
"@about": {
"type": "String",
@ -6504,5 +6504,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "Bạn đang học ngôn ngữ nào?",
"searchLanguagesHint": "Tìm kiếm ngôn ngữ mục tiêu",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1855,7 +1855,7 @@
"selectAll": "全選",
"deselectAll": "取消全選",
"@@locale": "yue",
"@@last_modified": "2026-01-27 14:02:42.486712",
"@@last_modified": "2026-01-28 11:22:14.017616",
"@ignoreUser": {
"type": "String",
"placeholders": {}
@ -12025,5 +12025,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "你正在學習什麼語言?",
"searchLanguagesHint": "搜尋目標語言",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "zh",
"@@last_modified": "2026-01-27 14:03:10.872296",
"@@last_modified": "2026-01-28 11:22:40.631434",
"about": "关于",
"@about": {
"type": "String",
@ -10925,5 +10925,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "你正在学习什么语言?",
"searchLanguagesHint": "搜索目标语言",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2026-01-27 14:02:55.518251",
"@@last_modified": "2026-01-28 11:22:26.284769",
"about": "關於",
"@about": {
"type": "String",
@ -10932,5 +10932,15 @@
"@newCourseAccess": {
"type": "String",
"placeholders": {}
},
"onboardingLanguagesTitle": "你正在學習什麼語言?",
"searchLanguagesHint": "搜尋目標語言",
"@onboardingLanguagesTitle": {
"type": "String",
"placeholders": {}
},
"@searchLanguagesHint": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2015,18 +2015,6 @@ class ChatController extends State<ChatPageWithRoom>
bool get _isToolbarOpen =>
MatrixState.pAnyState.isOverlayOpen(RegExp(r'^message_toolbar_overlay$'));
bool showMessageShimmer(Event event) {
if (event.type != EventTypes.Message) return false;
if (!(event.eventId == buttonEventID)) return false;
if (event.messageType == MessageTypes.Text) {
return !InstructionsEnum.clickTextMessages.isToggledOff;
}
if (event.messageType == MessageTypes.Audio) {
return !InstructionsEnum.clickAudioMessages.isToggledOff;
}
return false;
}
void showToolbar(
Event event, {
PangeaMessageEvent? pangeaMessageEvent,
@ -2059,14 +2047,11 @@ class ChatController extends State<ChatPageWithRoom>
);
// you've clicked a message so lets turn this off
InstructionsEnum.clickMessage.setToggledOff(true);
if (event.messageType == MessageTypes.Text &&
!InstructionsEnum.clickTextMessages.isToggledOff) {
InstructionsEnum.clickTextMessages.setToggledOff(true);
if (!InstructionsEnum.clickMessage.isToggledOff) {
InstructionsEnum.clickMessage.setToggledOff(true);
}
if (event.messageType == MessageTypes.Audio &&
!InstructionsEnum.clickAudioMessages.isToggledOff) {
InstructionsEnum.clickAudioMessages.setToggledOff(true);
if (!InstructionsEnum.shimmerNewToken.isToggledOff) {
InstructionsEnum.shimmerNewToken.setToggledOff(true);
}
if (!kIsWeb) {

View file

@ -11,8 +11,10 @@ import 'package:matrix/matrix.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pangea/common/widgets/shimmer_background.dart';
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
import 'package:fluffychat/pangea/events/models/pangea_token_model.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/toolbar/layout/reading_assistance_mode_enum.dart';
import 'package:fluffychat/pangea/toolbar/message_practice/message_practice_mode_enum.dart';
import 'package:fluffychat/pangea/toolbar/message_practice/token_practice_button.dart';
@ -446,6 +448,10 @@ class HtmlMessage extends StatelessWidget {
: false;
final isNew = token != null && newTokens.contains(token.text);
final isFirstNewToken = isNew && newTokens.first == token.text;
final showShimmer =
!InstructionsEnum.shimmerNewToken.isToggledOff && isFirstNewToken;
final tokenWidth = renderer.tokenTextWidthForContainer(
node.text,
Theme.of(context).colorScheme.primary.withAlpha(200),
@ -500,19 +506,25 @@ class HtmlMessage extends StatelessWidget {
: null,
child: HoverBuilder(
builder: (context, hovered) {
return UnderlineText(
text: node.text.trim(),
style: existingStyle,
linkStyle: linkStyle,
textDirection: pangeaMessageEvent?.textDirection,
underlineColor: TokenRenderingUtil.underlineColor(
underlineColor,
selected: selected,
highlighted: highlighted,
isNew: isNew,
practiceMode: readingAssistanceMode ==
ReadingAssistanceMode.practiceMode,
hovered: hovered,
return ShimmerBackground(
enabled: showShimmer,
borderRadius: BorderRadius.circular(4.0),
child: UnderlineText(
text: node.text.trim(),
style: existingStyle,
linkStyle: linkStyle,
textDirection:
pangeaMessageEvent?.textDirection,
underlineColor:
TokenRenderingUtil.underlineColor(
underlineColor,
selected: selected,
highlighted: highlighted,
isNew: isNew,
practiceMode: readingAssistanceMode ==
ReadingAssistanceMode.practiceMode,
hovered: hovered,
),
),
);
},

View file

@ -17,7 +17,6 @@ import 'package:fluffychat/pangea/bot/utils/bot_name.dart';
import 'package:fluffychat/pangea/bot/widgets/bot_settings_language_icon.dart';
import 'package:fluffychat/pangea/chat/extensions/custom_room_display_extension.dart';
import 'package:fluffychat/pangea/common/widgets/pressable_button.dart';
import 'package:fluffychat/pangea/common/widgets/shimmer_background.dart';
import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart';
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
import 'package:fluffychat/utils/date_time_extension.dart';
@ -603,228 +602,223 @@ class Message extends StatelessWidget {
child: ValueListenableBuilder(
valueListenable: controller
.depressMessageButton,
// #Pangea
child: ShimmerBackground(
enabled: controller
.showMessageShimmer(
event,
child: Container(
decoration: BoxDecoration(
color: noBubble
? Colors.transparent
: color,
borderRadius:
borderRadius,
),
// Pangea#
child: Container(
decoration:
BoxDecoration(
color: noBubble
? Colors
.transparent
: color,
borderRadius:
borderRadius,
),
clipBehavior:
Clip.antiAlias,
// #Pangea
child:
CompositedTransformTarget(
link: MatrixState
clipBehavior:
Clip.antiAlias,
// #Pangea
child:
CompositedTransformTarget(
link: MatrixState
.pAnyState
.layerLinkAndKey(
event.eventId,
)
.link,
// child: BubbleBackground(
// colors: colors,
// ignore: noBubble || !ownMessage,
// scrollController: scrollController,
// Pangea#
child: Container(
// #Pangea
key: MatrixState
.pAnyState
.layerLinkAndKey(
event.eventId,
)
.link,
// child: BubbleBackground(
// colors: colors,
// ignore: noBubble || !ownMessage,
// scrollController: scrollController,
.key,
// Pangea#
child: Container(
// #Pangea
key: MatrixState
.pAnyState
.layerLinkAndKey(
event.eventId,
)
.key,
// Pangea#
decoration:
BoxDecoration(
borderRadius:
BorderRadius
.circular(
AppConfig
.borderRadius,
),
decoration:
BoxDecoration(
borderRadius:
BorderRadius
.circular(
AppConfig
.borderRadius,
),
constraints:
const BoxConstraints(
maxWidth: FluffyThemes
.columnWidth *
1.5,
),
child: Column(
mainAxisSize:
MainAxisSize
.min,
crossAxisAlignment:
CrossAxisAlignment
.start,
children: <Widget>[
if ({
RelationshipTypes
.reply,
RelationshipTypes
.thread,
}.contains(
event
.relationshipType,
))
FutureBuilder<
Event?>(
future: event
.getReplyEvent(
timeline,
),
builder: (
BuildContext
context,
snapshot,
) {
final replyEvent = snapshot
.hasData
? snapshot
.data!
: Event(
eventId: event.relationshipEventId!,
content: {
'msgtype': 'm.text',
'body': '...',
},
// #Pangea
// senderId: event
// .senderId,
senderId: "",
// Pangea#
type: 'm.room.message',
room: event.room,
status: EventStatus.sent,
originServerTs: DateTime.now(),
);
return Padding(
padding:
const EdgeInsets.only(
left:
16,
right:
16,
top:
8,
),
),
constraints:
const BoxConstraints(
maxWidth: FluffyThemes
.columnWidth *
1.5,
),
child: Column(
mainAxisSize:
MainAxisSize
.min,
crossAxisAlignment:
CrossAxisAlignment
.start,
children: <Widget>[
if ({
RelationshipTypes
.reply,
RelationshipTypes
.thread,
}.contains(
event
.relationshipType,
))
FutureBuilder<
Event?>(
future: event
.getReplyEvent(
timeline,
),
builder: (
BuildContext
context,
snapshot,
) {
final replyEvent = snapshot
.hasData
? snapshot
.data!
: Event(
eventId:
event.relationshipEventId!,
content: {
'msgtype': 'm.text',
'body': '...',
},
// #Pangea
// senderId: event
// .senderId,
senderId:
"",
// Pangea#
type:
'm.room.message',
room:
event.room,
status:
EventStatus.sent,
originServerTs:
DateTime.now(),
);
return Padding(
padding:
const EdgeInsets
.only(
left:
16,
right:
16,
top: 8,
),
child:
Material(
color: Colors
.transparent,
borderRadius:
ReplyContent.borderRadius,
child:
Material(
color:
Colors.transparent,
InkWell(
borderRadius:
ReplyContent.borderRadius,
onTap: () =>
scrollToEventId(
replyEvent.eventId,
),
child:
InkWell(
borderRadius:
ReplyContent.borderRadius,
onTap: () =>
scrollToEventId(
replyEvent.eventId,
),
AbsorbPointer(
child:
AbsorbPointer(
child: ReplyContent(
replyEvent,
ownMessage: ownMessage,
timeline: timeline,
),
ReplyContent(
replyEvent,
ownMessage: ownMessage,
timeline: timeline,
),
),
),
);
},
),
MessageContent(
displayEvent,
textColor:
textColor,
linkColor:
linkColor,
onInfoTab:
onInfoTab,
borderRadius:
borderRadius,
timeline:
timeline,
selected:
selected,
// #Pangea
pangeaMessageEvent:
pangeaMessageEvent,
controller:
controller,
nextEvent:
nextEvent,
prevEvent:
previousEvent,
// Pangea#
),
);
},
),
if (event
.hasAggregatedEvents(
timeline,
RelationshipTypes
.edit,
))
Padding(
padding:
const EdgeInsets
.only(
bottom:
8.0,
left:
16.0,
right:
16.0,
),
child: Row(
mainAxisSize:
MainAxisSize
.min,
spacing:
4.0,
children: [
Icon(
Icons
.edit_outlined,
MessageContent(
displayEvent,
textColor:
textColor,
linkColor:
linkColor,
onInfoTab:
onInfoTab,
borderRadius:
borderRadius,
timeline:
timeline,
selected:
selected,
// #Pangea
pangeaMessageEvent:
pangeaMessageEvent,
controller:
controller,
nextEvent:
nextEvent,
prevEvent:
previousEvent,
// Pangea#
),
if (event
.hasAggregatedEvents(
timeline,
RelationshipTypes
.edit,
))
Padding(
padding:
const EdgeInsets
.only(
bottom: 8.0,
left: 16.0,
right: 16.0,
),
child: Row(
mainAxisSize:
MainAxisSize
.min,
spacing:
4.0,
children: [
Icon(
Icons
.edit_outlined,
color: textColor
.withAlpha(
164,
),
size:
14,
),
Text(
displayEvent
.originServerTs
.localizedTimeShort(
context,
),
style:
TextStyle(
color:
textColor.withAlpha(
164,
),
size:
14,
fontSize:
11,
),
Text(
displayEvent
.originServerTs
.localizedTimeShort(
context,
),
style:
TextStyle(
color:
textColor.withAlpha(
164,
),
fontSize:
11,
),
),
],
),
),
],
),
],
),
),
],
),
),
),

View file

@ -22,30 +22,33 @@ class ShimmerBackground extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (!enabled) {
return child;
}
final borderRadius =
this.borderRadius ?? BorderRadius.circular(AppConfig.borderRadius);
return Stack(
children: [
child,
if (enabled)
Positioned.fill(
child: IgnorePointer(
child: ClipRRect(
borderRadius: borderRadius,
child: Shimmer.fromColors(
baseColor: baseColor ?? shimmerColor.withValues(alpha: 0.1),
highlightColor: shimmerColor.withValues(alpha: 0.6),
direction: ShimmerDirection.ltr,
child: Container(
decoration: BoxDecoration(
color: shimmerColor.withValues(alpha: 0.3),
borderRadius: borderRadius,
),
Positioned.fill(
child: IgnorePointer(
child: ClipRRect(
borderRadius: borderRadius,
child: Shimmer.fromColors(
baseColor: baseColor ?? shimmerColor.withValues(alpha: 0.1),
highlightColor: shimmerColor.withValues(alpha: 0.6),
direction: ShimmerDirection.ltr,
child: Container(
decoration: BoxDecoration(
color: shimmerColor.withValues(alpha: 0.3),
borderRadius: borderRadius,
),
),
),
),
),
),
],
);
}

View file

@ -32,9 +32,9 @@ enum InstructionsEnum {
setLemmaEmoji,
disableLanguageTools,
selectMeaning,
clickTextMessages,
clickAudioMessages,
dismissSupportChat,
shimmerNewToken,
shimmerTranslation,
}
extension InstructionsEnumExtension on InstructionsEnum {
@ -66,9 +66,9 @@ extension InstructionsEnumExtension on InstructionsEnum {
case InstructionsEnum.noSavedActivitiesYet:
case InstructionsEnum.setLemmaEmoji:
case InstructionsEnum.disableLanguageTools:
case InstructionsEnum.clickTextMessages:
case InstructionsEnum.clickAudioMessages:
case InstructionsEnum.dismissSupportChat:
case InstructionsEnum.shimmerNewToken:
case InstructionsEnum.shimmerTranslation:
ErrorHandler.logError(
e: Exception("No title for this instruction"),
m: 'InstructionsEnumExtension.title',
@ -130,9 +130,9 @@ extension InstructionsEnumExtension on InstructionsEnum {
case InstructionsEnum.noSavedActivitiesYet:
return l10n.noSavedActivitiesYet;
case InstructionsEnum.setLemmaEmoji:
case InstructionsEnum.clickTextMessages:
case InstructionsEnum.clickAudioMessages:
case InstructionsEnum.dismissSupportChat:
case InstructionsEnum.shimmerNewToken:
case InstructionsEnum.shimmerTranslation:
return "";
case InstructionsEnum.disableLanguageTools:
return l10n.disableLanguageToolsDesc;

View file

@ -4,6 +4,7 @@ import 'package:go_router/go_router.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/common/widgets/shimmer_background.dart';
import 'package:fluffychat/pangea/languages/language_model.dart';
import 'package:fluffychat/pangea/languages/language_service.dart';
import 'package:fluffychat/pangea/languages/p_language_store.dart';
@ -102,7 +103,24 @@ class LanguageSelectionPageState extends State<LanguageSelectionPage> {
return Scaffold(
appBar: AppBar(
title: Text(L10n.of(context).languages),
title: ConstrainedBox(
constraints: const BoxConstraints(
maxWidth: 450,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BackButton(
onPressed: Navigator.of(context).pop,
),
Text(L10n.of(context).onboardingLanguagesTitle),
const SizedBox(
width: 40.0,
),
],
),
),
automaticallyImplyLeading: false,
),
body: SafeArea(
child: Center(
@ -121,6 +139,7 @@ class LanguageSelectionPageState extends State<LanguageSelectionPage> {
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(50),
),
hintText: L10n.of(context).searchLanguagesHint,
),
),
Expanded(
@ -153,27 +172,38 @@ class LanguageSelectionPageState extends State<LanguageSelectionPage> {
),
)
.map(
(l) => FilterChip(
selected: _selectedLanguage == l,
backgroundColor:
_selectedLanguage == l
? theme.colorScheme.primary
: theme.colorScheme.surface,
padding: const EdgeInsets.symmetric(
horizontal: 8.0,
vertical: 4.0,
(l) => ShimmerBackground(
enabled: _selectedLanguage == null,
borderRadius: const BorderRadius.all(
Radius.circular(16.0),
),
label: Text(
l.getDisplayName(context),
style: isColumnMode
? theme.textTheme.bodyLarge
: theme.textTheme.bodyMedium,
child: FilterChip(
selected: _selectedLanguage == l,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(
Radius.circular(16.0),
),
),
backgroundColor:
_selectedLanguage == l
? theme.colorScheme.primary
: theme.colorScheme.surface,
padding: const EdgeInsets.symmetric(
horizontal: 8.0,
vertical: 4.0,
),
label: Text(
l.getDisplayName(context),
style: isColumnMode
? theme.textTheme.bodyLarge
: theme.textTheme.bodyMedium,
),
onSelected: (selected) {
_setSelectedLanguage(
selected ? l : null,
);
},
),
onSelected: (selected) {
_setSelectedLanguage(
selected ? l : null,
);
},
),
)
.toList(),
@ -220,23 +250,24 @@ class LanguageSelectionPageState extends State<LanguageSelectionPage> {
)
: const SizedBox(),
),
Text(
L10n.of(context).chooseLanguage,
style: theme.textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
),
),
ElevatedButton(
onPressed: _selectedLanguage != null ? _submit : null,
style: ElevatedButton.styleFrom(
backgroundColor: theme.colorScheme.primaryContainer,
foregroundColor: theme.colorScheme.onPrimaryContainer,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(L10n.of(context).letsGo),
],
ShimmerBackground(
enabled: _selectedLanguage != null,
borderRadius: BorderRadius.circular(24.0),
child: ElevatedButton(
onPressed: _selectedLanguage != null ? _submit : null,
style: ElevatedButton.styleFrom(
backgroundColor: theme.colorScheme.primaryContainer,
foregroundColor: theme.colorScheme.onPrimaryContainer,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24.0),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(L10n.of(context).letsGo),
],
),
),
),
],

View file

@ -15,9 +15,11 @@ import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pages/chat/events/audio_player.dart';
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/common/widgets/pressable_button.dart';
import 'package:fluffychat/pangea/common/widgets/shimmer_background.dart';
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
import 'package:fluffychat/pangea/events/extensions/pangea_event_extension.dart';
import 'package:fluffychat/pangea/events/utils/report_message.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/text_to_speech/tts_controller.dart';
import 'package:fluffychat/pangea/toolbar/message_practice/message_audio_card.dart';
import 'package:fluffychat/pangea/toolbar/message_selection_overlay.dart';
@ -214,6 +216,9 @@ class SelectModeButtonsState extends State<SelectModeButtons> {
}
if (updatedMode == SelectMode.translate) {
if (!InstructionsEnum.shimmerTranslation.isToggledOff) {
InstructionsEnum.shimmerTranslation.setToggledOff(true);
}
await controller.fetchTranslation();
}
@ -423,25 +428,31 @@ class SelectModeButtonsState extends State<SelectModeButtons> {
colorFactor:
theme.brightness == Brightness.light ? 0.55 : 0.3,
builder: (context, depressed, shadowColor) =>
AnimatedContainer(
duration: FluffyThemes.animationDuration,
height: buttonSize,
width: buttonSize,
decoration: BoxDecoration(
color: depressed
? shadowColor
: theme.colorScheme.primaryContainer,
shape: BoxShape.circle,
),
child: ValueListenableBuilder(
valueListenable: _isPlayingNotifier,
builder: (context, playing, __) =>
_SelectModeButtonIcon(
mode: mode,
loading: controller.isLoading &&
mode == selectedMode,
playing: mode == SelectMode.audio && playing,
color: theme.colorScheme.onPrimaryContainer,
ShimmerBackground(
enabled: !InstructionsEnum
.shimmerTranslation.isToggledOff &&
mode == SelectMode.translate,
borderRadius: BorderRadius.circular(100),
child: AnimatedContainer(
duration: FluffyThemes.animationDuration,
height: buttonSize,
width: buttonSize,
decoration: BoxDecoration(
color: depressed
? shadowColor
: theme.colorScheme.primaryContainer,
shape: BoxShape.circle,
),
child: ValueListenableBuilder(
valueListenable: _isPlayingNotifier,
builder: (context, playing, __) =>
_SelectModeButtonIcon(
mode: mode,
loading: controller.isLoading &&
mode == selectedMode,
playing: mode == SelectMode.audio && playing,
color: theme.colorScheme.onPrimaryContainer,
),
),
),
),