4907 construct details changes (#4961)

* chore: remove delegation analytics page

* feat: vocab construct analytics level bar

* chore: analytics mobile navigation

* feat: cap construct XP
This commit is contained in:
ggurdin 2025-12-29 13:39:37 -05:00 committed by GitHub
parent 2bb51da97b
commit 0eeec052b2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
80 changed files with 700 additions and 1693 deletions

View file

@ -33,8 +33,12 @@ import 'package:fluffychat/pages/settings_password/settings_password.dart';
import 'package:fluffychat/pages/settings_security/settings_security.dart';
import 'package:fluffychat/pages/settings_style/settings_style.dart';
import 'package:fluffychat/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart';
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_page/analytics_page.dart';
import 'package:fluffychat/pangea/analytics_page/activity_archive.dart';
import 'package:fluffychat/pangea/analytics_page/empty_analytics_page.dart';
import 'package:fluffychat/pangea/analytics_summary/level_analytics_details_content.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/chat_settings/pages/edit_course.dart';
import 'package:fluffychat/pangea/chat_settings/pages/pangea_invitation_selection.dart';
@ -518,11 +522,11 @@ abstract class AppRoutes {
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
AnalyticsPage(
indicator: FluffyThemes.isColumnMode(context)
? null
: ProgressIndicatorEnum.wordsUsed,
),
FluffyThemes.isColumnMode(context)
? const EmptyAnalyticsPage()
: const ConstructAnalyticsView(
view: ConstructTypeEnum.vocab,
),
),
routes: [
GoRoute(
@ -530,11 +534,11 @@ abstract class AppRoutes {
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
AnalyticsPage(
indicator: FluffyThemes.isColumnMode(context)
? null
: ProgressIndicatorEnum.morphsUsed,
),
FluffyThemes.isColumnMode(context)
? const EmptyAnalyticsPage()
: const ConstructAnalyticsView(
view: ConstructTypeEnum.morph,
),
),
redirect: loggedOutRedirect,
routes: [
@ -548,9 +552,9 @@ abstract class AppRoutes {
return defaultPageBuilder(
context,
state,
AnalyticsPage(
indicator: ProgressIndicatorEnum.morphsUsed,
ConstructAnalyticsView(
construct: construct,
view: ConstructTypeEnum.morph,
),
);
},
@ -562,11 +566,11 @@ abstract class AppRoutes {
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
AnalyticsPage(
indicator: FluffyThemes.isColumnMode(context)
? null
: ProgressIndicatorEnum.wordsUsed,
),
FluffyThemes.isColumnMode(context)
? const EmptyAnalyticsPage()
: const ConstructAnalyticsView(
view: ConstructTypeEnum.vocab,
),
),
redirect: loggedOutRedirect,
routes: [
@ -579,9 +583,9 @@ abstract class AppRoutes {
return defaultPageBuilder(
context,
state,
AnalyticsPage(
indicator: ProgressIndicatorEnum.wordsUsed,
ConstructAnalyticsView(
construct: construct,
view: ConstructTypeEnum.vocab,
),
);
},
@ -593,11 +597,9 @@ abstract class AppRoutes {
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
AnalyticsPage(
indicator: FluffyThemes.isColumnMode(context)
? null
: ProgressIndicatorEnum.activities,
),
FluffyThemes.isColumnMode(context)
? const EmptyAnalyticsPage()
: const ActivityArchive(),
),
redirect: loggedOutRedirect,
routes: [
@ -610,9 +612,12 @@ abstract class AppRoutes {
roomId: state.pathParameters['roomid']!,
eventId: state.uri.queryParameters['event'],
backButton: BackButton(
onPressed: () => context.go(
"/rooms/analytics/activities",
),
onPressed: () {
AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
view: ProgressIndicatorEnum.activities,
);
},
),
),
),
@ -625,11 +630,9 @@ abstract class AppRoutes {
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
AnalyticsPage(
indicator: FluffyThemes.isColumnMode(context)
? null
: ProgressIndicatorEnum.level,
),
FluffyThemes.isColumnMode(context)
? const EmptyAnalyticsPage()
: const LevelAnalyticsDetailsContent(),
),
redirect: loggedOutRedirect,
),

View file

@ -4358,9 +4358,6 @@
"courseSavedSuccessfully": "تم حفظ الدورة بنجاح",
"addCoursePlan": "إضافة خطة دورة",
"activityStatsButtonInstruction": "انقر هنا لعرض إحصائيات نشاطك ولإغلاق النشاط عند الانتهاء",
"readingAnalyticsDesc": "انقر على الممارسة على كل رسالة لتمارين القراءة.",
"speakingAnalyticsDesc": "سجل رسائل صوتية لممارسة التحدث.",
"audioAnalyticsDesc": "انقر على الممارسة على كل رسالة لتمارين الاستماع.",
"loginToAccount": "تسجيل الدخول إلى حسابي",
"appDescription": "تعلم لغة\nأثناء مراسلة أصدقائك.",
"languages": "اللغات",
@ -4386,7 +4383,6 @@
"usernameOrEmail": "اسم المستخدم أو البريد الإلكتروني",
"email": "البريد الإلكتروني",
"forgotPassword": "هل نسيت كلمة المرور؟",
"writingAnalyticsDesc": "أرسل رسائل لممارسة الكتابة.",
"endActivity": "إنهاء النشاط",
"allLanguages": "جميع اللغات",
"chatListTooltip": "ستجد هنا رسائلك المباشرة! انقر على صورة أي مستخدم وابدأ محادثة لإرسال رسالة خاصة.",
@ -9306,18 +9302,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9418,10 +9402,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10943,4 +10923,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -1874,9 +1874,6 @@
"courseSavedSuccessfully": "Курс паспяхова захаваны",
"addCoursePlan": "Дадаць план курса",
"activityStatsButtonInstruction": "Націсніце тут, каб праглядаць статыстыку вашай дзейнасці і закрыць дзейнасць пасля завяршэння",
"readingAnalyticsDesc": "Націсніце практыкаванне на кожным паведамленні для практыкаванняў чытання.",
"speakingAnalyticsDesc": "Запісвайце галасавыя паведамленні для практыкаванняў маўлення.",
"audioAnalyticsDesc": "Націсніце практыкаванне на кожным паведамленні для практыкаванняў слухання.",
"loginToAccount": "Увайсці ў мой рахунак",
"appDescription": "Вучыце мову\nпраз адпраўку тэкставых паведамленняў сябрам.",
"languages": "Мовы",
@ -1902,7 +1899,6 @@
"usernameOrEmail": "Імя карыстальніка або электронная пошта",
"email": "Электронная пошта",
"forgotPassword": "Забылі пароль?",
"writingAnalyticsDesc": "Адпраўляйце паведамленні для практыкі пісьма.",
"endActivity": "Завяршыць дзейнасць",
"allLanguages": "Усе мовы",
"chatListTooltip": "Тут вы знойдзеце свае прамыя паведамленні! Націсніце на аватар любога карыстальніка і абярыце «пачаць размову», каб адправіць ДМ.",
@ -10188,18 +10184,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10300,10 +10284,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11825,4 +11805,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4465,9 +4465,6 @@
"courseSavedSuccessfully": "কোর্স সফলভাবে সংরক্ষিত হয়েছে",
"addCoursePlan": "একটি কোর্স পরিকল্পনা যোগ করুন",
"activityStatsButtonInstruction": "আপনার কার্যকলাপ পরিসংখ্যান দেখার জন্য এখানে ক্লিক করুন এবং শেষ হলে কার্যকলাপ বন্ধ করুন",
"readingAnalyticsDesc": "পাঠের জন্য প্রতিটি বার্তায় অনুশীলনে ক্লিক করুন।",
"speakingAnalyticsDesc": "বক্তব্য অনুশীলনের জন্য ভয়েস বার্তা রেকর্ড করুন।",
"audioAnalyticsDesc": "শোনার কার্যকলাপের জন্য প্রতিটি বার্তায় অনুশীলনে ক্লিক করুন।",
"loginToAccount": "আমার অ্যাকাউন্টে লগইন করুন",
"appDescription": "একটি ভাষা শিখুন\nআপনার বন্ধুদের সাথে মেসেজিং করার সময়।",
"languages": "ভাষাসমূহ",
@ -4493,7 +4490,6 @@
"usernameOrEmail": "ব্যবহারকার নাম বা ইমেইল",
"email": "ইমেইল",
"forgotPassword": "পাসওয়ার্ড ভুলে গেছেন?",
"writingAnalyticsDesc": "লিখতে অনুশীলনের জন্য বার্তা পাঠান।",
"endActivity": "ক্রিয়াকলাপ শেষ করুন",
"allLanguages": "সব ভাষা",
"chatListTooltip": "এখানে আপনি আপনার সরাসরি বার্তা খুঁজে পাবেন! যেকোনো ব্যবহারকারীর অবতার ক্লিক করুন এবং “আলাপ শুরু করুন” ক্লিক করে একটি ডিএম পাঠান।",
@ -10193,18 +10189,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10305,10 +10289,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11830,4 +11810,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4269,9 +4269,6 @@
"courseSavedSuccessfully": "ཚོགས་ཚོགས་བརྗོད་སྤྱོད་འབད་ཡོད།",
"addCoursePlan": "ཚོགས་ཚོགས་རིམ་ལོག",
"activityStatsButtonInstruction": "འདིར་ཤེས་བརྗོད་གནང་བ་དང་ཚོད་ལྟ་ལས་འགོ་བཙུགས་བྱེད་སློབ་ཚན་ལ་བརྗེ་བཅོས་འབད།",
"readingAnalyticsDesc": "ཚོད་ལྟ་ལས་འགོ་བཙུགས་ལ་ལས་སྒྲིག་ལག་ལེན་གྱི་ཚོད་ལྟ་ལས་འགོ་བཙུགས་ལ་སྤྱོད་སྒོམ།",
"speakingAnalyticsDesc": "སྐད་ཆ་སྒྲིག་ལག་ལེན་གྱི་སྒྲིག་ལག་ལ་ལས་སྒྲིག་ལག་ལེན་གྱི་སྤྱོད་སྒོམ།",
"audioAnalyticsDesc": "ཚོད་ལྟ་ལས་འགོ་བཙུགས་ལ་ལས་སྒྲིག་ལག་ལེན་གྱི་ཚོད་ལྟ་ལས་འགོ་བཙུགས་ལ་སྤྱོད་སྒོམ།",
"loginToAccount": "ངའི་ཁུལ་གཅིག་ལ་སྤྱོད་ལམ་སྤྱོད་འབད།",
"appDescription": "ཚོགས་ཚོགས་སྐད་ཡིག་སློབ་ཚན་ལས་སྤྱོད་སྒོམ།\nཁྱེད་ཀྱི་གྲོགས་མཚན་ལ་རྟག་པ་སྤྱོད་སྒོམ་ལས་སྤྱོད་སྒོམ།",
"languages": "ཚོད་ལྟ",
@ -9436,18 +9433,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10028,7 +10013,6 @@
"downloadCSVFile": "CSV ཡིག་ཚགས་འགྱོ་བཅོས་",
"promotionalSubscriptionDesc": "ཁྱེད་ཀྱིས་ད་ལྟ་ལ་ལོ་རྒྱལ་ཁབ་ལ་ལོག་འབད་ཡོད་པའི་སྤྱི་ཚེས་ལ་ལོག་འབད་ཡོད། ཁྱེད་ཀྱིས་འབྲེལ་བ་བྱེད་ལས་སྤྱོད་ལེན་ལ་བསྐུར་གནང་བའི་ལས་ཁེར་ལ་འདེམས་སོ།",
"originalSubscriptionPlatform": "ལོག་འབད་ཚུལ་ཁང་ {purchasePlatform} ལས་འབྲེལ་བ་བྱེད་ཡོད།",
"writingAnalyticsDesc": "ສົ່ງຂໍ້ຄວາມເພື່ອຝຶກຝนການຂຽນ",
"endActivity": "ສິ້ນສຸດກິດຈະກຳ",
"allLanguages": "ທັງຫມົດພາສາ",
"chatListTooltip": "ນີ້ແມ່ນລາຍການຂອງຂໍ້ຄວາມຕົວສະເຫຼີມ! ໃຫ້ກົດທຸກຜູ້ໃຊ້ທີ່ມີຮູບພາບແລະ “ເລີ່ມການສົນທະນາ”ເພື່ອສົ່ງຂໍ້ຄວາມ DM.",
@ -10220,10 +10204,6 @@
}
}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10480,4 +10460,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4444,9 +4444,6 @@
"courseSavedSuccessfully": "Curs desat amb èxit",
"addCoursePlan": "Afegeix un pla de curs",
"activityStatsButtonInstruction": "Fes clic aquí per veure les teves estadístiques d'activitat i per tancar l'activitat quan hagis acabat",
"readingAnalyticsDesc": "Fes clic a practicar en cada missatge per a activitats de lectura.",
"speakingAnalyticsDesc": "Grava missatges de veu per a pràctica d'expressió oral.",
"audioAnalyticsDesc": "Fes clic a practicar en cada missatge per a activitats d'escolta.",
"loginToAccount": "Inicia sessió al meu compte",
"appDescription": "Aprèn un idioma\nmentre xatejes amb els teus amics.",
"languages": "Idiomes",
@ -4472,7 +4469,6 @@
"usernameOrEmail": "Nom d'usuari o correu electrònic",
"email": "Correu electrònic",
"forgotPassword": "Has oblidat la contrasenya?",
"writingAnalyticsDesc": "Envia missatges per practicar l'escriptura.",
"endActivity": "Finalitzar l'activitat",
"allLanguages": "Tots els idiomes",
"chatListTooltip": "Aquí trobaràs els teus missatges directes! Fes clic a la icona d'un usuari i “Inicia una conversa” per enviar un missatge privat.",
@ -9113,18 +9109,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9225,10 +9209,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10750,4 +10730,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4001,9 +4001,6 @@
"courseSavedSuccessfully": "Kurz úspěšně uložen",
"addCoursePlan": "Přidat plán kurzu",
"activityStatsButtonInstruction": "Klikněte zde pro zobrazení statistik vaší aktivity a pro uzavření aktivity po dokončení",
"readingAnalyticsDesc": "Klikněte na cvičení u každé zprávy pro aktivity čtení.",
"speakingAnalyticsDesc": "Nahrajte hlasové zprávy pro procvičování mluvení.",
"audioAnalyticsDesc": "Klikněte na cvičení u každé zprávy pro poslechové aktivity.",
"loginToAccount": "Přihlásit se ke svému účtu",
"appDescription": "Učte se jazyk\npři psaní zpráv přátelům.",
"languages": "Jazyky",
@ -4029,7 +4026,6 @@
"usernameOrEmail": "Uživatelské jméno nebo e-mail",
"email": "E-mail",
"forgotPassword": "Zapomněli jste heslo?",
"writingAnalyticsDesc": "Posílejte zprávy pro procvičování psaní.",
"endActivity": "Ukončit aktivitu",
"allLanguages": "Všechny jazyky",
"chatListTooltip": "Zde najdete své přímé zprávy! Klikněte na avatar jakéhokoliv uživatele a “začněte konverzaci” pro odeslání DM.",
@ -9696,18 +9692,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9808,10 +9792,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11333,4 +11313,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -1893,9 +1893,6 @@
"courseSavedSuccessfully": "Kursus gemt med succes",
"addCoursePlan": "Tilføj en kursusplan",
"activityStatsButtonInstruction": "Klik her for at se dine aktivitetsstatistikker og for at lukke aktiviteten, når du er færdig",
"readingAnalyticsDesc": "Klik på øvelse på hver besked for læseaktiviteter.",
"speakingAnalyticsDesc": "Optag stemmemeddelelser til taletræning.",
"audioAnalyticsDesc": "Klik på øvelse på hver besked for lytteaktiviteter.",
"loginToAccount": "Log ind på min konto",
"appDescription": "Lær et sprog\nmens du sender beskeder til dine venner.",
"languages": "Sprog",
@ -1921,7 +1918,6 @@
"usernameOrEmail": "Brugernavn eller e-mail",
"email": "E-mail",
"forgotPassword": "Glemt adgangskode?",
"writingAnalyticsDesc": "Send beskeder for at øve skrivning.",
"endActivity": "Afslut aktivitet",
"allLanguages": "Alle sprog",
"chatListTooltip": "Her finder du dine direkte beskeder! Klik på en brugers avatar og “start samtale” for at sende en DM.",
@ -10151,18 +10147,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10263,10 +10247,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11787,4 +11767,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4479,9 +4479,6 @@
"courseSavedSuccessfully": "Kurs erfolgreich gespeichert",
"addCoursePlan": "Einen Kursplan hinzufügen",
"activityStatsButtonInstruction": "Klicken Sie hier, um Ihre Aktivitätsstatistiken anzuzeigen und die Aktivität bei Abschluss zu schließen",
"readingAnalyticsDesc": "Klicken Sie auf Übung bei jeder Nachricht für Leseaktivitäten.",
"speakingAnalyticsDesc": "Aufnahmen von Sprachnachrichten für Sprechübungen machen.",
"audioAnalyticsDesc": "Klicken Sie auf Übung bei jeder Nachricht für Höraktivitäten.",
"loginToAccount": "In mein Konto einloggen",
"appDescription": "Lerne eine Sprache\nwährend du deinen Freunden schreibst.",
"languages": "Sprachen",
@ -4507,7 +4504,6 @@
"usernameOrEmail": "Benutzername oder E-Mail",
"email": "E-Mail",
"forgotPassword": "Passwort vergessen?",
"writingAnalyticsDesc": "Senden Sie Nachrichten, um das Schreiben zu üben.",
"endActivity": "Aktivität beenden",
"allLanguages": "Alle Sprachen",
"chatListTooltip": "Hier finden Sie Ihre Direktnachrichten! Klicken Sie auf das Avatar eines Nutzers und “Unterhaltung starten”, um eine DM zu senden.",
@ -9096,18 +9092,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9208,10 +9192,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10733,4 +10713,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4419,9 +4419,6 @@
"courseSavedSuccessfully": "Το μάθημα αποθηκεύτηκε με επιτυχία",
"addCoursePlan": "Προσθήκη σχεδίου μαθήματος",
"activityStatsButtonInstruction": "Κάντε κλικ εδώ για να δείτε τα στατιστικά της δραστηριότητάς σας και να κλείσετε τη δραστηριότητα όταν τελειώσετε",
"readingAnalyticsDesc": "Κάντε κλικ στην πρακτική σε κάθε μήνυμα για δραστηριότητες ανάγνωσης.",
"speakingAnalyticsDesc": "Καταγράψτε φωνητικά μηνύματα για πρακτική ομιλίας.",
"audioAnalyticsDesc": "Κάντε κλικ στην πρακτική σε κάθε μήνυμα για δραστηριότητες ακρόασης.",
"loginToAccount": "Συνδεθείτε στον λογαριασμό μου",
"appDescription": "Μάθε μια γλώσσα\nενώ στέλνεις μηνύματα στους φίλους σου.",
"languages": "Γλώσσες",
@ -4447,7 +4444,6 @@
"usernameOrEmail": "Όνομα χρήστη ή email",
"email": "Email",
"forgotPassword": "Ξεχάσατε τον κωδικό;",
"writingAnalyticsDesc": "Αποστέλλετε μηνύματα για να εξασκηθείτε στη γραφή.",
"endActivity": "Τέλος δραστηριότητας",
"allLanguages": "Όλες οι γλώσσες",
"chatListTooltip": "Εδώ θα βρείτε τα άμεσα μηνύματά σας! Κάντε κλικ σε οποιονδήποτε avatar χρήστη και \"ξεκινήστε συνομιλία\" για να στείλετε ένα DM.",
@ -10147,18 +10143,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10259,10 +10243,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11784,4 +11764,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4657,9 +4657,6 @@
"courseSavedSuccessfully": "Course saved successfully",
"addCoursePlan": "Add a course plan",
"activityStatsButtonInstruction": "Click here to view your activity stats and to close the activity when finished",
"readingAnalyticsDesc": "Click practice on each message for reading activities.",
"speakingAnalyticsDesc": "Record voice messages for speaking practice.",
"audioAnalyticsDesc": "Click practice on each message for listening activities.",
"loginToAccount": "Login to my account",
"appDescription": "Learn a language\nwhile texting your friends.",
"languages": "Languages",
@ -4676,7 +4673,6 @@
"usernameOrEmail": "Username or email",
"email": "Email",
"forgotPassword": "Forgot password?",
"writingAnalyticsDesc": "Send messages to practice writing.",
"endActivity": "End activity",
"allLanguages": "All languages",
"directMessageBotTitle": "Direct message Pangea Bot",

View file

@ -3598,9 +3598,6 @@
"courseSavedSuccessfully": "Kurso sukcese konservita",
"addCoursePlan": "Aldoni kurso-planon",
"activityStatsButtonInstruction": "Klaku ĉi tie por vidi viajn aktivadstatistikojn kaj por fermi la aktivadon kiam vi finos",
"readingAnalyticsDesc": "Klaku praktiki ĉe ĉiu mesaĝo por legaj aktivecoj.",
"speakingAnalyticsDesc": "Registru voĉmesaĝojn por parolpractiko.",
"audioAnalyticsDesc": "Klaku praktiki ĉe ĉiu mesaĝo por aŭskultaj aktivecoj.",
"loginToAccount": "Ensaluti al mia konto",
"appDescription": "Lernu lingvon\ndum tekstdonado al viaj amikojn.",
"languages": "Lingvoj",
@ -3626,7 +3623,6 @@
"usernameOrEmail": "Uzantnomo aŭ retpoŝto",
"email": "Retpoŝto",
"forgotPassword": "Ĉu vi forgesis la pasvorton?",
"writingAnalyticsDesc": "Sendu mesaĝojn por praktiki skribadon.",
"endActivity": "Fini aktivecon",
"allLanguages": "Ĉiuj lingvoj",
"chatListTooltip": "Ĉi tie vi trovos viajn rektajn mesaĝojn! Klaku sur ajna uzantoprofilo kaj “komencu konversacion” por sendi DM.",
@ -10178,18 +10174,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10290,10 +10274,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11815,4 +11795,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -5747,9 +5747,6 @@
"courseSavedSuccessfully": "Curso guardado con éxito",
"addCoursePlan": "Agregar un plan de curso",
"activityStatsButtonInstruction": "Haz clic aquí para ver tus estadísticas de actividad y cerrar la actividad cuando termines",
"readingAnalyticsDesc": "Haz clic en practicar en cada mensaje para actividades de lectura.",
"speakingAnalyticsDesc": "Graba mensajes de voz para practicar speaking.",
"audioAnalyticsDesc": "Haz clic en practicar en cada mensaje para actividades de listening.",
"loginToAccount": "Iniciar sesión en mi cuenta",
"appDescription": "Aprende un idioma\nmientras envías mensajes a tus amigos.",
"languages": "Idiomas",
@ -5775,7 +5772,6 @@
"usernameOrEmail": "Nombre de usuario o correo electrónico",
"email": "Correo electrónico",
"forgotPassword": "¿Olvidaste tu contraseña?",
"writingAnalyticsDesc": "Envía mensajes para practicar la escritura.",
"endActivity": "Finalizar actividad",
"allLanguages": "Todos los idiomas",
"chatListTooltip": "¡Aquí encontrarás tus mensajes directos! Haz clic en el avatar de cualquier usuario y \"iniciar conversación\" para enviar un mensaje directo.",
@ -6292,18 +6288,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -6404,10 +6388,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -7960,4 +7940,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -8873,9 +8873,6 @@
"courseSavedSuccessfully": "Kursus salvestati edukalt",
"addCoursePlan": "Lisa kursuseplaan",
"activityStatsButtonInstruction": "Klõpsa siia, et vaadata oma tegevuse statistikat ja sulgeda tegevus pärast lõpetamist",
"readingAnalyticsDesc": "Klõpsa iga sõnumi peal, et teha lugemisharjutusi.",
"speakingAnalyticsDesc": "Salvesta häälteateid rääkimisharjutuste jaoks.",
"audioAnalyticsDesc": "Klõpsa iga sõnumi peal, et teha kuulamisülesandeid.",
"loginToAccount": "Logi sisse oma kontole",
"appDescription": "Õpi keelt\nsõpradega sõnumite saatmise ajal.",
"languages": "Keeled",
@ -8901,7 +8898,6 @@
"usernameOrEmail": "Kasutajanimi või e-post",
"email": "E-post",
"forgotPassword": "Unustasid parooli?",
"writingAnalyticsDesc": "Saada sõnumeid kirjutamise harjutamiseks.",
"endActivity": "Lõpeta tegevus",
"allLanguages": "Kõik keeled",
"chatListTooltip": "Siin leiad oma otsevestlused! Klõpsa mis tahes kasutaja avataril ja vali „Alusta vestlust“, et saata otsevestlus.",
@ -9355,18 +9351,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9467,10 +9451,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10997,4 +10977,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4472,9 +4472,6 @@
"courseSavedSuccessfully": "Ikastaroa arrakastaz gorde da",
"addCoursePlan": "Gehitu ikastaro plan bat",
"activityStatsButtonInstruction": "Klikatu hemen zure jarduera estatistikak ikusteko eta jarduera amaitzean ixteko",
"readingAnalyticsDesc": "Klikatu praktika bakoitzean irakurketa jarduerak egiteko.",
"speakingAnalyticsDesc": "Grabatu ahots mezuak mintzatzeko praktika egiteko.",
"audioAnalyticsDesc": "Klikatu praktika bakoitzean entzute jarduerak egiteko.",
"loginToAccount": "Hasi saioa nire kontuan",
"appDescription": "Ikasi hizkuntza\nzure lagunekin mezularitza egiten bitartean.",
"languages": "Hizkuntzak",
@ -4500,7 +4497,6 @@
"usernameOrEmail": "Erabiltzaile-izena edo emaila",
"email": "Emaila",
"forgotPassword": "Aizu galdu?",
"writingAnalyticsDesc": "Bidali mezuak idazketa praktikatzen laguntzeko.",
"endActivity": "Amaitu jarduera",
"allLanguages": "Hizkuntza guztiak",
"chatListTooltip": "Hemen zure mezu zuzenean aurkituko dituzu! Sakatu edozein erabiltzailearen avatarra eta “hasi elkarrizketa” mezu zuzena bidaltzeko.",
@ -9089,18 +9085,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9201,10 +9185,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10726,4 +10706,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3892,9 +3892,6 @@
"courseSavedSuccessfully": "دوره با موفقیت ذخیره شد",
"addCoursePlan": "افزودن برنامه دوره",
"activityStatsButtonInstruction": "برای مشاهده آمار فعالیت خود و بستن فعالیت پس از اتمام اینجا کلیک کنید",
"readingAnalyticsDesc": "برای فعالیت‌های خواندن، روی هر پیام تمرین کنید.",
"speakingAnalyticsDesc": "برای تمرین صحبت، پیام‌های صوتی ضبط کنید.",
"audioAnalyticsDesc": "برای فعالیت‌های شنیداری، روی هر پیام تمرین کنید.",
"loginToAccount": "وارد حساب کاربری من شوید",
"appDescription": "یادگیری زبان\nدر حین پیام‌رسانی به دوستانتان.",
"languages": "زبان‌ها",
@ -3920,7 +3917,6 @@
"usernameOrEmail": "نام کاربری یا ایمیل",
"email": "ایمیل",
"forgotPassword": "رمز عبور را فراموش کرده‌اید؟",
"writingAnalyticsDesc": "برای تمرین نوشتن پیام ارسال کنید.",
"endActivity": "پایان فعالیت",
"allLanguages": "همه زبان‌ها",
"chatListTooltip": "در اینجا پیام‌های مستقیم خود را پیدا خواهید کرد! روی آواتار هر کاربر کلیک کنید و «شروع مکالمه» را بزنید تا پیام مستقیم ارسال کنید.",
@ -9821,18 +9817,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9933,10 +9917,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11458,4 +11438,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3972,9 +3972,6 @@
"courseSavedSuccessfully": "Kurssi tallennettu onnistuneesti",
"addCoursePlan": "Lisää kurssisuunnitelma",
"activityStatsButtonInstruction": "Klikkaa tästä nähdäksesi aktiviteettitilastosi ja sulkeaksesi aktiviteetin lopuksi",
"readingAnalyticsDesc": "Klikkaa harjoitusta jokaisessa viestissä lukuharjoituksia varten.",
"speakingAnalyticsDesc": "Tallenna ääniviestejä puheharjoituksia varten.",
"audioAnalyticsDesc": "Klikkaa harjoitusta jokaisessa viestissä kuunteluharjoituksia varten.",
"loginToAccount": "Kirjaudu tililleni",
"appDescription": "Opiskele kieltä\nlähettämällä viestejä ystävillesi.",
"languages": "Kielet",
@ -4000,7 +3997,6 @@
"usernameOrEmail": "Käyttäjätunnus tai sähköposti",
"email": "Sähköposti",
"forgotPassword": "Unohditko salasanan?",
"writingAnalyticsDesc": "Lähetä viestejä harjoitellaksesi kirjoittamista.",
"endActivity": "Lopeta toiminta",
"allLanguages": "Kaikki kielet",
"chatListTooltip": "Täältä löydät yksityisviestisi! Klikkaa minkä tahansa käyttäjän avataria ja \"aloita keskustelu\" lähettääksesi yksityisviestin.",
@ -9712,18 +9708,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9824,10 +9808,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11349,4 +11329,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -2737,9 +2737,6 @@
"courseSavedSuccessfully": "Matagumpay na na-save ang kurso",
"addCoursePlan": "Magdagdag ng plano sa kurso",
"activityStatsButtonInstruction": "Pindutin dito upang makita ang iyong mga istatistika ng aktibidad at isara ang aktibidad kapag tapos na",
"readingAnalyticsDesc": "Pindutin ang practice sa bawat mensahe para sa mga aktibidad sa pagbasa.",
"speakingAnalyticsDesc": "Mag-record ng mga voice message para sa pagsasanay sa pagsasalita.",
"audioAnalyticsDesc": "Pindutin ang practice sa bawat mensahe para sa mga aktibidad sa pakikinig.",
"loginToAccount": "Mag-login sa aking account",
"appDescription": "Matuto ng isang wika\nhabang nagte-text sa iyong mga kaibigan.",
"languages": "Mga Wika",
@ -2765,7 +2762,6 @@
"usernameOrEmail": "Username o email",
"email": "Email",
"forgotPassword": "Nakalimutan ang password?",
"writingAnalyticsDesc": "Magpadala ng mga mensahe upang sanayin ang pagsusulat.",
"endActivity": "Tapusin ang aktibidad",
"allLanguages": "Lahat ng wika",
"chatListTooltip": "Dito mo makikita ang iyong mga direktang mensahe! I-click ang avatar ng kahit anong user at “simulan ang pag-uusap” upang magpadala ng DM.",
@ -10078,18 +10074,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10190,10 +10174,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11702,4 +11682,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4302,9 +4302,6 @@
"courseSavedSuccessfully": "Cours enregistré avec succès",
"addCoursePlan": "Ajouter un plan de cours",
"activityStatsButtonInstruction": "Cliquez ici pour voir vos statistiques d'activité et pour fermer l'activité une fois terminée",
"readingAnalyticsDesc": "Cliquez sur pratiquer sur chaque message pour les activités de lecture.",
"speakingAnalyticsDesc": "Enregistrez des messages vocaux pour la pratique de la parole.",
"audioAnalyticsDesc": "Cliquez sur pratiquer sur chaque message pour les activités d'écoute.",
"loginToAccount": "Se connecter à mon compte",
"appDescription": "Apprenez une langue\ntout en envoyant des messages à vos amis.",
"languages": "Langues",
@ -4330,7 +4327,6 @@
"usernameOrEmail": "Nom d'utilisateur ou email",
"email": "Email",
"forgotPassword": "Mot de passe oublié ?",
"writingAnalyticsDesc": "Envoyez des messages pour pratiquer l'écriture.",
"endActivity": "Terminer l'activité",
"allLanguages": "Toutes les langues",
"chatListTooltip": "Ici, vous trouverez vos messages directs ! Cliquez sur l'avatar d'un utilisateur et « démarrer une conversation » pour envoyer un message privé.",
@ -9413,18 +9409,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9525,10 +9509,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11050,4 +11030,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4480,9 +4480,6 @@
"courseSavedSuccessfully": "Sábháladh an cúrsa go rathúil",
"addCoursePlan": "Cuir plean cúrsa leis",
"activityStatsButtonInstruction": "Cliceáil anseo chun do staitisticí gníomhaíochta a fheiceáil agus an gníomhaíocht a dhúnadh nuair a bheidh sé críochnaithe",
"readingAnalyticsDesc": "Cliceáil cleachtadh ar gach teachtaireacht le haghaidh gníomhaíochtaí léitheoireachta.",
"speakingAnalyticsDesc": "Cláraigh teachtaireachtaí gutha le haghaidh cleachtadh labhartha.",
"audioAnalyticsDesc": "Cliceáil cleachtadh ar gach teachtaireacht le haghaidh gníomhaíochtaí éisteachta.",
"loginToAccount": "Logáil isteach i mo chuntas",
"appDescription": "Foghlaim teanga\nag an am céanna le do chairde.",
"languages": "Teangacha",
@ -4508,7 +4505,6 @@
"usernameOrEmail": "Ainm úsáideora nó ríomhphost",
"email": "Ríomhphost",
"forgotPassword": "An bhfuil do phasfhocal dearmadta?",
"writingAnalyticsDesc": "Seol teachtaireachtaí chun cleachtadh scríbhneoireachta a dhéanamh.",
"endActivity": "Críochnaigh an ghníomhaíocht",
"allLanguages": "Gach teanga",
"chatListTooltip": "Anseo gheobhaidh tú do theachtaireachtaí díreacha! Cliceáil ar avatar aon úsáideora agus “tosaigh comhrá” chun DM a sheoladh.",
@ -9087,18 +9083,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9199,10 +9183,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10724,4 +10704,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4473,9 +4473,6 @@
"courseSavedSuccessfully": "Curso gardado con éxito",
"addCoursePlan": "Engadir un plan de curso",
"activityStatsButtonInstruction": "Faga clic aquí para ver as súas estatísticas de actividade e pechar a actividade cando remate",
"readingAnalyticsDesc": "Faga clic en practicar en cada mensaxe para actividades de lectura.",
"speakingAnalyticsDesc": "Grabe mensaxes de voz para practicar a fala.",
"audioAnalyticsDesc": "Faga clic en practicar en cada mensaxe para actividades de escoita.",
"loginToAccount": "Inicia sesión na miña conta",
"appDescription": "Aprende un idioma mentres envías mensaxes aos teus amigos.",
"languages": "Idiomas",
@ -4501,7 +4498,6 @@
"usernameOrEmail": "Nome de usuario ou correo electrónico",
"email": "Correo electrónico",
"forgotPassword": "Esqueciches a contrasinal?",
"writingAnalyticsDesc": "Envía mensaxes para practicar a escritura.",
"endActivity": "Rematar a actividade",
"allLanguages": "Todas as linguas",
"chatListTooltip": "Aquí atoparás as túas mensaxes directas! Fai clic na icona de calquera usuario e \"comeza unha conversa\" para enviar unha mensaxe privada.",
@ -9086,18 +9082,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9198,10 +9182,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10723,4 +10703,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3058,9 +3058,6 @@
"courseSavedSuccessfully": "הקורס נשמר בהצלחה",
"addCoursePlan": "הוסף תכנית קורס",
"activityStatsButtonInstruction": "לחץ כאן כדי לצפות בסטטיסטיקות הפעילות שלך ולסגור את הפעילות בסיום",
"readingAnalyticsDesc": "לחץ על תרגול בכל הודעה לפעילויות קריאה.",
"speakingAnalyticsDesc": "הקלט הודעות קוליות לתרגול דיבור.",
"audioAnalyticsDesc": "לחץ על תרגול בכל הודעה לפעילויות שמיעה.",
"loginToAccount": "התחבר לחשבוני",
"appDescription": "למד שפה\nבזמן שליחת הודעות לחברים שלך.",
"languages": "שפות",
@ -3086,7 +3083,6 @@
"usernameOrEmail": "שם משתמש או אימייל",
"email": "אימייל",
"forgotPassword": "שכחת סיסמה?",
"writingAnalyticsDesc": "שלח הודעות לתרגול הכתיבה.",
"endActivity": "סיים פעילות",
"allLanguages": "כל השפות",
"chatListTooltip": "כאן תמצאו את ההודעות הישירות שלכם! לחצו על אייקון של משתמש כלשהו ו״התחל שיחה״ כדי לשלוח הודעה פרטית.",
@ -10138,18 +10134,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10250,10 +10234,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11775,4 +11755,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4446,9 +4446,6 @@
"courseSavedSuccessfully": "कोर्स सफलतापूर्वक सहेजा गया",
"addCoursePlan": "कोर्स योजना जोड़ें",
"activityStatsButtonInstruction": "यहां क्लिक करें अपनी गतिविधि आँकड़े देखने के लिए और समाप्त होने पर गतिविधि को बंद करने के लिए",
"readingAnalyticsDesc": "पढ़ने की गतिविधियों के लिए प्रत्येक संदेश पर अभ्यास पर क्लिक करें।",
"speakingAnalyticsDesc": "बोलने का अभ्यास करने के लिए आवाज़ संदेश रिकॉर्ड करें।",
"audioAnalyticsDesc": "सुनने की गतिविधियों के लिए प्रत्येक संदेश पर अभ्यास पर क्लिक करें।",
"loginToAccount": "मेरे खाते में लॉगिन करें",
"appDescription": "एक भाषा सीखें\nजब आप अपने दोस्तों को मैसेज कर रहे हों।",
"languages": "भाषाएँ",
@ -4474,7 +4471,6 @@
"usernameOrEmail": "यूजरनेम या ईमेल",
"email": "ईमेल",
"forgotPassword": "पासवर्ड भूल गए?",
"writingAnalyticsDesc": "लेखन का अभ्यास करने के लिए संदेश भेजें।",
"endActivity": "क्रिया समाप्त करें",
"allLanguages": "सभी भाषाएँ",
"chatListTooltip": "यहाँ आप अपने सीधे संदेश पाएंगे! किसी भी उपयोगकर्ता के अवतार पर क्लिक करें और “संवाद शुरू करें” पर क्लिक करें ताकि आप एक डीएम भेज सकें।",
@ -10174,18 +10170,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10286,10 +10270,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11811,4 +11791,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4228,9 +4228,6 @@
"courseSavedSuccessfully": "Tečaj je uspješno spremljen",
"addCoursePlan": "Dodajte plan tečaja",
"activityStatsButtonInstruction": "Kliknite ovdje za prikaz statistike vaše aktivnosti i zatvaranje aktivnosti nakon završetka",
"readingAnalyticsDesc": "Kliknite na vježbu na svakoj poruci za aktivnosti čitanja.",
"speakingAnalyticsDesc": "Snimate glasovne poruke za vježbu govora.",
"audioAnalyticsDesc": "Kliknite na vježbu na svakoj poruci za aktivnosti slušanja.",
"loginToAccount": "Prijavite se na svoj račun",
"appDescription": "Učite jezik\ndok šaljete poruke prijateljima.",
"languages": "Jezici",
@ -4256,7 +4253,6 @@
"usernameOrEmail": "Korisničko ime ili e-mail",
"email": "E-mail",
"forgotPassword": "Zaboravili ste lozinku?",
"writingAnalyticsDesc": "Šaljite poruke za vježbanje pisanja.",
"endActivity": "Završite aktivnost",
"allLanguages": "Svi jezici",
"chatListTooltip": "Ovdje ćete pronaći svoje izravne poruke! Kliknite na avatar bilo kojeg korisnika i “započni razgovor” za slanje DM-a.",
@ -9461,18 +9457,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9573,10 +9557,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11098,4 +11078,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4473,9 +4473,6 @@
"courseSavedSuccessfully": "Kurzus sikeresen mentve",
"addCoursePlan": "Kurzus terv hozzáadása",
"activityStatsButtonInstruction": "Kattintson ide az aktivitási statisztikák megtekintéséhez és a tevékenység bezárásához, ha befejezte",
"readingAnalyticsDesc": "Kattintson a gyakorlatra minden üzenetnél az olvasási tevékenységekhez.",
"speakingAnalyticsDesc": "Felvétel hangüzeneteket a beszédgyakorlatokhoz.",
"audioAnalyticsDesc": "Kattintson a gyakorlatra minden üzenetnél a hallgatási tevékenységekhez.",
"loginToAccount": "Jelentkezzen be a fiókomba",
"appDescription": "Tanulj egy nyelvet\nüzenetküldés közben a barátaidnak.",
"languages": "Nyelvek",
@ -4501,7 +4498,6 @@
"usernameOrEmail": "Felhasználónév vagy e-mail",
"email": "E-mail",
"forgotPassword": "Elfelejtetted a jelszót?",
"writingAnalyticsDesc": "Üzenetek küldése a írás gyakorlásához.",
"endActivity": "Tevékenység befejezése",
"allLanguages": "Minden nyelv",
"chatListTooltip": "Itt találod a közvetlen üzeneteidet! Kattints bármely felhasználó avatarjára, és válaszd a „beszélgetés indítása” lehetőséget, hogy üzenetet küldj.",
@ -9090,18 +9086,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9202,10 +9186,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10727,4 +10707,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -1921,9 +1921,6 @@
"courseSavedSuccessfully": "Curso salvat con successo",
"addCoursePlan": "Adder un plan de curso",
"activityStatsButtonInstruction": "Clicca hic pro vider tu statisticas de actividad e pro clauder le actividad quando es finite",
"readingAnalyticsDesc": "Clicca 'practica' super cata message pro actividades de lectura.",
"speakingAnalyticsDesc": "Registrate messages de voce pro practica de parola.",
"audioAnalyticsDesc": "Clicca 'practica' super cata message pro actividades de ascolto.",
"loginToAccount": "Intra in mi conto",
"appDescription": "Impara un idioma\ndum il texta a tu amicos.",
"languages": "Linguas",
@ -1949,7 +1946,6 @@
"usernameOrEmail": "Nomine de usator o email",
"email": "Email",
"forgotPassword": "Oblida le parola?",
"writingAnalyticsDesc": "Manda messages pro practicar le scriber.",
"endActivity": "Terminar le activitate",
"allLanguages": "Tote linguas",
"chatListTooltip": "Ici tu trovara tu messages directe! Clicca super le avatar de qualcunque usator e 'comenciar conversation' pro inviar un DM.",
@ -10167,18 +10163,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10279,10 +10263,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11804,4 +11784,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4474,9 +4474,6 @@
"courseSavedSuccessfully": "Kursus berhasil disimpan",
"addCoursePlan": "Tambahkan rencana kursus",
"activityStatsButtonInstruction": "Klik di sini untuk melihat statistik aktivitas Anda dan menutup aktivitas saat selesai",
"readingAnalyticsDesc": "Klik latihan pada setiap pesan untuk aktivitas membaca.",
"speakingAnalyticsDesc": "Rekam pesan suara untuk latihan berbicara.",
"audioAnalyticsDesc": "Klik latihan pada setiap pesan untuk aktivitas mendengarkan.",
"loginToAccount": "Masuk ke akun saya",
"appDescription": "Pelajari bahasa\nsambil mengirim pesan kepada teman.",
"languages": "Bahasa",
@ -4502,7 +4499,6 @@
"usernameOrEmail": "Nama pengguna atau email",
"email": "Email",
"forgotPassword": "Lupa kata sandi?",
"writingAnalyticsDesc": "Kirim pesan untuk berlatih menulis.",
"endActivity": "Akhiri aktivitas",
"allLanguages": "Semua bahasa",
"chatListTooltip": "Di sini Anda akan menemukan pesan langsung Anda! Klik avatar pengguna mana pun dan \"mulai percakapan\" untuk mengirim DM.",
@ -9080,18 +9076,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9192,10 +9176,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10717,4 +10697,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4335,9 +4335,6 @@
"courseSavedSuccessfully": "Cors salvat con success",
"addCoursePlan": "Aggiungi un plan de cors",
"activityStatsButtonInstruction": "Clika qua pro vider tuas statisticas de activitate e pro serrar l'activitate quando finit",
"readingAnalyticsDesc": "Clika praticar su cata message pro activitates de lectura.",
"speakingAnalyticsDesc": "Registrara messages de voce pro practicar de parlar.",
"audioAnalyticsDesc": "Clika praticar su cata message pro activitates de ascoltar.",
"loginToAccount": "Login a mi conto",
"appDescription": "Impara un linguage\ndurante scriver a tui amicos.",
"languages": "Linguages",
@ -4363,7 +4360,6 @@
"usernameOrEmail": "Nom de usator o email",
"email": "Email",
"forgotPassword": "Oblidate la parola de pass?",
"writingAnalyticsDesc": "Manda messages pro practicar scriver.",
"endActivity": "Finir l'activitate",
"allLanguages": "Tutte le linguas",
"chatListTooltip": "Qua tu trovarai to mesages directes! Clicca su qualunque avatar de usator e 'comencia conversation' pro mandar un DM.",
@ -10063,18 +10059,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10175,10 +10159,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11700,4 +11680,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4451,9 +4451,6 @@
"courseSavedSuccessfully": "Corso salvato con successo",
"addCoursePlan": "Aggiungi un piano del corso",
"activityStatsButtonInstruction": "Clicca qui per visualizzare le statistiche della tua attività e per chiudere l'attività quando hai finito",
"readingAnalyticsDesc": "Clicca su pratica su ogni messaggio per le attività di lettura.",
"speakingAnalyticsDesc": "Registra messaggi vocali per la pratica del parlato.",
"audioAnalyticsDesc": "Clicca su pratica su ogni messaggio per le attività di ascolto.",
"loginToAccount": "Accedi al mio account",
"appDescription": "Impara una lingua\nmentre scrivi ai tuoi amici.",
"languages": "Lingue",
@ -4479,7 +4476,6 @@
"usernameOrEmail": "Nome utente o email",
"email": "Email",
"forgotPassword": "Hai dimenticato la password?",
"writingAnalyticsDesc": "Invia messaggi per esercitarti a scrivere.",
"endActivity": "Termina attività",
"allLanguages": "Tutte le lingue",
"chatListTooltip": "Qui troverai i tuoi messaggi diretti! Clicca sull'avatar di qualsiasi utente e “inizia conversazione” per inviare un messaggio diretto.",
@ -9092,18 +9088,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9204,10 +9188,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10729,4 +10709,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3815,9 +3815,6 @@
"courseSavedSuccessfully": "コースが正常に保存されました",
"addCoursePlan": "コースプランを追加",
"activityStatsButtonInstruction": "ここをクリックして活動統計を表示し、終了時に活動を閉じます",
"readingAnalyticsDesc": "各メッセージの練習をクリックして読解活動を行います。",
"speakingAnalyticsDesc": "話す練習のために音声メッセージを録音します。",
"audioAnalyticsDesc": "各メッセージの練習をクリックしてリスニング活動を行います。",
"loginToAccount": "マイアカウントにログイン",
"appDescription": "友達とメッセージを送りながら言語を学びましょう。",
"languages": "言語",
@ -3843,7 +3840,6 @@
"usernameOrEmail": "ユーザー名またはメール",
"email": "メール",
"forgotPassword": "パスワードをお忘れですか?",
"writingAnalyticsDesc": "書き取り練習のためにメッセージを送信します。",
"endActivity": "アクティビティを終了",
"allLanguages": "すべての言語",
"chatListTooltip": "ここにあなたのダイレクトメッセージがあります任意のユーザーのアバターをクリックして「会話を開始」し、DMを送信してください。",
@ -9879,18 +9875,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9991,10 +9975,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11516,4 +11496,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -2557,9 +2557,6 @@
"courseSavedSuccessfully": "კურსი წარმატებით შენახულია",
"addCoursePlan": "კურსის გეგმის დამატება",
"activityStatsButtonInstruction": "აწკაპუნეთ აქ თქვენი აქტივობის სტატისტიკის სანახავად და აქტივობის დახურვისთვის, როდესაც დასრულდება",
"readingAnalyticsDesc": "წაიკითხეთ პრაქტიკა თითოეულ შეტყობინებაზე, წაკითხვის აქტივობებისთვის.",
"speakingAnalyticsDesc": "ჩაწერეთ ხმოვანი შეტყობინებები საუბრის პრაქტიკისთვის.",
"audioAnalyticsDesc": "აწკაპუნეთ პრაქტიკა თითოეულ შეტყობინებაზე, მოსმენის აქტივობებისთვის.",
"loginToAccount": "შესვლა ჩემს ანგარიშზე",
"appDescription": "სწავლა ენის\nმეგობრებთან მესენჯერში საუბრის დროს.",
"languages": "ენები",
@ -2585,7 +2582,6 @@
"usernameOrEmail": "მომხმარებლის სახელი ან ელფოსტა",
"email": "ელფოსტა",
"forgotPassword": "დაგავიწყდათ პაროლი?",
"writingAnalyticsDesc": "გაგზავნეთ შეტყობინებები წერის პრაქტიკისთვის.",
"endActivity": "ფართოება აქტივობა",
"allLanguages": "ყველა ენა",
"chatListTooltip": "აქ ნახავთ თქვენს პირდაპირ შეტყობინებებს! დაწკაპეთ ნებისმიერი მომხმარებლის ავატარი და „საუბრის დაწყება“, რათა გაგზავნოთ შეტყობინება.",
@ -10119,18 +10115,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10231,10 +10215,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11756,4 +11736,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4408,9 +4408,6 @@
"courseSavedSuccessfully": "강좌가 성공적으로 저장되었습니다",
"addCoursePlan": "강좌 계획 추가",
"activityStatsButtonInstruction": "여기를 클릭하여 활동 통계를 보고 완료 시 활동을 종료하세요",
"readingAnalyticsDesc": "읽기 활동을 위해 각 메시지에서 연습을 클릭하세요.",
"speakingAnalyticsDesc": "말하기 연습을 위해 음성 메시지를 녹음하세요.",
"audioAnalyticsDesc": "듣기 활동을 위해 각 메시지에서 연습을 클릭하세요.",
"loginToAccount": "내 계정에 로그인",
"appDescription": "친구들과 문자 메시지를 보내며 언어를 배우세요.",
"languages": "언어",
@ -4436,7 +4433,6 @@
"usernameOrEmail": "사용자 이름 또는 이메일",
"email": "이메일",
"forgotPassword": "비밀번호를 잊으셨나요?",
"writingAnalyticsDesc": "글쓰기를 연습하려면 메시지를 보내세요.",
"endActivity": "활동 종료",
"allLanguages": "모든 언어",
"chatListTooltip": "여기서 직접 메시지를 찾을 수 있습니다! 사용자 아바타를 클릭하고 “대화 시작”을 선택하여 DM을 보내세요.",
@ -9197,18 +9193,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9309,10 +9293,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10834,4 +10814,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3824,9 +3824,6 @@
"courseSavedSuccessfully": "Kursas sėkmingai išsaugotas",
"addCoursePlan": "Pridėti kurso planą",
"activityStatsButtonInstruction": "Spustelėkite čia, norėdami peržiūrėti savo veiklos statistiką ir uždaryti veiklą, kai baigsite",
"readingAnalyticsDesc": "Spustelėkite praktika ant kiekvienos žinutės skaitymo veikloms.",
"speakingAnalyticsDesc": "Įrašykite balso žinutes kalbėjimo praktikai.",
"audioAnalyticsDesc": "Spustelėkite praktika ant kiekvienos žinutės klausymo veikloms.",
"loginToAccount": "Prisijungti prie mano paskyros",
"appDescription": "Išmokite kalbą\nnaudodamiesi tekstais su draugais.",
"languages": "Kalbos",
@ -3852,7 +3849,6 @@
"usernameOrEmail": "Vartotojo vardas arba el. paštas",
"email": "El. paštas",
"forgotPassword": "Pamiršote slaptažodį?",
"writingAnalyticsDesc": "Siųskite žinutes praktikuodami rašymą.",
"endActivity": "Baigti veiklą",
"allLanguages": "Visos kalbos",
"chatListTooltip": "Čia rasite savo tiesiogines žinutes! Spustelėkite bet kurio vartotojo avatarą ir „pradėti pokalbį“, kad išsiųstumėte tiesioginę žinutę.",
@ -9894,18 +9890,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10006,10 +9990,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11531,4 +11511,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4445,9 +4445,6 @@
"courseSavedSuccessfully": "Kursu veiksmīgi saglabāts",
"addCoursePlan": "Pievienot kursa plānu",
"activityStatsButtonInstruction": "Noklikšķiniet šeit, lai skatītu savu aktivitātes statistiku un aizvērtu aktivitāti, kad tā ir pabeigta",
"readingAnalyticsDesc": "Noklikšķiniet uz prakses katrā ziņojumā, lai veiktu lasīšanas aktivitātes.",
"speakingAnalyticsDesc": "Ierakstiet balss ziņojumus, lai praktizētu runāšanu.",
"audioAnalyticsDesc": "Noklikšķiniet uz prakses katrā ziņojumā, lai veiktu klausīšanās aktivitātes.",
"loginToAccount": "Pierakstieties savā kontā",
"appDescription": "Mācieties valodu\nrakstot ziņas draugiem.",
"languages": "Valodas",
@ -4473,7 +4470,6 @@
"usernameOrEmail": "Lietotājvārds vai e-pasts",
"email": "E-pasts",
"forgotPassword": "Aizmirsāt paroli?",
"writingAnalyticsDesc": "Sūtiet ziņojumus, lai praktizētu rakstīšanu.",
"endActivity": "Beigt aktivitāti",
"allLanguages": "Visas valodas",
"chatListTooltip": "Šeit atradīsiet savas tiešās ziņas! Noklikšķiniet uz jebkura lietotāja avatara un izvēlieties „sākt sarunu”, lai nosūtītu DM.",
@ -9075,18 +9071,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9187,10 +9171,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10712,4 +10692,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3387,9 +3387,6 @@
"courseSavedSuccessfully": "Kurset er lagret vellykket",
"addCoursePlan": "Legg til en kursplan",
"activityStatsButtonInstruction": "Klikk her for å se aktivitetsstatistikken din og for å lukke aktiviteten når du er ferdig",
"readingAnalyticsDesc": "Klikk på praksis på hver melding for leseaktiviteter.",
"speakingAnalyticsDesc": "Ta opp talebeskjeder for å øve på å snakke.",
"audioAnalyticsDesc": "Klikk på praksis på hver melding for lytteaktiviteter.",
"loginToAccount": "Logg inn på kontoen min",
"appDescription": "Lær et språk\nmens du sender tekst til vennene dine.",
"languages": "Språk",
@ -3415,7 +3412,6 @@
"usernameOrEmail": "Brukernavn eller e-post",
"email": "E-post",
"forgotPassword": "Glemt passord?",
"writingAnalyticsDesc": "Send meldinger for å øve på å skrive.",
"endActivity": "Avslutt aktivitet",
"allLanguages": "Alle språk",
"chatListTooltip": "Her finner du dine direktemeldinger! Klikk på en brukers avatar og «start samtale» for å sende en DM.",
@ -10182,18 +10178,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10294,10 +10278,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11819,4 +11799,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4471,9 +4471,6 @@
"courseSavedSuccessfully": "Cursus succesvol opgeslagen",
"addCoursePlan": "Voeg een cursusplan toe",
"activityStatsButtonInstruction": "Klik hier om je activiteitsstatistieken te bekijken en de activiteit te sluiten wanneer je klaar bent",
"readingAnalyticsDesc": "Klik op oefenen bij elk bericht voor leesactiviteiten.",
"speakingAnalyticsDesc": "Neem spraakberichten op voor spreekvaardigheid.",
"audioAnalyticsDesc": "Klik op oefenen bij elk bericht voor luisteractiviteiten.",
"loginToAccount": "Log in op mijn account",
"appDescription": "Leer een taal\nterwijl je met je vrienden chat.",
"languages": "Talen",
@ -4499,7 +4496,6 @@
"usernameOrEmail": "Gebruikersnaam of e-mail",
"email": "E-mail",
"forgotPassword": "Wachtwoord vergeten?",
"writingAnalyticsDesc": "Stuur berichten om schrijven te oefenen.",
"endActivity": "Eind activiteit",
"allLanguages": "Alle talen",
"chatListTooltip": "Hier vind je je directe berichten! Klik op de avatar van een gebruiker en “start een gesprek” om een DM te sturen.",
@ -9089,18 +9085,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9201,10 +9185,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10726,4 +10706,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4472,9 +4472,6 @@
"courseSavedSuccessfully": "Kurs zapisano pomyślnie",
"addCoursePlan": "Dodaj plan kursu",
"activityStatsButtonInstruction": "Kliknij tutaj, aby zobaczyć statystyki aktywności i zamknąć aktywność po zakończeniu",
"readingAnalyticsDesc": "Kliknij ćwiczenie na każdej wiadomości, aby rozpocząć aktywności czytania.",
"speakingAnalyticsDesc": "Nagrywaj wiadomości głosowe, aby ćwiczyć mówienie.",
"audioAnalyticsDesc": "Kliknij ćwiczenie na każdej wiadomości, aby rozpocząć aktywności słuchania.",
"loginToAccount": "Zaloguj się do mojego konta",
"appDescription": "Ucz się języka\npoprzez pisanie wiadomości do znajomych.",
"languages": "Języki",
@ -4500,7 +4497,6 @@
"usernameOrEmail": "Nazwa użytkownika lub e-mail",
"email": "E-mail",
"forgotPassword": "Zapomniałeś hasła?",
"writingAnalyticsDesc": "Wyślij wiadomości, aby ćwiczyć pisanie.",
"endActivity": "Zakończ aktywność",
"allLanguages": "Wszystkie języki",
"chatListTooltip": "Tutaj znajdziesz swoje wiadomości bezpośrednie! Kliknij avatar dowolnego użytkownika i „rozpocznij rozmowę”, aby wysłać wiadomość prywatną.",
@ -9089,18 +9085,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9201,10 +9185,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10724,4 +10704,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4462,9 +4462,6 @@
"courseSavedSuccessfully": "Curso salvo com sucesso",
"addCoursePlan": "Adicionar um plano de curso",
"activityStatsButtonInstruction": "Clique aqui para ver suas estatísticas de atividade e fechar a atividade quando terminar",
"readingAnalyticsDesc": "Clique em prática em cada mensagem para atividades de leitura.",
"speakingAnalyticsDesc": "Grave mensagens de voz para prática de fala.",
"audioAnalyticsDesc": "Clique em prática em cada mensagem para atividades de audição.",
"loginToAccount": "Faça login na minha conta",
"appDescription": "Aprenda um idioma\nenquanto envia mensagens aos seus amigos.",
"languages": "Idiomas",
@ -4490,7 +4487,6 @@
"usernameOrEmail": "Nome de usuário ou email",
"email": "Email",
"forgotPassword": "Esqueceu a senha?",
"writingAnalyticsDesc": "Enviar mensagens para praticar a escrita.",
"endActivity": "Encerrar atividade",
"allLanguages": "Todos os idiomas",
"chatListTooltip": "Aqui você encontrará suas mensagens diretas! Clique no avatar de qualquer usuário e \"iniciar conversa\" para enviar uma DM.",
@ -10189,18 +10185,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10301,10 +10285,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11826,4 +11806,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4218,9 +4218,6 @@
"courseSavedSuccessfully": "Curso salvo com sucesso",
"addCoursePlan": "Adicionar um plano de curso",
"activityStatsButtonInstruction": "Clique aqui para ver suas estatísticas de atividade e fechar a atividade quando terminar",
"readingAnalyticsDesc": "Clique em praticar em cada mensagem para atividades de leitura.",
"speakingAnalyticsDesc": "Grave mensagens de voz para prática de fala.",
"audioAnalyticsDesc": "Clique em praticar em cada mensagem para atividades de escuta.",
"loginToAccount": "Faça login na minha conta",
"appDescription": "Aprenda um idioma\nenquanto envia mensagens para seus amigos.",
"languages": "Idiomas",
@ -4246,7 +4243,6 @@
"usernameOrEmail": "Nome de usuário ou email",
"email": "Email",
"forgotPassword": "Esqueceu a senha?",
"writingAnalyticsDesc": "Envie mensagens para praticar a escrita.",
"endActivity": "Encerrar atividade",
"allLanguages": "Todos os idiomas",
"chatListTooltip": "Aqui você encontrará suas mensagens diretas! Clique na foto de perfil de qualquer usuário e \"comece uma conversa\" para enviar uma DM.",
@ -9460,18 +9456,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9572,10 +9556,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11084,4 +11064,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3281,9 +3281,6 @@
"courseSavedSuccessfully": "Curso guardado com sucesso",
"addCoursePlan": "Adicionar um plano de curso",
"activityStatsButtonInstruction": "Clique aqui para ver as suas estatísticas de atividade e para fechar a atividade quando terminar",
"readingAnalyticsDesc": "Clique em prática em cada mensagem para atividades de leitura.",
"speakingAnalyticsDesc": "Grave mensagens de voz para prática de fala.",
"audioAnalyticsDesc": "Clique em prática em cada mensagem para atividades de audiência.",
"loginToAccount": "Entrar na minha conta",
"appDescription": "Aprenda uma língua\nenquanto envia mensagens aos seus amigos.",
"languages": "Línguas",
@ -3309,7 +3306,6 @@
"usernameOrEmail": "Nome de utilizador ou email",
"email": "Email",
"forgotPassword": "Esqueceu a palavra-passe?",
"writingAnalyticsDesc": "Envie mensagens para praticar a escrita.",
"endActivity": "Terminar atividade",
"allLanguages": "Todas as línguas",
"chatListTooltip": "Aqui você encontrará as suas mensagens diretas! Clique no avatar de qualquer utilizador e “comece uma conversa” para enviar uma DM.",
@ -10131,18 +10127,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10243,10 +10227,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11755,4 +11735,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3891,9 +3891,6 @@
"courseSavedSuccessfully": "Curs salvat cu succes",
"addCoursePlan": "Adaugă un plan de curs",
"activityStatsButtonInstruction": "Click aici pentru a vedea statisticile activității și pentru a închide activitatea când termini",
"readingAnalyticsDesc": "Click pe practică pentru fiecare mesaj pentru activități de citire.",
"speakingAnalyticsDesc": " Înregistrează mesaje vocale pentru practică de vorbire.",
"audioAnalyticsDesc": "Click pe practică pentru fiecare mesaj pentru activități de ascultare.",
"loginToAccount": "Autentifică-te în contul meu",
"appDescription": "Învață o limbă\nîn timp ce trimiți mesaje prietenilor.",
"languages": "Limbi",
@ -3919,7 +3916,6 @@
"usernameOrEmail": "Nume de utilizator sau email",
"email": "Email",
"forgotPassword": "Ai uitat parola?",
"writingAnalyticsDesc": "Trimite mesaje pentru a exersa scrierea.",
"endActivity": "Încheie activitatea",
"allLanguages": "Toate limbile",
"chatListTooltip": "Aici vei găsi mesajele tale directe! Fă clic pe avatarul oricărui utilizator și „începe conversația” pentru a trimite un mesaj direct.",
@ -9824,18 +9820,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9936,10 +9920,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11461,4 +11441,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4410,9 +4410,6 @@
"courseSavedSuccessfully": "Курс софранился соответство",
"addCoursePlan": "Добавить план курса",
"activityStatsButtonInstruction": "Нажмите закатовок, чтобы проверить статистику вашей детальности и закрути курс концем",
"readingAnalyticsDesc": "Нажимайте практику на кожном сообщении для обыкновенную детальность.",
"speakingAnalyticsDesc": "Записывайте ковозновую обобовую повесь для практики говорения.",
"audioAnalyticsDesc": "Нажимайте практику на кождом сообщении для обыкновенную нашительность.",
"loginToAccount": "войти в мой установки",
"appDescription": "Совседанно наступайте человеческий язык,например, в котором написате друзям.",
"languages": "Конфедерации",
@ -4438,7 +4435,6 @@
"usernameOrEmail": "Имя пользователя или email",
"email": "Email",
"forgotPassword": "Забыли пароль?",
"writingAnalyticsDesc": "Отправляйте сообщения для практики письма.",
"endActivity": "Завершить деятельность",
"allLanguages": "Все языки",
"chatListTooltip": "Здесь вы найдете свои личные сообщения! Нажмите на аватар любого пользователя и выберите «начать разговор», чтобы отправить личное сообщение.",
@ -9194,18 +9190,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9306,10 +9290,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10831,4 +10811,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3095,9 +3095,6 @@
"courseSavedSuccessfully": "Kurz bol úspešne uložený",
"addCoursePlan": "Pridať plán kurzu",
"activityStatsButtonInstruction": "Kliknite sem pre zobrazenie štatistík vašej aktivity a na zatvorenie aktivity po dokončení",
"readingAnalyticsDesc": "Kliknite na cvičenie pri každej správe pre aktivity čítania.",
"speakingAnalyticsDesc": "Nahrávajte hlasové správy pre hovorené cvičenia.",
"audioAnalyticsDesc": "Kliknite na cvičenie pri každej správe pre aktivity počúvania.",
"loginToAccount": "Prihlásiť sa do môjho účtu",
"appDescription": "Naučte sa jazyk\npočas písania správ priateľom.",
"languages": "Jazyky",
@ -3123,7 +3120,6 @@
"usernameOrEmail": "Používateľské meno alebo e-mail",
"email": "E-mail",
"forgotPassword": "Zabudli ste heslo?",
"writingAnalyticsDesc": "Posielajte správy na precvičovanie písania.",
"endActivity": "Ukončiť aktivitu",
"allLanguages": "Všetky jazyky",
"chatListTooltip": "Tu nájdete svoje priame správy! Kliknite na avatar akéhokoľvek používateľa a „začať konverzáciu“, aby ste poslali DM.",
@ -10173,18 +10169,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10285,10 +10269,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11810,4 +11790,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -2427,9 +2427,6 @@
"courseSavedSuccessfully": "Tečaj je bil uspešno shranjen",
"addCoursePlan": "Dodaj načrt tečaja",
"activityStatsButtonInstruction": "Kliknite tukaj za ogled statistik vaše dejavnosti in za zapiranje dejavnosti po končanem delu",
"readingAnalyticsDesc": "Kliknite na prakso na vsaki sporočilu za dejavnosti branja.",
"speakingAnalyticsDesc": "Posnemite glasovne sporočila za vaje govora.",
"audioAnalyticsDesc": "Kliknite na prakso na vsaki sporočilu za dejavnosti poslušanja.",
"loginToAccount": "Prijavite se v svoj račun",
"appDescription": "Učite se jezika\nmedtem ko pošiljate sporočila prijateljem.",
"languages": "Jeziki",
@ -2455,7 +2452,6 @@
"usernameOrEmail": "Uporabniško ime ali e-pošta",
"email": "E-pošta",
"forgotPassword": "Pozabljeno geslo?",
"writingAnalyticsDesc": "Pošiljajte sporočila za vadbo pisanja.",
"endActivity": "Končaj dejavnost",
"allLanguages": "Vsi jeziki",
"chatListTooltip": "Tukaj boste našli svoja neposredna sporočila! Kliknite na avatar katerega koli uporabnika in izberite »začni pogovor«, da pošljete DM.",
@ -10170,18 +10166,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10282,10 +10266,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11807,4 +11787,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -3508,9 +3508,6 @@
"courseSavedSuccessfully": "Курс успешно сачуван",
"addCoursePlan": "Додај план курса",
"activityStatsButtonInstruction": "Кликните овде да видите статистику активности и да затворите активност након завршетка",
"readingAnalyticsDesc": "Кликните на праксу на свакој поруци за активности читања.",
"speakingAnalyticsDesc": "Запишите гласовне поруке за вежбање говора.",
"audioAnalyticsDesc": "Kliknite na svaku poruku za vežbe slušanja.",
"loginToAccount": "Prijavi se na svoj nalog",
"appDescription": "Uči jezik\ndok šalješ poruke prijateljima.",
"languages": "Jezici",
@ -3536,7 +3533,6 @@
"usernameOrEmail": "Korisničko ime ili email",
"email": "Email",
"forgotPassword": "Zaboravili ste lozinku?",
"writingAnalyticsDesc": "Šaljite poruke za vežbanje pisanja.",
"endActivity": "Završi aktivnost",
"allLanguages": "Svi jezici",
"chatListTooltip": "Ovde ćete pronaći svoje direktne poruke! Kliknite na avatar bilo kojeg korisnika i “započni razgovor” da biste poslali DM.",
@ -10191,18 +10187,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10303,10 +10287,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11828,4 +11808,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4133,9 +4133,6 @@
"courseSavedSuccessfully": "Kursen sparades framgångsrikt",
"addCoursePlan": "Lägg till en kursplan",
"activityStatsButtonInstruction": "Klicka här för att se dina aktivitetsstatistik och för att stänga aktiviteten när du är klar",
"readingAnalyticsDesc": "Klicka på övning för varje meddelande för läsaktiviteter.",
"speakingAnalyticsDesc": "Spela in röstmeddelanden för talövningar.",
"audioAnalyticsDesc": "Klicka på övning för varje meddelande för lyssningsaktiviteter.",
"loginToAccount": "Logga in på mitt konto",
"appDescription": "Lär dig ett språk\nmedan du skickar meddelanden till dina vänner.",
"languages": "Språk",
@ -4161,7 +4158,6 @@
"usernameOrEmail": "Användarnamn eller e-post",
"email": "E-post",
"forgotPassword": "Glömt lösenord?",
"writingAnalyticsDesc": "Skicka meddelanden för att öva på att skriva.",
"endActivity": "Avsluta aktivitet",
"allLanguages": "Alla språk",
"chatListTooltip": "Här hittar du dina direktmeddelanden! Klicka på en användares avatar och “starta konversation” för att skicka ett DM.",
@ -9567,18 +9563,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9679,10 +9663,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11204,4 +11184,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4348,9 +4348,6 @@
"courseSavedSuccessfully": "பாடம் வெற்றிகரமாக சேமிக்கப்பட்டது",
"addCoursePlan": "பாடத்திட்டத்தைச் சேர்க்கவும்",
"activityStatsButtonInstruction": "உங்கள் செயல்பாட்டு புள்ளிவிவரங்களைப் பார்க்க இங்கே கிளிக் செய்யவும் மற்றும் முடிந்ததும் செயல்பாட்டை மூடவும்",
"readingAnalyticsDesc": "ஒவ்வொரு செய்தியிலும் பயிற்சி செய்ய வாசிப்பு செயல்பாடுகளுக்காக கிளிக் செய்யவும்.",
"speakingAnalyticsDesc": "பேச்சு பயிற்சிக்காக குரல் செய்திகளை பதிவு செய்யவும்.",
"audioAnalyticsDesc": "ஒவ்வொரு செய்தியிலும் கேட்கும் செயல்பாடுகளுக்காக கிளிக் செய்யவும்.",
"loginToAccount": "என் கணக்கில் உள்நுழையவும்",
"appDescription": "ஒரு மொழியை கற்றுக்கொள்ளுங்கள்\nஉங்கள் நண்பர்களுடன் உரையாடும் போது.",
"languages": "மொழிகள்",
@ -4376,7 +4373,6 @@
"usernameOrEmail": "பயனர்பெயர் அல்லது மின்னஞ்சல்",
"email": "மின்னஞ்சல்",
"forgotPassword": "கடவுச்சொல்லை மறந்துவிட்டீர்களா?",
"writingAnalyticsDesc": "எழுதும் பயிற்சிக்கு செய்திகள் அனுப்பவும்.",
"endActivity": "செயல்பாட்டை முடிக்கவும்",
"allLanguages": "அனைத்து மொழிகள்",
"chatListTooltip": "இங்கே நீங்கள் நேரடி செய்திகளை காணலாம்! எந்த பயனரின் அவதாரத்தையும் கிளிக் செய்து “பேச்சு தொடங்கவும்” என்பதைக் கிளிக் செய்து DM அனுப்பவும்.",
@ -9313,18 +9309,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9425,10 +9409,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10950,4 +10930,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -1883,9 +1883,6 @@
"courseSavedSuccessfully": "కోర్సు విజయవంతంగా సేవ్ చేయబడింది",
"addCoursePlan": "కోర్సు ప్రణాళికను జోడించండి",
"activityStatsButtonInstruction": "మీ కార్యకలాప గణాంకాలను చూడడానికి ఇక్కడ క్లిక్ చేయండి మరియు పూర్తి చేసినప్పుడు కార్యకలాపాన్ని మూసివేయండి",
"readingAnalyticsDesc": "పఠన కార్యకలాపాల కోసం ప్రతి సందేశంపై అభ్యాసం క్లిక్ చేయండి.",
"speakingAnalyticsDesc": "మాట్లాడే అభ్యాసం కోసం వాయిస్ సందేశాలను రికార్డ్ చేయండి.",
"audioAnalyticsDesc": "శ్రవణ కార్యకలాపాల కోసం ప్రతి సందేశంపై అభ్యాసం క్లిక్ చేయండి.",
"loginToAccount": "నా ఖాతాలో లాగిన్ అవ్వండి",
"appDescription": "భాష నేర్చుకోండి\nమీ స్నేహితులతో సందేశాలు పంపుతూ.",
"languages": "భాషలు",
@ -1911,7 +1908,6 @@
"usernameOrEmail": "యూజర్‌నేమ్ లేదా ఇమెయిల్",
"email": "ఇమెయిల్",
"forgotPassword": "పాస్వర్డ్ మర్చిపోయారా?",
"writingAnalyticsDesc": "రాయడం సాధన కోసం సందేశాలు పంపండి.",
"endActivity": "చర్యను ముగించండి",
"allLanguages": "అన్ని భాషలు",
"chatListTooltip": "ఇక్కడ మీరు మీ ప్రత్యక్ష సందేశాలను కనుగొంటారు! ఏదైనా యూజర్ యొక్క అవతారంపై క్లిక్ చేసి \"సంభాషణ ప్రారంభించండి\" అని క్లిక్ చేయండి.",
@ -10178,18 +10174,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10290,10 +10274,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11815,4 +11795,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4419,9 +4419,6 @@
"courseSavedSuccessfully": "บันทึกคอร์สเรียบร้อยแล้ว",
"addCoursePlan": "เพิ่มแผนคอร์ส",
"activityStatsButtonInstruction": "คลิกที่นี่เพื่อดูสถิติกิจกรรมของคุณและปิดกิจกรรมเมื่อเสร็จสิ้น",
"readingAnalyticsDesc": "คลิกฝึกฝนในแต่ละข้อความสำหรับกิจกรรมการอ่าน",
"speakingAnalyticsDesc": "บันทึกข้อความเสียงเพื่อฝึกพูด",
"audioAnalyticsDesc": "คลิกฝึกฝนในแต่ละข้อความเพื่อกิจกรรมการฟัง",
"loginToAccount": "เข้าสู่ระบบบัญชีของฉัน",
"appDescription": "เรียนรู้ภาษา\nในขณะส่งข้อความถึงเพื่อนของคุณ",
"languages": "ภาษา",
@ -4447,7 +4444,6 @@
"usernameOrEmail": "ชื่อผู้ใช้หรืออีเมล",
"email": "อีเมล",
"forgotPassword": "ลืมรหัสผ่าน?",
"writingAnalyticsDesc": "ส่งข้อความเพื่อฝึกฝนการเขียน",
"endActivity": "สิ้นสุดกิจกรรม",
"allLanguages": "ทุกภาษา",
"chatListTooltip": "ที่นี่คุณจะพบข้อความส่วนตัวของคุณ! คลิกที่อวาตาร์ของผู้ใช้ใดก็ได้และ \"เริ่มสนทนา\" เพื่อส่งข้อความส่วนตัว",
@ -10147,18 +10143,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -10259,10 +10243,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11784,4 +11764,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4355,9 +4355,6 @@
"courseSavedSuccessfully": "Kurs başarıyla kaydedildi",
"addCoursePlan": "Bir kurs planı ekle",
"activityStatsButtonInstruction": "Etkinlik istatistiklerinizi görmek ve tamamlandığında etkinliği kapatmak için buraya tıklayın",
"readingAnalyticsDesc": "Okuma etkinlikleri için her mesajda pratik yapmaya tıklayın.",
"speakingAnalyticsDesc": "Konuşma pratiği için sesli mesajlar kaydedin.",
"audioAnalyticsDesc": "Dinleme etkinlikleri için her mesajda pratik yapmaya tıklayın.",
"loginToAccount": "Hesabınıza giriş yapın",
"appDescription": "Bir dil öğrenin\narkadaşlarınıza mesaj atarken.",
"languages": "Diller",
@ -4383,7 +4380,6 @@
"usernameOrEmail": "Kullanıcı adı veya e-posta",
"email": "E-posta",
"forgotPassword": "Şifremi unuttum?",
"writingAnalyticsDesc": "Yazma alıştırması yapmak için mesaj gönderin.",
"endActivity": "Etkinliği sonlandır",
"allLanguages": "Tüm diller",
"chatListTooltip": "Burada doğrudan mesajlarınızı bulacaksınız! Herhangi bir kullanıcının avatarına tıklayın ve \"sohbet başlat\" seçeneğiyle DM gönderebilirsiniz.",
@ -9311,18 +9307,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9423,10 +9407,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10948,4 +10928,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4474,9 +4474,6 @@
"courseSavedSuccessfully": "Курс успішно збережено",
"addCoursePlan": "Додати план курсу",
"activityStatsButtonInstruction": "Натисніть тут, щоб переглянути статистику вашої активності та закрити активність після завершення",
"readingAnalyticsDesc": "Натисніть практику на кожному повідомленні для читання активностей.",
"speakingAnalyticsDesc": "Запишіть голосові повідомлення для практики говоріння.",
"audioAnalyticsDesc": "Натисніть практику на кожному повідомленні для слухання активностей.",
"loginToAccount": "Увійти до мого облікового запису",
"appDescription": "Вивчайте мову\nпишучи повідомлення друзям.",
"languages": "Мови",
@ -4502,7 +4499,6 @@
"usernameOrEmail": "Ім'я користувача або електронна пошта",
"email": "Електронна пошта",
"forgotPassword": "Забули пароль?",
"writingAnalyticsDesc": "Надсилайте повідомлення для практики написання.",
"endActivity": "Завершити діяльність",
"allLanguages": "Всі мови",
"chatListTooltip": "Тут ви знайдете свої особисті повідомлення! Натисніть на аватар будь-якого користувача і «почати розмову», щоб надіслати особисте повідомлення.",
@ -9083,18 +9079,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9195,10 +9179,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10720,4 +10700,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4037,9 +4037,6 @@
"courseSavedSuccessfully": "Lưu khóa học thành công",
"addCoursePlan": "Thêm kế hoạch khóa học",
"activityStatsButtonInstruction": "Nhấn vào đây để xem thống kê hoạt động của bạn và đóng hoạt động khi hoàn thành",
"readingAnalyticsDesc": "Nhấn luyện tập trên từng tin nhắn để thực hiện các hoạt động đọc.",
"speakingAnalyticsDesc": "Ghi âm tin nhắn thoại để luyện nói.",
"audioAnalyticsDesc": "Nhấn luyện tập trên từng tin nhắn để thực hiện các hoạt động nghe.",
"loginToAccount": "Đăng nhập vào tài khoản của tôi",
"appDescription": "Học một ngôn ngữ\ntrong khi nhắn tin với bạn bè.",
"languages": "Ngôn ngữ",
@ -4065,7 +4062,6 @@
"usernameOrEmail": "Tên người dùng hoặc email",
"email": "Email",
"forgotPassword": "Quên mật khẩu?",
"writingAnalyticsDesc": "Gửi tin nhắn để luyện viết.",
"endActivity": "Kết thúc hoạt động",
"allLanguages": "Tất cả các ngôn ngữ",
"chatListTooltip": "Bạn sẽ tìm thấy tin nhắn trực tiếp của mình ở đây! Nhấp vào ảnh đại diện của bất kỳ người dùng nào và chọn “bắt đầu cuộc trò chuyện” để gửi tin nhắn trực tiếp.",
@ -4626,18 +4622,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -4738,10 +4722,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -6296,4 +6276,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -1806,9 +1806,6 @@
"courseSavedSuccessfully": "課程已成功保存",
"addCoursePlan": "添加課程計劃",
"activityStatsButtonInstruction": "點擊此處查看您的活動統計數據,完成後關閉活動",
"readingAnalyticsDesc": "點擊每條消息進行閱讀練習。",
"speakingAnalyticsDesc": "錄製語音消息進行口語練習。",
"audioAnalyticsDesc": "點擊每條消息進行聽力練習。",
"loginToAccount": "登入我的帳戶",
"appDescription": "學習一種語言\n同時與朋友發訊息。",
"languages": "語言",
@ -1834,7 +1831,6 @@
"usernameOrEmail": "用戶名或電郵",
"email": "電郵",
"forgotPassword": "忘記密碼?",
"writingAnalyticsDesc": "發送訊息練習寫作。",
"endActivity": "結束活動",
"allLanguages": "所有語言",
"chatListTooltip": "喺呢度你會搵到你嘅直接訊息!點擊任何用戶嘅頭像同「開始對話」嚟發送私訊。",
@ -9774,18 +9770,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9886,10 +9870,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -11817,4 +11797,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4475,9 +4475,6 @@
"courseSavedSuccessfully": "课程已成功保存",
"addCoursePlan": "添加课程计划",
"activityStatsButtonInstruction": "点击这里查看您的活动统计,完成后关闭活动",
"readingAnalyticsDesc": "点击每条消息进行阅读活动练习。",
"speakingAnalyticsDesc": "录制语音消息进行口语练习。",
"audioAnalyticsDesc": "点击每条消息进行听力活动练习。",
"loginToAccount": "登录我的账户",
"appDescription": "学习一门语言\n同时给朋友发消息。",
"languages": "语言",
@ -4503,7 +4500,6 @@
"usernameOrEmail": "用户名或电子邮件",
"email": "电子邮件",
"forgotPassword": "忘记密码?",
"writingAnalyticsDesc": "发送消息以练习写作。",
"endActivity": "结束活动",
"allLanguages": "所有语言",
"chatListTooltip": "在这里你会找到你的私信!点击任何用户的头像并选择“开始对话”以发送私信。",
@ -9080,18 +9076,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9192,10 +9176,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10717,4 +10697,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -4450,9 +4450,6 @@
"courseSavedSuccessfully": "课程已成功保存",
"addCoursePlan": "添加课程计划",
"activityStatsButtonInstruction": "点击这里查看你的活动统计,并在完成后关闭活动",
"readingAnalyticsDesc": "点击每条消息的练习以进行阅读活动。",
"speakingAnalyticsDesc": "录制语音消息进行口语练习。",
"audioAnalyticsDesc": "点击每条消息的练习以进行听力活动。",
"loginToAccount": "登录我的账户",
"appDescription": "学习一门语言\n同时给朋友发短信。",
"languages": "語言",
@ -4478,7 +4475,6 @@
"usernameOrEmail": "用户名或电子邮件",
"email": "电子邮件",
"forgotPassword": "忘记密码?",
"writingAnalyticsDesc": "发送消息以练习写作。",
"endActivity": "结束活动",
"allLanguages": "所有语言",
"chatListTooltip": "在这里你会找到你的直接消息!点击任何用户的头像并选择“开始对话”以发送私信。",
@ -9100,18 +9096,6 @@
"type": "String",
"placeholders": {}
},
"@readingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@speakingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@audioAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@loginToAccount": {
"type": "String",
"placeholders": {}
@ -9212,10 +9196,6 @@
"type": "String",
"placeholders": {}
},
"@writingAnalyticsDesc": {
"type": "String",
"placeholders": {}
},
"@endActivity": {
"type": "String",
"placeholders": {}
@ -10724,4 +10704,4 @@
"type": "String",
"placeholders": {}
}
}
}

View file

@ -113,6 +113,7 @@ class AnalyticsDataService {
Future<void> _initAnalytics() async {
try {
Logs().i("Initializing analytics database.");
final client = _analyticsClientGetter.client;
if (client.prevBatch == null) {
await client.onSync.stream.first;
@ -130,10 +131,19 @@ class AnalyticsDataService {
client: client,
dataService: this,
);
await updateXPOffset(analyticsProfile.xpOffset ?? 0);
await _syncController!.bulkUpdate();
final vocab = await getAggregatedConstructs(ConstructTypeEnum.vocab);
final morphs = await getAggregatedConstructs(ConstructTypeEnum.morph);
final constructs = [...vocab.values, ...morphs.values];
final totalXP = constructs.fold(0, (total, c) => total + c.points);
await _analyticsClientGetter.database.updateDerivedStats(
DerivedAnalyticsDataModel(
totalXP: totalXP,
offset: analyticsProfile.xpOffset ?? 0,
),
);
_syncController!.start();
await _initMergeTable();
@ -272,7 +282,6 @@ class AnalyticsDataService {
Future<Map<ConstructIdentifier, ConstructUses>> getAggregatedConstructs(
ConstructTypeEnum type,
) async {
await _ensureInitialized();
final combined =
await _analyticsClientGetter.database.getAggregatedConstructs(type);
@ -341,14 +350,10 @@ class AnalyticsDataService {
AnalyticsUpdate update,
) async {
final events = <AnalyticsUpdateEvent>[];
final morphIds = update.addedConstructs
.where((c) => c.constructType == ConstructTypeEnum.morph)
.map((c) => c.identifier)
.toSet();
final updateIds = update.addedConstructs.map((c) => c.identifier).toList();
final prevData = await derivedData;
final prevMorphs = await getConstructUses(morphIds.toList());
final prevConstructs = await getConstructUses(updateIds);
_invalidateCaches();
await _ensureInitialized();
@ -359,7 +364,17 @@ class AnalyticsDataService {
final blocked = blockedConstructs;
_mergeTable.addConstructsByUses(update.addedConstructs, blocked);
final newData = await derivedData;
final newConstructs = await getConstructUses(updateIds);
int points = 0;
for (final id in updateIds) {
final prevPoints = prevConstructs[id]?.points ?? 0;
final newPoints = newConstructs[id]?.points ?? 0;
points += (newPoints - prevPoints);
}
events.add(XPGainedEvent(points, update.targetID));
final newData = prevData.copyWith(totalXP: prevData.totalXP + points);
await _analyticsClientGetter.database.updateDerivedStats(newData);
// Update public profile each time that new analytics are added.
// If the level hasn't changed, this will not send an update to the server.
@ -383,10 +398,10 @@ class AnalyticsDataService {
);
}
final newMorphs = await getConstructUses(morphIds.toList());
final newUnlockedMorphs = morphIds.where((id) {
final prevPoints = prevMorphs[id]?.points ?? 0;
final newPoints = newMorphs[id]?.points ?? 0;
final newUnlockedMorphs = updateIds.where((id) {
if (id.type != ConstructTypeEnum.morph) return false;
final prevPoints = prevConstructs[id]?.points ?? 0;
final newPoints = newConstructs[id]?.points ?? 0;
return prevPoints < _morphUnlockXP && newPoints >= _morphUnlockXP;
}).toSet();
@ -394,9 +409,6 @@ class AnalyticsDataService {
events.add(MorphUnlockedEvent(newUnlockedMorphs));
}
final points = update.addedConstructs.fold(0, (s, c) => s + c.xp);
events.add(XPGainedEvent(points, update.targetID));
if (update.blockedConstruct != null) {
events.add(ConstructBlockedEvent(update.blockedConstruct!));
}

View file

@ -31,9 +31,7 @@ class AnalyticsDatabase with DatabaseFileStorage {
late Box<Map> _aggregatedLocalVocabConstructsBox;
late Box<Map> _aggregatedServerMorphConstructsBox;
late Box<Map> _aggregatedLocalMorphConstructsBox;
late Box<Map> _derivedServerStatsBox;
late Box<Map> _derivedLocalStatsBox;
late Box<Map> _derivedStatsBox;
static const String _serverConstructsBoxName = 'box_server_constructs';
@ -52,9 +50,7 @@ class AnalyticsDatabase with DatabaseFileStorage {
static const String _aggregatedLocalMorphConstructsBoxName =
'box_aggregated_local_morph_constructs';
static const String _derivedServerStatsBoxName = 'box_derived_server_stats';
static const String _derivedLocalStatsBoxName = 'box_derived_local_stats';
static const String _derivedStatsBoxName = 'box_derived_stats';
static const String _lastEventTimestampBoxName = 'box_last_event_timestamp';
@ -114,8 +110,7 @@ class AnalyticsDatabase with DatabaseFileStorage {
_aggregatedLocalVocabConstructsBoxName,
_aggregatedServerMorphConstructsBoxName,
_aggregatedLocalMorphConstructsBoxName,
_derivedServerStatsBoxName,
_derivedLocalStatsBoxName,
_derivedStatsBoxName,
},
sqfliteDatabase: database,
sqfliteFactory: sqfliteFactory,
@ -144,11 +139,8 @@ class AnalyticsDatabase with DatabaseFileStorage {
_aggregatedLocalMorphConstructsBox = _collection.openBox<Map>(
_aggregatedLocalMorphConstructsBoxName,
);
_derivedServerStatsBox = _collection.openBox<Map>(
_derivedServerStatsBoxName,
);
_derivedLocalStatsBox = _collection.openBox<Map>(
_derivedLocalStatsBoxName,
_derivedStatsBox = _collection.openBox<Map>(
_derivedStatsBoxName,
);
}
@ -167,8 +159,7 @@ class AnalyticsDatabase with DatabaseFileStorage {
_aggregatedLocalVocabConstructsBox.clearQuickAccessCache();
_aggregatedServerMorphConstructsBox.clearQuickAccessCache();
_aggregatedLocalMorphConstructsBox.clearQuickAccessCache();
_derivedServerStatsBox.clearQuickAccessCache();
_derivedLocalStatsBox.clearQuickAccessCache();
_derivedStatsBox.clearQuickAccessCache();
await _collection.clear();
}
@ -191,30 +182,13 @@ class AnalyticsDatabase with DatabaseFileStorage {
return DateTime.parse(timestampString);
}
Future<DerivedAnalyticsDataModel> _getDerivedServerStats() async {
final raw = await _derivedServerStatsBox.get('derived_stats');
return raw == null
? DerivedAnalyticsDataModel()
: DerivedAnalyticsDataModel.fromJson(
Map<String, dynamic>.from(raw),
);
}
Future<DerivedAnalyticsDataModel> _getDerivedLocalStats() async {
final raw = await _derivedLocalStatsBox.get('derived_stats');
return raw == null
? DerivedAnalyticsDataModel()
: DerivedAnalyticsDataModel.fromJson(
Map<String, dynamic>.from(raw),
);
}
Future<DerivedAnalyticsDataModel> getDerivedStats() async {
DerivedAnalyticsDataModel server = DerivedAnalyticsDataModel();
DerivedAnalyticsDataModel local = DerivedAnalyticsDataModel();
server = await _getDerivedServerStats();
local = await _getDerivedLocalStats();
return server.merge(local);
final raw = await _derivedStatsBox.get('derived_stats');
return raw == null
? DerivedAnalyticsDataModel()
: DerivedAnalyticsDataModel.fromJson(
Map<String, dynamic>.from(raw),
);
}
Future<List<OneConstructUse>> getUses({
@ -391,7 +365,6 @@ class AnalyticsDatabase with DatabaseFileStorage {
await _localConstructsBox.clear();
await _aggregatedLocalVocabConstructsBox.clear();
await _aggregatedLocalMorphConstructsBox.clear();
await _derivedLocalStatsBox.clear();
});
}
@ -511,29 +484,17 @@ class AnalyticsDatabase with DatabaseFileStorage {
Future<void> updateXPOffset(int offset) {
return _transaction(() async {
final serverStats = await _getDerivedServerStats();
final localStats = await _getDerivedLocalStats();
final updatedServerStats = serverStats.copyWith(
offset: offset,
);
final updatedLocalStats = localStats.copyWith(
offset: offset,
);
await _derivedServerStatsBox.put(
final stats = await getDerivedStats();
final updatedStats = stats.copyWith(offset: offset);
await _derivedStatsBox.put(
'derived_stats',
updatedServerStats.toJson(),
);
await _derivedLocalStatsBox.put(
'derived_stats',
updatedLocalStats.toJson(),
updatedStats.toJson(),
);
});
}
Future<void> updateDerivedStats(DerivedAnalyticsDataModel newStats) =>
_derivedServerStatsBox.put(
_derivedStatsBox.put(
'derived_stats',
newStats.toJson(),
);
@ -546,7 +507,6 @@ class AnalyticsDatabase with DatabaseFileStorage {
final stopwatch = Stopwatch()..start();
await _transaction(() async {
final lastUpdated = await getLastEventTimestamp();
final derivedData = await _getDerivedServerStats();
DateTime mostRecent = lastUpdated ?? events.first.event.originServerTs;
final existingKeys = (await _serverConstructsBox.getAllKeys()).toSet();
@ -610,19 +570,6 @@ class AnalyticsDatabase with DatabaseFileStorage {
);
}
// Update derived stats
final updatedDerivedStats = derivedData.update(
[
...aggregatedVocabUses,
...aggregatedMorphUses,
],
);
await _derivedServerStatsBox.put(
'derived_stats',
updatedDerivedStats.toJson(),
);
// Update timestamp
await _lastEventTimestampBox.put(
'last_event_timestamp',
@ -682,14 +629,6 @@ class AnalyticsDatabase with DatabaseFileStorage {
entry.value.toJson(),
);
}
// Update derived stats
final derivedData = await _getDerivedLocalStats();
final updatedDerivedStats = derivedData.update(uses);
await _derivedLocalStatsBox.put(
'derived_stats',
updatedDerivedStats.toJson(),
);
});
stopwatch.stop();

View file

@ -9,6 +9,7 @@ import 'package:fluffychat/pangea/analytics_details_popup/vocab_analytics_detail
import 'package:fluffychat/pangea/analytics_details_popup/vocab_analytics_list_view.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart';
import 'package:fluffychat/pangea/analytics_summary/learning_progress_indicators.dart';
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/constructs/construct_level_enum.dart';
@ -129,12 +130,30 @@ class ConstructAnalyticsViewState extends State<ConstructAnalyticsView> {
@override
Widget build(BuildContext context) {
return widget.view == ConstructTypeEnum.morph
? widget.construct == null
? MorphAnalyticsListView(controller: this)
: MorphDetailsView(constructId: widget.construct!)
: widget.construct == null
? VocabAnalyticsListView(controller: this)
: VocabDetailsView(constructId: widget.construct!);
return Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsetsGeometry.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (widget.construct == null)
LearningProgressIndicators(
selected: widget.view.indicator,
),
Expanded(
child: widget.view == ConstructTypeEnum.morph
? widget.construct == null
? MorphAnalyticsListView(controller: this)
: MorphDetailsView(constructId: widget.construct!)
: widget.construct == null
? VocabAnalyticsListView(controller: this)
: VocabDetailsView(constructId: widget.construct!),
),
],
),
),
),
);
}
}

View file

@ -17,7 +17,10 @@ class AnalyticsDetailsUsageContent extends StatelessWidget {
Widget build(BuildContext context) {
return Column(
children: [
LemmaUseExampleMessages(construct: construct),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: LemmaUseExampleMessages(construct: construct),
),
...LearningSkillsEnum.values.where((v) => v.isVisible).map((skill) {
return LemmaUsageDots(
construct: construct,

View file

@ -0,0 +1,62 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_constants.dart';
import 'package:fluffychat/pangea/analytics_summary/animated_progress_bar.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/constructs/construct_level_enum.dart';
import 'package:fluffychat/widgets/matrix.dart';
class ConstructXPProgressBar extends StatelessWidget {
final ConstructIdentifier construct;
const ConstructXPProgressBar({
required this.construct,
super.key,
});
@override
Widget build(BuildContext context) {
final categories = ConstructLevelEnum.values.sorted(
(a, b) => a.xpNeeded.compareTo(b.xpNeeded),
);
final analyticsService = Matrix.of(context).analyticsDataService;
return Column(
spacing: 8.0,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [...categories.map((c) => c.icon())],
),
StreamBuilder(
stream:
analyticsService.updateDispatcher.constructUpdateStream.stream,
builder: (context, snapshot) {
return FutureBuilder(
future: analyticsService.getConstructUse(construct),
builder: (context, snapshot) {
final points = snapshot.data?.points ?? 0;
final progress =
min(1.0, points / AnalyticsConstants.xpForFlower);
return AnimatedProgressBar(
height: 20.0,
widthPercent: progress,
barColor: AppConfig.goldLight,
backgroundColor:
Theme.of(context).colorScheme.secondaryContainer,
);
},
);
},
),
],
);
}
}

View file

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart';
@ -58,41 +59,29 @@ class LemmaUsageDots extends StatelessWidget {
? construct.lemmaCategory.color(context)
: construct.lemmaCategory.darkColor(context));
final description = category.description(context);
return Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Tooltip(
triggerMode: TooltipTriggerMode.tap,
message: tooltip,
child: Icon(
icon,
size: 24,
color: textColor.withValues(alpha: 0.7),
),
),
const SizedBox(width: 8.0),
Flexible(
child: dots.isEmpty
? description != null
? Text(
description,
style: const TextStyle(
fontStyle: FontStyle.italic,
),
)
: const SizedBox()
: Wrap(
spacing: 3,
runSpacing: 5,
children: dots,
),
),
],
return ListTile(
leading: Tooltip(
triggerMode: TooltipTriggerMode.tap,
message: tooltip,
child: Icon(
icon,
size: 24,
color: textColor.withValues(alpha: 0.7),
),
),
title: Flexible(
child: dots.isEmpty
? Text(
L10n.of(context).noDataFound,
style: const TextStyle(
fontStyle: FontStyle.italic,
),
)
: Wrap(
spacing: 3,
runSpacing: 5,
children: dots,
),
),
);
}

View file

@ -1,15 +1,13 @@
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
import 'package:fluffychat/pangea/analytics_downloads/analytics_download_button.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/common/config/environment.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/constructs/construct_level_enum.dart';
@ -156,9 +154,13 @@ class MorphFeatureBox extends StatelessWidget {
morphFeature: morphFeature,
morphTag: morphTag,
constructAnalytics: snapshot.data,
onTap: () => context.go(
"/rooms/analytics/${id.type.string}/${Uri.encodeComponent(jsonEncode(id.toJson()))}",
),
onTap: () {
AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
view: ProgressIndicatorEnum.morphsUsed,
construct: id,
);
},
),
);
},

View file

@ -8,6 +8,7 @@ import 'package:fluffychat/pangea/lemmas/construct_xp_widget.dart';
import 'package:fluffychat/pangea/morphs/morph_feature_display.dart';
import 'package:fluffychat/pangea/morphs/morph_features_enum.dart';
import 'package:fluffychat/pangea/morphs/morph_tag_display.dart';
import 'package:fluffychat/widgets/layouts/max_width_body.dart';
import 'package:fluffychat/widgets/matrix.dart';
class MorphDetailsView extends StatelessWidget {
@ -34,7 +35,9 @@ class MorphDetailsView extends StatelessWidget {
? level.color(context)
: level.darkColor(context);
return SingleChildScrollView(
return MaxWidthBody(
maxWidth: 600.0,
showBorder: false,
child: Column(
spacing: 16.0,
children: [

View file

@ -4,12 +4,17 @@ import 'package:collection/collection.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_usage_content.dart';
import 'package:fluffychat/pangea/analytics_details_popup/construct_xp_progress_bar.dart';
import 'package:fluffychat/pangea/analytics_details_popup/word_text_with_audio_button.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/constructs/construct_level_enum.dart';
import 'package:fluffychat/pangea/events/models/pangea_token_text_model.dart';
import 'package:fluffychat/pangea/lemmas/construct_xp_widget.dart';
import 'package:fluffychat/pangea/toolbar/word_card/word_zoom_widget.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
import 'package:fluffychat/widgets/layouts/max_width_body.dart';
import 'package:fluffychat/widgets/matrix.dart';
/// Displays information about selected lemma, and its usage
@ -21,6 +26,31 @@ class VocabDetailsView extends StatelessWidget {
required this.constructId,
});
Future<void> _blockLemma(BuildContext context) async {
final resp = await showOkCancelAlertDialog(
context: context,
title: L10n.of(context).areYouSure,
message: L10n.of(context).blockLemmaConfirmation,
isDestructive: true,
);
if (resp != OkCancelResult.ok) return;
final res = await showFutureLoadingDialog(
context: context,
future: () => Matrix.of(context)
.analyticsDataService
.updateService
.blockConstruct(constructId),
);
if (!res.isError) {
AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
view: ProgressIndicatorEnum.wordsUsed,
);
}
}
@override
Widget build(BuildContext context) {
final analyticsService = Matrix.of(context).analyticsDataService;
@ -42,7 +72,9 @@ class VocabDetailsView extends StatelessWidget {
.toList() ??
[];
return SingleChildScrollView(
return MaxWidthBody(
maxWidth: 600.0,
showBorder: false,
child: Column(
spacing: 16.0,
children: [
@ -54,37 +86,25 @@ class VocabDetailsView extends StatelessWidget {
langCode:
MatrixState.pangeaController.userController.userL2Code!,
construct: constructId,
onClose: Navigator.of(context).pop,
),
],
),
if (construct != null)
Column(
spacing: 20.0,
children: [
Padding(
padding: const EdgeInsets.all(20.0),
child: ConstructXpWidget(
icon: StreamBuilder(
key: ValueKey(constructId.string),
stream: analyticsService.updateDispatcher
.lemmaUpdateStream(constructId),
builder: (context, update) {
final emoji = update.data?.emojis?.firstOrNull ??
constructId.userSetEmoji;
return Text(
emoji ?? "-",
style: const TextStyle(fontSize: 24.0),
);
},
),
level: construct.lemmaCategory,
points: construct.points,
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: ConstructXPProgressBar(
construct: constructId,
),
),
Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
Align(
Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Align(
alignment: Alignment.centerLeft,
child: _VocabForms(
lemma: constructId.lemma,
@ -92,11 +112,24 @@ class VocabDetailsView extends StatelessWidget {
textColor: textColor,
),
),
AnalyticsDetailsUsageContent(
construct: construct,
),
AnalyticsDetailsUsageContent(
construct: construct,
),
ListTile(
leading: Icon(
Icons.delete_outline,
color: Theme.of(context).colorScheme.error,
),
],
),
title: Text(
L10n.of(context).delete,
style: TextStyle(
color: Theme.of(context).colorScheme.error,
),
),
onTap: () => _blockLemma(context),
),
],
),
],
),

View file

@ -4,50 +4,44 @@ import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/common/widgets/shrinkable_text.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/constructs/construct_level_enum.dart';
import 'package:fluffychat/widgets/hover_builder.dart';
import 'package:fluffychat/widgets/matrix.dart';
class VocabAnalyticsListTile extends StatefulWidget {
class VocabAnalyticsListTile extends StatelessWidget {
final void Function()? onTap;
final ConstructIdentifier constructId;
final ConstructLevelEnum level;
final Color textColor;
final bool selected;
const VocabAnalyticsListTile({
super.key,
required this.constructId,
this.level = ConstructLevelEnum.seeds,
required this.textColor,
this.onTap,
this.selected = false,
});
final void Function()? onTap;
final ConstructIdentifier constructId;
final ConstructLevelEnum level;
final Color textColor;
@override
VocabAnalyticsListTileState createState() => VocabAnalyticsListTileState();
}
class VocabAnalyticsListTileState extends State<VocabAnalyticsListTile> {
bool _isHovered = false;
final double maxWidth = 100;
final double padding = 8.0;
@override
Widget build(BuildContext context) {
final analyticsService = Matrix.of(context).analyticsDataService;
return MouseRegion(
onEnter: (_) => setState(() => _isHovered = true),
onExit: (_) => setState(() => _isHovered = false),
child: Material(
return HoverBuilder(
builder: (context, hovered) => Material(
type: MaterialType.transparency,
child: InkWell(
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
onTap: widget.onTap,
onTap: onTap,
child: Container(
height: maxWidth,
width: maxWidth,
padding: EdgeInsets.all(padding),
decoration: BoxDecoration(
color: _isHovered
? widget.textColor.withAlpha(20)
color: hovered || selected
? textColor.withAlpha(20)
: Colors.transparent,
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
),
@ -56,10 +50,10 @@ class VocabAnalyticsListTileState extends State<VocabAnalyticsListTile> {
children: [
StreamBuilder(
stream: analyticsService.updateDispatcher
.lemmaUpdateStream(widget.constructId),
.lemmaUpdateStream(constructId),
builder: (context, snapshot) {
final emoji = snapshot.data?.emojis?.firstOrNull ??
widget.constructId.userSetEmoji;
constructId.userSetEmoji;
return Container(
alignment: Alignment.center,
@ -71,7 +65,7 @@ class VocabAnalyticsListTileState extends State<VocabAnalyticsListTile> {
fontSize: 22,
),
)
: widget.level.icon(36.0),
: level.icon(36.0),
);
},
),
@ -80,11 +74,11 @@ class VocabAnalyticsListTileState extends State<VocabAnalyticsListTile> {
padding: const EdgeInsets.only(top: 4),
height: (maxWidth - padding * 2) * 0.4,
child: ShrinkableText(
text: widget.constructId.lemma,
text: constructId.lemma,
maxWidth: maxWidth - padding * 2,
style: TextStyle(
fontSize: 16,
color: widget.textColor,
color: textColor,
),
),
),

View file

@ -10,8 +10,10 @@ import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
import 'package:fluffychat/pangea/analytics_details_popup/vocab_analytics_list_tile.dart';
import 'package:fluffychat/pangea/analytics_downloads/analytics_download_button.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/constructs/construct_level_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart';
@ -87,6 +89,20 @@ class VocabAnalyticsListView extends StatelessWidget {
filters.add(const DownloadAnalyticsButton());
}
final constructParam =
GoRouterState.of(context).pathParameters['construct'];
ConstructIdentifier? selectedConstruct;
if (constructParam != null) {
try {
selectedConstruct = ConstructIdentifier.fromJson(
jsonDecode(constructParam),
);
} catch (e) {
debugPrint("Invalid construct ID format in route: $constructParam");
}
}
return Column(
children: [
AnimatedContainer(
@ -188,8 +204,10 @@ class VocabAnalyticsListView extends StatelessWidget {
langCode: MatrixState.pangeaController
.userController.userL2Code!,
);
context.go(
"/rooms/analytics/${vocabItem.id.type.string}/${Uri.encodeComponent(jsonEncode(vocabItem.id.toJson()))}",
AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
view: ProgressIndicatorEnum.wordsUsed,
construct: vocabItem.id,
);
},
constructId: vocabItem.id,
@ -198,6 +216,7 @@ class VocabAnalyticsListView extends StatelessWidget {
? vocabItem.lemmaCategory.darkColor(context)
: vocabItem.lemmaCategory.color(context),
level: vocabItem.lemmaCategory,
selected: vocabItem.id == selectedConstruct,
);
},
childCount: _filteredVocab!.length,

View file

@ -0,0 +1,59 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/utils/adaptive_bottom_sheet.dart';
class AnalyticsNavigationUtil {
static Future<void> navigateToAnalytics({
required BuildContext context,
ProgressIndicatorEnum? view,
ConstructIdentifier? construct,
String? activityRoomId,
}) async {
if (view == null) {
context.go('/rooms/analytics');
return;
}
if (view == ProgressIndicatorEnum.activities) {
if (activityRoomId != null) {
context.go('/rooms/analytics/activities/$activityRoomId');
return;
}
context.go('/rooms/analytics/activities');
return;
}
if (construct == null ||
!{ProgressIndicatorEnum.wordsUsed, ProgressIndicatorEnum.morphsUsed}
.contains(view)) {
context.go("/rooms/analytics/${view.route}");
return;
}
final isColumnMode = FluffyThemes.isColumnMode(context);
if (isColumnMode) {
context.go(
'/rooms/analytics/${view.route}/${Uri.encodeComponent(jsonEncode(construct.toJson()))}',
);
return;
}
await showAdaptiveBottomSheet(
context: context,
builder: (context) {
return ConstructAnalyticsView(
view: view.constructType,
construct: construct,
);
},
);
}
}

View file

@ -1,3 +1,5 @@
import 'dart:math';
import 'package:fluffychat/pangea/analytics_misc/analytics_constants.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart';
@ -21,9 +23,12 @@ class ConstructUses {
// Total points for all uses of this lemma
int get points {
return uses.fold<int>(
0,
(total, use) => total + use.xp,
return min(
uses.fold<int>(
0,
(total, use) => total + use.xp,
),
AnalyticsConstants.xpForFlower,
);
}

View file

@ -33,19 +33,4 @@ enum LearningSkillsEnum {
return "";
}
}
String? description(BuildContext context) {
switch (this) {
case LearningSkillsEnum.reading:
return L10n.of(context).readingAnalyticsDesc;
case LearningSkillsEnum.hearing:
return L10n.of(context).audioAnalyticsDesc;
case LearningSkillsEnum.speaking:
return L10n.of(context).speakingAnalyticsDesc;
case LearningSkillsEnum.writing:
return L10n.of(context).writingAnalyticsDesc;
default:
return null;
}
}
}

View file

@ -1,11 +1,9 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/analytics_details_popup/vocab_analytics_list_tile.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
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/constructs/construct_identifier.dart';
@ -49,8 +47,10 @@ mixin LemmaEmojiSetter {
textColor: Theme.of(context).colorScheme.surface,
onTap: () {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
context.go(
"/rooms/analytics/${constructId.type.name}/${Uri.encodeComponent(jsonEncode(constructId.toJson()))}",
AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
view: constructId.type.indicator,
construct: constructId,
);
},
),

View file

@ -1,9 +1,8 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
class MessageAnalyticsFeedback extends StatefulWidget {
@ -127,7 +126,8 @@ class MessageAnalyticsFeedbackState extends State<MessageAnalyticsFeedback>
return Material(
type: MaterialType.transparency,
child: InkWell(
onTap: () => context.go("/rooms/analytics"),
onTap: () =>
AnalyticsNavigationUtil.navigateToAnalytics(context: context),
child: ScaleTransition(
scale: _bubbleScaleAnimation,
alignment: Alignment.bottomRight,
@ -195,7 +195,10 @@ class _NewConstructsBadge extends StatelessWidget {
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () => context.go("/rooms/analytics/${type.string}"),
onTap: () => AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
view: type.indicator,
),
child: Tooltip(
message: tooltip,
child: AnimatedBuilder(

View file

@ -6,8 +6,11 @@ import 'package:matrix/matrix.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
import 'package:fluffychat/pangea/analytics_misc/client_analytics_extension.dart';
import 'package:fluffychat/pangea/analytics_misc/saved_analytics_extension.dart';
import 'package:fluffychat/pangea/analytics_summary/learning_progress_indicators.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart';
import 'package:fluffychat/widgets/hover_builder.dart';
@ -17,36 +20,52 @@ import '../../config/themes.dart';
import '../../widgets/avatar.dart';
class ActivityArchive extends StatelessWidget {
final String? selectedRoomId;
const ActivityArchive({
super.key,
this.selectedRoomId,
});
@override
Widget build(BuildContext context) {
final Room? analyticsRoom = Matrix.of(context).client.analyticsRoomLocal();
final archive = analyticsRoom?.archivedActivities ?? [];
return MaxWidthBody(
withScrolling: false,
child: ListView.builder(
physics: const ClampingScrollPhysics(),
itemCount: archive.length + 1,
itemBuilder: (BuildContext context, int i) {
if (i == 0) {
return InstructionsInlineTooltip(
instructionsEnum: archive.isEmpty
? InstructionsEnum.noSavedActivitiesYet
: InstructionsEnum.activityAnalyticsList,
padding: const EdgeInsets.all(8.0),
);
}
i--;
return AnalyticsActivityItem(
room: archive[i],
selected: archive[i].id == selectedRoomId,
);
},
final selectedRoomId = GoRouterState.of(context).pathParameters['roomid'];
return Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsetsGeometry.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const LearningProgressIndicators(
selected: ProgressIndicatorEnum.activities,
),
Expanded(
child: MaxWidthBody(
withScrolling: false,
child: ListView.builder(
physics: const ClampingScrollPhysics(),
itemCount: archive.length + 1,
itemBuilder: (BuildContext context, int i) {
if (i == 0) {
return InstructionsInlineTooltip(
instructionsEnum: archive.isEmpty
? InstructionsEnum.noSavedActivitiesYet
: InstructionsEnum.activityAnalyticsList,
padding: const EdgeInsets.all(8.0),
);
}
i--;
return AnalyticsActivityItem(
room: archive[i],
selected: archive[i].id == selectedRoomId,
);
},
),
),
),
],
),
),
),
);
}
@ -113,9 +132,13 @@ class AnalyticsActivityItem extends StatelessWidget {
),
)
: null,
onTap: () => context.go(
'/rooms/analytics/activities/${room.id}',
),
onTap: () {
AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
view: ProgressIndicatorEnum.activities,
activityRoomId: room.id,
);
},
),
),
);

View file

@ -1,141 +0,0 @@
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:go_router/go_router.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_page/activity_archive.dart';
import 'package:fluffychat/pangea/analytics_page/analytics_page_constants.dart';
import 'package:fluffychat/pangea/analytics_summary/learning_progress_indicators.dart';
import 'package:fluffychat/pangea/analytics_summary/level_analytics_details_content.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
import 'package:fluffychat/widgets/matrix.dart';
class AnalyticsPage extends StatefulWidget {
final ProgressIndicatorEnum? indicator;
final ConstructIdentifier? construct;
final bool isSidebar;
const AnalyticsPage({
super.key,
this.indicator,
this.construct,
this.isSidebar = false,
});
@override
AnalyticsPageState createState() => AnalyticsPageState();
}
class AnalyticsPageState extends State<AnalyticsPage> {
@override
void initState() {
super.initState();
MatrixState.pangeaController.initControllers();
}
Future<void> _blockLemma() async {
final resp = await showOkCancelAlertDialog(
context: context,
title: L10n.of(context).areYouSure,
message: L10n.of(context).blockLemmaConfirmation,
isDestructive: true,
);
if (resp != OkCancelResult.ok) return;
final res = await showFutureLoadingDialog(
context: context,
future: () => Matrix.of(context)
.analyticsDataService
.updateService
.blockConstruct(widget.construct!),
);
if (!res.isError) {
context.go("/rooms/analytics/${ConstructTypeEnum.vocab.name}");
}
}
@override
Widget build(BuildContext context) {
final analyticsRoomId = GoRouterState.of(context).pathParameters['roomid'];
return Scaffold(
appBar: widget.construct != null
? AppBar(
actions: widget.indicator == ProgressIndicatorEnum.wordsUsed
? [
IconButton(
icon: const Icon(Icons.delete_forever_outlined),
color: Theme.of(context).colorScheme.error,
tooltip: L10n.of(context).delete,
onPressed: _blockLemma,
),
]
: null,
)
: null,
body: SafeArea(
child: Padding(
padding: const EdgeInsetsGeometry.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (widget.isSidebar ||
(!FluffyThemes.isColumnMode(context) &&
widget.construct == null))
LearningProgressIndicators(
selected: widget.indicator,
canSelect: widget.indicator != ProgressIndicatorEnum.level,
),
Expanded(
child: () {
if (widget.indicator == ProgressIndicatorEnum.level) {
return const LevelAnalyticsDetailsContent();
} else if (widget.indicator ==
ProgressIndicatorEnum.morphsUsed) {
return ConstructAnalyticsView(
construct: widget.construct,
view: ConstructTypeEnum.morph,
);
} else if (widget.indicator ==
ProgressIndicatorEnum.wordsUsed) {
return ConstructAnalyticsView(
construct: widget.construct,
view: ConstructTypeEnum.vocab,
);
} else if (widget.indicator ==
ProgressIndicatorEnum.activities) {
return ActivityArchive(
selectedRoomId: analyticsRoomId,
);
}
return Center(
child: SizedBox(
width: 250.0,
child: CachedNetworkImage(
imageUrl:
"${AppConfig.assetsBaseURL}/${AnalyticsPageConstants.dinoBotFileName}",
errorWidget: (context, url, error) => const SizedBox(),
placeholder: (context, url) => const Center(
child: CircularProgressIndicator.adaptive(),
),
),
),
);
}(),
),
],
),
),
),
);
}
}

View file

@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/analytics_page/analytics_page_constants.dart';
class EmptyAnalyticsPage extends StatelessWidget {
const EmptyAnalyticsPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Center(
child: SizedBox(
width: 250.0,
child: CachedNetworkImage(
imageUrl:
"${AppConfig.assetsBaseURL}/${AnalyticsPageConstants.dinoBotFileName}",
errorWidget: (context, url, error) => const SizedBox(),
placeholder: (context, url) => const Center(
child: CircularProgressIndicator.adaptive(),
),
),
),
),
),
);
}
}

View file

@ -1,8 +1,7 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
import 'package:fluffychat/pangea/analytics_misc/client_analytics_extension.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/saved_analytics_extension.dart';
@ -70,8 +69,10 @@ class LearningProgressIndicators extends StatelessWidget {
(c) => HoverButton(
selected: selected == c.indicator,
onPressed: () {
context.go(
"/rooms/analytics/${c.string}",
AnalyticsNavigationUtil
.navigateToAnalytics(
context: context,
view: c.indicator,
);
},
child: ProgressIndicatorBadge(
@ -85,8 +86,9 @@ class LearningProgressIndicators extends StatelessWidget {
selected: selected ==
ProgressIndicatorEnum.activities,
onPressed: () {
context.go(
"/rooms/analytics/activities",
AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
view: ProgressIndicatorEnum.activities,
);
},
child: Tooltip(
@ -181,7 +183,11 @@ class LearningProgressIndicators extends StatelessWidget {
child: GestureDetector(
onTap: canSelect
? () {
context.go("/rooms/analytics/level");
AnalyticsNavigationUtil
.navigateToAnalytics(
context: context,
view: ProgressIndicatorEnum.level,
);
}
: null,
child: FutureBuilder(

View file

@ -5,6 +5,8 @@ import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
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_summary/learning_progress_indicators.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart';
import 'package:fluffychat/pangea/morphs/get_grammar_copy.dart';
@ -20,127 +22,137 @@ class LevelAnalyticsDetailsContent extends StatelessWidget {
final isColumnMode = FluffyThemes.isColumnMode(context);
final analyticsService = Matrix.of(context).analyticsDataService;
return StreamBuilder(
stream: analyticsService.updateDispatcher.constructUpdateStream.stream,
builder: (context, _) {
return Scaffold(
appBar: AppBar(
titleSpacing: 0,
automaticallyImplyLeading: false,
title: FutureBuilder(
future: analyticsService.derivedData,
builder: (context, snapshot) {
final totalXP = snapshot.data?.totalXP ?? 0;
final maxLevelXP = snapshot.data?.minXPForNextLevel ?? 0;
final level = snapshot.data?.level ?? 0;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"${L10n.of(context).levelShort(level)}",
style: TextStyle(
fontSize: isColumnMode ? 24 : 16,
fontWeight: FontWeight.w900,
color: AppConfig.gold,
),
),
Text(
L10n.of(context).xpIntoLevel(totalXP, maxLevelXP),
style: TextStyle(
fontSize: isColumnMode ? 24 : 16,
fontWeight: FontWeight.w900,
color: AppConfig.gold,
),
),
],
),
);
},
),
),
body: FutureBuilder(
future: analyticsService.getUses(count: 100),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const Center(
child: CircularProgressIndicator.adaptive(),
);
}
final uses = snapshot.data!;
return Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsetsGeometry.all(16.0),
child: StreamBuilder(
stream:
analyticsService.updateDispatcher.constructUpdateStream.stream,
builder: (context, _) {
return Column(
children: [
Expanded(
child: ListView.builder(
itemCount: uses.length + 1,
itemBuilder: (context, index) {
if (index == 0) {
return const InstructionsInlineTooltip(
instructionsEnum: InstructionsEnum.levelAnalytics,
padding: EdgeInsets.symmetric(vertical: 16.0),
);
}
index--;
const LearningProgressIndicators(
selected: ProgressIndicatorEnum.level,
canSelect: false,
),
FutureBuilder(
future: analyticsService.derivedData,
builder: (context, snapshot) {
if (snapshot.data == null) {
return const SizedBox();
}
final use = uses[index];
String lemmaCopy = use.lemma;
if (use.constructType == ConstructTypeEnum.morph) {
lemmaCopy = getGrammarCopy(
category: use.category,
lemma: use.lemma,
context: context,
) ??
use.lemma;
}
return Padding(
padding: const EdgeInsets.symmetric(
vertical: 12,
horizontal: 16,
),
child: IntrinsicHeight(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.centerLeft,
child: Container(
width: 40,
alignment: Alignment.centerLeft,
child: Icon(use.useType.icon),
),
),
const SizedBox(width: 10),
Expanded(
child: Text(
"\"$lemmaCopy\" - ${use.useType.description(context)}",
style: const TextStyle(fontSize: 14),
),
),
Container(
alignment: Alignment.topRight,
width: 60,
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
"${use.xp > 0 ? '+' : ''}${use.xp}",
style: TextStyle(
fontWeight: FontWeight.w900,
fontSize: 14,
height: 1,
color: use.pointValueColor(context),
),
),
],
),
),
],
final totalXP = snapshot.data!.totalXP;
final maxLevelXP = snapshot.data!.minXPForNextLevel;
final level = snapshot.data!.level;
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"${L10n.of(context).levelShort(level)}",
style: TextStyle(
fontSize: isColumnMode ? 24 : 16,
fontWeight: FontWeight.w900,
color: AppConfig.gold,
),
),
Text(
L10n.of(context).xpIntoLevel(totalXP, maxLevelXP),
style: TextStyle(
fontSize: isColumnMode ? 24 : 16,
fontWeight: FontWeight.w900,
color: AppConfig.gold,
),
),
],
);
},
),
Expanded(
child: FutureBuilder(
future: analyticsService.getUses(count: 100),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const Center(
child: CircularProgressIndicator.adaptive(),
);
}
final uses = snapshot.data!;
return ListView.builder(
itemCount: uses.length + 1,
itemBuilder: (context, index) {
if (index == 0) {
return const InstructionsInlineTooltip(
instructionsEnum:
InstructionsEnum.levelAnalytics,
padding: EdgeInsets.symmetric(vertical: 16.0),
);
}
index--;
final use = uses[index];
String lemmaCopy = use.lemma;
if (use.constructType == ConstructTypeEnum.morph) {
lemmaCopy = getGrammarCopy(
category: use.category,
lemma: use.lemma,
context: context,
) ??
use.lemma;
}
return Padding(
padding: const EdgeInsets.symmetric(
vertical: 12,
horizontal: 16,
),
child: IntrinsicHeight(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.centerLeft,
child: Container(
width: 40,
alignment: Alignment.centerLeft,
child: Icon(use.useType.icon),
),
),
const SizedBox(width: 10),
Expanded(
child: Text(
"\"$lemmaCopy\" - ${use.useType.description(context)}",
style: const TextStyle(fontSize: 14),
),
),
Container(
alignment: Alignment.topRight,
width: 60,
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
"${use.xp > 0 ? '+' : ''}${use.xp}",
style: TextStyle(
fontWeight: FontWeight.w900,
fontSize: 14,
height: 1,
color:
use.pointValueColor(context),
),
),
],
),
),
],
),
),
);
},
);
},
),
@ -149,8 +161,8 @@ class LevelAnalyticsDetailsContent extends StatelessWidget {
);
},
),
);
},
),
),
);
}
}

View file

@ -69,4 +69,17 @@ enum ProgressIndicatorEnum {
return ConstructTypeEnum.vocab;
}
}
String get route {
switch (this) {
case level:
return 'level';
case wordsUsed:
return ConstructTypeEnum.vocab.name;
case morphsUsed:
return ConstructTypeEnum.morph.name;
case activities:
return 'activities';
}
}
}

View file

@ -1,16 +1,14 @@
// ignore_for_file: depend_on_referenced_packages, implementation_imports
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/chat/widgets/icon_rain.dart';
import 'package:fluffychat/pangea/common/utils/overlay.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
@ -168,8 +166,10 @@ class ConstructNotificationOverlayState
}
void _showDetails() {
context.go(
"/rooms/analytics/${ConstructTypeEnum.morph.string}/${Uri.encodeComponent(jsonEncode(widget.construct.toJson()))}",
AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
view: ProgressIndicatorEnum.morphsUsed,
construct: widget.construct,
);
}

View file

@ -7,9 +7,10 @@ import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pages/chat_list/chat_list.dart';
import 'package:fluffychat/pages/settings/settings.dart';
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
import 'package:fluffychat/pangea/analytics_page/analytics_page.dart';
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
import 'package:fluffychat/pangea/analytics_page/activity_archive.dart';
import 'package:fluffychat/pangea/analytics_summary/level_analytics_details_content.dart';
import 'package:fluffychat/pangea/spaces/space_constants.dart';
import 'package:fluffychat/widgets/navigation_rail.dart';
@ -113,21 +114,14 @@ class _MainView extends StatelessWidget {
}
if (path.contains("analytics")) {
ProgressIndicatorEnum indicator = ProgressIndicatorEnum.wordsUsed;
if (path.contains("analytics/level")) {
indicator = ProgressIndicatorEnum.level;
} else if (path.contains("analytics/${ConstructTypeEnum.morph.string}")) {
indicator = ProgressIndicatorEnum.morphsUsed;
} else if (path.contains("analytics/${ConstructTypeEnum.vocab.string}")) {
indicator = ProgressIndicatorEnum.wordsUsed;
return const LevelAnalyticsDetailsContent();
} else if (path.contains("analytics/activities")) {
indicator = ProgressIndicatorEnum.activities;
return const ActivityArchive();
} else if (path.contains("analytics/${ConstructTypeEnum.morph.string}")) {
return const ConstructAnalyticsView(view: ConstructTypeEnum.morph);
}
return AnalyticsPage(
indicator: indicator,
isSidebar: true,
);
return const ConstructAnalyticsView(view: ConstructTypeEnum.vocab);
}
if (path.contains("settings")) {

View file

@ -7,6 +7,7 @@ import 'package:matrix/matrix.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat_list/navi_rail_item.dart';
import 'package:fluffychat/pangea/analytics_misc/analytics_navigation_util.dart';
import 'package:fluffychat/pangea/chat_list/utils/chat_list_handle_space_tap.dart';
import 'package:fluffychat/pangea/course_plans/map_clipper.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
@ -92,7 +93,9 @@ class SpacesNavigationRail extends StatelessWidget {
return NaviRailItem(
isSelected: isAnalytics,
onTap: () {
context.go("/rooms/analytics");
AnalyticsNavigationUtil.navigateToAnalytics(
context: context,
);
},
backgroundColor: Colors.transparent,
icon: FutureBuilder<Profile>(