From 40c4045f865204f87f95896e62de47cf7cca879b Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Fri, 7 Jun 2024 22:17:48 -0400 Subject: [PATCH 01/54] fixes for exiting IT and editing original message --- .../controllers/it_controller.dart | 23 ++++++++++++++----- lib/pangea/choreographer/widgets/it_bar.dart | 7 +++++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/pangea/choreographer/controllers/it_controller.dart b/lib/pangea/choreographer/controllers/it_controller.dart index 6d5f8e347..91899a71a 100644 --- a/lib/pangea/choreographer/controllers/it_controller.dart +++ b/lib/pangea/choreographer/controllers/it_controller.dart @@ -61,11 +61,9 @@ class ITController { } void closeIT() { - //if they close it before choosing anything, just put their text back + //if they close it before completing, just put their text back //PTODO - explore using last itStep - if (choreographer.currentText.isEmpty) { - choreographer.textController.text = sourceText ?? ""; - } + choreographer.textController.text = sourceText ?? ""; clear(); } @@ -217,8 +215,20 @@ class ITController { Future onEditSourceTextSubmit(String newSourceText) async { try { - sourceText = newSourceText; + + _isOpen = true; _isEditingSourceText = false; + _itStartData = ITStartData(newSourceText, choreographer.l1LangCode); + completedITSteps = []; + currentITStep = null; + nextITStep = null; + goldRouteTracker = GoldRouteTracker.defaultTracker; + payLoadIds = []; + + _setSourceText(); + getTranslationData(false); + + /*sourceText = newSourceText; final String currentText = choreographer.currentText; choreographer.startLoading(); @@ -241,7 +251,7 @@ class ITController { storedGoldContinuances: goldRouteTracker.continuances, ); - _addPayloadId(responses[1]); + _addPayloadId(responses[1]);*/ } catch (err, stack) { debugger(when: kDebugMode); if (err is! http.Response) { @@ -252,6 +262,7 @@ class ITController { ); } finally { choreographer.stopLoading(); + choreographer.textController.text = ""; } } diff --git a/lib/pangea/choreographer/widgets/it_bar.dart b/lib/pangea/choreographer/widgets/it_bar.dart index 4e26cba58..013c7238b 100644 --- a/lib/pangea/choreographer/widgets/it_bar.dart +++ b/lib/pangea/choreographer/widgets/it_bar.dart @@ -184,7 +184,12 @@ class OriginalText extends StatelessWidget { ), ), ), - if (!controller.isEditingSourceText && controller.sourceText != null) + if ( + !controller.isEditingSourceText + && controller.sourceText != null + && controller.completedITSteps.length + < controller.goldRouteTracker.continuances.length + ) IconButton( onPressed: () => controller.setIsEditingSourceText(true), icon: const Icon(Icons.edit_outlined), From f7753a0477ddf3303c9e10071396fe93475df82c Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Sat, 8 Jun 2024 22:55:36 -0400 Subject: [PATCH 02/54] ITController Animates in --- .../controllers/it_controller.dart | 5 + lib/pangea/choreographer/widgets/it_bar.dart | 165 ++++++++++-------- 2 files changed, 95 insertions(+), 75 deletions(-) diff --git a/lib/pangea/choreographer/controllers/it_controller.dart b/lib/pangea/choreographer/controllers/it_controller.dart index 91899a71a..f29bb59b2 100644 --- a/lib/pangea/choreographer/controllers/it_controller.dart +++ b/lib/pangea/choreographer/controllers/it_controller.dart @@ -21,6 +21,7 @@ class ITController { Choreographer choreographer; bool _isOpen = false; + bool _willOpen = false; bool _isEditingSourceText = false; bool showChoiceFeedback = false; @@ -36,6 +37,7 @@ class ITController { void clear() { _isOpen = false; + _willOpen = false; showChoiceFeedback = false; _isEditingSourceText = false; @@ -54,6 +56,7 @@ class ITController { } Future initializeIT(ITStartData itStartData) async { + _willOpen = true; Future.delayed(const Duration(microseconds: 100), () { _isOpen = true; }); @@ -347,6 +350,8 @@ class ITController { bool get isOpen => _isOpen; + bool get willOpen => _willOpen; + String get targetLangCode => choreographer.l2LangCode!; String get sourceLangCode => choreographer.l1LangCode!; diff --git a/lib/pangea/choreographer/widgets/it_bar.dart b/lib/pangea/choreographer/widgets/it_bar.dart index 013c7238b..068d99166 100644 --- a/lib/pangea/choreographer/widgets/it_bar.dart +++ b/lib/pangea/choreographer/widgets/it_bar.dart @@ -7,6 +7,7 @@ import 'package:fluffychat/pangea/choreographer/widgets/it_feedback_card.dart'; import 'package:fluffychat/pangea/choreographer/widgets/translation_finished_flow.dart'; import 'package:fluffychat/pangea/constants/choreo_constants.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -21,93 +22,107 @@ class ITBar extends StatelessWidget { final Choreographer choreographer; const ITBar({super.key, required this.choreographer}); - ITController get controller => choreographer.itController; + ITController get itController => choreographer.itController; @override Widget build(BuildContext context) { - if (!controller.isOpen) return const SizedBox(); - return CompositedTransformTarget( - link: choreographer.itBarLinkAndKey.link, - child: Container( - key: choreographer.itBarLinkAndKey.key, - decoration: BoxDecoration( - color: Theme.of(context).brightness == Brightness.light - ? Colors.white - : Colors.black, - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(AppConfig.borderRadius), - topRight: Radius.circular(AppConfig.borderRadius), - ), - ), - width: double.infinity, - padding: const EdgeInsets.fromLTRB(0, 3, 3, 3), - child: Stack( - children: [ - SingleChildScrollView( - child: Column( + return AnimatedSize( + duration: itController.willOpen + ? const Duration(milliseconds: 2000) + : const Duration(milliseconds: 500), + curve: Curves.fastOutSlowIn, + clipBehavior: Clip.none, + child: !itController.willOpen + ? const SizedBox() + : CompositedTransformTarget( + link: choreographer.itBarLinkAndKey.link, + child: AnimatedOpacity( + duration: itController.willOpen + ? const Duration(milliseconds: 2000) + : const Duration(milliseconds: 500), + opacity: itController.willOpen ? 1.0 : 0.0, + child: Container( + key: choreographer.itBarLinkAndKey.key, + decoration: BoxDecoration( + color: Theme.of(context).brightness == Brightness.light + ? Colors.white + : Colors.black, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(AppConfig.borderRadius), + topRight: Radius.circular(AppConfig.borderRadius), + ), + ), + width: double.infinity, + padding: const EdgeInsets.fromLTRB(0, 3, 3, 3), + child: Stack( children: [ - // Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // // Row( - // // mainAxisAlignment: MainAxisAlignment.start, - // // crossAxisAlignment: CrossAxisAlignment.start, - // // children: [ - // // CounterDisplay( - // // correct: controller.correctChoices, - // // custom: controller.customChoices, - // // incorrect: controller.incorrectChoices, - // // yellow: controller.wildcardChoices, - // // ), - // // CompositedTransformTarget( - // // link: choreographer.itBotLayerLinkAndKey.link, - // // child: ITBotButton( - // // key: choreographer.itBotLayerLinkAndKey.key, - // // choreographer: choreographer, - // // ), - // // ), - // // ], - // // ), - // ITCloseButton(choreographer: choreographer), - // ], - // ), - // const SizedBox(height: 40.0), - OriginalText(controller: controller), - const SizedBox(height: 7.0), - IntrinsicHeight( - child: Container( - constraints: const BoxConstraints(minHeight: 80), - width: double.infinity, - padding: const EdgeInsets.symmetric(horizontal: 4.0), - child: Center( - child: controller.choreographer.errorService.isError - ? ITError( - error: controller + SingleChildScrollView( + child: Column( + children: [ + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // // Row( + // // mainAxisAlignment: MainAxisAlignment.start, + // // crossAxisAlignment: CrossAxisAlignment.start, + // // children: [ + // // CounterDisplay( + // // correct: controller.correctChoices, + // // custom: controller.customChoices, + // // incorrect: controller.incorrectChoices, + // // yellow: controller.wildcardChoices, + // // ), + // // CompositedTransformTarget( + // // link: choreographer.itBotLayerLinkAndKey.link, + // // child: ITBotButton( + // // key: choreographer.itBotLayerLinkAndKey.key, + // // choreographer: choreographer, + // // ), + // // ), + // // ], + // // ), + // ITCloseButton(choreographer: choreographer), + // ], + // ), + // const SizedBox(height: 40.0), + OriginalText(controller: itController), + const SizedBox(height: 7.0), + IntrinsicHeight( + child: Container( + constraints: const BoxConstraints(minHeight: 80), + width: double.infinity, + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Center( + child: itController.choreographer.errorService.isError + ? ITError( + error: itController .choreographer.errorService.error!, - controller: controller, + controller: itController, ) - : controller.showChoiceFeedback - ? ChoiceFeedbackText(controller: controller) - : controller.isTranslationDone - ? TranslationFeedback( - controller: controller, - ) - : ITChoices(controller: controller), - ), + : itController.showChoiceFeedback + ? ChoiceFeedbackText(controller: itController) + : itController.isTranslationDone + ? TranslationFeedback( + controller: itController, + ) + : ITChoices(controller: itController), + ), + ), + ), + ], ), ), + Positioned( + top: 0.0, + right: 0.0, + child: ITCloseButton(choreographer: choreographer), + ), ], ), ), - Positioned( - top: 0.0, - right: 0.0, - child: ITCloseButton(choreographer: choreographer), - ), - ], - ), + ), ), ); } From 5a5f18bd84cdbf8ed2e636d1d1c1e3fc664a4a42 Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:21:35 -0400 Subject: [PATCH 03/54] Auto Play Interactive Translator --- assets/l10n/intl_en.arb | 12 ++- assets/l10n/intl_es.arb | 13 ++- .../controllers/choreographer.dart | 5 + .../controllers/igc_controller.dart | 5 + lib/pangea/controllers/user_controller.dart | 9 ++ lib/pangea/models/class_model.dart | 5 + lib/pangea/models/user_model.dart | 3 + .../widgets/igc/pangea_text_controller.dart | 27 ++++-- needed-translations.txt | 94 +++++++++++++++++++ 9 files changed, 162 insertions(+), 11 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index fe2a3da03..7fceca29b 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -2514,6 +2514,16 @@ "type": "text", "placeholders": {} }, + "interactiveTranslatorAutoPlaySliderHeader": "Auto Play Interactive Translator", + "@interactiveTranslatorAutoPlaySliderHeader": { + "type": "text", + "placeholders": {} + }, + "interactiveTranslatorAutoPlayDesc": "Launches the interactive translator without asking.", + "@interactiveTranslatorAutoPlayDesc": { + "type": "text", + "placeholders": {} + }, "notYetSet": "Not yet set", "@notYetSet": { "type": "text", @@ -3964,4 +3974,4 @@ "roomDataMissing": "Some data may be missing from rooms in which you are not a member.", "updatePhoneOS": "You may need to update your device's OS version.", "wordsPerMinute": "Words per minute" -} \ No newline at end of file +} diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb index d463699be..3d652ac2a 100644 --- a/assets/l10n/intl_es.arb +++ b/assets/l10n/intl_es.arb @@ -3099,6 +3099,17 @@ "type": "text", "placeholders": {} }, + "interactiveTranslatorAutoPlaySliderHeader": "Traductora interactiva de reproducción automática", + "interactiveTranslatorAutoPlay": "Traductora interactiva de reproducción automática", + "@interactiveTranslatorAutoPlay": { + "type": "text", + "placeholders": {} + }, + "interactiveTranslatorAutoPlayDesc": "Inicia el traductor interactivo sin preguntar.", + "@interactiveTranslatorAutoPlayDesc": { + "type": "text", + "placeholders": {} + }, "grammarAssistance": "Asistencia gramatical", "@grammarAssistance": { "type": "text", @@ -4652,4 +4663,4 @@ "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel": "Reacción al envío del aviso de debate", "studentAnalyticsNotAvailable": "Datos de los estudiantes no disponibles actualmente", "roomDataMissing": "Es posible que falten algunos datos de las salas de las que no es miembro." -} \ No newline at end of file +} diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 3a26676c6..529ba95b4 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -513,6 +513,11 @@ class Choreographer { chatController.room, ); + bool get itAutoPlayEnabled => pangeaController.permissionsController.isToolEnabled( + ToolSetting.itAutoPlay, + chatController.room, + ); + bool get definitionsEnabled => pangeaController.permissionsController.isToolEnabled( ToolSetting.definitions, diff --git a/lib/pangea/choreographer/controllers/igc_controller.dart b/lib/pangea/choreographer/controllers/igc_controller.dart index 73694e257..6638afa3b 100644 --- a/lib/pangea/choreographer/controllers/igc_controller.dart +++ b/lib/pangea/choreographer/controllers/igc_controller.dart @@ -191,6 +191,11 @@ class IgcController { const int firstMatchIndex = 0; final PangeaMatch match = igcTextData!.matches[firstMatchIndex]; + if (match.isITStart && choreographer.itAutoPlayEnabled && igcTextData != null) { + choreographer.onITStart(igcTextData!.matches[firstMatchIndex]); + return; + } + OverlayUtil.showPositionedCard( context: context, cardToShow: SpanCard( diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index d3a17d365..0e336fdf6 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -126,6 +126,7 @@ class UserController extends BaseController { final bool? trial = migratedProfileInfo(MatrixProfile.activatedFreeTrial); final bool? interactiveTranslator = migratedProfileInfo(MatrixProfile.interactiveTranslator); + final bool? itAutoPlay = migratedProfileInfo(MatrixProfile.itAutoPlay); final bool? interactiveGrammar = migratedProfileInfo(MatrixProfile.interactiveGrammar); final bool? immersionMode = @@ -144,6 +145,7 @@ class UserController extends BaseController { autoPlayMessages: autoPlay, activatedFreeTrial: trial, interactiveTranslator: interactiveTranslator, + itAutoPlay: itAutoPlay, interactiveGrammar: interactiveGrammar, immersionMode: immersionMode, definitions: definitions, @@ -225,6 +227,7 @@ class UserController extends BaseController { bool? autoPlayMessages, bool? activatedFreeTrial, bool? interactiveTranslator, + bool? itAutoPlay, bool? interactiveGrammar, bool? immersionMode, bool? definitions, @@ -262,6 +265,12 @@ class UserController extends BaseController { interactiveTranslator, ); } + if (itAutoPlay != null) { + await _pangeaController.pStoreService.save( + MatrixProfile.itAutoPlay.title, + itAutoPlay, + ); + } if (interactiveGrammar != null) { await _pangeaController.pStoreService.save( MatrixProfile.interactiveGrammar.title, diff --git a/lib/pangea/models/class_model.dart b/lib/pangea/models/class_model.dart index 1f588980c..cf0cadedb 100644 --- a/lib/pangea/models/class_model.dart +++ b/lib/pangea/models/class_model.dart @@ -295,6 +295,7 @@ class PangeaRoomRules { enum ToolSetting { interactiveTranslator, + itAutoPlay, interactiveGrammar, immersionMode, definitions, @@ -306,6 +307,8 @@ extension SettingCopy on ToolSetting { switch (this) { case ToolSetting.interactiveTranslator: return L10n.of(context)!.interactiveTranslatorSliderHeader; + case ToolSetting.itAutoPlay: + return L10n.of(context)!.interactiveTranslatorAutoPlaySliderHeader; case ToolSetting.interactiveGrammar: return L10n.of(context)!.interactiveGrammarSliderHeader; case ToolSetting.immersionMode: @@ -324,6 +327,8 @@ extension SettingCopy on ToolSetting { return L10n.of(context)!.itToggleDescription; case ToolSetting.interactiveGrammar: return L10n.of(context)!.igcToggleDescription; + case ToolSetting.itAutoPlay: + return L10n.of(context)!.interactiveTranslatorAutoPlayDesc; case ToolSetting.immersionMode: return L10n.of(context)!.toggleImmersionModeDesc; case ToolSetting.definitions: diff --git a/lib/pangea/models/user_model.dart b/lib/pangea/models/user_model.dart index 2169c6f70..396bcaccb 100644 --- a/lib/pangea/models/user_model.dart +++ b/lib/pangea/models/user_model.dart @@ -56,6 +56,7 @@ enum MatrixProfile { autoPlayMessages, activatedFreeTrial, interactiveTranslator, + itAutoPlay, interactiveGrammar, immersionMode, definitions, @@ -81,6 +82,8 @@ extension MatrixProfileExtension on MatrixProfile { return PLocalKey.activatedTrialKey; case MatrixProfile.interactiveTranslator: return ToolSetting.interactiveTranslator.toString(); + case MatrixProfile.itAutoPlay: + return ToolSetting.itAutoPlay.toString(); case MatrixProfile.interactiveGrammar: return ToolSetting.interactiveGrammar.toString(); case MatrixProfile.immersionMode: diff --git a/lib/pangea/widgets/igc/pangea_text_controller.dart b/lib/pangea/widgets/igc/pangea_text_controller.dart index a40e2cc15..30551463b 100644 --- a/lib/pangea/widgets/igc/pangea_text_controller.dart +++ b/lib/pangea/widgets/igc/pangea_text_controller.dart @@ -96,15 +96,24 @@ class PangeaTextController extends TextEditingController { : null; if (cardToShow != null) { - OverlayUtil.showPositionedCard( - context: context, - cardSize: matchIndex != -1 && - choreographer.igc.igcTextData!.matches[matchIndex].isITStart - ? const Size(350, 220) - : const Size(350, 400), - cardToShow: cardToShow, - transformTargetId: choreographer.inputTransformTargetKey, - ); + if ( + choreographer.itAutoPlayEnabled && + choreographer.igc.igcTextData!.matches[matchIndex].isITStart + ) { + choreographer.onITStart( + choreographer.igc.igcTextData!.matches[matchIndex], + ); + } else { + OverlayUtil.showPositionedCard( + context: context, + cardSize: matchIndex != -1 && + choreographer.igc.igcTextData!.matches[matchIndex].isITStart + ? const Size(350, 220) + : const Size(350, 400), + cardToShow: cardToShow, + transformTargetId: choreographer.inputTransformTargetKey, + ); + } } } diff --git a/needed-translations.txt b/needed-translations.txt index bb967d011..2bf77fe82 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -51,6 +51,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -1430,6 +1432,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -2340,6 +2344,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -3240,6 +3246,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -4140,6 +4148,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -5040,6 +5050,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -5935,6 +5947,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -6787,6 +6801,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -7687,6 +7703,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -8579,6 +8597,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -9422,6 +9442,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -10273,6 +10295,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -11173,6 +11197,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -12073,6 +12099,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -12973,6 +13001,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -13865,6 +13895,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -14716,6 +14748,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -15616,6 +15650,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -16513,6 +16549,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -17403,6 +17441,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -18817,6 +18857,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -19727,6 +19769,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -20627,6 +20671,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -21523,6 +21569,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -22412,6 +22460,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -23312,6 +23362,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -24212,6 +24264,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -25112,6 +25166,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -26012,6 +26068,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -26912,6 +26970,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -27812,6 +27872,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -28712,6 +28774,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -29608,6 +29672,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -30481,6 +30547,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -31381,6 +31449,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -32273,6 +32343,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -33124,6 +33196,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -34024,6 +34098,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -34924,6 +35000,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -35820,6 +35898,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -36689,6 +36769,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -37589,6 +37671,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -38485,6 +38569,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -39366,6 +39452,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -40217,6 +40305,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -41109,6 +41199,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -41960,6 +42052,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", From 831080198131b53e06e92c883bef9e62cf3c8a2a Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:21:35 -0400 Subject: [PATCH 04/54] Auto Play Interactive Translator --- assets/l10n/intl_en.arb | 12 ++- assets/l10n/intl_es.arb | 13 ++- .../controllers/choreographer.dart | 5 + .../controllers/igc_controller.dart | 20 +++- lib/pangea/choreographer/widgets/it_bar.dart | 18 +++- lib/pangea/controllers/user_controller.dart | 9 ++ lib/pangea/models/class_model.dart | 5 + lib/pangea/models/user_model.dart | 3 + .../widgets/igc/pangea_text_controller.dart | 37 +++++--- lib/pangea/widgets/igc/span_card.dart | 44 +++++++++ needed-translations.txt | 94 +++++++++++++++++++ 11 files changed, 241 insertions(+), 19 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index fe2a3da03..7fceca29b 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -2514,6 +2514,16 @@ "type": "text", "placeholders": {} }, + "interactiveTranslatorAutoPlaySliderHeader": "Auto Play Interactive Translator", + "@interactiveTranslatorAutoPlaySliderHeader": { + "type": "text", + "placeholders": {} + }, + "interactiveTranslatorAutoPlayDesc": "Launches the interactive translator without asking.", + "@interactiveTranslatorAutoPlayDesc": { + "type": "text", + "placeholders": {} + }, "notYetSet": "Not yet set", "@notYetSet": { "type": "text", @@ -3964,4 +3974,4 @@ "roomDataMissing": "Some data may be missing from rooms in which you are not a member.", "updatePhoneOS": "You may need to update your device's OS version.", "wordsPerMinute": "Words per minute" -} \ No newline at end of file +} diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb index d463699be..3d652ac2a 100644 --- a/assets/l10n/intl_es.arb +++ b/assets/l10n/intl_es.arb @@ -3099,6 +3099,17 @@ "type": "text", "placeholders": {} }, + "interactiveTranslatorAutoPlaySliderHeader": "Traductora interactiva de reproducción automática", + "interactiveTranslatorAutoPlay": "Traductora interactiva de reproducción automática", + "@interactiveTranslatorAutoPlay": { + "type": "text", + "placeholders": {} + }, + "interactiveTranslatorAutoPlayDesc": "Inicia el traductor interactivo sin preguntar.", + "@interactiveTranslatorAutoPlayDesc": { + "type": "text", + "placeholders": {} + }, "grammarAssistance": "Asistencia gramatical", "@grammarAssistance": { "type": "text", @@ -4652,4 +4663,4 @@ "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel": "Reacción al envío del aviso de debate", "studentAnalyticsNotAvailable": "Datos de los estudiantes no disponibles actualmente", "roomDataMissing": "Es posible que falten algunos datos de las salas de las que no es miembro." -} \ No newline at end of file +} diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 3a26676c6..529ba95b4 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -513,6 +513,11 @@ class Choreographer { chatController.room, ); + bool get itAutoPlayEnabled => pangeaController.permissionsController.isToolEnabled( + ToolSetting.itAutoPlay, + chatController.room, + ); + bool get definitionsEnabled => pangeaController.permissionsController.isToolEnabled( ToolSetting.definitions, diff --git a/lib/pangea/choreographer/controllers/igc_controller.dart b/lib/pangea/choreographer/controllers/igc_controller.dart index 73694e257..07a0ac2a2 100644 --- a/lib/pangea/choreographer/controllers/igc_controller.dart +++ b/lib/pangea/choreographer/controllers/igc_controller.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; import 'package:fluffychat/pangea/choreographer/controllers/error_service.dart'; +import 'package:fluffychat/pangea/models/class_model.dart'; import 'package:fluffychat/pangea/models/igc_text_data_model.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart'; import 'package:fluffychat/pangea/models/span_data.dart'; @@ -29,6 +30,8 @@ class IgcController { IgcController(this.choreographer); + bool turnOnAutoPlay = false; + Future getIGCTextData({required bool tokensOnly}) async { try { if (choreographer.currentText.isEmpty) return clear(); @@ -191,6 +194,15 @@ class IgcController { const int firstMatchIndex = 0; final PangeaMatch match = igcTextData!.matches[firstMatchIndex]; + if ( + match.isITStart && + choreographer.itAutoPlayEnabled && + igcTextData != null + ) { + choreographer.onITStart(igcTextData!.matches[firstMatchIndex]); + return; + } + OverlayUtil.showPositionedCard( context: context, cardToShow: SpanCard( @@ -203,6 +215,12 @@ class IgcController { ), onITStart: () { if (choreographer.itEnabled && igcTextData != null) { + if (turnOnAutoPlay) { + choreographer.pangeaController.pStoreService.save( + ToolSetting.itAutoPlay.toString(), + true, + ); + } choreographer.onITStart(igcTextData!.matches[firstMatchIndex]); } }, @@ -210,7 +228,7 @@ class IgcController { ), roomId: choreographer.roomId, ), - cardSize: match.isITStart ? const Size(350, 220) : const Size(350, 400), + cardSize: match.isITStart ? const Size(350, 260) : const Size(350, 400), transformTargetId: choreographer.inputTransformTargetKey, ); } diff --git a/lib/pangea/choreographer/widgets/it_bar.dart b/lib/pangea/choreographer/widgets/it_bar.dart index 068d99166..2ba630900 100644 --- a/lib/pangea/choreographer/widgets/it_bar.dart +++ b/lib/pangea/choreographer/widgets/it_bar.dart @@ -202,12 +202,20 @@ class OriginalText extends StatelessWidget { if ( !controller.isEditingSourceText && controller.sourceText != null - && controller.completedITSteps.length - < controller.goldRouteTracker.continuances.length ) - IconButton( - onPressed: () => controller.setIsEditingSourceText(true), - icon: const Icon(Icons.edit_outlined), + AnimatedOpacity( + duration: const Duration(milliseconds: 500), + opacity: controller.nextITStep != null + ? 1.0 + : 0.0, + child: IconButton( + onPressed: () => { + if (controller.nextITStep != null) { + controller.setIsEditingSourceText(true), + }, + }, + icon: const Icon(Icons.edit_outlined), + ), ), ], ), diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index d3a17d365..0e336fdf6 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -126,6 +126,7 @@ class UserController extends BaseController { final bool? trial = migratedProfileInfo(MatrixProfile.activatedFreeTrial); final bool? interactiveTranslator = migratedProfileInfo(MatrixProfile.interactiveTranslator); + final bool? itAutoPlay = migratedProfileInfo(MatrixProfile.itAutoPlay); final bool? interactiveGrammar = migratedProfileInfo(MatrixProfile.interactiveGrammar); final bool? immersionMode = @@ -144,6 +145,7 @@ class UserController extends BaseController { autoPlayMessages: autoPlay, activatedFreeTrial: trial, interactiveTranslator: interactiveTranslator, + itAutoPlay: itAutoPlay, interactiveGrammar: interactiveGrammar, immersionMode: immersionMode, definitions: definitions, @@ -225,6 +227,7 @@ class UserController extends BaseController { bool? autoPlayMessages, bool? activatedFreeTrial, bool? interactiveTranslator, + bool? itAutoPlay, bool? interactiveGrammar, bool? immersionMode, bool? definitions, @@ -262,6 +265,12 @@ class UserController extends BaseController { interactiveTranslator, ); } + if (itAutoPlay != null) { + await _pangeaController.pStoreService.save( + MatrixProfile.itAutoPlay.title, + itAutoPlay, + ); + } if (interactiveGrammar != null) { await _pangeaController.pStoreService.save( MatrixProfile.interactiveGrammar.title, diff --git a/lib/pangea/models/class_model.dart b/lib/pangea/models/class_model.dart index 1f588980c..cf0cadedb 100644 --- a/lib/pangea/models/class_model.dart +++ b/lib/pangea/models/class_model.dart @@ -295,6 +295,7 @@ class PangeaRoomRules { enum ToolSetting { interactiveTranslator, + itAutoPlay, interactiveGrammar, immersionMode, definitions, @@ -306,6 +307,8 @@ extension SettingCopy on ToolSetting { switch (this) { case ToolSetting.interactiveTranslator: return L10n.of(context)!.interactiveTranslatorSliderHeader; + case ToolSetting.itAutoPlay: + return L10n.of(context)!.interactiveTranslatorAutoPlaySliderHeader; case ToolSetting.interactiveGrammar: return L10n.of(context)!.interactiveGrammarSliderHeader; case ToolSetting.immersionMode: @@ -324,6 +327,8 @@ extension SettingCopy on ToolSetting { return L10n.of(context)!.itToggleDescription; case ToolSetting.interactiveGrammar: return L10n.of(context)!.igcToggleDescription; + case ToolSetting.itAutoPlay: + return L10n.of(context)!.interactiveTranslatorAutoPlayDesc; case ToolSetting.immersionMode: return L10n.of(context)!.toggleImmersionModeDesc; case ToolSetting.definitions: diff --git a/lib/pangea/models/user_model.dart b/lib/pangea/models/user_model.dart index 2169c6f70..396bcaccb 100644 --- a/lib/pangea/models/user_model.dart +++ b/lib/pangea/models/user_model.dart @@ -56,6 +56,7 @@ enum MatrixProfile { autoPlayMessages, activatedFreeTrial, interactiveTranslator, + itAutoPlay, interactiveGrammar, immersionMode, definitions, @@ -81,6 +82,8 @@ extension MatrixProfileExtension on MatrixProfile { return PLocalKey.activatedTrialKey; case MatrixProfile.interactiveTranslator: return ToolSetting.interactiveTranslator.toString(); + case MatrixProfile.itAutoPlay: + return ToolSetting.itAutoPlay.toString(); case MatrixProfile.interactiveGrammar: return ToolSetting.interactiveGrammar.toString(); case MatrixProfile.immersionMode: diff --git a/lib/pangea/widgets/igc/pangea_text_controller.dart b/lib/pangea/widgets/igc/pangea_text_controller.dart index a40e2cc15..c476ccca0 100644 --- a/lib/pangea/widgets/igc/pangea_text_controller.dart +++ b/lib/pangea/widgets/igc/pangea_text_controller.dart @@ -82,9 +82,15 @@ class PangeaTextController extends TextEditingController { debugPrint("onSentenceRewrite $tokenIndex $sentenceRewrite"); }), onIgnore: () => choreographer.onIgnoreMatch( - cursorOffset: selection.baseOffset, - ), + cursorOffset: selection.baseOffset, + ), onITStart: () { + if (choreographer.igc.turnOnAutoPlay) { + choreographer.pangeaController.pStoreService.save( + 'ToolSetting.itAutoPlay', + true, + ); + } choreographer.onITStart( choreographer.igc.igcTextData!.matches[matchIndex], ); @@ -96,15 +102,24 @@ class PangeaTextController extends TextEditingController { : null; if (cardToShow != null) { - OverlayUtil.showPositionedCard( - context: context, - cardSize: matchIndex != -1 && - choreographer.igc.igcTextData!.matches[matchIndex].isITStart - ? const Size(350, 220) - : const Size(350, 400), - cardToShow: cardToShow, - transformTargetId: choreographer.inputTransformTargetKey, - ); + if ( + choreographer.itAutoPlayEnabled && + choreographer.igc.igcTextData!.matches[matchIndex].isITStart + ) { + choreographer.onITStart( + choreographer.igc.igcTextData!.matches[matchIndex], + ); + } else { + OverlayUtil.showPositionedCard( + context: context, + cardSize: matchIndex != -1 && + choreographer.igc.igcTextData!.matches[matchIndex].isITStart + ? const Size(350, 260) + : const Size(350, 400), + cardToShow: cardToShow, + transformTargetId: choreographer.inputTransformTargetKey, + ); + } } } diff --git a/lib/pangea/widgets/igc/span_card.dart b/lib/pangea/widgets/igc/span_card.dart index fd44383a0..52901bfa2 100644 --- a/lib/pangea/widgets/igc/span_card.dart +++ b/lib/pangea/widgets/igc/span_card.dart @@ -281,6 +281,13 @@ class WordMatchContent extends StatelessWidget { ), ], ), + if (controller.widget.scm.pangeaMatch!.isITStart) + DontShowSwitchListTile( + value: controller.widget.scm.choreographer.igc.turnOnAutoPlay, + onChanged: ((value) { + controller.widget.scm.choreographer.igc.turnOnAutoPlay = value; + }), + ), ], ); } on Exception catch (e) { @@ -419,3 +426,40 @@ class StartITButton extends StatelessWidget { ); } } + +class DontShowSwitchListTile extends StatefulWidget { + final bool value; + final ValueChanged onChanged; + + const DontShowSwitchListTile({ + super.key, + required this.value, + required this.onChanged, + }); + + @override + DontShowSwitchListTileState createState() => DontShowSwitchListTileState(); +} + +class DontShowSwitchListTileState extends State { + bool switchValue = false; + + @override + void initState() { + super.initState(); + switchValue = widget.value; + } + + @override + Widget build(BuildContext context) { + return SwitchListTile.adaptive( + activeColor: AppConfig.activeToggleColor, + title: Text(L10n.of(context)!.interactiveTranslatorAutoPlaySliderHeader), + value: switchValue, + onChanged: (value) => { + widget.onChanged(value), + setState(() => switchValue = value), + }, + ); + } +} diff --git a/needed-translations.txt b/needed-translations.txt index bb967d011..2bf77fe82 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -51,6 +51,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -1430,6 +1432,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -2340,6 +2344,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -3240,6 +3246,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -4140,6 +4148,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -5040,6 +5050,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -5935,6 +5947,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -6787,6 +6801,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -7687,6 +7703,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -8579,6 +8597,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -9422,6 +9442,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -10273,6 +10295,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -11173,6 +11197,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -12073,6 +12099,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -12973,6 +13001,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -13865,6 +13895,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -14716,6 +14748,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -15616,6 +15650,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -16513,6 +16549,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -17403,6 +17441,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -18817,6 +18857,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -19727,6 +19769,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -20627,6 +20671,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -21523,6 +21569,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -22412,6 +22460,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -23312,6 +23362,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -24212,6 +24264,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -25112,6 +25166,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -26012,6 +26068,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -26912,6 +26970,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -27812,6 +27872,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -28712,6 +28774,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -29608,6 +29672,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -30481,6 +30547,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -31381,6 +31449,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -32273,6 +32343,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -33124,6 +33196,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -34024,6 +34098,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -34924,6 +35000,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -35820,6 +35898,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -36689,6 +36769,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -37589,6 +37671,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -38485,6 +38569,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -39366,6 +39452,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -40217,6 +40305,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -41109,6 +41199,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", @@ -41960,6 +42052,8 @@ "interactiveTranslatorNotAllowedDesc", "interactiveTranslatorAllowedDesc", "interactiveTranslatorRequiredDesc", + "interactiveTranslatorAutoPlaySliderHeader", + "interactiveTranslatorAutoPlayDesc", "notYetSet", "multiLingualClass", "classAnalytics", From 94f87a5312af33e67e47cbf7e8b7c640fe96ff24 Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Fri, 14 Jun 2024 08:38:10 -0400 Subject: [PATCH 05/54] copy edits --- assets/l10n/intl_en.arb | 14 ++++++++------ assets/l10n/intl_es.arb | 8 ++++---- lib/pangea/enum/span_data_type.dart | 7 +++++-- lib/pangea/utils/match_copy.dart | 18 +++++++++++------- lib/pangea/widgets/igc/span_card.dart | 7 ++++--- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 7fceca29b..6974d82f0 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -2514,7 +2514,7 @@ "type": "text", "placeholders": {} }, - "interactiveTranslatorAutoPlaySliderHeader": "Auto Play Interactive Translator", + "interactiveTranslatorAutoPlaySliderHeader": "Autoplay translation", "@interactiveTranslatorAutoPlaySliderHeader": { "type": "text", "placeholders": {} @@ -2884,21 +2884,23 @@ "type": "text", "placeholders": {} }, - "helpMeTranslate": "Help me translate!", + "helpMeTranslate": "Yes!", "@helpMeTranslate": { "type": "text", "placeholders": {} }, - "needsItShortMessage": "Try interactive translation!", + "needsItShortMessage": "Out of target", "needsIGCShortMessage": "Try interactive grammar assistance!", "@needsItShortMessage": { "type": "text", "placeholders": {} }, - "needsItMessage": "This message has too many words in your base language.", + "needsItMessage": "Wait, that's not {targetLanguage}! Do you need help translating?", "@needsItMessage": { "type": "text", - "placeholders": {} + "placeholders": { + "targetLanguage": {} + } }, "needsIgcMessage": "This message has a grammar error.", "tokenTranslationTitle": "A word is in your base language.", @@ -3974,4 +3976,4 @@ "roomDataMissing": "Some data may be missing from rooms in which you are not a member.", "updatePhoneOS": "You may need to update your device's OS version.", "wordsPerMinute": "Words per minute" -} +} \ No newline at end of file diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb index 3d652ac2a..819caeea0 100644 --- a/assets/l10n/intl_es.arb +++ b/assets/l10n/intl_es.arb @@ -3099,7 +3099,7 @@ "type": "text", "placeholders": {} }, - "interactiveTranslatorAutoPlaySliderHeader": "Traductora interactiva de reproducción automática", + "interactiveTranslatorAutoPlaySliderHeader": "Traducción de reproducción automática", "interactiveTranslatorAutoPlay": "Traductora interactiva de reproducción automática", "@interactiveTranslatorAutoPlay": { "type": "text", @@ -3172,10 +3172,10 @@ "translationSeemsFinished": "La traducción parece estar terminada.", "needsItShortMessage": "¡Pruebe la traducción interactiva!", "needsIGCShortMessage": "¡Pruebe el corrector gramatical interactivo!", - "needsItMessage": "Este mensaje tiene demasiadas palabras en su idioma base.", + "needsItMessage": "Espera, ¡ese no es {targetLanguage}! ¿Necesitas ayuda para traducir?", "needsIgcMessage": "Este mensaje tiene un error gramatical.", "tokenTranslationTitle": "Una palabra está en su idioma base.", - "helpMeTranslate": "¡Ayúdeme a traducir!", + "helpMeTranslate": "¡Sí!", "setToPublicSettingsTitle": "¿Quiere encontrar un compañero de conversación?", "setToPublicSettingsDesc": "Antes de que pueda buscar un compañero de conversación, debe configurar la visibilidad de su perfil como pública.", "publicProfileTitle": "Perfil público", @@ -4663,4 +4663,4 @@ "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel": "Reacción al envío del aviso de debate", "studentAnalyticsNotAvailable": "Datos de los estudiantes no disponibles actualmente", "roomDataMissing": "Es posible que falten algunos datos de las salas de las que no es miembro." -} +} \ No newline at end of file diff --git a/lib/pangea/enum/span_data_type.dart b/lib/pangea/enum/span_data_type.dart index 5e4fdf8cb..949aac26b 100644 --- a/lib/pangea/enum/span_data_type.dart +++ b/lib/pangea/enum/span_data_type.dart @@ -1,5 +1,5 @@ +import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; - import 'package:flutter_gen/gen_l10n/l10n.dart'; enum SpanDataTypeEnum { @@ -32,7 +32,10 @@ extension SpanDataTypeEnumExt on SpanDataTypeEnum { case SpanDataTypeEnum.correction: return L10n.of(context)!.correctionDefaultPrompt; case SpanDataTypeEnum.itStart: - return L10n.of(context)!.needsItMessage; + return L10n.of(context)!.needsItMessage( + MatrixState.pangeaController.languageController.userL2?.displayName ?? + "target language", + ); } } } diff --git a/lib/pangea/utils/match_copy.dart b/lib/pangea/utils/match_copy.dart index 28080f9b5..86d784356 100644 --- a/lib/pangea/utils/match_copy.dart +++ b/lib/pangea/utils/match_copy.dart @@ -1,13 +1,13 @@ import 'dart:developer'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:sentry_flutter/sentry_flutter.dart'; - import 'package:fluffychat/pangea/enum/span_data_type.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; + import '../constants/match_rule_ids.dart'; import '../models/pangea_match_model.dart'; @@ -96,7 +96,11 @@ class MatchCopy { switch (afterColon) { case MatchRuleIds.interactiveTranslation: title = l10n.needsItShortMessage; - description = l10n.needsItMessage; + description = l10n.needsItMessage( + MatrixState + .pangeaController.languageController.userL2?.displayName ?? + "target language", + ); break; case MatchRuleIds.tokenNeedsTranslation: title = l10n.tokenTranslationTitle; diff --git a/lib/pangea/widgets/igc/span_card.dart b/lib/pangea/widgets/igc/span_card.dart index 52901bfa2..9b9fbb4ec 100644 --- a/lib/pangea/widgets/igc/span_card.dart +++ b/lib/pangea/widgets/igc/span_card.dart @@ -162,6 +162,7 @@ class WordMatchContent extends StatelessWidget { try { return Column( children: [ + // if (!controller.widget.scm.pangeaMatch!.isITStart) CardHeader( text: controller.error?.toString() ?? matchCopy.title, botExpression: controller.error == null @@ -222,7 +223,7 @@ class WordMatchContent extends StatelessWidget { opacity: 0.8, child: TextButton( style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( + backgroundColor: WidgetStateProperty.all( AppConfig.primaryColor.withOpacity(0.1), ), ), @@ -249,7 +250,7 @@ class WordMatchContent extends StatelessWidget { ? onReplaceSelected : null, style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( + backgroundColor: WidgetStateProperty.all( (controller.selectedChoice != null ? controller.selectedChoice!.color : AppConfig.primaryColor) @@ -272,7 +273,7 @@ class WordMatchContent extends StatelessWidget { ); }, style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( + backgroundColor: WidgetStateProperty.all( (AppConfig.primaryColor).withOpacity(0.1), ), ), From 89e726b9636073614306d65d127ea0314142bbfd Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:42:15 -0400 Subject: [PATCH 06/54] Added New Bot with Animations --- assets/pangea/bot_faces/pangea_bot.riv | Bin 0 -> 10794 bytes .../controllers/it_controller.dart | 24 ------ lib/pangea/controllers/user_controller.dart | 2 +- lib/pangea/widgets/common/bot_face_svg.dart | 78 +++++++++++++++--- pubspec.yaml | 3 +- 5 files changed, 68 insertions(+), 39 deletions(-) create mode 100644 assets/pangea/bot_faces/pangea_bot.riv diff --git a/assets/pangea/bot_faces/pangea_bot.riv b/assets/pangea/bot_faces/pangea_bot.riv new file mode 100644 index 0000000000000000000000000000000000000000..b6956e547eeb1962304f8ad5aeec12c435307b3e GIT binary patch literal 10794 zcmdUVdw5LO*Z(<_nMlJNK~m=gagDfCg@_=MbIwFkX$j@bOsHxuq6mq`rL?{pcY=z# zC2?=vDlTykW#-I8Y2DSOl-8|^ep6L#Df-I0);{~pOn&-%-sk<}eV+IAJZD>b?ax|k z@3r>Yw@kleTVf67yR{uE+53JB{;SWhH5le;LI4)`{SFx_S;iP3=Z($CP0t&`7>s_F z+_5Ic%rGA$a9A(~6C3p8{vELn769-Ez}VbTCWDzN%5`#loW;WUnf%N>D_2>#w8Bys zV>B6qzx_;-La<=!njD7kw6wH*f||W|g@uc}xT532Cy*A`A1JWm2tU^SHL zgDP8ez{0I@*F|0CYABZv>aQ`S(66EChzhEPa{HiqF1u*q)N$Lf_w}lwDtu6PlMY+B z(Tlet>g8&v!#=2hlRGS2{?A(wB~(Lw>4QprdfLKWpA_U`f=mq=lc^D3mS>cNq`i+- zy{2LfJ@~7S95@}c2cJyj>sSxY5+ZSLQoga+;ZBObIK_0d{B7_>558sa!Q6Rk1)y0W@%p=bJI>|G3hJRS7h+dxJ|+APBT zzwc;mx57`!!o+)pII0+aN=Uv7k?5n?DmlYa-E_#K$Dp zaSOM?pJDHkcthzimk^U|a+4agS%iRBs44_cMC;1pP~o)@MDHSJpTSXS0=S9Paeub+gWY2 z+QMHLi*Ru4LbTt9?-0<^BAh%iM{9$c8{5!x$30{0ZDyYDRJq8v%h7XoVlkC384%$X zy6(P&^E#D(*l(jtNbNcZwWji4kAELVHK!?RP32QQZEg{omTlIMB?DSngp>^8V`$45 zBcq&#{Ff87Skk&`S^()5hQuzy8F<3m8|Xs@=|d);Q5feI&YirE_)NaX+;c9WesMkY zb0$A%K|@&>d>}<@+t9#_v*)H(yLLL=B0OJQ3%#DnL(PqH7O-+{O*7=t%SF-kDvv$)>VSFvmujJF5N?H!pEA=5Y@6 z(%+QJuln`0Q)oS?wy3oDbNM0bw1_a#HfV_?*;%2rL=Z>ca5^C?KUNjX<<}(Z;gJQB zt!2*@2ko7j577|KuY4v6CB>KH6_@izr}gyHpG8~gTU$l@pMCpkh)1nPibA-5vZU00 z^DWW(b*DR`t!uZss{QE65}dQA4B=H(Rk&V{GM^f@b{`isdU`ahW#fX+Hrp^6oONmNXMQf^Kt7HrQ z;;hr2|Ls!j)d&2B2J2nI-royd%8uk`4(q(_Rg!J}hSriDDS`-o^{`7gkX$Y)$Maa# zD%W6TTVdq)lkVEd=&Phx~4N8 z?@TZsFDlswYeX4-^jS3iyfxWVZj&0I^Z2HJ-5S|fn64vcTZWm0e0Ma7ojWW$)&H3lUWNzua zhAP-7V9ipq+bYLgkZ^UG%M!QGWBK!k21&xg>@%V=gzuzUyUL1e`!Fe5wg2>f2lNO) z9^C#-6(0Ps%xUX6G|OqP`%8Bm<~dIqfo`>Gkc(6ER^wbPMBOISLYAMhWVkGBI#M5_ z1J!GN-jZQS2tc(^J-&9m6V~tLk}|G&iqkr1%vRBsHzh=}ztJ^;N{kuS*d-{p0%c{u zdy(;0v1xb7w$B)^+E*U3d39Bp7XvoJyqy z1|jIAi({VeM@OyHg0PC^--`>Eg+U9x5tTnW?sZyME?X+u+?7{EJ5t~+fGkaDAPO`7 zT~k)N+<7@(gS@*|RDB@V`UJUzPZNJ~D#tF|6Rq`@{w>-5dVQ1A&aC>IYI%NMk-%Gj zstU?#T2P;+rLO6sA$;GyeN{{y)3=5;`F>l)roYASh;NqmAjH+2ncdg3O3KN_^+Z znwtHFzdOvEHWhW?c(rwm6Vv7;tqJp{3}R%e<>G=@eB*>c?SQ#`WH5|k#B3*oY^N5o zT`XT7_GLWm=y9SF_g9W+^>?SEi=kl=|A#8vTK`P6ZCE?rVSjr3K5f|j)yq!d&a*kH zVr+Cuw5|>BnFmtdb?W+fa%N?-ftZ?Ra4t z7Tju4!A&@I34O5NcN&%ye~#1es%IL)n4}JN7}KI1I1LYK`Fe=u|LULa5;B6|q#VE zLCgGQ_Z`Cfjy_JM?ew!wYt3Geul-l3qCIf)D>&HiJ<|&Y%k(=Sb7?V0aIiO=>eu!CeJnT6qCL$%=m}I;{K}Gz3eC=9IdoA3QmC z4RWr26SXPRr&Mfq`wc;E{@L^k@p{gk#GE_HR?E4v7pB2QwQ~j6<)_;?4bHIU_Zmf3 z1V?nZD}~%^xgQhny2mpw$}XykuHeq3|BSNdSaZbLwiUq#l6%M@y9Lz_9=G|Jg?n?p1+kaeY8Rkeo*ABP4jx!; z;lleSA?#{(*pEK2*z4;p+)L|TL)f+Iu-iVct0^}eoc+W;H_U>YEQID3%dZKobir}* zpkzzy+}dd$wY3yurZvby&l`6oWyNNg>t8ic(032X81USaZT{%^3=5aHtQD%eqh-)t zmY=4!bHV8$3(t*EEh#>#3Ufyu#G@iqZ#+FAL)Ag67bZMbVbw48wh~!9NdmZ6ObZvZ zu6BXppL`6rnq2JW0y;ED!w)pWzp?!HE#|r4_(ZN|P>miuSr&q~Z9>&h{g((=wX@Ag zx1efhyHFN3|F(d(mWMqdt!Nlpq3VJ&QW{45j*kPIXKjqqlhM#DLpR#)&iZLX&?uaSq6TwZMa+L_WD6LbPKA1?fP1TvYt*_eZ5weMYx<2jH;nEcw2@W zmLmaG-=i5|Fd8lCW3up#BeJ%G%Wny1H9ymQsHWV7{k_&a2iW@d__OztGv!o~-P_PtTJaM1(E$zBIt!ia-MB*ne9n`%wwCQ7zk$Iy6t5$qEh zVgDuhqTWsKswxufEA77J|!ZD$$b?X<;V7;s4Rr{Sj9kC+- zSrb};kRnN$xj#y>hHjoO+s<#=?68mi1g@3@a(~iF8MU}t%0BacrRQ6d;hH}r*AY;t@lqyNw#t2uZZ?*n_;o?HvweWn*(5i z*BvV>pT~Aktt~R%l5BTAcEsCD2d_Z$0IAqB39jW^-jWsmMzmzTZJsLG5_5_j_RG6S z4*@b~?H-E|l=`-+lwNBoSvP;!ShoG{3~<`-ol&Tk8=+(I7#)%_}Wc$V8A4*WnhbbZs-ea+Tndi#9J$O zWJ1BS0gIJmNji!qOPYlin2_?}as>w{{O2MDMh_m)L~1h@Td~-Q#eOUfVsXS%oI&aw78kL&jKx(fu3>Qpiw9Ud!D6NXijT12+5$}wS3A=|CSpZ^4wS0QQ#Vrv7oW)Bw1rU2T}Cqjglf)`uLeyHVymflo- zZ2-@J=PQqT^0XY5fc$_((=1Hm7=L-lkdawKy6$FUS-oe~x)O@LYUpr-?NzLo-c4vc z90*aLVMoH5@E&X`xeJA(fz;H>s^?620*p%Mw)1kkd%16TxdXl2;a=_pFLxGL)fF#A zn%Z0M!^fU!d?6}Z^BwUVy4Sex&>G-5X6f1Z;1nKZGe1~z25<3B9M#UJ%i+%KrU~y2+fTGaz*DoNKOKB_0=*2EJMpJ z&wr0J4khWMA4edB_CgP|$68d`&F;{Q*80v|fKq6!-RuoWqP2Gxv_N?r9L1tFiY-P9 z6ilp9G_`i(e{D2JK{Oz1p!dJ@nbrj=+C)9#cf|#RCGjCN$rs`*J!US5*#wXDfzKOy zr7L`-2^|_8L~INl`h^~YBtnNq*C7oI<82^x;}}z7&e*IxFoM3*x=8-g6PDl)y(OgH zTgQr&3g|8JDOnH5*LFRz09Vk_VF@^^0vFCo04|RB>ABHJHUW~wzae=$15XKI34y>L z^X(@{qB=@y>IeYU}pd)x_p{o+LZAMbJF7-KRlmt8Lz z$!dwq3v@q$*W8G`22Uk1Y0D%aBfVT0vd-=4ZT;>rX=bn%1E~9Vb*hqVY=X&-wZ$`hr$wIr_#yE zgd~8eG;ApMjSqcEqY37!5C1t072>D+dG*ZJXp+vAKJ-H$%p)KE6Cb+D2Q!U^1oa>H zq0eeG>CXiZ-@Do2_(7xv^k}oOFK#us0To4F!RX;+KeDq4>VyR#>CD|Fu|VRyr&tL{ zxo8(+F$E~LKT(N^0DO`I6#gkXgz6^wKn1oSpK2$$LGk6tr}{~rQ2cS=gKA6{_>W`? zl_)_sQwt<(sKh$tQwt=6D83B&)B?#Sim%XAV^V@ zHzA)|AUQ|zUudc^^}qtjIx10sVWJjD22zQ|$fp)aHd6c=#)&=%z(`Zq5^1WNM4Aea zNK@@3(iFcBBC6{rk*4^6h%}WTk){?%q^SgnG_^n?P4U|?(sTqQ(iHy>k){$P($oTp zG?gHcrWQz~DSjhHnpz-{ruct|G?gHcrWQz~sRW5MwLl_G@vAY?)B=e##nVXR4FPwq zztNfWRxl5T{Za2sJctmN5q{&Cz}Ip|4r!7&DtByF*9qQR0cv{g<3wTqgeU7Pun?f*<@l}yXHuQ3vd%1Ytpx7ucx0{zMd$}<4bZj3l z*XrdC@^Ul1T)cMBKEUBw*N_J!Io)U{794qF7}k}G8L`xl=tjDe!-(`v5kZlI-f;oG zg_lcr2|U8!{X#!fl6Acnz)qf+hs!AVK;KNzhjfdv6OydaxP1|>&l0VzMI5xyj0dOc z3k2TeXujhSkS-4`y;w|gx;S+7V&keW4PFa$rlAEoG0_5@XJ~;=OSC|-t%0PI5-m`y zWCPctiOwfhd`)1ALMV zg!E)H0m(2wV1^Czl4Ep$_k@NMm!8m?0!hzekbgP}=Y9Pw2KlFxaLD&Pi=h^J7DFxc zP=#73iCQR$S}2KHh?vj3ewl22sAa*iKk(Fr`7|%n&j}=I*|Tv4?l*AZ(7EwmZjzVV z+slQuK*z!Y;Jf>2#<2G%IuAp&aOX+tVf-?l8Y}6z3%h{3ALZiiN4aQ>a#OrqG}iRo zSExZV=9%sPo$%=II(0xBdDjU`fMv|*i6;TH>B~8S{7wzP)f_>T9H|4~Dw8;2_*fXX zfv#b&-~bj~$i!T)fCl|~^AfVOqdh8Rt{=xUICx3tl6z(o`1M0rLIdPRvbgfM1@d~; zuZKXB{$7&65*xV6WgdMMU5la(z6`DQp5+BK;DXU*2ufa4&&fo`)PvtjCTHg6z;8Lm zX7x_b95y^Bi|JCp)+9G@{E5fdET(G#TccO{#H_p~9TX09 zh2IIBsm&xUXBl`+#6QXd&sdEI^1!RHiY-hbIIQ`tV(-@QNWl*>fya94`NX0h^Pf5# BTiyTw literal 0 HcmV?d00001 diff --git a/lib/pangea/choreographer/controllers/it_controller.dart b/lib/pangea/choreographer/controllers/it_controller.dart index f29bb59b2..ba14aa095 100644 --- a/lib/pangea/choreographer/controllers/it_controller.dart +++ b/lib/pangea/choreographer/controllers/it_controller.dart @@ -231,30 +231,6 @@ class ITController { _setSourceText(); getTranslationData(false); - /*sourceText = newSourceText; - final String currentText = choreographer.currentText; - - choreographer.startLoading(); - - final List responses = await Future.wait([ - _customInputTranslation(""), - _customInputTranslation(choreographer.currentText), - ]); - if (responses[0].goldContinuances != null && - responses[0].goldContinuances!.isNotEmpty) { - goldRouteTracker = GoldRouteTracker( - responses[0].goldContinuances!, - sourceText!, - ); - } - currentITStep = CurrentITStep( - sourceText: sourceText!, - currentText: currentText, - responseModel: responses[1], - storedGoldContinuances: goldRouteTracker.continuances, - ); - - _addPayloadId(responses[1]);*/ } catch (err, stack) { debugger(when: kDebugMode); if (err is! http.Response) { diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index 0e336fdf6..c6a1b3409 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -142,7 +142,7 @@ class UserController extends BaseController { await updateMatrixProfile( dateOfBirth: dob, - autoPlayMessages: autoPlay, + autoPlayMessages: autoPlay ?? false, activatedFreeTrial: trial, interactiveTranslator: interactiveTranslator, itAutoPlay: itAutoPlay, diff --git a/lib/pangea/widgets/common/bot_face_svg.dart b/lib/pangea/widgets/common/bot_face_svg.dart index 718f10c90..b856596dd 100644 --- a/lib/pangea/widgets/common/bot_face_svg.dart +++ b/lib/pangea/widgets/common/bot_face_svg.dart @@ -1,8 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:rive/rive.dart'; enum BotExpression { surprised, right, addled, left, down, shocked } -class BotFace extends StatelessWidget { +class BotFace extends StatefulWidget { + final double width; + final Color? forceColor; + final BotExpression expression; + const BotFace({ super.key, required this.width, @@ -10,21 +15,68 @@ class BotFace extends StatelessWidget { this.forceColor, }); - final double width; - final Color? forceColor; - final BotExpression expression; + @override + BotFaceState createState() => BotFaceState(); +} + +class BotFaceState extends State { + Artboard? _artboard; + SMINumber? _input; + + @override + void initState() { + super.initState(); + _loadRiveFile(); + } + + double mapExpressionToInput(BotExpression expression) { + switch (expression) { + case BotExpression.surprised: + return 1.0; + case BotExpression.right: + return 2.0; + case BotExpression.shocked: + return 3.0; + case BotExpression.addled: + return 4.0; + default: + return 0.0; + } + } + + Future _loadRiveFile() async { + final riveFile = await RiveFile.asset('assets/pangea/bot_faces/pangea_bot.riv'); + + final artboard = riveFile.mainArtboard; + final controller = StateMachineController + .fromArtboard(artboard, 'BotIconStateMachine'); + + if (controller != null) { + artboard.addController(controller); + _input = controller.findInput("Enter State") as SMINumber?; + controller.setInputValue( + 890, // this should be the id of the input + mapExpressionToInput(widget.expression), + ); + } + + setState(() { + _artboard = artboard; + }); + } @override Widget build(BuildContext context) { - return Image.asset( - 'assets/pangea/bot_faces/${expression.toString().split('.').last}.png', - // 'assets/pangea/bot_faces/surprised.png', - width: width, - height: width, - // color: forceColor ?? - // (Theme.of(context).brightness == Brightness.light - // ? Theme.of(context).colorScheme.primary - // : Theme.of(context).colorScheme.primary), + + return SizedBox( + width: widget.width, + height: widget.width, + child: _artboard != null + ? Rive( + artboard: _artboard!, + fit: BoxFit.cover, + ) + : Container(), ); } } diff --git a/pubspec.yaml b/pubspec.yaml index 0c3b2faac..e8d93c8d1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -124,6 +124,7 @@ dependencies: sentry_flutter: ^8.2.0 shimmer: ^3.0.0 syncfusion_flutter_xlsio: ^25.1.40 + rive: 0.11.11 # Pangea# dev_dependencies: @@ -212,4 +213,4 @@ dependency_overrides: keyboard_shortcuts: git: url: https://github.com/TheOneWithTheBraid/keyboard_shortcuts.git - ref: null-safety \ No newline at end of file + ref: null-safety From 5c0763f0a9fd00eaed7dafef565519cb560a211d Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Fri, 14 Jun 2024 21:14:37 -0400 Subject: [PATCH 07/54] Finished Bot Animations and other fixes --- assets/pangea/bot_faces/pangea_bot.riv | Bin 10794 -> 10789 bytes .../controllers/igc_controller.dart | 9 ---- .../choreographer/widgets/it_bar_buttons.dart | 2 +- .../widgets/it_feedback_card.dart | 2 +- lib/pangea/controllers/user_controller.dart | 2 +- lib/pangea/utils/instructions.dart | 2 +- lib/pangea/widgets/common/bot_face_svg.dart | 32 +++++++++----- .../conversation_bot_settings.dart | 2 +- .../widgets/igc/pangea_text_controller.dart | 6 --- lib/pangea/widgets/igc/span_card.dart | 40 ++++++++++++------ lib/pangea/widgets/new_group/vocab_list.dart | 6 +-- 11 files changed, 57 insertions(+), 46 deletions(-) diff --git a/assets/pangea/bot_faces/pangea_bot.riv b/assets/pangea/bot_faces/pangea_bot.riv index b6956e547eeb1962304f8ad5aeec12c435307b3e..177b9b28fe53aa22a9bb986fbdd7a3e62dd71a09 100644 GIT binary patch delta 178 zcmZ1#vNUAFEwRma#B^9UbIE*T+svdK%)B{V&5^mD%QdegwJ5kGu_TqjvWt=3C$TcM zNWqZ7j=^y{Bg;I-34RQ2vl$scJhpj^7x=-vxj=yidyp7AiWq|fNQ`kF;|q4UItQ>A l(>%r<;&8DB2L{`zKr?KoiZL<*H32!y4E7+31w^ni0051&D{KG& delta 186 zcmZ1)vMOZ5Eip#x%{Rq#S(&UEH?zrnV*}BDl!BQ-w7;4ob3M0fUP)?^LU2i9Nh*V7 z7bCk*VkMAo$l$ getIGCTextData({required bool tokensOnly}) async { try { if (choreographer.currentText.isEmpty) return clear(); @@ -215,12 +212,6 @@ class IgcController { ), onITStart: () { if (choreographer.itEnabled && igcTextData != null) { - if (turnOnAutoPlay) { - choreographer.pangeaController.pStoreService.save( - ToolSetting.itAutoPlay.toString(), - true, - ); - } choreographer.onITStart(igcTextData!.matches[firstMatchIndex]); } }, diff --git a/lib/pangea/choreographer/widgets/it_bar_buttons.dart b/lib/pangea/choreographer/widgets/it_bar_buttons.dart index 815020d17..786c17c07 100644 --- a/lib/pangea/choreographer/widgets/it_bar_buttons.dart +++ b/lib/pangea/choreographer/widgets/it_bar_buttons.dart @@ -45,7 +45,7 @@ class ITBotButton extends StatelessWidget { ); return IconButton( - icon: const BotFace(width: 40.0, expression: BotExpression.right), + icon: const BotFace(width: 40.0, expression: BotExpression.idle), onPressed: () => choreographer.pangeaController.instructions.show( context, InstructionsEnum.itInstructions, diff --git a/lib/pangea/choreographer/widgets/it_feedback_card.dart b/lib/pangea/choreographer/widgets/it_feedback_card.dart index 072d24e1a..5424310a8 100644 --- a/lib/pangea/choreographer/widgets/it_feedback_card.dart +++ b/lib/pangea/choreographer/widgets/it_feedback_card.dart @@ -129,7 +129,7 @@ class ITFeedbackCardView extends StatelessWidget { children: [ CardHeader( text: controller.widget.req.chosenContinuance, - botExpression: BotExpression.down, + botExpression: BotExpression.nonGold, ), Text( controller.widget.choiceFeedback, diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index c6a1b3409..0e336fdf6 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -142,7 +142,7 @@ class UserController extends BaseController { await updateMatrixProfile( dateOfBirth: dob, - autoPlayMessages: autoPlay ?? false, + autoPlayMessages: autoPlay, activatedFreeTrial: trial, interactiveTranslator: interactiveTranslator, itAutoPlay: itAutoPlay, diff --git a/lib/pangea/utils/instructions.dart b/lib/pangea/utils/instructions.dart index f1fa8b59f..7d3711ae6 100644 --- a/lib/pangea/utils/instructions.dart +++ b/lib/pangea/utils/instructions.dart @@ -73,7 +73,7 @@ class InstructionsController { children: [ CardHeader( text: key.title(context), - botExpression: BotExpression.surprised, + botExpression: BotExpression.idle, onClose: () => {_instructionsClosed[key] = true}, ), const SizedBox(height: 10.0), diff --git a/lib/pangea/widgets/common/bot_face_svg.dart b/lib/pangea/widgets/common/bot_face_svg.dart index b856596dd..f387b4bc3 100644 --- a/lib/pangea/widgets/common/bot_face_svg.dart +++ b/lib/pangea/widgets/common/bot_face_svg.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rive/rive.dart'; -enum BotExpression { surprised, right, addled, left, down, shocked } +enum BotExpression { gold, nonGold, addled, idle, surprised } class BotFace extends StatefulWidget { final double width; @@ -21,7 +21,7 @@ class BotFace extends StatefulWidget { class BotFaceState extends State { Artboard? _artboard; - SMINumber? _input; + StateMachineController? _controller; @override void initState() { @@ -31,11 +31,11 @@ class BotFaceState extends State { double mapExpressionToInput(BotExpression expression) { switch (expression) { - case BotExpression.surprised: + case BotExpression.gold: return 1.0; - case BotExpression.right: + case BotExpression.nonGold: return 2.0; - case BotExpression.shocked: + case BotExpression.surprised: return 3.0; case BotExpression.addled: return 4.0; @@ -48,14 +48,13 @@ class BotFaceState extends State { final riveFile = await RiveFile.asset('assets/pangea/bot_faces/pangea_bot.riv'); final artboard = riveFile.mainArtboard; - final controller = StateMachineController + _controller = StateMachineController .fromArtboard(artboard, 'BotIconStateMachine'); - if (controller != null) { - artboard.addController(controller); - _input = controller.findInput("Enter State") as SMINumber?; - controller.setInputValue( - 890, // this should be the id of the input + if (_controller != null) { + artboard.addController(_controller!); + _controller!.setInputValue( + _controller!.stateMachine.inputs[0].id, mapExpressionToInput(widget.expression), ); } @@ -79,6 +78,17 @@ class BotFaceState extends State { : Container(), ); } + + @override + void didUpdateWidget(BotFace oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.expression != widget.expression) { + _controller!.setInputValue( + _controller!.stateMachine.inputs[0].id, + mapExpressionToInput(widget.expression), + ); + } + } } // extension ParseToString on BotExpressions { diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart index d10fd6980..7e242b706 100644 --- a/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart @@ -142,7 +142,7 @@ class ConversationBotSettingsState extends State { Theme.of(context).textTheme.bodyLarge!.color, child: const BotFace( width: 30.0, - expression: BotExpression.right, + expression: BotExpression.idle, ), ), activeColor: AppConfig.activeToggleColor, diff --git a/lib/pangea/widgets/igc/pangea_text_controller.dart b/lib/pangea/widgets/igc/pangea_text_controller.dart index c476ccca0..adecb4f00 100644 --- a/lib/pangea/widgets/igc/pangea_text_controller.dart +++ b/lib/pangea/widgets/igc/pangea_text_controller.dart @@ -85,12 +85,6 @@ class PangeaTextController extends TextEditingController { cursorOffset: selection.baseOffset, ), onITStart: () { - if (choreographer.igc.turnOnAutoPlay) { - choreographer.pangeaController.pStoreService.save( - 'ToolSetting.itAutoPlay', - true, - ); - } choreographer.onITStart( choreographer.igc.igcTextData!.matches[matchIndex], ); diff --git a/lib/pangea/widgets/igc/span_card.dart b/lib/pangea/widgets/igc/span_card.dart index 9b9fbb4ec..3d6df9928 100644 --- a/lib/pangea/widgets/igc/span_card.dart +++ b/lib/pangea/widgets/igc/span_card.dart @@ -15,6 +15,7 @@ import '../../../widgets/matrix.dart'; import '../../choreographer/widgets/choice_array.dart'; import '../../controllers/pangea_controller.dart'; import '../../enum/span_choice_type.dart'; +import '../../models/class_model.dart'; import '../../models/span_card_model.dart'; import '../common/bot_face_svg.dart'; import 'card_header.dart'; @@ -49,6 +50,8 @@ class SpanCardState extends State { bool fetchingData = false; int? selectedChoiceIndex; + BotExpression currentExpression = BotExpression.nonGold; + //on initState, get SpanDetails @override void initState() { @@ -121,7 +124,23 @@ class WordMatchContent extends StatelessWidget { .choices?[index] .selected = true; - controller.setState(() => ()); + controller.setState( + () => ( + controller.currentExpression = + controller + .widget + .scm + .choreographer + .igc + .igcTextData + !.matches[controller.widget.scm.matchIndex] + .match + .choices![index] + .isBestCorrection + ? BotExpression.gold + : BotExpression.nonGold + ), + ); // if (controller.widget.scm.pangeaMatch.match.choices![index].type == // SpanChoiceType.distractor) { // await controller.getSpanDetails(); @@ -166,7 +185,7 @@ class WordMatchContent extends StatelessWidget { CardHeader( text: controller.error?.toString() ?? matchCopy.title, botExpression: controller.error == null - ? BotExpression.right + ? controller.currentExpression : BotExpression.addled, ), Expanded( @@ -284,10 +303,7 @@ class WordMatchContent extends StatelessWidget { ), if (controller.widget.scm.pangeaMatch!.isITStart) DontShowSwitchListTile( - value: controller.widget.scm.choreographer.igc.turnOnAutoPlay, - onChanged: ((value) { - controller.widget.scm.choreographer.igc.turnOnAutoPlay = value; - }), + controller: pangeaController, ), ], ); @@ -429,13 +445,11 @@ class StartITButton extends StatelessWidget { } class DontShowSwitchListTile extends StatefulWidget { - final bool value; - final ValueChanged onChanged; + final PangeaController controller; const DontShowSwitchListTile({ super.key, - required this.value, - required this.onChanged, + required this.controller, }); @override @@ -448,7 +462,6 @@ class DontShowSwitchListTileState extends State { @override void initState() { super.initState(); - switchValue = widget.value; } @override @@ -458,7 +471,10 @@ class DontShowSwitchListTileState extends State { title: Text(L10n.of(context)!.interactiveTranslatorAutoPlaySliderHeader), value: switchValue, onChanged: (value) => { - widget.onChanged(value), + widget.controller.pStoreService.save( + ToolSetting.itAutoPlay.toString(), + value, + ), setState(() => switchValue = value), }, ); diff --git a/lib/pangea/widgets/new_group/vocab_list.dart b/lib/pangea/widgets/new_group/vocab_list.dart index e6c2675e4..240e99a85 100644 --- a/lib/pangea/widgets/new_group/vocab_list.dart +++ b/lib/pangea/widgets/new_group/vocab_list.dart @@ -271,7 +271,7 @@ class GenerateVocabButtonState extends State { ElevatedButton.icon( icon: const BotFace( width: 50.0, - expression: BotExpression.right, + expression: BotExpression.idle, ), label: Text(L10n.of(context)!.generateVocabulary), onPressed: () async { @@ -464,9 +464,9 @@ class PromptsFieldState extends State { // button to call API ElevatedButton.icon( - icon: const BotFace( + icon: BotFace( width: 50.0, - expression: BotExpression.right, + expression: BotExpression.idle, ), label: Text(L10n.of(context)!.generatePrompts), onPressed: () async { From 929909a000f61175a753b3ac1e6c7efbc0192da1 Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Tue, 18 Jun 2024 12:10:49 -0400 Subject: [PATCH 08/54] little code cleanup --- .../widgets/igc/pangea_text_controller.dart | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/lib/pangea/widgets/igc/pangea_text_controller.dart b/lib/pangea/widgets/igc/pangea_text_controller.dart index adecb4f00..b91186c22 100644 --- a/lib/pangea/widgets/igc/pangea_text_controller.dart +++ b/lib/pangea/widgets/igc/pangea_text_controller.dart @@ -71,6 +71,16 @@ class PangeaTextController extends TextEditingController { choreographer.igc.igcTextData!.getTopMatchIndexForOffset( selection.baseOffset, ); + + // if autoplay on and it start then just start it + if (matchIndex != -1 && + choreographer.itAutoPlayEnabled && + choreographer.igc.igcTextData!.matches[matchIndex].isITStart) { + return choreographer.onITStart( + choreographer.igc.igcTextData!.matches[matchIndex], + ); + } + final Widget? cardToShow = matchIndex != -1 ? SpanCard( scm: SpanCardModel( @@ -82,8 +92,8 @@ class PangeaTextController extends TextEditingController { debugPrint("onSentenceRewrite $tokenIndex $sentenceRewrite"); }), onIgnore: () => choreographer.onIgnoreMatch( - cursorOffset: selection.baseOffset, - ), + cursorOffset: selection.baseOffset, + ), onITStart: () { choreographer.onITStart( choreographer.igc.igcTextData!.matches[matchIndex], @@ -96,24 +106,15 @@ class PangeaTextController extends TextEditingController { : null; if (cardToShow != null) { - if ( - choreographer.itAutoPlayEnabled && - choreographer.igc.igcTextData!.matches[matchIndex].isITStart - ) { - choreographer.onITStart( - choreographer.igc.igcTextData!.matches[matchIndex], - ); - } else { - OverlayUtil.showPositionedCard( - context: context, - cardSize: matchIndex != -1 && - choreographer.igc.igcTextData!.matches[matchIndex].isITStart - ? const Size(350, 260) - : const Size(350, 400), - cardToShow: cardToShow, - transformTargetId: choreographer.inputTransformTargetKey, - ); - } + OverlayUtil.showPositionedCard( + context: context, + cardSize: matchIndex != -1 && + choreographer.igc.igcTextData!.matches[matchIndex].isITStart + ? const Size(350, 260) + : const Size(350, 400), + cardToShow: cardToShow, + transformTargetId: choreographer.inputTransformTargetKey, + ); } } From 90adf436d31d29fbaa2005da3bbb8532bf7f6f8d Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:29:44 -0400 Subject: [PATCH 09/54] Choice quick click bug fixed 343 --- assets/pangea/bot_faces/pangea_bot.riv | Bin 10789 -> 11187 bytes lib/pages/chat/chat_input_row.dart | 4 - lib/pages/chat/chat_view.dart | 4 + .../choreographer/widgets/choice_array.dart | 97 ++++++++++++++---- lib/pangea/controllers/local_settings.dart | 3 +- lib/pangea/widgets/igc/span_card.dart | 2 +- 6 files changed, 83 insertions(+), 27 deletions(-) diff --git a/assets/pangea/bot_faces/pangea_bot.riv b/assets/pangea/bot_faces/pangea_bot.riv index 177b9b28fe53aa22a9bb986fbdd7a3e62dd71a09..94244a30f977bc7fadbcec98932ba3bff200374d 100644 GIT binary patch delta 533 zcmZ1)vN?RiIk8Yl<6H(QQ(gu+7e=@9zR4Cq4j-6P$GX9ULDIMaE}M1klsQ~>0V9(c zkRt$A%D~WI59A2KIh)Ult!3i#g{zjZb#mHVE*Z?p4zvZtnS4S?l}1*-QPN@7LA4s_ z4LqKl?5Uz+K&nSKo2n%;P2MfWHF>&*7Hxbo`GCglz#c{h1_uWQ%PvNCpTx@4A_YSR zdj{L7Kv5vU3?f)T1Pg;5gX45Yrg@AL{21J31EqmHmU)a9_`$rnKmlMB0mYanU(i&S TV4ughLmVOFz~BHfgpmONzpMoNT46%q(xtH91FJV)Hp=0cOVB$^5D+o72=InI@mm z)Sm3Ab<32&vWt=3C$TcMNWqZ7j=^y{Bg;I-34RQ2vl$scJhpj^7x=-vxj=yidyp9W l? choices; final void Function(int) onPressed; @@ -18,6 +17,7 @@ class ChoicesArray extends StatelessWidget { final int? selectedChoiceIndex; final String originalSpan; final String Function(int) uniqueKeyForLayerLink; + const ChoicesArray({ super.key, required this.isLoading, @@ -29,23 +29,49 @@ class ChoicesArray extends StatelessWidget { this.onLongPress, }); + @override + ChoicesArrayState createState() => ChoicesArrayState(); +} + +class ChoicesArrayState extends State { + bool interactionDisabled = false; + + void disableInteraction() { + WidgetsBinding.instance.addPostFrameCallback((_) { + setState(() { + interactionDisabled = true; + }); + }); + } + + void enableInteractions() { + WidgetsBinding.instance.addPostFrameCallback((_) { + setState(() { + interactionDisabled = false; + }); + }); + } + @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); - return isLoading && (choices == null || choices!.length <= 1) - ? ItShimmer(originalSpan: originalSpan) + return widget.isLoading && (widget.choices == null || widget.choices!.length <= 1) + ? ItShimmer(originalSpan: widget.originalSpan) : Wrap( alignment: WrapAlignment.center, - children: choices + children: widget.choices ?.asMap() .entries .map( (entry) => ChoiceItem( theme: theme, - onLongPress: onLongPress, - onPressed: onPressed, + onLongPress: widget.onLongPress, + onPressed: widget.onPressed, entry: entry, - isSelected: selectedChoiceIndex == entry.key, + interactionDisabled: interactionDisabled, + enableInteraction: enableInteractions, + disableInteraction: disableInteraction, + isSelected: widget.selectedChoiceIndex == entry.key, ), ) .toList() ?? @@ -74,6 +100,9 @@ class ChoiceItem extends StatelessWidget { required this.onPressed, required this.entry, required this.isSelected, + required this.interactionDisabled, + required this.enableInteraction, + required this.disableInteraction, }); final MapEntry entry; @@ -81,6 +110,9 @@ class ChoiceItem extends StatelessWidget { final void Function(int p1)? onLongPress; final void Function(int p1) onPressed; final bool isSelected; + final bool interactionDisabled; + final VoidCallback enableInteraction; + final VoidCallback disableInteraction; @override Widget build(BuildContext context) { @@ -94,6 +126,8 @@ class ChoiceItem extends StatelessWidget { key: ValueKey(entry.value.text), selected: entry.value.color != null, isGold: entry.value.isGold, + enableInteraction: enableInteraction, + disableInteraction: disableInteraction, child: Container( margin: const EdgeInsets.all(2), padding: EdgeInsets.zero, @@ -128,8 +162,9 @@ class ChoiceItem extends StatelessWidget { ), ), onLongPress: - onLongPress != null ? () => onLongPress!(entry.key) : null, - onPressed: () => onPressed(entry.key), + onLongPress != null && !interactionDisabled + ? () => onLongPress!(entry.key) : null, + onPressed: interactionDisabled ? null : () => onPressed(entry.key), child: Text( entry.value.text, style: BotStyle.text(context), @@ -149,11 +184,15 @@ class ChoiceAnimationWidget extends StatefulWidget { final Widget child; final bool selected; final bool isGold; + final VoidCallback enableInteraction; + final VoidCallback disableInteraction; const ChoiceAnimationWidget({ super.key, required this.child, required this.selected, + required this.enableInteraction, + required this.disableInteraction, this.isGold = false, }); @@ -161,11 +200,13 @@ class ChoiceAnimationWidget extends StatefulWidget { ChoiceAnimationWidgetState createState() => ChoiceAnimationWidgetState(); } +enum AnimationState { ready, forward, reverse, finished } + class ChoiceAnimationWidgetState extends State with SingleTickerProviderStateMixin { late final AnimationController _controller; late final Animation _animation; - bool animationPlayed = false; + AnimationState animationState = AnimationState.ready; @override void initState() { @@ -193,17 +234,29 @@ class ChoiceAnimationWidgetState extends State ), ]).animate(_controller); - if (widget.selected && !animationPlayed) { + widget.enableInteraction(); + + if (widget.selected && animationState == AnimationState.ready) { + widget.disableInteraction(); _controller.forward(); - animationPlayed = true; - setState(() {}); + setState(() { + animationState = AnimationState.forward; + }); } _controller.addStatusListener((status) { - if (status == AnimationStatus.completed) { + if (status == AnimationStatus.completed && + animationState == AnimationState.forward) { _controller.reverse(); - } else if (status == AnimationStatus.dismissed) { - _controller.stop(); - _controller.reset(); + setState(() { + animationState = AnimationState.reverse; + }); + } + if (status == AnimationStatus.dismissed && + animationState == AnimationState.reverse) { + widget.enableInteraction(); + setState(() { + animationState = AnimationState.finished; + }); } }); } @@ -211,10 +264,12 @@ class ChoiceAnimationWidgetState extends State @override void didUpdateWidget(ChoiceAnimationWidget oldWidget) { super.didUpdateWidget(oldWidget); - if (widget.selected && !animationPlayed) { + if (widget.selected && animationState == AnimationState.ready) { + widget.disableInteraction(); _controller.forward(); - animationPlayed = true; - setState(() {}); + setState(() { + animationState = AnimationState.forward; + }); } } diff --git a/lib/pangea/controllers/local_settings.dart b/lib/pangea/controllers/local_settings.dart index 5984a7bf5..d6ae119a5 100644 --- a/lib/pangea/controllers/local_settings.dart +++ b/lib/pangea/controllers/local_settings.dart @@ -9,7 +9,8 @@ class LocalSettings { } bool userLanguageToolSetting(ToolSetting setting) => - _pangeaController.pStoreService.read(setting.toString()) ?? true; + _pangeaController.pStoreService.read(setting.toString()) + ?? setting != ToolSetting.itAutoPlay; // bool get userEnableIT => // _pangeaController.pStoreService.read(ToolSetting.interactiveTranslator.toString()) ?? true; diff --git a/lib/pangea/widgets/igc/span_card.dart b/lib/pangea/widgets/igc/span_card.dart index 3d6df9928..75738a687 100644 --- a/lib/pangea/widgets/igc/span_card.dart +++ b/lib/pangea/widgets/igc/span_card.dart @@ -138,7 +138,7 @@ class WordMatchContent extends StatelessWidget { .choices![index] .isBestCorrection ? BotExpression.gold - : BotExpression.nonGold + : BotExpression.surprised ), ); // if (controller.widget.scm.pangeaMatch.match.choices![index].type == From 50dc34bd94166e125a8c41720562722a83db4f05 Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Thu, 20 Jun 2024 22:20:47 -0400 Subject: [PATCH 10/54] itAutoPlay added to setting switches --- lib/pangea/enum/span_data_type.dart | 2 +- lib/pangea/models/class_model.dart | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/pangea/enum/span_data_type.dart b/lib/pangea/enum/span_data_type.dart index 949aac26b..38315fd50 100644 --- a/lib/pangea/enum/span_data_type.dart +++ b/lib/pangea/enum/span_data_type.dart @@ -34,7 +34,7 @@ extension SpanDataTypeEnumExt on SpanDataTypeEnum { case SpanDataTypeEnum.itStart: return L10n.of(context)!.needsItMessage( MatrixState.pangeaController.languageController.userL2?.displayName ?? - "target language", + L10n.of(context)!.targetLanguage, ); } } diff --git a/lib/pangea/models/class_model.dart b/lib/pangea/models/class_model.dart index cf0cadedb..f663af8ce 100644 --- a/lib/pangea/models/class_model.dart +++ b/lib/pangea/models/class_model.dart @@ -120,6 +120,7 @@ class PangeaRoomRules { bool isInviteOnlyStudents; // 0 = forbidden, 1 = allow individual to choose, 2 = require int interactiveTranslator; + int itAutoPlay; int interactiveGrammar; int immersionMode; int definitions; @@ -138,6 +139,7 @@ class PangeaRoomRules { this.isVoiceNotes = true, this.isInviteOnlyStudents = true, this.interactiveTranslator = ClassDefaultValues.languageToolPermissions, + this.itAutoPlay = ClassDefaultValues.languageToolPermissions, this.interactiveGrammar = ClassDefaultValues.languageToolPermissions, this.immersionMode = ClassDefaultValues.languageToolPermissions, this.definitions = ClassDefaultValues.languageToolPermissions, @@ -189,6 +191,9 @@ class PangeaRoomRules { case ToolSetting.interactiveTranslator: interactiveTranslator = value; break; + case ToolSetting.itAutoPlay: + itAutoPlay = value; + break; case ToolSetting.interactiveGrammar: interactiveGrammar = value; break; @@ -227,6 +232,8 @@ class PangeaRoomRules { isInviteOnlyStudents: json['is_invite_only_students'] ?? true, interactiveTranslator: json['interactive_translator'] ?? ClassDefaultValues.languageToolPermissions, + itAutoPlay: json['it_auto_play'] ?? + ClassDefaultValues.languageToolPermissions, interactiveGrammar: json['interactive_grammar'] ?? ClassDefaultValues.languageToolPermissions, immersionMode: json['immersion_mode'] ?? @@ -252,6 +259,7 @@ class PangeaRoomRules { data['is_voice_notes'] = isVoiceNotes; data['is_invite_only_students'] = isInviteOnlyStudents; data['interactive_translator'] = interactiveTranslator; + data['it_auto_play'] = itAutoPlay; data['interactive_grammar'] = interactiveGrammar; data['immersion_mode'] = immersionMode; data['definitions'] = definitions; @@ -263,6 +271,8 @@ class PangeaRoomRules { switch (setting) { case ToolSetting.interactiveTranslator: return interactiveTranslator; + case ToolSetting.itAutoPlay: + return itAutoPlay; case ToolSetting.interactiveGrammar: return interactiveGrammar; case ToolSetting.immersionMode: From dec0c2352375e0804edfd90aff8dedaa9819bc4e Mon Sep 17 00:00:00 2001 From: WilsonLe Date: Fri, 21 Jun 2024 17:16:18 -0400 Subject: [PATCH 11/54] save, not working, freezes when open room detail --- assets/l10n/intl_en.arb | 4 + lib/pangea/constants/model_keys.dart | 8 +- lib/pangea/models/bot_options_model.dart | 70 ++++-- ...sation_bot_custom_system_prompt_input.dart | 73 +++++++ .../conversation_bot_custom_zone.dart | 63 +++++- .../conversation_bot_mode_dynamic_zone.dart | 11 +- .../conversation_bot_mode_select.dart | 2 +- .../conversation_bot_settings.dart | 45 ++-- needed-translations.txt | 200 ++++++++++++++++++ pubspec.lock | 40 ++++ 10 files changed, 459 insertions(+), 57 deletions(-) create mode 100644 lib/pangea/widgets/conversation_bot/conversation_bot_custom_system_prompt_input.dart diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index c66ef7ac6..2b97c1686 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -4022,6 +4022,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel": "Hours between discussion prompts", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel": "Responds on ⏩ reaction", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel": "Reaction to send discussion prompt", + "conversationBotCustomZone_title": "Custom Settings", + "conversationBotCustomZone_customSystemPromptLabel": "System prompt", + "conversationBotCustomZone_customSystemPromptPlaceholder": "Set custom system prompt", + "conversationBotCustomZone_customTriggerReactionEnabledLabel": "Responds on ⏩ reaction", "addConversationBotDialogTitleInvite": "Confirm inviting conversation bot", "addConversationBotButtonInvite": "Invite", "addConversationBotDialogInviteConfirmation": "Invite", diff --git a/lib/pangea/constants/model_keys.dart b/lib/pangea/constants/model_keys.dart index 0cd14e5a4..dca53288d 100644 --- a/lib/pangea/constants/model_keys.dart +++ b/lib/pangea/constants/model_keys.dart @@ -102,14 +102,14 @@ class ModelKey { static const String custom = "custom"; static const String discussionTopic = "discussion_topic"; static const String discussionKeywords = "discussion_keywords"; - static const String discussionTriggerScheduleEnabled = - "discussion_trigger_schedule_enabled"; - static const String discussionTriggerScheduleHourInterval = - "discussion_trigger_schedule_hour_interval"; static const String discussionTriggerReactionEnabled = "discussion_trigger_reaction_enabled"; static const String discussionTriggerReactionKey = "discussion_trigger_reaction_key"; + static const String customSystemPrompt = "custom_system_prompt"; + static const String customTriggerReactionEnabled = + "custom_trigger_reaction_enabled"; + static const String customTriggerReactionKey = "custom_trigger_reaction_key"; static const String prevEventId = "prev_event_id"; static const String prevLastUpdated = "prev_last_updated"; diff --git a/lib/pangea/models/bot_options_model.dart b/lib/pangea/models/bot_options_model.dart index 00eaddc1b..0e1019e62 100644 --- a/lib/pangea/models/bot_options_model.dart +++ b/lib/pangea/models/bot_options_model.dart @@ -16,41 +16,62 @@ class BotOptionsModel { String? custom; String? discussionTopic; String? discussionKeywords; - bool? discussionTriggerScheduleEnabled; - int? discussionTriggerScheduleHourInterval; - bool? discussionTriggerReactionEnabled; - String? discussionTriggerReactionKey; + bool discussionTriggerReactionEnabled; + String discussionTriggerReactionKey; + String? customSystemPrompt; + bool customTriggerReactionEnabled; + String customTriggerReactionKey; BotOptionsModel({ + //////////////////////////////////////////////////////////////////////////// + // General Bot Options + //////////////////////////////////////////////////////////////////////////// this.languageLevel, this.topic = "General Conversation", this.keywords = const [], this.safetyModeration = true, this.mode = "discussion", - this.custom = "", + + //////////////////////////////////////////////////////////////////////////// + // Discussion Mode Options + //////////////////////////////////////////////////////////////////////////// this.discussionTopic, this.discussionKeywords, - this.discussionTriggerScheduleEnabled, - this.discussionTriggerScheduleHourInterval, this.discussionTriggerReactionEnabled = true, - this.discussionTriggerReactionKey, + this.discussionTriggerReactionKey = "⏩", + + //////////////////////////////////////////////////////////////////////////// + // Custom Mode Options + //////////////////////////////////////////////////////////////////////////// + this.customSystemPrompt, + this.customTriggerReactionEnabled = true, + this.customTriggerReactionKey = "⏩", }); factory BotOptionsModel.fromJson(json) { return BotOptionsModel( + ////////////////////////////////////////////////////////////////////////// + // General Bot Options + ////////////////////////////////////////////////////////////////////////// languageLevel: json[ModelKey.languageLevel], safetyModeration: json[ModelKey.safetyModeration] ?? true, mode: json[ModelKey.mode] ?? "discussion", - custom: json[ModelKey.custom], + + ////////////////////////////////////////////////////////////////////////// + // Discussion Mode Options + ////////////////////////////////////////////////////////////////////////// discussionTopic: json[ModelKey.discussionTopic], discussionKeywords: json[ModelKey.discussionKeywords], - discussionTriggerScheduleEnabled: - json[ModelKey.discussionTriggerScheduleEnabled], - discussionTriggerScheduleHourInterval: - json[ModelKey.discussionTriggerScheduleHourInterval], discussionTriggerReactionEnabled: json[ModelKey.discussionTriggerReactionEnabled], discussionTriggerReactionKey: json[ModelKey.discussionTriggerReactionKey], + + ////////////////////////////////////////////////////////////////////////// + // Custom Mode Options + ////////////////////////////////////////////////////////////////////////// + customSystemPrompt: json[ModelKey.customSystemPrompt], + customTriggerReactionEnabled: json[ModelKey.customTriggerReactionEnabled], + customTriggerReactionKey: json[ModelKey.customTriggerReactionKey], ); } @@ -64,14 +85,14 @@ class BotOptionsModel { data[ModelKey.custom] = custom; data[ModelKey.discussionTopic] = discussionTopic; data[ModelKey.discussionKeywords] = discussionKeywords; - data[ModelKey.discussionTriggerScheduleEnabled] = - discussionTriggerScheduleEnabled; - data[ModelKey.discussionTriggerScheduleHourInterval] = - discussionTriggerScheduleHourInterval; data[ModelKey.discussionTriggerReactionEnabled] = discussionTriggerReactionEnabled; data[ModelKey.discussionTriggerReactionKey] = discussionTriggerReactionKey; + data[ModelKey.customSystemPrompt] = customSystemPrompt; + data[ModelKey.customTriggerReactionEnabled] = + customTriggerReactionEnabled; + data[ModelKey.customTriggerReactionKey] = customTriggerReactionKey; return data; } catch (e, s) { debugger(when: kDebugMode); @@ -101,18 +122,21 @@ class BotOptionsModel { case ModelKey.discussionKeywords: discussionKeywords = value; break; - case ModelKey.discussionTriggerScheduleEnabled: - discussionTriggerScheduleEnabled = value; - break; - case ModelKey.discussionTriggerScheduleHourInterval: - discussionTriggerScheduleHourInterval = value; - break; case ModelKey.discussionTriggerReactionEnabled: discussionTriggerReactionEnabled = value; break; case ModelKey.discussionTriggerReactionKey: discussionTriggerReactionKey = value; break; + case ModelKey.customSystemPrompt: + customSystemPrompt = value; + break; + case ModelKey.customTriggerReactionEnabled: + customTriggerReactionEnabled = value; + break; + case ModelKey.customTriggerReactionKey: + customTriggerReactionKey = value; + break; default: throw Exception('Invalid key for bot options - $key'); } diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_custom_system_prompt_input.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_custom_system_prompt_input.dart new file mode 100644 index 000000000..55ec1493d --- /dev/null +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_custom_system_prompt_input.dart @@ -0,0 +1,73 @@ +import 'package:fluffychat/pangea/models/bot_options_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +class ConversationBotCustomSystemPromptInput extends StatelessWidget { + final BotOptionsModel initialBotOptions; + // call this to update propagate changes to parents + final void Function(BotOptionsModel) onChanged; + + const ConversationBotCustomSystemPromptInput({ + super.key, + required this.initialBotOptions, + required this.onChanged, + }); + + @override + Widget build(BuildContext context) { + String customSystemPrompt = initialBotOptions.customSystemPrompt ?? ""; + + final TextEditingController textFieldController = + TextEditingController(text: customSystemPrompt); + + void setBotCustomSystemPromptAction() async { + showDialog( + context: context, + useRootNavigator: false, + builder: (BuildContext context) => AlertDialog( + title: Text( + L10n.of(context)!.conversationBotCustomZone_customSystemPromptLabel, + ), + content: TextField( + minLines: 1, + maxLines: 10, + maxLength: 1000, + controller: textFieldController, + onChanged: (value) { + customSystemPrompt = value; + }, + ), + actions: [ + TextButton( + child: Text(L10n.of(context)!.cancel), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + TextButton( + child: Text(L10n.of(context)!.ok), + onPressed: () { + if (customSystemPrompt == "") return; + if (customSystemPrompt != + initialBotOptions.customSystemPrompt) { + initialBotOptions.customSystemPrompt = customSystemPrompt; + onChanged.call(initialBotOptions); + Navigator.of(context).pop(); + } + }, + ), + ], + ), + ); + } + + return ListTile( + onTap: setBotCustomSystemPromptAction, + title: Text( + initialBotOptions.customSystemPrompt ?? + L10n.of(context)! + .conversationBotCustomZone_customSystemPromptPlaceholder, + ), + ); + } +} diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_custom_zone.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_custom_zone.dart index 5fe8880ea..46f87237c 100644 --- a/lib/pangea/widgets/conversation_bot/conversation_bot_custom_zone.dart +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_custom_zone.dart @@ -1,15 +1,74 @@ +import 'package:fluffychat/pangea/models/bot_options_model.dart'; +import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_custom_system_prompt_input.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; class ConversationBotCustomZone extends StatelessWidget { + final BotOptionsModel initialBotOptions; + // call this to update propagate changes to parents + final void Function(BotOptionsModel) onChanged; + const ConversationBotCustomZone({ super.key, + required this.initialBotOptions, + required this.onChanged, }); @override Widget build(BuildContext context) { - return const Column( + return Column( children: [ - Text('Custom Zone'), + const SizedBox(height: 12), + Text( + L10n.of(context)!.conversationBotCustomZone_title, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + const Divider( + color: Colors.grey, + thickness: 1, + ), + const SizedBox(height: 12), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.fromLTRB(12, 0, 0, 0), + child: Text( + L10n.of(context)! + .conversationBotCustomZone_customSystemPromptLabel, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8), + child: ConversationBotCustomSystemPromptInput( + initialBotOptions: initialBotOptions, + onChanged: onChanged, + ), + ), + const SizedBox(height: 12), + CheckboxListTile( + title: Text( + L10n.of(context)! + .conversationBotCustomZone_customTriggerReactionEnabledLabel, + ), + enabled: false, + value: initialBotOptions.customTriggerReactionEnabled, + onChanged: (value) { + initialBotOptions.customTriggerReactionEnabled = value ?? false; + initialBotOptions.customTriggerReactionKey = + "⏩"; // hard code this for now + onChanged.call(initialBotOptions); + }, + // make this input disabled always + ), + const SizedBox(height: 12), ], ); } diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_mode_dynamic_zone.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_mode_dynamic_zone.dart index b0c78888f..b15689357 100644 --- a/lib/pangea/widgets/conversation_bot/conversation_bot_mode_dynamic_zone.dart +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_mode_dynamic_zone.dart @@ -1,7 +1,5 @@ import 'package:fluffychat/pangea/models/bot_options_model.dart'; -import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_conversation_zone.dart'; import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_custom_zone.dart'; -import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_text_adventure_zone.dart'; import 'package:flutter/material.dart'; import 'conversation_bot_discussion_zone.dart'; @@ -23,9 +21,12 @@ class ConversationBotModeDynamicZone extends StatelessWidget { initialBotOptions: initialBotOptions, onChanged: onChanged, ), - "custom": const ConversationBotCustomZone(), - "conversation": const ConversationBotConversationZone(), - "text_adventure": const ConversationBotTextAdventureZone(), + "custom": ConversationBotCustomZone( + initialBotOptions: initialBotOptions, + onChanged: onChanged, + ), + // "conversation": const ConversationBotConversationZone(), + // "text_adventure": const ConversationBotTextAdventureZone(), }; return Container( decoration: BoxDecoration( diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_mode_select.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_mode_select.dart index 9662dec55..ba60f038c 100644 --- a/lib/pangea/widgets/conversation_bot/conversation_bot_mode_select.dart +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_mode_select.dart @@ -16,7 +16,7 @@ class ConversationBotModeSelect extends StatelessWidget { final Map options = { "discussion": L10n.of(context)!.conversationBotModeSelectOption_discussion, - // "custom": L10n.of(context)!.conversationBotModeSelectOption_custom, + "custom": L10n.of(context)!.conversationBotModeSelectOption_custom, // "conversation": // L10n.of(context)!.conversationBotModeSelectOption_conversation, // "text_adventure": diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart index 6684dcca7..6b57ca3a4 100644 --- a/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart @@ -4,6 +4,7 @@ import 'package:fluffychat/pangea/models/bot_options_model.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; import 'package:fluffychat/pangea/widgets/common/bot_face_svg.dart'; import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_mode_dynamic_zone.dart'; +import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_mode_select.dart'; import 'package:fluffychat/pangea/widgets/space/language_level_dropdown.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -226,28 +227,28 @@ class ConversationBotSettingsState extends State { }), ), ), - // Padding( - // padding: const EdgeInsets.fromLTRB(32, 16, 0, 0), - // child: Text( - // L10n.of(context)!.conversationBotModeSelectDescription, - // style: TextStyle( - // color: Theme.of(context).colorScheme.secondary, - // fontWeight: FontWeight.bold, - // fontSize: 16, - // ), - // ), - // ), - // Padding( - // padding: const EdgeInsets.only(left: 16), - // child: ConversationBotModeSelect( - // initialMode: botOptions.mode, - // onChanged: (String? mode) => updateBotOption( - // () { - // botOptions.mode = mode ?? "discussion"; - // }, - // ), - // ), - // ), + Padding( + padding: const EdgeInsets.fromLTRB(32, 16, 0, 0), + child: Text( + L10n.of(context)!.conversationBotModeSelectDescription, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 16), + child: ConversationBotModeSelect( + initialMode: botOptions.mode, + onChanged: (String? mode) => updateBotOption( + () { + botOptions.mode = mode ?? "discussion"; + }, + ), + ), + ), Padding( padding: const EdgeInsets.fromLTRB(28, 0, 12, 0), child: ConversationBotModeDynamicZone( diff --git a/needed-translations.txt b/needed-translations.txt index 293985cfc..3ce87e091 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -831,6 +831,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -2330,6 +2334,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -3829,6 +3837,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -5332,6 +5344,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -6237,6 +6253,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -7224,6 +7244,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -8098,6 +8122,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -9548,6 +9576,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -10700,6 +10732,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -10773,6 +10809,10 @@ "searchMore", "gallery", "files", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -11621,6 +11661,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -12491,6 +12535,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -13498,6 +13546,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -14471,6 +14523,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -15800,6 +15856,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -16808,6 +16868,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -17945,6 +18009,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -18819,6 +18887,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -20071,6 +20143,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -21567,6 +21643,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -22516,6 +22596,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -23404,6 +23488,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -24891,6 +24979,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -25769,6 +25861,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -27027,6 +27123,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -27954,6 +28054,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -28992,6 +29096,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -30349,6 +30457,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -31223,6 +31335,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -32259,6 +32375,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -33139,6 +33259,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -34339,6 +34463,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -35305,6 +35433,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -36280,6 +36412,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -37761,6 +37897,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -38639,6 +38779,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -39840,6 +39984,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -40850,6 +40998,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -41728,6 +41880,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -42995,6 +43151,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -44394,6 +44554,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -45567,6 +45731,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -46474,6 +46642,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -47974,6 +48146,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -49428,6 +49604,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -50302,6 +50482,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -51205,6 +51389,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -52561,6 +52749,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -53434,6 +53626,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", @@ -54581,6 +54777,10 @@ "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", + "conversationBotCustomZone_title", + "conversationBotCustomZone_customSystemPromptLabel", + "conversationBotCustomZone_customSystemPromptPlaceholder", + "conversationBotCustomZone_customTriggerReactionEnabledLabel", "addConversationBotDialogTitleInvite", "addConversationBotButtonInvite", "addConversationBotDialogInviteConfirmation", diff --git a/pubspec.lock b/pubspec.lock index afe372a2f..655752eda 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -975,6 +975,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + globbing: + dependency: transitive + description: + name: globbing + sha256: "4f89cfaf6fa74c9c1740a96259da06bd45411ede56744e28017cc534a12b6e2d" + url: "https://pub.dev" + source: hosted + version: "1.0.0" go_router: dependency: "direct main" description: @@ -1167,6 +1175,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.8+1" + injector: + dependency: transitive + description: + name: injector + sha256: ed389bed5b48a699d5b9561c985023d0d5cc88dd5ff2237aadcce5a5ab433e4e + url: "https://pub.dev" + source: hosted + version: "3.0.0" integration_test: dependency: "direct dev" description: flutter @@ -1749,6 +1765,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + properties: + dependency: transitive + description: + name: properties + sha256: "333f427dd4ed07bdbe8c75b9ff864a1e70b5d7a8426a2e8bdd457b65ae5ac598" + url: "https://pub.dev" + source: hosted + version: "2.1.1" provider: dependency: "direct main" description: @@ -1949,6 +1973,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.2.0" + sentry_dart_plugin: + dependency: "direct dev" + description: + name: sentry_dart_plugin + sha256: e81fa3e0ffabd04fdcfbfecd6468d4a342f02ab33edca09708c61bcd2be42b7d + url: "https://pub.dev" + source: hosted + version: "1.7.1" sentry_flutter: dependency: "direct main" description: @@ -2234,6 +2266,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0+1" + system_info2: + dependency: transitive + description: + name: system_info2 + sha256: "65206bbef475217008b5827374767550a5420ce70a04d2d7e94d1d2253f3efc9" + url: "https://pub.dev" + source: hosted + version: "4.0.0" tar: dependency: transitive description: From a4cd5d702b1bdcf1c35ab0f0c05c047d4677d805 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Mon, 24 Jun 2024 12:05:57 -0400 Subject: [PATCH 12/54] Let multiple overlays coexist --- .../controllers/language_list_controller.dart | 4 ++-- lib/pangea/utils/any_state_holder.dart | 24 ++++++++++++------- lib/pangea/utils/instructions.dart | 1 + lib/pangea/utils/overlay.dart | 12 +++++++--- lib/pangea/widgets/chat/message_toolbar.dart | 11 +++++---- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/lib/pangea/controllers/language_list_controller.dart b/lib/pangea/controllers/language_list_controller.dart index 345d5b5e7..59c3cce88 100644 --- a/lib/pangea/controllers/language_list_controller.dart +++ b/lib/pangea/controllers/language_list_controller.dart @@ -27,7 +27,7 @@ class PangeaLanguage { static Future initialize() async { try { - _langList = await _getCahedFlags(); + _langList = await _getCachedFlags(); if (await _shouldFetch || _langList.isEmpty) { _langList = await LanguageRepo.fetchLanguages(); @@ -77,7 +77,7 @@ class PangeaLanguage { await MyShared.saveJson(PrefKey.flags, flagMap); } - static Future> _getCahedFlags() async { + static Future> _getCachedFlags() async { final Map? flagsMap = await MyShared.readJson(PrefKey.flags); if (flagsMap == null) { diff --git a/lib/pangea/utils/any_state_holder.dart b/lib/pangea/utils/any_state_holder.dart index bd09c7131..9705a9ca1 100644 --- a/lib/pangea/utils/any_state_holder.dart +++ b/lib/pangea/utils/any_state_holder.dart @@ -4,7 +4,7 @@ import 'package:sentry_flutter/sentry_flutter.dart'; class PangeaAnyState { final Map _layerLinkAndKeys = {}; - OverlayEntry? overlay; + List entries = []; dispose() { closeOverlay(); @@ -32,26 +32,32 @@ class PangeaAnyState { _layerLinkAndKeys.remove(transformTargetId); } - void openOverlay(OverlayEntry entry, BuildContext context) { - closeOverlay(); - overlay = entry; - Overlay.of(context).insert(overlay!); + void openOverlay( + OverlayEntry entry, + BuildContext context, { + bool closePrevOverlay = true, + }) { + if (closePrevOverlay) { + closeOverlay(); + } + entries.add(entry); + Overlay.of(context).insert(entry); } void closeOverlay() { - if (overlay != null) { + if (entries.isNotEmpty) { try { - overlay?.remove(); + entries.last.remove(); } catch (err, s) { ErrorHandler.logError( e: err, s: s, data: { - "overlay": overlay, + "overlay": entries.last, }, ); } - overlay = null; + entries.removeLast(); } } diff --git a/lib/pangea/utils/instructions.dart b/lib/pangea/utils/instructions.dart index 43350f518..b9eecd799 100644 --- a/lib/pangea/utils/instructions.dart +++ b/lib/pangea/utils/instructions.dart @@ -94,6 +94,7 @@ class InstructionsController { ), cardSize: const Size(300.0, 300.0), transformTargetId: transformTargetKey, + closePrevOverlay: false, ), ); } diff --git a/lib/pangea/utils/overlay.dart b/lib/pangea/utils/overlay.dart index 07eab5133..b0ab82025 100644 --- a/lib/pangea/utils/overlay.dart +++ b/lib/pangea/utils/overlay.dart @@ -25,9 +25,12 @@ class OverlayUtil { Color? backgroundColor, Alignment? targetAnchor, Alignment? followerAnchor, + bool closePrevOverlay = true, }) { try { - MatrixState.pAnyState.closeOverlay(); + if (closePrevOverlay) { + MatrixState.pAnyState.closeOverlay(); + } final LayerLinkAndKey layerLinkAndKey = MatrixState.pAnyState.layerLinkAndKey(transformTargetId); @@ -58,7 +61,8 @@ class OverlayUtil { ), ); - MatrixState.pAnyState.openOverlay(entry, context); + MatrixState.pAnyState + .openOverlay(entry, context, closePrevOverlay: closePrevOverlay); } catch (err, stack) { debugger(when: kDebugMode); ErrorHandler.logError(e: err, s: stack); @@ -72,6 +76,7 @@ class OverlayUtil { required String transformTargetId, backDropToDismiss = true, Color? borderColor, + bool closePrevOverlay = true, }) { try { final LayerLinkAndKey layerLinkAndKey = @@ -101,6 +106,7 @@ class OverlayUtil { offset: cardOffset, backDropToDismiss: backDropToDismiss, borderColor: borderColor, + closePrevOverlay: closePrevOverlay, ); } catch (err, stack) { debugger(when: kDebugMode); @@ -176,7 +182,7 @@ class OverlayUtil { return Offset(dx, dy); } - static bool get isOverlayOpen => MatrixState.pAnyState.overlay != null; + static bool get isOverlayOpen => MatrixState.pAnyState.entries.isNotEmpty; } class TransparentBackdrop extends StatelessWidget { diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index ba508906b..a120669ab 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -135,8 +135,8 @@ class ToolbarDisplayController { backgroundColor: const Color.fromRGBO(0, 0, 0, 1).withAlpha(100), ); - if (MatrixState.pAnyState.overlay != null) { - overlayId = MatrixState.pAnyState.overlay.hashCode.toString(); + if (MatrixState.pAnyState.entries.isNotEmpty) { + overlayId = MatrixState.pAnyState.entries.last.hashCode.toString(); } if (mode != null) { @@ -150,8 +150,11 @@ class ToolbarDisplayController { bool get highlighted { if (overlayId == null) return false; - if (MatrixState.pAnyState.overlay == null) overlayId = null; - return MatrixState.pAnyState.overlay.hashCode.toString() == overlayId; + if (MatrixState.pAnyState.entries.isEmpty) { + overlayId = null; + return false; + } + return MatrixState.pAnyState.entries.last.hashCode.toString() == overlayId; } } From e29951d5a4a2244140fd5be0d3b8ad8ab04fb016 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 24 Jun 2024 12:49:12 -0400 Subject: [PATCH 13/54] fix iOS version error after updating firebase packages --- ios/Podfile | 2 +- ios/Runner.xcodeproj/project.pbxproj | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index c8df069d3..fac4d8176 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '12.0' +platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 4d1ab7555..98f0adda2 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -475,7 +475,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -568,7 +568,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -617,7 +617,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; From 9c615e7b6604446b320f5789e0c6a9570db52e56 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Tue, 25 Jun 2024 10:21:27 -0400 Subject: [PATCH 14/54] Set max topic height, working on scroll --- .../class_description_button.dart | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart b/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart index 4fdb38604..4f231d1d0 100644 --- a/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart +++ b/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart @@ -26,14 +26,23 @@ class ClassDescriptionButton extends StatelessWidget { foregroundColor: iconColor, child: const Icon(Icons.topic_outlined), ), - subtitle: Text( - room.topic.isEmpty - ? (room.isRoomAdmin - ? (room.isSpace - ? L10n.of(context)!.classDescriptionDesc - : L10n.of(context)!.chatTopicDesc) - : L10n.of(context)!.topicNotSet) - : room.topic, + subtitle: ConstrainedBox( + constraints: const BoxConstraints( + maxHeight: 190, + ), + child: SingleChildScrollView( + // child: NestedScrollView( ??? + controller: ScrollController(), + child: Text( + room.topic.isEmpty + ? (room.isRoomAdmin + ? (room.isSpace + ? L10n.of(context)!.classDescriptionDesc + : L10n.of(context)!.chatTopicDesc) + : L10n.of(context)!.topicNotSet) + : room.topic, + ), + ), ), title: Text( room.isSpace From 2572f277b09c41f849b3322fdebf07fd8734d3a0 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Tue, 25 Jun 2024 11:35:28 -0400 Subject: [PATCH 15/54] Fix scrollbar weirdness --- lib/pages/chat_details/chat_details_view.dart | 1067 +++++++++-------- .../class_description_button.dart | 24 +- 2 files changed, 554 insertions(+), 537 deletions(-) diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart index ca8cb8b04..cf4668637 100644 --- a/lib/pages/chat_details/chat_details_view.dart +++ b/lib/pages/chat_details/chat_details_view.dart @@ -104,380 +104,170 @@ class ChatDetailsView extends StatelessWidget { backgroundColor: Theme.of(context).appBarTheme.backgroundColor, ), body: MaxWidthBody( - child: ListView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: members.length + 1 + (canRequestMoreMembers ? 1 : 0), - itemBuilder: (BuildContext context, int i) => i == 0 - ? Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Row( - children: [ - Padding( - padding: const EdgeInsets.all(32.0), - child: Stack( - children: [ - Material( - elevation: Theme.of(context) - .appBarTheme - .scrolledUnderElevation ?? - 4, - shadowColor: Theme.of(context) - .appBarTheme - .shadowColor, - shape: RoundedRectangleBorder( - side: BorderSide( - color: Theme.of(context).dividerColor, + // #Pangea + child: ScrollConfiguration( + behavior: + ScrollConfiguration.of(context).copyWith(scrollbars: false), + // Pangea# + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: members.length + 1 + (canRequestMoreMembers ? 1 : 0), + itemBuilder: (BuildContext context, int i) => i == 0 + ? Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + Padding( + padding: const EdgeInsets.all(32.0), + child: Stack( + children: [ + Material( + elevation: Theme.of(context) + .appBarTheme + .scrolledUnderElevation ?? + 4, + shadowColor: Theme.of(context) + .appBarTheme + .shadowColor, + shape: RoundedRectangleBorder( + side: BorderSide( + color: Theme.of(context).dividerColor, + ), + borderRadius: BorderRadius.circular( + Avatar.defaultSize * 2.5, + ), ), - borderRadius: BorderRadius.circular( - Avatar.defaultSize * 2.5, - ), - ), - child: Hero( - tag: controller - .widget.embeddedCloseButton != - null - ? 'embedded_content_banner' - : 'content_banner', - child: Avatar( - mxContent: room.avatar, - name: displayname, - size: Avatar.defaultSize * 2.5, - ), - ), - ), - if (!room.isDirectChat && - room.canChangeStateEvent( - EventTypes.RoomAvatar, - )) - Positioned( - bottom: 0, - right: 0, - child: FloatingActionButton.small( - onPressed: controller.setAvatarAction, - heroTag: null, - child: const Icon( - Icons.camera_alt_outlined, + child: Hero( + tag: controller.widget + .embeddedCloseButton != + null + ? 'embedded_content_banner' + : 'content_banner', + child: Avatar( + mxContent: room.avatar, + name: displayname, + size: Avatar.defaultSize * 2.5, ), ), ), - ], + if (!room.isDirectChat && + room.canChangeStateEvent( + EventTypes.RoomAvatar, + )) + Positioned( + bottom: 0, + right: 0, + child: FloatingActionButton.small( + onPressed: controller.setAvatarAction, + heroTag: null, + child: const Icon( + Icons.camera_alt_outlined, + ), + ), + ), + ], + ), ), - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextButton.icon( - onPressed: () => room.isDirectChat - ? null - : room.canChangeStateEvent( - EventTypes.RoomName, - ) - ? controller.setDisplaynameAction() - : FluffyShare.share( - displayname, - context, - copyOnly: true, - ), - icon: Icon( - room.isDirectChat - ? Icons.chat_bubble_outline + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextButton.icon( + onPressed: () => room.isDirectChat + ? null : room.canChangeStateEvent( EventTypes.RoomName, ) - ? Icons.edit_outlined - : Icons.copy_outlined, - size: 16, - ), - style: TextButton.styleFrom( - foregroundColor: Theme.of(context) - .colorScheme - .onSurface, - ), - label: Text( - room.isDirectChat - ? L10n.of(context)!.directChat - : displayname, - maxLines: 1, - overflow: TextOverflow.ellipsis, - // style: const TextStyle(fontSize: 18), - ), - ), - TextButton.icon( - onPressed: () => room.isDirectChat - ? null - : context.push( - '/rooms/${controller.roomId}/details/members', - ), - icon: const Icon( - Icons.group_outlined, - size: 14, - ), - style: TextButton.styleFrom( - foregroundColor: Theme.of(context) - .colorScheme - .secondary, - ), - label: Text( - L10n.of(context)!.countParticipants( - actualMembersCount, + ? controller + .setDisplaynameAction() + : FluffyShare.share( + displayname, + context, + copyOnly: true, + ), + icon: Icon( + room.isDirectChat + ? Icons.chat_bubble_outline + : room.canChangeStateEvent( + EventTypes.RoomName, + ) + ? Icons.edit_outlined + : Icons.copy_outlined, + size: 16, + ), + style: TextButton.styleFrom( + foregroundColor: Theme.of(context) + .colorScheme + .onSurface, + ), + label: Text( + room.isDirectChat + ? L10n.of(context)!.directChat + : displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + // style: const TextStyle(fontSize: 18), ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - // style: const TextStyle(fontSize: 12), ), - ), - ], + TextButton.icon( + onPressed: () => room.isDirectChat + ? null + : context.push( + '/rooms/${controller.roomId}/details/members', + ), + icon: const Icon( + Icons.group_outlined, + size: 14, + ), + style: TextButton.styleFrom( + foregroundColor: Theme.of(context) + .colorScheme + .secondary, + ), + label: Text( + L10n.of(context)!.countParticipants( + actualMembersCount, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + // style: const TextStyle(fontSize: 12), + ), + ), + ], + ), ), - ), - ], - ), - Divider( - height: 1, - color: Theme.of(context).dividerColor, - ), - // if (room.canSendEvent('m.room.name')) - if (room.isRoomAdmin) - // #Pangea - ClassNameButton( - room: room, - controller: controller, + ], ), - if (room.canSendEvent('m.room.topic')) - ClassDescriptionButton( - room: room, - controller: controller, + Divider( + height: 1, + color: Theme.of(context).dividerColor, ), - // #Pangea - RoomCapacityButton( - room: room, - controller: controller, - ), - // Pangea# - if ((room.isPangeaClass || room.isExchange) && - room.isRoomAdmin) - ListTile( - title: Text( - L10n.of(context)!.classAnalytics, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.analytics_outlined, - ), - ), - onTap: () => context.go( - '/rooms/analytics/${room.id}', - ), - ), - if (room.classSettings != null && room.isRoomAdmin) - ClassSettings( - roomId: controller.roomId, - startOpen: false, - ), - if (room.pangeaRoomRules != null) - RoomRulesEditor( - roomId: controller.roomId, - startOpen: false, - ), - // if (!room.canChangeStateEvent(EventTypes.RoomTopic)) - // ListTile( - // title: Text( - // L10n.of(context)!.chatDescription, - // style: TextStyle( - // color: Theme.of(context).colorScheme.secondary, - // fontWeight: FontWeight.bold, - // ), - // ), - // ) - // else - // Padding( - // padding: const EdgeInsets.all(16.0), - // child: TextButton.icon( - // onPressed: controller.setTopicAction, - // label: Text(L10n.of(context)!.setChatDescription), - // icon: const Icon(Icons.edit_outlined), - // style: TextButton.styleFrom( - // backgroundColor: Theme.of(context) - // .colorScheme - // .secondaryContainer, - // foregroundColor: Theme.of(context) - // .colorScheme - // .onSecondaryContainer, - // ), - // ), - // ), - // Padding( - // padding: const EdgeInsets.symmetric( - // horizontal: 16.0, - // ), - // child: SelectableLinkify( - // text: room.topic.isEmpty - // ? L10n.of(context)!.noChatDescriptionYet - // : room.topic, - // options: const LinkifyOptions(humanize: false), - // linkStyle: const TextStyle( - // color: Colors.blueAccent, - // decorationColor: Colors.blueAccent, - // ), - // style: TextStyle( - // fontSize: 14, - // fontStyle: room.topic.isEmpty - // ? FontStyle.italic - // : FontStyle.normal, - // color: - // Theme.of(context).textTheme.bodyMedium!.color, - // decorationColor: - // Theme.of(context).textTheme.bodyMedium!.color, - // ), - // onOpen: (url) => - // UrlLauncher(context, url.url).launchUrl(), - // ), - // ), - // const SizedBox(height: 16), - // Divider( - // height: 1, - // color: Theme.of(context).dividerColor, - // ), - // ListTile( - // leading: CircleAvatar( - // backgroundColor: - // Theme.of(context).scaffoldBackgroundColor, - // foregroundColor: iconColor, - // child: const Icon( - // Icons.insert_emoticon_outlined, - // ), - // ), - // title: - // Text(L10n.of(context)!.customEmojisAndStickers), - // subtitle: Text(L10n.of(context)!.setCustomEmotes), - // onTap: controller.goToEmoteSettings, - // trailing: const Icon(Icons.chevron_right_outlined), - // ), - // if (!room.isDirectChat) - // ListTile( - // leading: CircleAvatar( - // backgroundColor: - // Theme.of(context).scaffoldBackgroundColor, - // foregroundColor: iconColor, - // child: const Icon(Icons.shield_outlined), - // ), - // title: Text( - // L10n.of(context)!.accessAndVisibility, - // ), - // subtitle: Text( - // L10n.of(context)!.accessAndVisibilityDescription, - // ), - // onTap: () => context - // .push('/rooms/${room.id}/details/access'), - // trailing: const Icon(Icons.chevron_right_outlined), - // ), - // if (!room.isDirectChat) - if (!room.isDirectChat && - !room.isSpace && - room.isRoomAdmin) - // Pangea# - ListTile( - // #Pangea - // title: Text(L10n.of(context)!.chatPermissions), - title: Text( - L10n.of(context)!.editChatPermissions, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), - // Pangea# - subtitle: Text( - L10n.of(context)!.whoCanPerformWhichAction, - ), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.edit_attributes_outlined, - ), - ), - // #Pangea - // trailing: const Icon(Icons.chevron_right_outlined), - // Pangea# - onTap: () => context - .push('/rooms/${room.id}/details/permissions'), - ), - Divider( - height: 1, - color: Theme.of(context).dividerColor, - ), - // #Pangea - if (room.canInvite && - !room.isDirectChat && - (!room.isSpace || room.isRoomAdmin)) - ListTile( - title: Text( - room.isSpace - ? L10n.of(context)!.inviteUsersFromPangea - : L10n.of(context)!.inviteStudentByUserName, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: - Theme.of(context).textTheme.bodyLarge!.color, - child: const Icon( - Icons.add, - ), - ), - onTap: () => context.go('/rooms/${room.id}/invite'), - ), - if (room.showClassEditOptions && room.isSpace) - SpaceDetailsToggleAddStudentsTile( - controller: controller, - ), - if (controller.displayAddStudentOptions && - room.showClassEditOptions) - ClassInvitationButtons(roomId: controller.roomId!), - const Divider(height: 1), - if (!room.isSpace && - !room.isDirectChat && - room.canInvite) - ConversationBotSettings( - key: controller.addConversationBotKey, - room: room, - ), - const Divider(height: 1), - if (!room.isPangeaClass && - !room.isDirectChat && - room.isRoomAdmin) - AddToSpaceToggles( - roomId: room.id, - key: controller.addToSpaceKey, - startOpen: false, - mode: room.isExchange - ? AddToClassMode.exchange - : AddToClassMode.chat, - ), - const Divider(height: 1), - if (!room.isDirectChat) + // if (room.canSendEvent('m.room.name')) if (room.isRoomAdmin) + // #Pangea + ClassNameButton( + room: room, + controller: controller, + ), + if (room.canSendEvent('m.room.topic')) + ClassDescriptionButton( + room: room, + controller: controller, + ), + // #Pangea + RoomCapacityButton( + room: room, + controller: controller, + ), + // Pangea# + if ((room.isPangeaClass || room.isExchange) && + room.isRoomAdmin) ListTile( title: Text( - room.isSpace - ? L10n.of(context)!.archiveSpace - : L10n.of(context)!.archive, + L10n.of(context)!.classAnalytics, style: TextStyle( color: Theme.of(context).colorScheme.secondary, @@ -489,199 +279,424 @@ class ChatDetailsView extends StatelessWidget { Theme.of(context).scaffoldBackgroundColor, foregroundColor: iconColor, child: const Icon( - Icons.archive_outlined, + Icons.analytics_outlined, ), ), - onTap: () async { - OkCancelResult confirmed = OkCancelResult.ok; - bool shouldGo = false; - // archiveSpace has its own popup; only show if not space - if (!room.isSpace) { - confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - message: L10n.of(context)! - .archiveRoomDescription, - ); - } - if (confirmed == OkCancelResult.ok) { - if (room.isSpace) { - shouldGo = await room.archiveSpace( - context, - Matrix.of(context).client, - ); - } else { - final success = - await showFutureLoadingDialog( + onTap: () => context.go( + '/rooms/analytics/${room.id}', + ), + ), + if (room.classSettings != null && room.isRoomAdmin) + ClassSettings( + roomId: controller.roomId, + startOpen: false, + ), + if (room.pangeaRoomRules != null) + RoomRulesEditor( + roomId: controller.roomId, + startOpen: false, + ), + // if (!room.canChangeStateEvent(EventTypes.RoomTopic)) + // ListTile( + // title: Text( + // L10n.of(context)!.chatDescription, + // style: TextStyle( + // color: Theme.of(context).colorScheme.secondary, + // fontWeight: FontWeight.bold, + // ), + // ), + // ) + // else + // Padding( + // padding: const EdgeInsets.all(16.0), + // child: TextButton.icon( + // onPressed: controller.setTopicAction, + // label: Text(L10n.of(context)!.setChatDescription), + // icon: const Icon(Icons.edit_outlined), + // style: TextButton.styleFrom( + // backgroundColor: Theme.of(context) + // .colorScheme + // .secondaryContainer, + // foregroundColor: Theme.of(context) + // .colorScheme + // .onSecondaryContainer, + // ), + // ), + // ), + // Padding( + // padding: const EdgeInsets.symmetric( + // horizontal: 16.0, + // ), + // child: SelectableLinkify( + // text: room.topic.isEmpty + // ? L10n.of(context)!.noChatDescriptionYet + // : room.topic, + // options: const LinkifyOptions(humanize: false), + // linkStyle: const TextStyle( + // color: Colors.blueAccent, + // decorationColor: Colors.blueAccent, + // ), + // style: TextStyle( + // fontSize: 14, + // fontStyle: room.topic.isEmpty + // ? FontStyle.italic + // : FontStyle.normal, + // color: + // Theme.of(context).textTheme.bodyMedium!.color, + // decorationColor: + // Theme.of(context).textTheme.bodyMedium!.color, + // ), + // onOpen: (url) => + // UrlLauncher(context, url.url).launchUrl(), + // ), + // ), + // const SizedBox(height: 16), + // Divider( + // height: 1, + // color: Theme.of(context).dividerColor, + // ), + // ListTile( + // leading: CircleAvatar( + // backgroundColor: + // Theme.of(context).scaffoldBackgroundColor, + // foregroundColor: iconColor, + // child: const Icon( + // Icons.insert_emoticon_outlined, + // ), + // ), + // title: + // Text(L10n.of(context)!.customEmojisAndStickers), + // subtitle: Text(L10n.of(context)!.setCustomEmotes), + // onTap: controller.goToEmoteSettings, + // trailing: const Icon(Icons.chevron_right_outlined), + // ), + // if (!room.isDirectChat) + // ListTile( + // leading: CircleAvatar( + // backgroundColor: + // Theme.of(context).scaffoldBackgroundColor, + // foregroundColor: iconColor, + // child: const Icon(Icons.shield_outlined), + // ), + // title: Text( + // L10n.of(context)!.accessAndVisibility, + // ), + // subtitle: Text( + // L10n.of(context)!.accessAndVisibilityDescription, + // ), + // onTap: () => context + // .push('/rooms/${room.id}/details/access'), + // trailing: const Icon(Icons.chevron_right_outlined), + // ), + // if (!room.isDirectChat) + if (!room.isDirectChat && + !room.isSpace && + room.isRoomAdmin) + // Pangea# + ListTile( + // #Pangea + // title: Text(L10n.of(context)!.chatPermissions), + title: Text( + L10n.of(context)!.editChatPermissions, + style: TextStyle( + color: + Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + // Pangea# + subtitle: Text( + L10n.of(context)!.whoCanPerformWhichAction, + ), + leading: CircleAvatar( + backgroundColor: + Theme.of(context).scaffoldBackgroundColor, + foregroundColor: iconColor, + child: const Icon( + Icons.edit_attributes_outlined, + ), + ), + // #Pangea + // trailing: const Icon(Icons.chevron_right_outlined), + // Pangea# + onTap: () => context.push( + '/rooms/${room.id}/details/permissions'), + ), + Divider( + height: 1, + color: Theme.of(context).dividerColor, + ), + // #Pangea + if (room.canInvite && + !room.isDirectChat && + (!room.isSpace || room.isRoomAdmin)) + ListTile( + title: Text( + room.isSpace + ? L10n.of(context)!.inviteUsersFromPangea + : L10n.of(context)!.inviteStudentByUserName, + style: TextStyle( + color: + Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + leading: CircleAvatar( + backgroundColor: + Theme.of(context).scaffoldBackgroundColor, + foregroundColor: Theme.of(context) + .textTheme + .bodyLarge! + .color, + child: const Icon( + Icons.add, + ), + ), + onTap: () => + context.go('/rooms/${room.id}/invite'), + ), + if (room.showClassEditOptions && room.isSpace) + SpaceDetailsToggleAddStudentsTile( + controller: controller, + ), + if (controller.displayAddStudentOptions && + room.showClassEditOptions) + ClassInvitationButtons(roomId: controller.roomId!), + const Divider(height: 1), + if (!room.isSpace && + !room.isDirectChat && + room.canInvite) + ConversationBotSettings( + key: controller.addConversationBotKey, + room: room, + ), + const Divider(height: 1), + if (!room.isPangeaClass && + !room.isDirectChat && + room.isRoomAdmin) + AddToSpaceToggles( + roomId: room.id, + key: controller.addToSpaceKey, + startOpen: false, + mode: room.isExchange + ? AddToClassMode.exchange + : AddToClassMode.chat, + ), + const Divider(height: 1), + if (!room.isDirectChat) + if (room.isRoomAdmin) + ListTile( + title: Text( + room.isSpace + ? L10n.of(context)!.archiveSpace + : L10n.of(context)!.archive, + style: TextStyle( + color: + Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + leading: CircleAvatar( + backgroundColor: + Theme.of(context).scaffoldBackgroundColor, + foregroundColor: iconColor, + child: const Icon( + Icons.archive_outlined, + ), + ), + onTap: () async { + OkCancelResult confirmed = OkCancelResult.ok; + bool shouldGo = false; + // archiveSpace has its own popup; only show if not space + if (!room.isSpace) { + confirmed = await showOkCancelAlertDialog( + useRootNavigator: false, context: context, - future: () async { - await room.archive(); - }, + title: L10n.of(context)!.areYouSure, + okLabel: L10n.of(context)!.ok, + cancelLabel: L10n.of(context)!.cancel, + message: L10n.of(context)! + .archiveRoomDescription, ); - shouldGo = (success.error == null); } - if (shouldGo) { - context.go('/rooms'); - } - } - }, - ), - ListTile( - title: Text( - L10n.of(context)!.leave, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.arrow_forward, - ), - ), - onTap: () async { - OkCancelResult confirmed = OkCancelResult.ok; - bool shouldGo = false; - // If user is only admin, room will be archived - final bool onlyAdmin = await room.isOnlyAdmin(); - // archiveSpace has its own popup; only show if not space - if (!room.isSpace) { - confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - message: onlyAdmin - ? L10n.of(context)!.onlyAdminDescription - : L10n.of(context)!.leaveRoomDescription, - ); - } - if (confirmed == OkCancelResult.ok) { - if (room.isSpace) { - shouldGo = onlyAdmin - ? await room.archiveSpace( - context, - Matrix.of(context).client, - onlyAdmin: true, - ) - : await room.leaveSpace( + if (confirmed == OkCancelResult.ok) { + if (room.isSpace) { + shouldGo = await room.archiveSpace( context, Matrix.of(context).client, ); - } else { - final success = await showFutureLoadingDialog( - context: context, - future: () async { - onlyAdmin - ? await room.archive() - : await room.leave(); - }, - ); - shouldGo = (success.error == null); - } - if (shouldGo) { - context.go('/rooms'); - } - } - }, - ), - if (room.isRoomAdmin && !room.isDirectChat) - SwitchListTile.adaptive( - activeColor: AppConfig.activeToggleColor, + } else { + final success = + await showFutureLoadingDialog( + context: context, + future: () async { + await room.archive(); + }, + ); + shouldGo = (success.error == null); + } + if (shouldGo) { + context.go('/rooms'); + } + } + }, + ), + ListTile( title: Text( - room.isSpace - ? L10n.of(context)!.lockSpace - : L10n.of(context)!.lockChat, + L10n.of(context)!.leave, style: TextStyle( color: Theme.of(context).colorScheme.secondary, fontWeight: FontWeight.bold, ), ), - secondary: CircleAvatar( + leading: CircleAvatar( backgroundColor: Theme.of(context).scaffoldBackgroundColor, foregroundColor: iconColor, - child: Icon( - room.isLocked - ? Icons.lock_outlined - : Icons.no_encryption_outlined, + child: const Icon( + Icons.arrow_forward, ), ), - value: room.isLocked, - onChanged: (value) => showFutureLoadingDialog( - context: context, - future: () => value - ? lockRoom( - room, - Matrix.of(context).client, - ) - : unlockRoom( - room, - Matrix.of(context).client, - ), + onTap: () async { + OkCancelResult confirmed = OkCancelResult.ok; + bool shouldGo = false; + // If user is only admin, room will be archived + final bool onlyAdmin = await room.isOnlyAdmin(); + // archiveSpace has its own popup; only show if not space + if (!room.isSpace) { + confirmed = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context)!.areYouSure, + okLabel: L10n.of(context)!.ok, + cancelLabel: L10n.of(context)!.cancel, + message: onlyAdmin + ? L10n.of(context)!.onlyAdminDescription + : L10n.of(context)!.leaveRoomDescription, + ); + } + if (confirmed == OkCancelResult.ok) { + if (room.isSpace) { + shouldGo = onlyAdmin + ? await room.archiveSpace( + context, + Matrix.of(context).client, + onlyAdmin: true, + ) + : await room.leaveSpace( + context, + Matrix.of(context).client, + ); + } else { + final success = await showFutureLoadingDialog( + context: context, + future: () async { + onlyAdmin + ? await room.archive() + : await room.leave(); + }, + ); + shouldGo = (success.error == null); + } + if (shouldGo) { + context.go('/rooms'); + } + } + }, + ), + if (room.isRoomAdmin && !room.isDirectChat) + SwitchListTile.adaptive( + activeColor: AppConfig.activeToggleColor, + title: Text( + room.isSpace + ? L10n.of(context)!.lockSpace + : L10n.of(context)!.lockChat, + style: TextStyle( + color: + Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + secondary: CircleAvatar( + backgroundColor: + Theme.of(context).scaffoldBackgroundColor, + foregroundColor: iconColor, + child: Icon( + room.isLocked + ? Icons.lock_outlined + : Icons.no_encryption_outlined, + ), + ), + value: room.isLocked, + onChanged: (value) => showFutureLoadingDialog( + context: context, + future: () => value + ? lockRoom( + room, + Matrix.of(context).client, + ) + : unlockRoom( + room, + Matrix.of(context).client, + ), + ), + ), + const Divider(height: 1), + // Pangea# + ListTile( + title: Text( + L10n.of(context)!.countParticipants( + actualMembersCount.toString(), + ), + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), ), ), - const Divider(height: 1), - // Pangea# - ListTile( - title: Text( - L10n.of(context)!.countParticipants( - actualMembersCount.toString(), + // #Pangea + // if (!room.isDirectChat && room.canInvite) + // ListTile( + // title: Text(L10n.of(context)!.inviteContact), + // leading: CircleAvatar( + // backgroundColor: Theme.of(context) + // .colorScheme + // .primaryContainer, + // foregroundColor: Theme.of(context) + // .colorScheme + // .onPrimaryContainer, + // radius: Avatar.defaultSize / 2, + // child: const Icon(Icons.add_outlined), + // ), + // trailing: const Icon(Icons.chevron_right_outlined), + // onTap: () => context.go('/rooms/${room.id}/invite'), + // ), + // Pangea# + ], + ) + : i < members.length + 1 + ? ParticipantListItem(members[i - 1]) + : ListTile( + title: Text( + L10n.of(context)!.loadCountMoreParticipants( + (actualMembersCount - members.length) + .toString(), + ), ), - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, + leading: CircleAvatar( + backgroundColor: + Theme.of(context).scaffoldBackgroundColor, + child: const Icon( + Icons.group_outlined, + color: Colors.grey, + ), ), - ), - ), - // #Pangea - // if (!room.isDirectChat && room.canInvite) - // ListTile( - // title: Text(L10n.of(context)!.inviteContact), - // leading: CircleAvatar( - // backgroundColor: Theme.of(context) - // .colorScheme - // .primaryContainer, - // foregroundColor: Theme.of(context) - // .colorScheme - // .onPrimaryContainer, - // radius: Avatar.defaultSize / 2, - // child: const Icon(Icons.add_outlined), - // ), - // trailing: const Icon(Icons.chevron_right_outlined), - // onTap: () => context.go('/rooms/${room.id}/invite'), - // ), - // Pangea# - ], - ) - : i < members.length + 1 - ? ParticipantListItem(members[i - 1]) - : ListTile( - title: Text( - L10n.of(context)!.loadCountMoreParticipants( - (actualMembersCount - members.length).toString(), + onTap: () => context.push( + '/rooms/${controller.roomId!}/details/members', ), + trailing: const Icon(Icons.chevron_right_outlined), ), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - child: const Icon( - Icons.group_outlined, - color: Colors.grey, - ), - ), - onTap: () => context.push( - '/rooms/${controller.roomId!}/details/members', - ), - trailing: const Icon(Icons.chevron_right_outlined), - ), + ), ), ), ); diff --git a/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart b/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart index 4f231d1d0..24c934953 100644 --- a/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart +++ b/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart @@ -30,17 +30,19 @@ class ClassDescriptionButton extends StatelessWidget { constraints: const BoxConstraints( maxHeight: 190, ), - child: SingleChildScrollView( - // child: NestedScrollView( ??? - controller: ScrollController(), - child: Text( - room.topic.isEmpty - ? (room.isRoomAdmin - ? (room.isSpace - ? L10n.of(context)!.classDescriptionDesc - : L10n.of(context)!.chatTopicDesc) - : L10n.of(context)!.topicNotSet) - : room.topic, + child: Scrollbar( + child: SingleChildScrollView( + primary: false, + controller: ScrollController(), + child: Text( + room.topic.isEmpty + ? (room.isRoomAdmin + ? (room.isSpace + ? L10n.of(context)!.classDescriptionDesc + : L10n.of(context)!.chatTopicDesc) + : L10n.of(context)!.topicNotSet) + : room.topic, + ), ), ), ), From aab10ff613bd8afbcb93a09d060ab5b3e642e154 Mon Sep 17 00:00:00 2001 From: WilsonLe Date: Tue, 25 Jun 2024 11:52:36 -0400 Subject: [PATCH 16/54] add custom mode and propagate user inputs to state events --- lib/pangea/constants/model_keys.dart | 1 - lib/pangea/models/bot_options_model.dart | 31 +++++++++---------- .../conversation_bot_custom_zone.dart | 5 +-- .../conversation_bot_discussion_zone.dart | 4 +-- .../conversation_bot_settings.dart | 4 ++- 5 files changed, 22 insertions(+), 23 deletions(-) diff --git a/lib/pangea/constants/model_keys.dart b/lib/pangea/constants/model_keys.dart index dca53288d..502435479 100644 --- a/lib/pangea/constants/model_keys.dart +++ b/lib/pangea/constants/model_keys.dart @@ -99,7 +99,6 @@ class ModelKey { static const String languageLevel = "difficulty"; static const String safetyModeration = "safety_moderation"; static const String mode = "mode"; - static const String custom = "custom"; static const String discussionTopic = "discussion_topic"; static const String discussionKeywords = "discussion_keywords"; static const String discussionTriggerReactionEnabled = diff --git a/lib/pangea/models/bot_options_model.dart b/lib/pangea/models/bot_options_model.dart index 0e1019e62..179461a34 100644 --- a/lib/pangea/models/bot_options_model.dart +++ b/lib/pangea/models/bot_options_model.dart @@ -13,14 +13,13 @@ class BotOptionsModel { List keywords; bool safetyModeration; String mode; - String? custom; String? discussionTopic; String? discussionKeywords; - bool discussionTriggerReactionEnabled; - String discussionTriggerReactionKey; + bool? discussionTriggerReactionEnabled; + String? discussionTriggerReactionKey; String? customSystemPrompt; - bool customTriggerReactionEnabled; - String customTriggerReactionKey; + bool? customTriggerReactionEnabled; + String? customTriggerReactionKey; BotOptionsModel({ //////////////////////////////////////////////////////////////////////////// @@ -63,15 +62,17 @@ class BotOptionsModel { discussionTopic: json[ModelKey.discussionTopic], discussionKeywords: json[ModelKey.discussionKeywords], discussionTriggerReactionEnabled: - json[ModelKey.discussionTriggerReactionEnabled], - discussionTriggerReactionKey: json[ModelKey.discussionTriggerReactionKey], + json[ModelKey.discussionTriggerReactionEnabled] ?? true, + discussionTriggerReactionKey: + json[ModelKey.discussionTriggerReactionKey] ?? "⏩", ////////////////////////////////////////////////////////////////////////// // Custom Mode Options ////////////////////////////////////////////////////////////////////////// customSystemPrompt: json[ModelKey.customSystemPrompt], - customTriggerReactionEnabled: json[ModelKey.customTriggerReactionEnabled], - customTriggerReactionKey: json[ModelKey.customTriggerReactionKey], + customTriggerReactionEnabled: + json[ModelKey.customTriggerReactionEnabled] ?? true, + customTriggerReactionKey: json[ModelKey.customTriggerReactionKey] ?? "⏩", ); } @@ -82,17 +83,16 @@ class BotOptionsModel { data[ModelKey.languageLevel] = languageLevel; data[ModelKey.safetyModeration] = safetyModeration; data[ModelKey.mode] = mode; - data[ModelKey.custom] = custom; data[ModelKey.discussionTopic] = discussionTopic; data[ModelKey.discussionKeywords] = discussionKeywords; data[ModelKey.discussionTriggerReactionEnabled] = - discussionTriggerReactionEnabled; + discussionTriggerReactionEnabled ?? true; data[ModelKey.discussionTriggerReactionKey] = - discussionTriggerReactionKey; + discussionTriggerReactionKey ?? "⏩"; data[ModelKey.customSystemPrompt] = customSystemPrompt; data[ModelKey.customTriggerReactionEnabled] = - customTriggerReactionEnabled; - data[ModelKey.customTriggerReactionKey] = customTriggerReactionKey; + customTriggerReactionEnabled ?? true; + data[ModelKey.customTriggerReactionKey] = customTriggerReactionKey ?? "⏩"; return data; } catch (e, s) { debugger(when: kDebugMode); @@ -113,9 +113,6 @@ class BotOptionsModel { case ModelKey.mode: mode = value; break; - case ModelKey.custom: - custom = value; - break; case ModelKey.discussionTopic: discussionTopic = value; break; diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_custom_zone.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_custom_zone.dart index 46f87237c..553de7182 100644 --- a/lib/pangea/widgets/conversation_bot/conversation_bot_custom_zone.dart +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_custom_zone.dart @@ -16,6 +16,7 @@ class ConversationBotCustomZone extends StatelessWidget { @override Widget build(BuildContext context) { + print(initialBotOptions.toJson()); return Column( children: [ const SizedBox(height: 12), @@ -59,9 +60,9 @@ class ConversationBotCustomZone extends StatelessWidget { .conversationBotCustomZone_customTriggerReactionEnabledLabel, ), enabled: false, - value: initialBotOptions.customTriggerReactionEnabled, + value: initialBotOptions.customTriggerReactionEnabled ?? true, onChanged: (value) { - initialBotOptions.customTriggerReactionEnabled = value ?? false; + initialBotOptions.customTriggerReactionEnabled = value ?? true; initialBotOptions.customTriggerReactionKey = "⏩"; // hard code this for now onChanged.call(initialBotOptions); diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_discussion_zone.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_discussion_zone.dart index ed642a391..2bb4d7a76 100644 --- a/lib/pangea/widgets/conversation_bot/conversation_bot_discussion_zone.dart +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_discussion_zone.dart @@ -82,9 +82,9 @@ class ConversationBotDiscussionZone extends StatelessWidget { .conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel, ), enabled: false, - value: initialBotOptions.discussionTriggerReactionEnabled ?? false, + value: initialBotOptions.discussionTriggerReactionEnabled ?? true, onChanged: (value) { - initialBotOptions.discussionTriggerReactionEnabled = value ?? false; + initialBotOptions.discussionTriggerReactionEnabled = value ?? true; initialBotOptions.discussionTriggerReactionKey = "⏩"; // hard code this for now onChanged.call(initialBotOptions); diff --git a/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart b/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart index 6b57ca3a4..226b728d7 100644 --- a/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart +++ b/lib/pangea/widgets/conversation_bot/conversation_bot_settings.dart @@ -47,7 +47,9 @@ class ConversationBotSettingsState extends State { void initState() { super.initState(); isOpen = widget.startOpen; - botOptions = widget.room?.botOptions ?? BotOptionsModel(); + botOptions = widget.room?.botOptions != null + ? BotOptionsModel.fromJson(widget.room?.botOptions?.toJson()) + : BotOptionsModel(); widget.room?.isBotRoom.then((bool isBotRoom) { setState(() { addBot = isBotRoom; From 6ecccbbc3e11fcc693fa16573b1dc5965a803b9a Mon Sep 17 00:00:00 2001 From: WilsonLe Date: Tue, 25 Jun 2024 15:02:23 -0400 Subject: [PATCH 17/54] remove excess int files --- assets/l10n/intl_fil 2.arb | 870 ------------------------------------- assets/l10n/intl_ka 2.arb | 744 ------------------------------- needed-translations.txt | 3 - 3 files changed, 1617 deletions(-) delete mode 100644 assets/l10n/intl_fil 2.arb delete mode 100644 assets/l10n/intl_ka 2.arb diff --git a/assets/l10n/intl_fil 2.arb b/assets/l10n/intl_fil 2.arb deleted file mode 100644 index 07ef65218..000000000 --- a/assets/l10n/intl_fil 2.arb +++ /dev/null @@ -1,870 +0,0 @@ -{ - "remove": "Tanggalin", - "@remove": { - "type": "text", - "placeholders": {} - }, - "importNow": "I-import ngayon", - "@importNow": {}, - "importEmojis": "I-import ang mga Emoji", - "@importEmojis": {}, - "importFromZipFile": "Mag-import mula sa .zip file", - "@importFromZipFile": {}, - "exportEmotePack": "I-export ang Emote pack bilang .zip", - "@exportEmotePack": {}, - "accept": "Tanggapin", - "@accept": { - "type": "text", - "placeholders": {} - }, - "account": "Account", - "@account": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Magdagdag ng email", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "confirmMatrixId": "Paki-kumpirma ang iyong Matrix ID para burahin ang iyong account.", - "@confirmMatrixId": {}, - "addChatDescription": "Magdagdag ng deskripsyon ng chat...", - "@addChatDescription": {}, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alyas", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Lahat", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Lahat ng mga chat", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "commandHint_googly": "Magpadala ng mga googly eye", - "@commandHint_googly": {}, - "commandHint_cuddle": "Magpadala ng yakap", - "@commandHint_cuddle": {}, - "cuddleContent": "Niyakap ka ni {senderName}", - "@cuddleContent": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "hugContent": "Niyakap ka ni {senderName}", - "@hugContent": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Pwede sumali ang anumang tao", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Lock ng app", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Archive", - "@archive": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Pwede ba sumali ang mga bisita", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Sigurado ka?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Tanggapin ang hiling ng verification mula sa {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "autoplayImages": "Awtomatikong i-play ang mga gumagalaw na sticker at emote", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "sendTypingNotifications": "Ipadala ang mga typing notification", - "@sendTypingNotifications": {}, - "blockDevice": "I-block ang Device", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Na-block", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Palitan ang pangalan ng device", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "Pinalitan ni {username} ang avatar ng chat", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRules": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibility": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history sa: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheRoomAliases": "Pinalitan ni {username} ang mga alias ng room", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changePassword": "Palitan ang password", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Palitan ang iyong avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Nasira ang encryption", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Pag-backup ng chat", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Mga detalye ng chat", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Nadagdag ang chat sa space na ito", - "@chatHasBeenAddedToThisSpace": {}, - "chats": "Mga Chat", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Pumili ng malakas na password", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "I-clear ang archive", - "@clearArchive": {}, - "close": "Isara", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_markasgroup": "Markahan bilang grupo", - "@commandHint_markasgroup": {}, - "commandHint_ban": "Pagbawalan ang ibinigay na user sa room na ito", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "repeatPassword": "Ulitin ang password", - "@repeatPassword": {}, - "notAnImage": "Hindi isang file na larawan.", - "@notAnImage": {}, - "replace": "Palitan", - "@replace": {}, - "about": "Tungkol sa", - "@about": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "👍 Tinanggap ni {username} ang imbitasyon", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "activatedEndToEndEncryption": "🔐 Na-activate ni {username} ang end to end encryption", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "supposedMxid": "Dapat ito ay {mxid}", - "@supposedMxid": { - "type": "text", - "placeholders": { - "mxid": {} - } - }, - "addToSpace": "Idagdag sa space", - "@addToSpace": {}, - "commandHint_hug": "Magpadala ng yakap", - "@commandHint_hug": {}, - "googlyEyesContent": "Nagpadala si {senderName} ng googly eyes", - "@googlyEyesContent": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "answeredTheCall": "Sinagot ni {senderName} ang tawag", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "areYouSureYouWantToLogout": "Sigurado kang gusto mong mag-log out?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Para i-sign ang isa pang tao, pakilagay ang iyong secure store passphrase o recovery key.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Ang homeserver ay sinusuportahan ang sumusunod na uri ng login:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "sendOnEnter": "Ipadala sa pagpindot ng enter", - "@sendOnEnter": {}, - "badServerVersionsException": "Ang homeserver ay sinusuportahan ang mga Spec bersyon:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Pagbawalan sa chat", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Pinagbawalan", - "@banned": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Mga mensahe ng bot", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cancel": "Kanselahin", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "Pinagbawalan ni {username} si {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "cantOpenUri": "Hindi mabuksan ang URI na {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changedTheJoinRules": "Pinalitan ni {username} ang mga tuntunin sa pagsali", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pagsali sa: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheChatDescriptionTo": "Pinalitan ni {username} ang deskripsyon ng chat sa: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheProfileAvatar": "Pinalitan ni {username} ang kanilang avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatNameTo": "Pinalitan ni {username} ang pangalan ng chat sa: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheRoomInvitationLink": "Pinalitan ni {username} ang link ng imbitasyon", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changeTheHomeserver": "Palitan ang homeserver", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Palitan ang iyong istilio", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changedTheChatPermissions": "Pinalitan ni {username} ang mga pahintulot ng chat", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changeTheNameOfTheGroup": "Palitan ng pangalan ng grupo", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changedTheDisplaynameTo": "Pinalitan ni {username} ang kanilang displayname sa: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "yourChatBackupHasBeenSetUp": "Na-set up na ang iyong chat backup.", - "@yourChatBackupHasBeenSetUp": {}, - "chatBackupDescription": "Naka-secure ang iyong mga lumang mensahe gamit ng recovery key. Siguraduhing hindi mo ito mawalan.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "commandHint_markasdm": "Markahan bilang direktang mensahe na room para sa ibinigay na Matrix ID", - "@commandHint_markasdm": {}, - "changedTheGuestAccessRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita sa: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "commandHint_clearcache": "I-clear ang cache", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_discardsession": "Iwaksi ang sesyon", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_create": "Gumawa ng walang lamang group chat\nGumamit ng --no-encryption para i-disable ang encryption", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "configureChat": "I-configure ang chat", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Kumpirmahin", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Paki-kumpara ang mga numero", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Kinopya sa clipboard", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopyahin", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopyahin sa clipboard", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} mga kasali", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "createdTheChat": "💬 Ginawa ni {username} ang chat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createGroup": "Gumawa ng grupo", - "@createGroup": {}, - "createNewSpace": "Bagong space", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Kasalukuyang aktibo", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Madilim", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Pinalitan na ang display name", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "directChats": "Mga Direktang Chat", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "allRooms": "Lahat ng Mga Group Chat", - "@allRooms": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "I-download ang file", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "I-edit ang mga naka-block na server", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "chatPermissions": "Mga pahintulot ng chat", - "@chatPermissions": {}, - "editDisplayname": "I-edit ang display name", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "I-edit ang mga alyas ng room", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "edit": "I-edit", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "I-edit ang avatar ng room", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Umiiral na ang emote!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Walang lamang chat", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "I-enable ang encryption", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "encryption": "Pag-encrypt", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Naka-encrypt", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Hindi naka-enable ang encryption", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Handa na ang lahat!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "appLockDescription": "I-lock ang app kapag hindi ginagamit sa pamamagitan ng pin code", - "@appLockDescription": {}, - "commandHint_dm": "Magsimula ng direktong chat\nGumamit ng --no-encryptiom para i-disable ang encryption", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_html": "Magpadala ng HTML-formatted na text", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Imbitahan ang ibinigay na user sa room na ito", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Sumali sa ibinigay na room", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Tanggalin ang ibinigay na user sa room na ito", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Umalis sa room na ito", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Ilarawan ang iyong sarili", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Ilapat ang iyong larawan para sa room na ito (bilang mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Ilapat ang iyong display name para sa room na ito", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Ilapat ang level ng lakas sa ibinigay na user (default: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_react": "Magpadala ng reply bilang reaksyon", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Magpadala ng text", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "I-unban ang ibinigay na user sa room na ito", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Hindi wastong command", - "@commandInvalid": { - "type": "text" - }, - "compareEmojiMatch": "Paki-kumpara ang mga emoji", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "connect": "Kumonekta", - "@connect": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Naglalaman ng display name", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "create": "Gumawa", - "@create": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}/{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{month}/{day}/{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Ide-deactivate nito ang iyong user account. Hindi na ito maaaring bawiin! Sigurado ka?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "delete": "Burahin", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Burahin ang mensahe", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "device": "Device", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID ng Device", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Mga Device", - "@devices": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Hindi wastong shortcode ng emote!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteKeyboardNoRecents": "Ang mga kamakailang ginamit na emote ay lalabas dito...", - "@emoteKeyboardNoRecents": { - "type": "text", - "placeholders": {} - }, - "calls": "Mga Tawag", - "@calls": {}, - "customEmojisAndStickers": "Mga custom emoji at sticker", - "@customEmojisAndStickers": {}, - "customEmojisAndStickersBody": "Magdagdag o magbahagi ng mga custom emoji o sticker na maaring gamitin sa anumang chat.", - "@customEmojisAndStickersBody": {}, - "emoteShortcode": "Shortcode ng emoji", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Kailangan mong pumili ng emote shortcode at isang larawan!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "I-enable ang emote pack globally", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "Tinapos ni {senderName} ang tawag", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAnEmailAddress": "Maglagay ng email address", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "homeserver": "Homeserver", - "@homeserver": {}, - "enterYourHomeserver": "Ilagay ang iyong homeserver", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Lubhang nakakasakit", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "commandHint_plain": "Magpadala ng hindi na-format na text", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandMissing": "Hindi isang command ang {command}.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "contactHasBeenInvitedToTheGroup": "Inimbita ang contact sa group", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Naglalaman ng username", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Inulat ang nilalaman sa mga pangangasiwa ng server", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Hindi ma-decrypt ang mensahe: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "defaultPermissionLevel": "Default na antas ng pahintulot", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Burahin ang account", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Mga emote pack para sa room", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Mga Setting ng Emote", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "globalChatId": "Global chat ID", - "@globalChatId": {}, - "accessAndVisibility": "Pag-access at visibility", - "@accessAndVisibility": {}, - "accessAndVisibilityDescription": "Sino ang pinapayagang sumali sa chat at paano matutuklas ang chat.", - "@accessAndVisibilityDescription": {}, - "enableEncryptionWarning": "Hindi mo madi-disable ang encryption. Sigurado ka ba?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Hindi makuha ang lokasyon: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "fileName": "Pangalan ng file", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Laki ng font", - "@fontSize": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_ka 2.arb b/assets/l10n/intl_ka 2.arb deleted file mode 100644 index 8c99e3c9a..000000000 --- a/assets/l10n/intl_ka 2.arb +++ /dev/null @@ -1,744 +0,0 @@ -{ - "alias": "მეტსახელი", - "@alias": { - "type": "text", - "placeholders": {} - }, - "appLockDescription": "პინკოდის გამოყენების გარეშე აპლიკაციის ბლოკირება", - "@appLockDescription": {}, - "commandHint_hug": "მეგობრული ჩახუტვის გაგზავნა", - "@commandHint_hug": {}, - "areYouSure": "დარწმუნებული ხართ?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "დარწმუნებული ხართ, რომ გამოსვლა გსურთ?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "hugContent": "{senderName} მეგობრულად გეხუტება", - "@hugContent": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "askSSSSSign": "სხვა მომხმარებლის დადასტურებლად, გთხოვთ, ჩაწეროთ თქვენი ან საიდუმლო ფრაზა, ან აღდგენის გასაღები.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "ანიმირებული სტიკერებისა და ემოჯების ავტომატური ჩართვა", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "banFromChat": "ჩატიდან გაგდება და ბლოკირება", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "დაბლოკილია", - "@banned": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "ამ სერვერს აქვს შესვლის მეთოდების მხარდაჭერა:\n{serverVersions}\nმაგრამ ამ აპლიკაციას აქვს მხარდაჭერა მხოლოდ:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "sendOnEnter": "გაგზავნა enter-ის დაჭერისას", - "@sendOnEnter": {}, - "bannedUser": "{username} დაბლოკა {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "მოწყობილების ბლოკირება", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "დაბლოკილია", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "ბოტის შეტყობინებები", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cancel": "გაუქმება", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changedTheHistoryVisibilityTo": "{username} შეცვალა ისტორიის ხილვადობა: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} გაწევრიანების წესები შეცვალა", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheProfileAvatar": "{username} შეცვალა პროფილის ფოტო", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "chat": "ჩატი", - "@chat": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "პროფილის ფოტოს შეცვლა", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "yourChatBackupHasBeenSetUp": "თქვენი ჩატის სარეზერვო საშუალება კონფიგურირებული იქნა.", - "@yourChatBackupHasBeenSetUp": {}, - "channelCorruptedDecryptError": "დაშიფვრა დაზიანდა", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "თქვენი ძველი შეტყობინებები დაცულია აღდგების გასაღებით. არ დაკარგოთ ის.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "commandHint_discardsession": "სესიის გაუქმება", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_invite": "მოცემული მომხმარებლის მოწვევა ამ ოთახში", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_plain": "არაფორმატირებული ტექსტის გაგზავნა", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_send": "ტექსტის გაგზავნა", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandMissing": "{command} არაა ბრძანება.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "confirm": "დადასტურება", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "დაკავშირება", - "@connect": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} მონაწილე", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "createGroup": "ჯგუფის შექმნა", - "@createGroup": {}, - "deactivateAccountWarning": "ეს გააუქმებს თქვენს ანგარიშს. ამის გაუქმება შეუძლებელია. დარწმუნებული ხართ?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "devices": "მოწყობილებები", - "@devices": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "ბნელი", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "chatPermissions": "ჩატის უფლებები", - "@chatPermissions": {}, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "editRoomAliases": "ოთახის მეტსახელების შეცვლა", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "ეს ემოცია უკვე არსებობს!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "ემოციის არასწორი მოკლე კოდი!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "importNow": "იმპორტი", - "@importNow": {}, - "importEmojis": "ემოჯის იმპორტი", - "@importEmojis": {}, - "importFromZipFile": "იმპორტი .zip ფაილიდან", - "@importFromZipFile": {}, - "exportEmotePack": "ემოციების .zip ფაილში ექსპორტი", - "@exportEmotePack": {}, - "replace": "ჩანაცვლება", - "@replace": {}, - "accept": "თანხმობა", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "👍 {username} მიიღო მოწვევა", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "ანგარიში", - "@account": { - "type": "text", - "placeholders": {} - }, - "addEmail": "ელ.ფოსტის დამატება", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "confirmMatrixId": "გთხოვთ, დაადასტუროთ თქვენი Matrix ID ანგარიშის წაშლისათვის.", - "@confirmMatrixId": {}, - "addChatDescription": "ჩატის აღწერილობის დამატება...", - "@addChatDescription": {}, - "addToSpace": "სივრცეში დამატება", - "@addToSpace": {}, - "admin": "ადმინი", - "@admin": { - "type": "text", - "placeholders": {} - }, - "all": "ყველა", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "ყველა ჩატი", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "commandHint_cuddle": "ჩახუტების გაგზავნა", - "@commandHint_cuddle": {}, - "answeredTheCall": "{senderName} უპასუხა ზარს", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "ყველას შეუძლია გაწევრიანება", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "აპლიკაციის ბლოკირება", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "არქივი", - "@archive": { - "type": "text", - "placeholders": {} - }, - "commandHint_googly": "გამოშტერილი თვალების გაგზავნა", - "@commandHint_googly": {}, - "googlyEyesContent": "{senderName} გამოშტერილ თვალებს გიგზავნის", - "@googlyEyesContent": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "cuddleContent": "{senderName} გეხუტება", - "@cuddleContent": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "areGuestsAllowedToJoin": "შეუძლიათ თუ არა სტუმარ მომხმარებლებს გაწევრიანება", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "მიიღებთ {username} დადასტურების მოთხოვნას?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sendTypingNotifications": "წერის შეტყობინების გაგზავნა", - "@sendTypingNotifications": {}, - "cantOpenUri": "ვერ იხსნება ბმული {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "მოწყობილების გადარქმევა", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} ჩატის ფოტო შეცვალა", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} ჩატის ახალი აღწერილობა დააყენა: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} ჩატი გადაარქვა: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} ჩატის უფლებები შეცვალა", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRules": "{username} შეცვალა სტუმრების წვდომის წესები", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} შეცვალა სტუმრების წვდომის წესები: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} შეცვალა ისტორიის ხილვადობა", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} გაწევრიანების წესები შეცვალა: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheRoomAliases": "{username} ოთახის მეტსახელები შეცვალა", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} მოწვევის ბმული შეცვალა", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changePassword": "პაროლის შეცვლა", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "სახლის სერვერის შეცვლა", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "სტილის შეცვლა", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "ჯგუფის გადარქმევა", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "ჩატის სარეზერვო საშუალება", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "ჩატის დეტალები", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "ჩატი დაემატა ამ სივრცეს", - "@chatHasBeenAddedToThisSpace": {}, - "chats": "ჩატები", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "ძლიერი პაროლი აარჩიეთ", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "არქივის გაწმენდა", - "@clearArchive": {}, - "close": "დახურვა", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_markasgroup": "აღნიშვნა, როგორც ჯგუფის", - "@commandHint_markasgroup": {}, - "commandHint_ban": "მოცემული მომხმარებლის ბლოკირება ამ ოთახში", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "­ქეშის გაწმენდა", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_join": "მოცემულ ოთახში გაწევრიანება", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "მოცემული მომხმარებლის წაშლა ამ ოთახიდან", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "ამ ოთახიდან გასვლა", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "აღწერეთ თქვენი თავი", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_unban": "ამ ოთახში მომხმარებლისგან ბლოკის მოხსნა", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "არასწორი ბრძანება", - "@commandInvalid": { - "type": "text" - }, - "compareEmojiMatch": "გთხოვთ, შეადაროთ ეს ემოჯი", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "გთხოვთ, შეადაროთ ეს რიცხვები", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "ჩატის კონფიგურაცია", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "კონტაქტი მოწვეული იქნა ჯგუფში", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "შეიცავს სახელს", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "კოპირებულია ბუფერში", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "კოპირება", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "კოპირება ბუფერში", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "შეტყობინების გაშიფვრის შეცდომა: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "create": "შექმნა", - "@create": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "💬 {username} შექმნა ჩატი", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewSpace": "ახალი სივრცე", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "ახლა აქტიურია", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "delete": "წაშლა", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "ანგარიშის წაშლა", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "შეტყობინების წაშლა", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "device": "მოწყობილება", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "მოწყობილების ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "directChats": "პირდაპირი ჩატები", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "allRooms": "ყველა ჯგუფური ჩატები", - "@allRooms": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "ფაილის ჩატვირთვა", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "რედაქტირება", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "ბლოკირებული სერვერების რედაქტირება", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "ოთახის ფოტოს შეცვლა", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "ემოციების პარამეტრები", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "globalChatId": "გლობალური ჩატის ID", - "@globalChatId": {}, - "repeatPassword": "გაიმეორეთ პაროლი", - "@repeatPassword": {}, - "notAnImage": "ფაილი არაა სურათი.", - "@notAnImage": {}, - "remove": "წაშლა", - "@remove": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "🔐 {username} გააქტიურა end to end დაშიფვრა", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "supposedMxid": "ეს უნდა იყოს {mxid}", - "@supposedMxid": { - "type": "text", - "placeholders": { - "mxid": {} - } - }, - "about": "შესახებ", - "@about": { - "type": "text", - "placeholders": {} - }, - "changedTheDisplaynameTo": "{username} შეცვალა ნაჩვენები სახელი: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "commandHint_create": "ცარიელი ჯგუფური ჩატის შექმნა\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_dm": "პირდაპირი ჩატის დაწყება\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_html": "HTML ფორმატირებული ტექსტის გაგზავნა", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_myroomavatar": "თქვენი ფოტოს დაყენება ამ ოთახისათვის(mxc-uri-ს დახმარებით)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "ამ ოთახისათვის ნაჩვენები სახელის დაყენება", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "მოცემული მომხმარებლისათვის უფლებების დონის დაყენება (ჩვეულებრივ: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_react": "რეაქციის სახით პასუხის გაგზავნა", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "containsDisplayName": "ნაჩვენებ სახელს შეიცავს", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "ეს კონტენტი გაგზავნილ იქნა სერვერის ადმინისტრატორებთან", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "ნაგულისხმევი უფლების დონე", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "ნაჩვენები სახელი შეიცვალა", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "ნაჩვენები სახელის შეცვლა", - "@editDisplayname": { - "type": "text", - "placeholders": {} - } -} diff --git a/needed-translations.txt b/needed-translations.txt index 17c19e045..1f94a2fec 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -10726,9 +10726,6 @@ "es": [ "searchIn", - "searchMore", - "gallery", - "files", "conversationBotCustomZone_title", "conversationBotCustomZone_customSystemPromptLabel", "conversationBotCustomZone_customSystemPromptPlaceholder", From 76d26f1c0ccf2d533144e491c2d2f3c88803d019 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 25 Jun 2024 15:19:27 -0400 Subject: [PATCH 18/54] populate space analytics language dropdown from space student's analytics rooms --- .../pangea_room_extension.dart | 6 +++ .../space_settings_extension.dart | 28 +++++++++++ .../pages/analytics/base_analytics.dart | 8 +++- .../pages/analytics/base_analytics_view.dart | 3 +- .../space_analytics/space_analytics.dart | 39 ++++++++-------- .../space_analytics/space_analytics_view.dart | 1 + .../analytics/space_list/space_list.dart | 46 ++++++++++++++----- .../analytics/space_list/space_list_view.dart | 4 +- 8 files changed, 99 insertions(+), 36 deletions(-) diff --git a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index 6219c62d2..b8dae7ab3 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -4,14 +4,17 @@ import 'dart:developer'; import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; +import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; +import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/analytics/analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_event.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_model.dart'; import 'package:fluffychat/pangea/models/bot_options_model.dart'; +import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; @@ -129,6 +132,9 @@ extension PangeaRoom on Room { Event? get pangeaRoomRulesStateEvent => _pangeaRoomRulesStateEvent; + Future> targetLanguages() async => + await _targetLanguages(); + // events Future leaveIfFull() async => await _leaveIfFull(); diff --git a/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart b/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart index 00efb6773..5799631b1 100644 --- a/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart @@ -92,6 +92,34 @@ extension SpaceRoomExtension on Room { return null; } + Future> _targetLanguages() async { + await requestParticipants(); + final students = _students; + + final Map langCounts = {}; + final List allRooms = client.rooms; + for (final User student in students) { + for (final Room room in allRooms) { + if (!room.isAnalyticsRoomOfUser(student.id)) continue; + final String? langCode = room.madeForLang; + if (langCode == null || + langCode.isEmpty || + langCode == LanguageKeys.unknownLanguage) { + continue; + } + final LanguageModel lang = PangeaLanguage.byLangCode(langCode); + langCounts[lang] ??= 0; + langCounts[lang] = langCounts[lang]! + 1; + } + } + // get a list of language models, sorted + // by the number of students who are learning that language + return langCounts.entries.map((entry) => entry.key).toList() + ..sort( + (a, b) => langCounts[b]!.compareTo(langCounts[a]!), + ); + } + // DateTime? get _languageSettingsUpdatedAt { // if (!isSpace) return null; // return languageSettingsStateEvent?.originServerTs ?? creationTime; diff --git a/lib/pangea/pages/analytics/base_analytics.dart b/lib/pangea/pages/analytics/base_analytics.dart index f62e5f6b5..3ab8fa0f2 100644 --- a/lib/pangea/pages/analytics/base_analytics.dart +++ b/lib/pangea/pages/analytics/base_analytics.dart @@ -25,8 +25,9 @@ class BaseAnalyticsPage extends StatefulWidget { final AnalyticsSelected defaultSelected; final AnalyticsSelected? alwaysSelected; final StudentAnalyticsController? myAnalyticsController; + final List targetLanguages; - const BaseAnalyticsPage({ + BaseAnalyticsPage({ super.key, required this.pageTitle, required this.tabs, @@ -34,7 +35,10 @@ class BaseAnalyticsPage extends StatefulWidget { required this.defaultSelected, this.selectedView, this.myAnalyticsController, - }); + targetLanguages, + }) : targetLanguages = (targetLanguages?.isNotEmpty ?? false) + ? targetLanguages + : MatrixState.pangeaController.pLanguageStore.targetOptions; @override State createState() => BaseAnalyticsController(); diff --git a/lib/pangea/pages/analytics/base_analytics_view.dart b/lib/pangea/pages/analytics/base_analytics_view.dart index 1c0445d5a..8cab95396 100644 --- a/lib/pangea/pages/analytics/base_analytics_view.dart +++ b/lib/pangea/pages/analytics/base_analytics_view.dart @@ -128,8 +128,7 @@ class BaseAnalyticsView extends StatelessWidget { value: controller.pangeaController.analytics .currentAnalyticsSpaceLang, onChange: (lang) => controller.toggleSpaceLang(lang), - languages: controller - .pangeaController.pLanguageStore.targetOptions, + languages: controller.widget.targetLanguages, ), ], ), diff --git a/lib/pangea/pages/analytics/space_analytics/space_analytics.dart b/lib/pangea/pages/analytics/space_analytics/space_analytics.dart index 64875bfba..b32780761 100644 --- a/lib/pangea/pages/analytics/space_analytics/space_analytics.dart +++ b/lib/pangea/pages/analytics/space_analytics/space_analytics.dart @@ -4,6 +4,7 @@ import 'dart:developer'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/widgets/common/list_placeholder.dart'; import 'package:fluffychat/pangea/widgets/common/p_circular_loader.dart'; @@ -33,6 +34,18 @@ class SpaceAnalyticsV2Controller extends State { List students = []; String? get spaceId => GoRouterState.of(context).pathParameters['spaceid']; Room? _spaceRoom; + List targetLanguages = []; + + @override + void initState() { + super.initState(); + Future.delayed(Duration.zero, () async { + if (spaceRoom == null || (!(spaceRoom?.isSpace ?? false))) { + context.go('/rooms'); + } + getChatAndStudents(); + }); + } Room? get spaceRoom { if (_spaceRoom == null || _spaceRoom!.id != spaceId) { @@ -44,23 +57,11 @@ class SpaceAnalyticsV2Controller extends State { context.go('/rooms/analytics'); return null; } - getChatAndStudents(); + getChatAndStudents().then((_) => setTargetLanguages()); } return _spaceRoom; } - @override - void initState() { - super.initState(); - debugPrint("init space analytics"); - Future.delayed(Duration.zero, () async { - if (spaceRoom == null || (!(spaceRoom?.isSpace ?? false))) { - context.go('/rooms'); - } - getChatAndStudents(); - }); - } - Future getChatAndStudents() async { try { await spaceRoom?.postLoad(); @@ -97,12 +98,12 @@ class SpaceAnalyticsV2Controller extends State { } } - // @override - // void dispose() { - // super.dispose(); - // refreshTimer?.cancel(); - // stateSub?.cancel(); - // } + Future setTargetLanguages() async { + // get a list of language models, sorted by the + // number of students who are learning that language + targetLanguages = await spaceRoom?.targetLanguages() ?? []; + setState(() {}); + } @override Widget build(BuildContext context) { diff --git a/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart b/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart index 5e0008555..c72ec3c26 100644 --- a/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart +++ b/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart @@ -59,6 +59,7 @@ class SpaceAnalyticsView extends StatelessWidget { AnalyticsEntryType.space, controller.spaceRoom?.name ?? "", ), + targetLanguages: controller.targetLanguages, ) : const SizedBox(); } diff --git a/lib/pangea/pages/analytics/space_list/space_list.dart b/lib/pangea/pages/analytics/space_list/space_list.dart index 058d54e63..e325e1e94 100644 --- a/lib/pangea/pages/analytics/space_list/space_list.dart +++ b/lib/pangea/pages/analytics/space_list/space_list.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:fluffychat/pangea/enum/time_span.dart'; import 'package:fluffychat/pangea/extensions/client_extension/client_extension.dart'; +import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/pages/analytics/space_list/space_list_view.dart'; import 'package:flutter/material.dart'; @@ -22,26 +23,47 @@ class AnalyticsSpaceList extends StatefulWidget { class AnalyticsSpaceListController extends State { PangeaController pangeaController = MatrixState.pangeaController; List spaces = []; + List targetLanguages = []; @override void initState() { super.initState(); - Matrix.of(context).client.spacesImTeaching.then((spaceList) { - spaceList = spaceList - .where( - (space) => !spaceList.any( - (parentSpace) => parentSpace.spaceChildren - .any((child) => child.roomId == space.id), - ), - ) - .toList(); - spaces = spaceList; - setState(() {}); - }); + + setSpaceList().then((_) => setTargetLanguages()); } StreamController refreshStream = StreamController.broadcast(); + Future setSpaceList() async { + final spaceList = await Matrix.of(context).client.spacesImTeaching; + spaces = spaceList + .where( + (space) => !spaceList.any( + (parentSpace) => parentSpace.spaceChildren + .any((child) => child.roomId == space.id), + ), + ) + .toList(); + setState(() {}); + } + + Future setTargetLanguages() async { + if (spaces.isEmpty) return; + final Map langCounts = {}; + for (final Room space in spaces) { + final List targetLangs = await space.targetLanguages(); + for (final LanguageModel lang in targetLangs) { + langCounts[lang] ??= 0; + langCounts[lang] = langCounts[lang]! + 1; + } + } + targetLanguages = langCounts.entries.map((entry) => entry.key).toList() + ..sort( + (a, b) => langCounts[b]!.compareTo(langCounts[a]!), + ); + setState(() {}); + } + void toggleTimeSpan(BuildContext context, TimeSpan timeSpan) { pangeaController.analytics.setCurrentAnalyticsTimeSpan(timeSpan); refreshStream.add(false); diff --git a/lib/pangea/pages/analytics/space_list/space_list_view.dart b/lib/pangea/pages/analytics/space_list/space_list_view.dart index 5f5bf22da..1837d35f2 100644 --- a/lib/pangea/pages/analytics/space_list/space_list_view.dart +++ b/lib/pangea/pages/analytics/space_list/space_list_view.dart @@ -45,7 +45,9 @@ class AnalyticsSpaceListView extends StatelessWidget { value: controller.pangeaController.analytics.currentAnalyticsSpaceLang, onChange: (lang) => controller.toggleSpaceLang(lang), - languages: controller.pangeaController.pLanguageStore.targetOptions, + languages: controller.targetLanguages.isEmpty + ? controller.pangeaController.pLanguageStore.targetOptions + : controller.targetLanguages, ), ], ), From 8ca44a17ff4f3df3891c7f8af2f76cdba8aebfcd Mon Sep 17 00:00:00 2001 From: WilsonLe Date: Tue, 25 Jun 2024 15:50:40 -0400 Subject: [PATCH 19/54] remove local dev files --- devtools_options 2.yaml | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 devtools_options 2.yaml diff --git a/devtools_options 2.yaml b/devtools_options 2.yaml deleted file mode 100644 index fa0b357c4..000000000 --- a/devtools_options 2.yaml +++ /dev/null @@ -1,3 +0,0 @@ -description: This file stores settings for Dart & Flutter DevTools. -documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states -extensions: From c9d1b72773857611d8fe4848d0984b2b514ff018 Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Wed, 26 Jun 2024 11:34:41 -0400 Subject: [PATCH 20/54] igc tweaks --- assets/l10n/intl_en.arb | 4 +- assets/l10n/intl_es.arb | 4 +- .../controllers/choreographer.dart | 11 +---- .../widgets/start_igc_button.dart | 48 ++++--------------- lib/pangea/enum/assistance_state_enum.dart | 43 +++++++++++++++++ 5 files changed, 57 insertions(+), 53 deletions(-) create mode 100644 lib/pangea/enum/assistance_state_enum.dart diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 056c6a347..cb319c9c7 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -4010,9 +4010,9 @@ "wordsPerMinute": "Words per minute", "autoIGCToolName": "Run Language Assistance Automatically", "autoIGCToolDescription": "Automatically run language assistance after typing messages", - "runGrammarCorrection": "Run grammar correction", + "runGrammarCorrection": "Check message", "grammarCorrectionFailed": "Issues to address", - "grammarCorrectionComplete": "Grammar correction complete", + "grammarCorrectionComplete": "Looks good!", "leaveRoomDescription": "The chat will be moved to the archive. Other users will be able to see that you have left the chat.", "archiveSpaceDescription": "All chats within this space will be moved to the archive for yourself and other non-admin users.", "leaveSpaceDescription": "All chats within this space will be moved to the archive. Other users will be able to see that you have left the space.", diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb index 0658bff50..dc328294a 100644 --- a/assets/l10n/intl_es.arb +++ b/assets/l10n/intl_es.arb @@ -4609,9 +4609,9 @@ "enterNumber": "Introduzca un valor numérico entero.", "autoIGCToolName": "Ejecutar automáticamente la asistencia lingüística", "autoIGCToolDescription": "Ejecutar automáticamente la asistencia lingüística después de escribir mensajes", - "runGrammarCorrection": "Corregir la gramática", + "runGrammarCorrection": "Comprobar mensaje", "grammarCorrectionFailed": "Cuestiones a tratar", - "grammarCorrectionComplete": "Corrección gramatical completa", + "grammarCorrectionComplete": "¡Se ve bien!", "leaveRoomDescription": "El chat se moverá al archivo. Los demás usuarios podrán ver que has abandonado el chat.", "archiveSpaceDescription": "Todos los chats de este espacio se moverán al archivo para ti y otros usuarios que no sean administradores.", "leaveSpaceDescription": "Todos los chats dentro de este espacio se moverán al archivo. Los demás usuarios podrán ver que has abandonado el espacio.", diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 6ea029a6f..a0c6a5f6b 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -8,6 +8,7 @@ import 'package:fluffychat/pangea/choreographer/controllers/message_options.dart import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; +import 'package:fluffychat/pangea/enum/assistance_state_enum.dart'; import 'package:fluffychat/pangea/enum/edit_type.dart'; import 'package:fluffychat/pangea/models/it_step.dart'; import 'package:fluffychat/pangea/models/language_detection_model.dart'; @@ -570,13 +571,3 @@ class Choreographer { return AssistanceState.complete; } } - -// assistance state is, user has not typed a message, user has typed a message and IGC has not run, -// IGC is running, IGC has run and there are remaining steps (either IT or IGC), or all steps are done -enum AssistanceState { - noMessage, - notFetched, - fetching, - fetched, - complete, -} diff --git a/lib/pangea/choreographer/widgets/start_igc_button.dart b/lib/pangea/choreographer/widgets/start_igc_button.dart index 49e4b078d..877158dd2 100644 --- a/lib/pangea/choreographer/widgets/start_igc_button.dart +++ b/lib/pangea/choreographer/widgets/start_igc_button.dart @@ -1,10 +1,9 @@ import 'dart:async'; import 'dart:math' as math; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; -import 'package:fluffychat/pangea/constants/colors.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; +import 'package:fluffychat/pangea/enum/assistance_state_enum.dart'; import 'package:fluffychat/pangea/widgets/user_settings/p_language_dialog.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -54,15 +53,15 @@ class StartIGCButtonState extends State setState(() => prevState = assistanceState); } + bool get itEnabled => widget.controller.choreographer.itEnabled; + bool get igcEnabled => widget.controller.choreographer.igcEnabled; + CanSendStatus get canSendStatus => + widget.controller.pangeaController.subscriptionController.canSendStatus; + bool get grammarCorrectionEnabled => + (itEnabled || igcEnabled) && canSendStatus == CanSendStatus.subscribed; + @override Widget build(BuildContext context) { - final bool itEnabled = widget.controller.choreographer.itEnabled; - final bool igcEnabled = widget.controller.choreographer.igcEnabled; - final CanSendStatus canSendStatus = - widget.controller.pangeaController.subscriptionController.canSendStatus; - final bool grammarCorrectionEnabled = - (itEnabled || igcEnabled) && canSendStatus == CanSendStatus.subscribed; - if (!grammarCorrectionEnabled || widget.controller.choreographer.isAutoIGCEnabled || widget.controller.choreographer.choreoMode == ChoreoMode.it) { @@ -89,7 +88,7 @@ class StartIGCButtonState extends State disabledElevation: 0, shape: const CircleBorder(), onPressed: () { - if (assistanceState != AssistanceState.complete) { + if (assistanceState != AssistanceState.fetching) { widget.controller.choreographer .getLanguageHelp( false, @@ -142,32 +141,3 @@ class StartIGCButtonState extends State ); } } - -extension AssistanceStateExtension on AssistanceState { - Color stateColor(context) { - switch (this) { - case AssistanceState.noMessage: - case AssistanceState.notFetched: - case AssistanceState.fetching: - return Theme.of(context).colorScheme.primary; - case AssistanceState.fetched: - return PangeaColors.igcError; - case AssistanceState.complete: - return AppConfig.success; - } - } - - String tooltip(L10n l10n) { - switch (this) { - case AssistanceState.noMessage: - case AssistanceState.notFetched: - return l10n.runGrammarCorrection; - case AssistanceState.fetching: - return ""; - case AssistanceState.fetched: - return l10n.grammarCorrectionFailed; - case AssistanceState.complete: - return l10n.grammarCorrectionComplete; - } - } -} diff --git a/lib/pangea/enum/assistance_state_enum.dart b/lib/pangea/enum/assistance_state_enum.dart new file mode 100644 index 000000000..6d3a853da --- /dev/null +++ b/lib/pangea/enum/assistance_state_enum.dart @@ -0,0 +1,43 @@ +// assistance state is, user has not typed a message, user has typed a message and IGC has not run, +// IGC is running, IGC has run and there are remaining steps (either IT or IGC), or all steps are done +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pangea/constants/colors.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +enum AssistanceState { + noMessage, + notFetched, + fetching, + fetched, + complete, +} + +extension AssistanceStateExtension on AssistanceState { + Color stateColor(context) { + switch (this) { + case AssistanceState.noMessage: + case AssistanceState.notFetched: + case AssistanceState.fetching: + return Theme.of(context).colorScheme.primary; + case AssistanceState.fetched: + return PangeaColors.igcError; + case AssistanceState.complete: + return AppConfig.success; + } + } + + String tooltip(L10n l10n) { + switch (this) { + case AssistanceState.noMessage: + case AssistanceState.notFetched: + return l10n.runGrammarCorrection; + case AssistanceState.fetching: + return ""; + case AssistanceState.fetched: + return l10n.grammarCorrectionFailed; + case AssistanceState.complete: + return l10n.grammarCorrectionComplete; + } + } +} From 59e521b69e758cc31c339de93369ce4f4a0971be Mon Sep 17 00:00:00 2001 From: Kelrap Date: Wed, 26 Jun 2024 12:27:45 -0400 Subject: [PATCH 21/54] Hide some Chat permission options --- .../chat_permissions_settings_view.dart | 111 +++++++++++------- .../subscription/subscription_options.dart | 2 +- 2 files changed, 68 insertions(+), 45 deletions(-) diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart index ea81c842c..2b1dff187 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart @@ -35,11 +35,26 @@ class ChatPermissionsSettingsView extends StatelessWidget { final powerLevels = Map.from(powerLevelsContent) // #Pangea // ..removeWhere((k, v) => v is! int); - ..removeWhere((k, v) => v is! int || k.equals("m.call.invite")); + ..removeWhere( + (k, v) => + v is! int || + k.equals("m.call.invite") || + k.equals("historical") || + k.equals("state_default"), + ); // Pangea# final eventsPowerLevels = Map.from( powerLevelsContent.tryGetMap('events') ?? {}, - )..removeWhere((k, v) => v is! int); + // #Pangea + )..removeWhere( + (k, v) => + v is! int || + k.equals("m.space.child") || + k.equals("pangea.usranalytics") || + k.equals(EventTypes.RoomPowerLevels), + ); + // )..removeWhere((k, v) => v is! int); + // Pangea# return Column( children: [ Column( @@ -57,51 +72,59 @@ class ChatPermissionsSettingsView extends StatelessWidget { ), canEdit: room.canChangePowerLevel, ), - Divider(color: Theme.of(context).dividerColor), - ListTile( - title: Text( - L10n.of(context)!.notifications, - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - ), - ), - ), - Builder( - builder: (context) { - const key = 'rooms'; - final value = powerLevelsContent - .containsKey('notifications') - ? powerLevelsContent - .tryGetMap('notifications') - ?.tryGet('rooms') ?? - 0 - : 0; - return PermissionsListTile( - permissionKey: key, - permission: value, - category: 'notifications', - canEdit: room.canChangePowerLevel, - onChanged: (level) => controller.editPowerLevel( - context, - key, - value, - newLevel: level, - category: 'notifications', + // #Pangea + // Why would teacher need to stop students from seeing notifications? + // Divider(color: Theme.of(context).dividerColor), + // ListTile( + // title: Text( + // L10n.of(context)!.notifications, + // style: TextStyle( + // color: Theme.of(context).colorScheme.primary, + // fontWeight: FontWeight.bold, + // ), + // ), + // ), + // Builder( + // builder: (context) { + // const key = 'rooms'; + // final value = powerLevelsContent + // .containsKey('notifications') + // ? powerLevelsContent + // .tryGetMap('notifications') + // ?.tryGet('rooms') ?? + // 0 + // : 0; + // return PermissionsListTile( + // permissionKey: key, + // permission: value, + // category: 'notifications', + // canEdit: room.canChangePowerLevel, + // onChanged: (level) => controller.editPowerLevel( + // context, + // key, + // value, + // newLevel: level, + // category: 'notifications', + // ), + // ); + // }, + // ), + // Only show if there are actually items in this category + if (eventsPowerLevels.isNotEmpty) + // Pangea# + Divider(color: Theme.of(context).dividerColor), + // #Pangea + if (eventsPowerLevels.isNotEmpty) + // Pangea# + ListTile( + title: Text( + L10n.of(context)!.configureChat, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold, ), - ); - }, - ), - Divider(color: Theme.of(context).dividerColor), - ListTile( - title: Text( - L10n.of(context)!.configureChat, - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, ), ), - ), for (final entry in eventsPowerLevels.entries) PermissionsListTile( permissionKey: entry.key, diff --git a/lib/pangea/widgets/subscription/subscription_options.dart b/lib/pangea/widgets/subscription/subscription_options.dart index 41c8cbe4f..d40f68023 100644 --- a/lib/pangea/widgets/subscription/subscription_options.dart +++ b/lib/pangea/widgets/subscription/subscription_options.dart @@ -109,7 +109,7 @@ class SubscriptionCard extends StatelessWidget { title ?? subscription?.displayName(context) ?? '', textAlign: TextAlign.center, style: TextStyle( - fontSize: 24, + fontSize: 20, color: enabled ? null : const Color.fromARGB(255, 174, 174, 174), ), From 340d0ac1e26ee5678c083d8fb64999aa603968f7 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Wed, 26 Jun 2024 14:42:01 -0400 Subject: [PATCH 22/54] Makes error analytics close button more noticeable --- lib/pangea/pages/analytics/construct_list.dart | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/pangea/pages/analytics/construct_list.dart b/lib/pangea/pages/analytics/construct_list.dart index e169922ca..8651b7a74 100644 --- a/lib/pangea/pages/analytics/construct_list.dart +++ b/lib/pangea/pages/analytics/construct_list.dart @@ -355,15 +355,17 @@ class ConstructMessagesDialog extends StatelessWidget { final msgEventMatches = controller.getMessageEventMatches(); + final noData = controller.constructs![controller.lemmaIndex].uses.length > + controller._msgEvents.length; + return AlertDialog( title: Center(child: Text(controller.widget.controller.currentLemma!)), content: SizedBox( - height: 350, - width: 500, + height: noData ? 90 : 250, + width: noData ? 200 : 400, child: Column( children: [ - if (controller.constructs![controller.lemmaIndex].uses.length > - controller._msgEvents.length) + if (noData) Center( child: Padding( padding: const EdgeInsets.all(8.0), @@ -398,8 +400,8 @@ class ConstructMessagesDialog extends StatelessWidget { child: Text( L10n.of(context)!.close.toUpperCase(), style: TextStyle( - color: - Theme.of(context).textTheme.bodyMedium?.color?.withAlpha(150), + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold, ), ), ), From b12efe7e801f163f168f23b58727ad1a9608303c Mon Sep 17 00:00:00 2001 From: ggurdin Date: Wed, 26 Jun 2024 15:28:58 -0400 Subject: [PATCH 23/54] updates to improve navigation of practice activities --- assets/l10n/intl_en.arb | 3 +- .../pangea_message_event.dart | 10 +- .../multiple_choice_activity_model.dart | 2 +- .../practice_activity_model.dart | 8 +- ...art => multiple_choice_activity_view.dart} | 21 +-- .../practice_activity/practice_activity.dart | 104 +++++++++++ .../practice_activity_card.dart | 164 +++++++++++++---- .../practice_activity_content.dart | 165 ------------------ needed-translations.txt | 150 ++++++++++------ 9 files changed, 348 insertions(+), 279 deletions(-) rename lib/pangea/widgets/practice_activity/{multiple_choice_activity.dart => multiple_choice_activity_view.dart} (75%) create mode 100644 lib/pangea/widgets/practice_activity/practice_activity.dart delete mode 100644 lib/pangea/widgets/practice_activity/practice_activity_content.dart diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 056c6a347..647697673 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -4058,5 +4058,6 @@ "suggestToSpaceDesc": "Suggested spaces will appear in the chat lists for their parent spaces", "practice": "Practice", "noLanguagesSet": "No languages set", - "noActivitiesFound": "No practice activities found for this message" + "noActivitiesFound": "No practice activities found for this message", + "previous": "Previous" } \ No newline at end of file diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index 951b77dfc..306376df8 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -569,15 +569,7 @@ class PangeaMessageEvent { if (l2Code == null) return false; final List activities = practiceActivities(l2Code!); if (activities.isEmpty) return false; - - // for now, only show the button if the event has no completed activities - // TODO - revert this after adding logic to show next activity - for (final activity in activities) { - if (activity.isComplete) return false; - } - return true; - // if (activities.isEmpty) return false; - // return !activities.every((activity) => activity.isComplete); + return activities.any((activity) => !(activity.isComplete)); } String? get l2Code => diff --git a/lib/pangea/models/practice_activities.dart/multiple_choice_activity_model.dart b/lib/pangea/models/practice_activities.dart/multiple_choice_activity_model.dart index 3cd78a66a..68376d410 100644 --- a/lib/pangea/models/practice_activities.dart/multiple_choice_activity_model.dart +++ b/lib/pangea/models/practice_activities.dart/multiple_choice_activity_model.dart @@ -27,7 +27,7 @@ class MultipleChoice { return MultipleChoice( question: json['question'] as String, choices: (json['choices'] as List).map((e) => e as String).toList(), - answer: json['answer'] as String, + answer: json['answer'] ?? json['correct_answer'] as String, ); } diff --git a/lib/pangea/models/practice_activities.dart/practice_activity_model.dart b/lib/pangea/models/practice_activities.dart/practice_activity_model.dart index ae8455c7f..f5f4348c6 100644 --- a/lib/pangea/models/practice_activities.dart/practice_activity_model.dart +++ b/lib/pangea/models/practice_activities.dart/practice_activity_model.dart @@ -243,9 +243,11 @@ class PracticeActivityModel { .toList(), langCode: json['lang_code'] as String, msgId: json['msg_id'] as String, - activityType: ActivityTypeEnum.values.firstWhere( - (e) => e.string == json['activity_type'], - ), + activityType: json['activity_type'] == "multipleChoice" + ? ActivityTypeEnum.multipleChoice + : ActivityTypeEnum.values.firstWhere( + (e) => e.string == json['activity_type'], + ), multipleChoice: json['multiple_choice'] != null ? MultipleChoice.fromJson( json['multiple_choice'] as Map, diff --git a/lib/pangea/widgets/practice_activity/multiple_choice_activity.dart b/lib/pangea/widgets/practice_activity/multiple_choice_activity_view.dart similarity index 75% rename from lib/pangea/widgets/practice_activity/multiple_choice_activity.dart rename to lib/pangea/widgets/practice_activity/multiple_choice_activity_view.dart index c2861ffe0..100da3456 100644 --- a/lib/pangea/widgets/practice_activity/multiple_choice_activity.dart +++ b/lib/pangea/widgets/practice_activity/multiple_choice_activity_view.dart @@ -2,26 +2,24 @@ import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/choreographer/widgets/choice_array.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_model.dart'; -import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_content.dart'; +import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity.dart'; import 'package:flutter/material.dart'; -class MultipleChoiceActivity extends StatelessWidget { - final MessagePracticeActivityContentState card; +class MultipleChoiceActivityView extends StatelessWidget { + final PracticeActivityContentState controller; final Function(int) updateChoice; final bool isActive; - const MultipleChoiceActivity({ + const MultipleChoiceActivityView({ super.key, - required this.card, + required this.controller, required this.updateChoice, required this.isActive, }); - PracticeActivityEvent get practiceEvent => card.practiceEvent; + PracticeActivityEvent get practiceEvent => controller.practiceEvent; - int? get selectedChoiceIndex => card.selectedChoiceIndex; - - bool get submitted => card.recordSubmittedThisSession; + int? get selectedChoiceIndex => controller.selectedChoiceIndex; @override Widget build(BuildContext context) { @@ -50,10 +48,7 @@ class MultipleChoiceActivity extends StatelessWidget { .mapIndexed( (index, value) => Choice( text: value, - color: (selectedChoiceIndex == index || - practiceActivity.multipleChoice! - .isCorrect(index)) && - submitted + color: selectedChoiceIndex == index ? practiceActivity.multipleChoice!.choiceColor(index) : null, isGold: practiceActivity.multipleChoice!.isCorrect(index), diff --git a/lib/pangea/widgets/practice_activity/practice_activity.dart b/lib/pangea/widgets/practice_activity/practice_activity.dart new file mode 100644 index 000000000..5606aceff --- /dev/null +++ b/lib/pangea/widgets/practice_activity/practice_activity.dart @@ -0,0 +1,104 @@ +import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; +import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; +import 'package:fluffychat/pangea/widgets/practice_activity/multiple_choice_activity_view.dart'; +import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_card.dart'; +import 'package:flutter/material.dart'; + +class PracticeActivity extends StatefulWidget { + final PracticeActivityEvent practiceEvent; + final PangeaMessageEvent pangeaMessageEvent; + final MessagePracticeActivityCardState controller; + + const PracticeActivity({ + super.key, + required this.practiceEvent, + required this.pangeaMessageEvent, + required this.controller, + }); + + @override + PracticeActivityContentState createState() => PracticeActivityContentState(); +} + +class PracticeActivityContentState extends State { + PracticeActivityEvent get practiceEvent => widget.practiceEvent; + int? selectedChoiceIndex; + bool isSubmitted = false; + + @override + void initState() { + super.initState(); + setRecord(); + } + + @override + void didUpdateWidget(covariant PracticeActivity oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.practiceEvent.event.eventId != + widget.practiceEvent.event.eventId) { + setRecord(); + } + } + + // sets the record model for the activity + // either a new record model that will be sent after submitting the + // activity or the record model from the user's previous response + void setRecord() { + if (widget.controller.recordEvent?.record == null) { + final String question = + practiceEvent.practiceActivity.multipleChoice!.question; + widget.controller.recordModel = + PracticeActivityRecordModel(question: question); + } else { + widget.controller.recordModel = widget.controller.recordEvent!.record; + + // Note that only MultipleChoice activities will have this so we + // probably should move this logic to the MultipleChoiceActivity widget + selectedChoiceIndex = + widget.controller.recordModel?.latestResponse != null + ? widget.practiceEvent.practiceActivity.multipleChoice + ?.choiceIndex(widget.controller.recordModel!.latestResponse!) + : null; + isSubmitted = widget.controller.recordModel?.latestResponse != null; + } + setState(() {}); + } + + void updateChoice(int index) { + setState(() { + selectedChoiceIndex = index; + widget.controller.recordModel!.addResponse( + text: widget + .practiceEvent.practiceActivity.multipleChoice!.choices[index], + ); + }); + } + + Widget get activityWidget { + switch (widget.practiceEvent.practiceActivity.activityType) { + case ActivityTypeEnum.multipleChoice: + return MultipleChoiceActivityView( + controller: this, + updateChoice: updateChoice, + isActive: !isSubmitted, + ); + default: + return const SizedBox.shrink(); + } + } + + @override + Widget build(BuildContext context) { + debugPrint( + "MessagePracticeActivityContentState.build with selectedChoiceIndex: $selectedChoiceIndex", + ); + return Column( + children: [ + activityWidget, + const SizedBox(height: 8), + ], + ); + } +} diff --git a/lib/pangea/widgets/practice_activity/practice_activity_card.dart b/lib/pangea/widgets/practice_activity/practice_activity_card.dart index 17c528b22..e28dabe9d 100644 --- a/lib/pangea/widgets/practice_activity/practice_activity_card.dart +++ b/lib/pangea/widgets/practice_activity/practice_activity_card.dart @@ -1,15 +1,20 @@ import 'dart:developer'; -import 'package:fluffychat/pangea/enum/message_mode_enum.dart'; +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/practice_acitivity_record_event.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; +import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; import 'package:fluffychat/pangea/utils/bot_style.dart'; +import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; -import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_content.dart'; +import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; class PracticeActivityCard extends StatefulWidget { final PangeaMessageEvent pangeaMessageEvent; @@ -27,12 +32,32 @@ class PracticeActivityCard extends StatefulWidget { } class MessagePracticeActivityCardState extends State { + List practiceActivities = []; PracticeActivityEvent? practiceEvent; + PracticeActivityRecordModel? recordModel; + bool sending = false; + + int get practiceEventIndex => practiceActivities.indexWhere( + (activity) => activity.event.eventId == practiceEvent?.event.eventId, + ); + + bool get isPrevEnabled => + practiceEventIndex > 0 && + practiceActivities.length > (practiceEventIndex - 1); + + bool get isNextEnabled => + practiceEventIndex >= 0 && + practiceEventIndex < practiceActivities.length - 1; + + // the first record for this practice activity + // assosiated with the current user + PracticeActivityRecordEvent? get recordEvent => + practiceEvent?.userRecords.firstOrNull; @override void initState() { super.initState(); - loadInitialData(); + setPracticeActivities(); } String? get langCode { @@ -50,46 +75,106 @@ class MessagePracticeActivityCardState extends State { return langCode; } - void loadInitialData() { + /// Initalizes the practice activities for the current language + /// and sets the first activity as the current activity + void setPracticeActivities() { if (langCode == null) return; - updatePracticeActivity(); - if (practiceEvent == null) { - debugger(when: kDebugMode); - } - } - - void updatePracticeActivity() { - if (langCode == null) return; - final List activities = + practiceActivities = widget.pangeaMessageEvent.practiceActivities(langCode!); - if (activities.isEmpty) return; - final List incompleteActivities = - activities.where((element) => !element.isComplete).toList(); - debugPrint("total events: ${activities.length}"); - debugPrint("incomplete practice events: ${incompleteActivities.length}"); + if (practiceActivities.isEmpty) return; - // TODO update to show next activity - practiceEvent = activities.first; - // // if an incomplete activity is found, show that - // if (incompleteActivities.isNotEmpty) { - // practiceEvent = incompleteActivities.first; - // } - // // if no incomplete activity is found, show the last activity - // else if (activities.isNotEmpty) { - // practiceEvent = activities.last; - // } + practiceActivities.sort( + (a, b) => a.event.originServerTs.compareTo(b.event.originServerTs), + ); + + // if the current activity hasn't been set yet, show the first uncompleted activity + // if there is one. If not, show the first activity + final List incompleteActivities = + practiceActivities.where((element) => !element.isComplete).toList(); + practiceEvent ??= incompleteActivities.isNotEmpty + ? incompleteActivities.first + : practiceActivities.first; setState(() {}); } - void showNextActivity() { - if (langCode == null) return; - updatePracticeActivity(); - widget.controller.updateMode(MessageMode.practiceActivity); + void navigateActivities({Direction? direction, int? index}) { + final bool enableNavigation = (direction == Direction.f && isNextEnabled) || + (direction == Direction.b && isPrevEnabled) || + (index != null && index >= 0 && index < practiceActivities.length); + if (enableNavigation) { + final int newIndex = index ?? + (direction == Direction.f + ? practiceEventIndex + 1 + : practiceEventIndex - 1); + practiceEvent = practiceActivities[newIndex]; + setState(() {}); + } + } + + void sendRecord() { + if (recordModel == null || practiceEvent == null) return; + setState(() => sending = true); + MatrixState.pangeaController.activityRecordController + .send(recordModel!, practiceEvent!) + .catchError((error) { + ErrorHandler.logError( + e: error, + s: StackTrace.current, + data: { + 'recordModel': recordModel?.toJson(), + 'practiceEvent': practiceEvent?.event.toJson(), + }, + ); + return null; + }).whenComplete(() => setState(() => sending = false)); } @override Widget build(BuildContext context) { - if (practiceEvent == null) { + final Widget navigationButtons = Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Opacity( + opacity: isPrevEnabled ? 1.0 : 0, + child: IconButton( + onPressed: isPrevEnabled + ? () => navigateActivities(direction: Direction.b) + : null, + icon: const Icon(Icons.keyboard_arrow_left_outlined), + tooltip: L10n.of(context)!.previous, + ), + ), + Expanded( + child: Opacity( + opacity: recordEvent == null ? 1.0 : 0.5, + child: sending + ? const CircularProgressIndicator.adaptive() + : TextButton( + onPressed: recordEvent == null ? sendRecord : null, + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all( + AppConfig.primaryColor, + ), + ), + child: Text(L10n.of(context)!.submit), + ), + ), + ), + Opacity( + opacity: isNextEnabled ? 1.0 : 0, + child: IconButton( + onPressed: isNextEnabled + ? () => navigateActivities(direction: Direction.f) + : null, + icon: const Icon(Icons.keyboard_arrow_right_outlined), + tooltip: L10n.of(context)!.next, + ), + ), + ], + ); + + if (practiceEvent == null || practiceActivities.isEmpty) { return Text( L10n.of(context)!.noActivitiesFound, style: BotStyle.text(context), @@ -99,10 +184,15 @@ class MessagePracticeActivityCardState extends State { // onActivityGenerated: updatePracticeActivity, // ); } - return PracticeActivityContent( - practiceEvent: practiceEvent!, - pangeaMessageEvent: widget.pangeaMessageEvent, - controller: this, + return Column( + children: [ + PracticeActivity( + pangeaMessageEvent: widget.pangeaMessageEvent, + practiceEvent: practiceEvent!, + controller: this, + ), + navigationButtons, + ], ); } } diff --git a/lib/pangea/widgets/practice_activity/practice_activity_content.dart b/lib/pangea/widgets/practice_activity/practice_activity_content.dart deleted file mode 100644 index 8080c27ee..000000000 --- a/lib/pangea/widgets/practice_activity/practice_activity_content.dart +++ /dev/null @@ -1,165 +0,0 @@ -import 'package:collection/collection.dart'; -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; -import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; -import 'package:fluffychat/pangea/matrix_event_wrappers/practice_acitivity_record_event.dart'; -import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; -import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; -import 'package:fluffychat/pangea/utils/error_handler.dart'; -import 'package:fluffychat/pangea/widgets/practice_activity/multiple_choice_activity.dart'; -import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_card.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -class PracticeActivityContent extends StatefulWidget { - final PracticeActivityEvent practiceEvent; - final PangeaMessageEvent pangeaMessageEvent; - final MessagePracticeActivityCardState controller; - - const PracticeActivityContent({ - super.key, - required this.practiceEvent, - required this.pangeaMessageEvent, - required this.controller, - }); - - @override - MessagePracticeActivityContentState createState() => - MessagePracticeActivityContentState(); -} - -class MessagePracticeActivityContentState - extends State { - int? selectedChoiceIndex; - PracticeActivityRecordModel? recordModel; - bool recordSubmittedThisSession = false; - bool recordSubmittedPreviousSession = false; - - PracticeActivityEvent get practiceEvent => widget.practiceEvent; - - @override - void initState() { - super.initState(); - initalizeActivity(); - } - - @override - void didUpdateWidget(covariant PracticeActivityContent oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.practiceEvent.event.eventId != - widget.practiceEvent.event.eventId) { - initalizeActivity(); - } - } - - void initalizeActivity() { - final PracticeActivityRecordEvent? recordEvent = - widget.practiceEvent.userRecords.firstOrNull; - if (recordEvent?.record == null) { - recordModel = PracticeActivityRecordModel( - question: - widget.practiceEvent.practiceActivity.multipleChoice!.question, - ); - } else { - recordModel = recordEvent!.record; - - //Note that only MultipleChoice activities will have this so we probably should move this logic to the MultipleChoiceActivity widget - selectedChoiceIndex = recordModel?.latestResponse != null - ? widget.practiceEvent.practiceActivity.multipleChoice - ?.choiceIndex(recordModel!.latestResponse!) - : null; - - recordSubmittedPreviousSession = true; - recordSubmittedThisSession = true; - } - setState(() {}); - } - - void updateChoice(int index) { - setState(() { - selectedChoiceIndex = index; - recordModel!.addResponse( - text: widget - .practiceEvent.practiceActivity.multipleChoice!.choices[index], - ); - }); - } - - Widget get activityWidget { - switch (widget.practiceEvent.practiceActivity.activityType) { - case ActivityTypeEnum.multipleChoice: - return MultipleChoiceActivity( - card: this, - updateChoice: updateChoice, - isActive: - !recordSubmittedPreviousSession && !recordSubmittedThisSession, - ); - default: - return const SizedBox.shrink(); - } - } - - void sendRecord() { - MatrixState.pangeaController.activityRecordController - .send( - recordModel!, - widget.practiceEvent, - ) - .catchError((error) { - ErrorHandler.logError( - e: error, - s: StackTrace.current, - data: { - 'recordModel': recordModel?.toJson(), - 'practiceEvent': widget.practiceEvent.event.toJson(), - }, - ); - return null; - }).then((_) => widget.controller.showNextActivity()); - - setState(() { - recordSubmittedThisSession = true; - }); - } - - @override - Widget build(BuildContext context) { - debugPrint( - "MessagePracticeActivityContentState.build with selectedChoiceIndex: $selectedChoiceIndex", - ); - return Column( - children: [ - activityWidget, - const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Opacity( - opacity: selectedChoiceIndex != null && - !recordSubmittedThisSession && - !recordSubmittedPreviousSession - ? 1.0 - : 0.5, - child: TextButton( - onPressed: () { - if (recordSubmittedThisSession || - recordSubmittedPreviousSession) { - return; - } - selectedChoiceIndex != null ? sendRecord() : null; - }, - style: ButtonStyle( - backgroundColor: WidgetStateProperty.all( - AppConfig.primaryColor, - ), - ), - child: Text(L10n.of(context)!.submit), - ), - ), - ], - ), - ], - ); - } -} diff --git a/needed-translations.txt b/needed-translations.txt index 1355bb368..ec54ac359 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -863,7 +863,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "be": [ @@ -2363,7 +2364,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "bn": [ @@ -3859,7 +3861,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "bo": [ @@ -5359,7 +5362,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ca": [ @@ -6261,7 +6265,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "cs": [ @@ -7245,7 +7250,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "de": [ @@ -8112,7 +8118,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "el": [ @@ -9563,7 +9570,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "eo": [ @@ -10712,7 +10720,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "es": [ @@ -10727,7 +10736,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "et": [ @@ -11594,7 +11604,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "eu": [ @@ -12463,7 +12474,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "fa": [ @@ -13469,7 +13481,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "fi": [ @@ -14439,7 +14452,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "fil": [ @@ -15765,7 +15779,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "fr": [ @@ -16770,7 +16785,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ga": [ @@ -17904,7 +17920,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "gl": [ @@ -18771,7 +18788,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "he": [ @@ -20024,7 +20042,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "hi": [ @@ -21517,7 +21536,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "hr": [ @@ -22463,7 +22483,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "hu": [ @@ -23346,7 +23367,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ia": [ @@ -24832,7 +24854,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "id": [ @@ -25705,7 +25728,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ie": [ @@ -26962,7 +26986,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "it": [ @@ -27886,7 +27911,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ja": [ @@ -28921,7 +28947,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ka": [ @@ -30275,7 +30302,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ko": [ @@ -31144,7 +31172,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "lt": [ @@ -32179,7 +32208,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "lv": [ @@ -33054,7 +33084,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "nb": [ @@ -34253,7 +34284,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "nl": [ @@ -35216,7 +35248,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "pl": [ @@ -36188,7 +36221,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "pt": [ @@ -37666,7 +37700,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "pt_BR": [ @@ -38539,7 +38574,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "pt_PT": [ @@ -39739,7 +39775,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ro": [ @@ -40746,7 +40783,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ru": [ @@ -41619,7 +41657,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "sk": [ @@ -42885,7 +42924,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "sl": [ @@ -44281,7 +44321,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "sr": [ @@ -45451,7 +45492,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "sv": [ @@ -46355,7 +46397,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "ta": [ @@ -47852,7 +47895,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "th": [ @@ -49303,7 +49347,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "tr": [ @@ -50170,7 +50215,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "uk": [ @@ -51074,7 +51120,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "vi": [ @@ -52426,7 +52473,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "zh": [ @@ -53293,7 +53341,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ], "zh_Hant": [ @@ -54441,6 +54490,7 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "previous" ] } From 47dbe6dfd308658d4a5b09b241288bab52bfb90a Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Wed, 26 Jun 2024 16:21:57 -0400 Subject: [PATCH 24/54] itAutoPlay moved from ToolSettings to PLocalKey --- .../controllers/choreographer.dart | 6 +-- lib/pangea/constants/local.key.dart | 1 + lib/pangea/controllers/local_settings.dart | 3 +- lib/pangea/controllers/user_controller.dart | 18 +++---- lib/pangea/models/class_model.dart | 51 +++++++------------ lib/pangea/models/user_model.dart | 6 +-- .../settings_learning_view.dart | 10 ++++ lib/pangea/widgets/igc/span_card.dart | 4 +- 8 files changed, 47 insertions(+), 52 deletions(-) diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 529ba95b4..ce6dbb04f 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -15,6 +15,7 @@ import 'package:fluffychat/pangea/models/class_model.dart'; import 'package:fluffychat/pangea/models/it_step.dart'; import 'package:fluffychat/pangea/models/representation_content_model.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; +import 'package:fluffychat/pangea/models/user_model.dart'; import 'package:fluffychat/pangea/utils/any_state_holder.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/overlay.dart'; @@ -513,9 +514,8 @@ class Choreographer { chatController.room, ); - bool get itAutoPlayEnabled => pangeaController.permissionsController.isToolEnabled( - ToolSetting.itAutoPlay, - chatController.room, + bool get itAutoPlayEnabled => pangeaController.pStoreService.read( + MatrixProfile.itAutoPlay.title, ); bool get definitionsEnabled => diff --git a/lib/pangea/constants/local.key.dart b/lib/pangea/constants/local.key.dart index c0390c2ba..8dc496bf8 100644 --- a/lib/pangea/constants/local.key.dart +++ b/lib/pangea/constants/local.key.dart @@ -11,4 +11,5 @@ class PLocalKey { static const String dismissedPaywall = 'dismissedPaywall'; static const String paywallBackoff = 'paywallBackoff'; static const String autoPlayMessages = 'autoPlayMessages'; + static const String itAutoPlay = 'itAutoPlay'; } diff --git a/lib/pangea/controllers/local_settings.dart b/lib/pangea/controllers/local_settings.dart index d6ae119a5..5984a7bf5 100644 --- a/lib/pangea/controllers/local_settings.dart +++ b/lib/pangea/controllers/local_settings.dart @@ -9,8 +9,7 @@ class LocalSettings { } bool userLanguageToolSetting(ToolSetting setting) => - _pangeaController.pStoreService.read(setting.toString()) - ?? setting != ToolSetting.itAutoPlay; + _pangeaController.pStoreService.read(setting.toString()) ?? true; // bool get userEnableIT => // _pangeaController.pStoreService.read(ToolSetting.interactiveTranslator.toString()) ?? true; diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index 0e336fdf6..31cde897f 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -123,10 +123,10 @@ class UserController extends BaseController { : null; final bool? autoPlay = migratedProfileInfo(MatrixProfile.autoPlayMessages); + final bool? itAutoPlay = migratedProfileInfo(MatrixProfile.itAutoPlay); final bool? trial = migratedProfileInfo(MatrixProfile.activatedFreeTrial); final bool? interactiveTranslator = migratedProfileInfo(MatrixProfile.interactiveTranslator); - final bool? itAutoPlay = migratedProfileInfo(MatrixProfile.itAutoPlay); final bool? interactiveGrammar = migratedProfileInfo(MatrixProfile.interactiveGrammar); final bool? immersionMode = @@ -143,9 +143,9 @@ class UserController extends BaseController { await updateMatrixProfile( dateOfBirth: dob, autoPlayMessages: autoPlay, + itAutoPlay: itAutoPlay, activatedFreeTrial: trial, interactiveTranslator: interactiveTranslator, - itAutoPlay: itAutoPlay, interactiveGrammar: interactiveGrammar, immersionMode: immersionMode, definitions: definitions, @@ -225,9 +225,9 @@ class UserController extends BaseController { Future updateMatrixProfile({ String? dateOfBirth, bool? autoPlayMessages, + bool? itAutoPlay, bool? activatedFreeTrial, bool? interactiveTranslator, - bool? itAutoPlay, bool? interactiveGrammar, bool? immersionMode, bool? definitions, @@ -253,6 +253,12 @@ class UserController extends BaseController { autoPlayMessages, ); } + if (itAutoPlay != null) { + await _pangeaController.pStoreService.save( + MatrixProfile.itAutoPlay.title, + itAutoPlay, + ); + } if (activatedFreeTrial != null) { await _pangeaController.pStoreService.save( MatrixProfile.activatedFreeTrial.title, @@ -265,12 +271,6 @@ class UserController extends BaseController { interactiveTranslator, ); } - if (itAutoPlay != null) { - await _pangeaController.pStoreService.save( - MatrixProfile.itAutoPlay.title, - itAutoPlay, - ); - } if (interactiveGrammar != null) { await _pangeaController.pStoreService.save( MatrixProfile.interactiveGrammar.title, diff --git a/lib/pangea/models/class_model.dart b/lib/pangea/models/class_model.dart index f663af8ce..0bebdac2f 100644 --- a/lib/pangea/models/class_model.dart +++ b/lib/pangea/models/class_model.dart @@ -31,13 +31,13 @@ class ClassSettingsModel { }); static ClassSettingsModel get newClass => ClassSettingsModel( - city: null, - country: null, - dominantLanguage: ClassDefaultValues.defaultDominantLanguage, - languageLevel: null, - schoolName: null, - targetLanguage: ClassDefaultValues.defaultTargetLanguage, - ); + city: null, + country: null, + dominantLanguage: ClassDefaultValues.defaultDominantLanguage, + languageLevel: null, + schoolName: null, + targetLanguage: ClassDefaultValues.defaultTargetLanguage, + ); factory ClassSettingsModel.fromJson(Map json) { return ClassSettingsModel( @@ -100,9 +100,9 @@ class ClassSettingsModel { } StateEvent get toStateEvent => StateEvent( - content: toJson(), - type: PangeaEventTypes.classSettings, - ); + content: toJson(), + type: PangeaEventTypes.classSettings, + ); } class PangeaRoomRules { @@ -120,7 +120,6 @@ class PangeaRoomRules { bool isInviteOnlyStudents; // 0 = forbidden, 1 = allow individual to choose, 2 = require int interactiveTranslator; - int itAutoPlay; int interactiveGrammar; int immersionMode; int definitions; @@ -139,7 +138,6 @@ class PangeaRoomRules { this.isVoiceNotes = true, this.isInviteOnlyStudents = true, this.interactiveTranslator = ClassDefaultValues.languageToolPermissions, - this.itAutoPlay = ClassDefaultValues.languageToolPermissions, this.interactiveGrammar = ClassDefaultValues.languageToolPermissions, this.immersionMode = ClassDefaultValues.languageToolPermissions, this.definitions = ClassDefaultValues.languageToolPermissions, @@ -191,9 +189,6 @@ class PangeaRoomRules { case ToolSetting.interactiveTranslator: interactiveTranslator = value; break; - case ToolSetting.itAutoPlay: - itAutoPlay = value; - break; case ToolSetting.interactiveGrammar: interactiveGrammar = value; break; @@ -212,9 +207,9 @@ class PangeaRoomRules { } StateEvent get toStateEvent => StateEvent( - content: toJson(), - type: PangeaEventTypes.rules, - ); + content: toJson(), + type: PangeaEventTypes.rules, + ); factory PangeaRoomRules.fromJson(Map json) => PangeaRoomRules( @@ -232,16 +227,14 @@ class PangeaRoomRules { isInviteOnlyStudents: json['is_invite_only_students'] ?? true, interactiveTranslator: json['interactive_translator'] ?? ClassDefaultValues.languageToolPermissions, - itAutoPlay: json['it_auto_play'] ?? - ClassDefaultValues.languageToolPermissions, interactiveGrammar: json['interactive_grammar'] ?? ClassDefaultValues.languageToolPermissions, immersionMode: json['immersion_mode'] ?? ClassDefaultValues.languageToolPermissions, definitions: - json['definitions'] ?? ClassDefaultValues.languageToolPermissions, + json['definitions'] ?? ClassDefaultValues.languageToolPermissions, translations: - json['translations'] ?? ClassDefaultValues.languageToolPermissions, + json['translations'] ?? ClassDefaultValues.languageToolPermissions, ); Map toJson() { @@ -259,7 +252,6 @@ class PangeaRoomRules { data['is_voice_notes'] = isVoiceNotes; data['is_invite_only_students'] = isInviteOnlyStudents; data['interactive_translator'] = interactiveTranslator; - data['it_auto_play'] = itAutoPlay; data['interactive_grammar'] = interactiveGrammar; data['immersion_mode'] = immersionMode; data['definitions'] = definitions; @@ -271,8 +263,6 @@ class PangeaRoomRules { switch (setting) { case ToolSetting.interactiveTranslator: return interactiveTranslator; - case ToolSetting.itAutoPlay: - return itAutoPlay; case ToolSetting.interactiveGrammar: return interactiveGrammar; case ToolSetting.immersionMode: @@ -287,9 +277,9 @@ class PangeaRoomRules { } String languageToolPermissionsText( - BuildContext context, - ToolSetting setting, - ) { + BuildContext context, + ToolSetting setting, + ) { switch (getToolSettings(setting)) { case 0: return L10n.of(context)!.interactiveTranslatorNotAllowed; @@ -305,7 +295,6 @@ class PangeaRoomRules { enum ToolSetting { interactiveTranslator, - itAutoPlay, interactiveGrammar, immersionMode, definitions, @@ -317,8 +306,6 @@ extension SettingCopy on ToolSetting { switch (this) { case ToolSetting.interactiveTranslator: return L10n.of(context)!.interactiveTranslatorSliderHeader; - case ToolSetting.itAutoPlay: - return L10n.of(context)!.interactiveTranslatorAutoPlaySliderHeader; case ToolSetting.interactiveGrammar: return L10n.of(context)!.interactiveGrammarSliderHeader; case ToolSetting.immersionMode: @@ -337,8 +324,6 @@ extension SettingCopy on ToolSetting { return L10n.of(context)!.itToggleDescription; case ToolSetting.interactiveGrammar: return L10n.of(context)!.igcToggleDescription; - case ToolSetting.itAutoPlay: - return L10n.of(context)!.interactiveTranslatorAutoPlayDesc; case ToolSetting.immersionMode: return L10n.of(context)!.toggleImmersionModeDesc; case ToolSetting.definitions: diff --git a/lib/pangea/models/user_model.dart b/lib/pangea/models/user_model.dart index 396bcaccb..3721da95c 100644 --- a/lib/pangea/models/user_model.dart +++ b/lib/pangea/models/user_model.dart @@ -54,9 +54,9 @@ class PUserModel { enum MatrixProfile { dateOfBirth, autoPlayMessages, + itAutoPlay, activatedFreeTrial, interactiveTranslator, - itAutoPlay, interactiveGrammar, immersionMode, definitions, @@ -78,12 +78,12 @@ extension MatrixProfileExtension on MatrixProfile { return ModelKey.userDateOfBirth; case MatrixProfile.autoPlayMessages: return PLocalKey.autoPlayMessages; + case MatrixProfile.itAutoPlay: + return PLocalKey.itAutoPlay; case MatrixProfile.activatedFreeTrial: return PLocalKey.activatedTrialKey; case MatrixProfile.interactiveTranslator: return ToolSetting.interactiveTranslator.toString(); - case MatrixProfile.itAutoPlay: - return ToolSetting.itAutoPlay.toString(); case MatrixProfile.interactiveGrammar: return ToolSetting.interactiveGrammar.toString(); case MatrixProfile.immersionMode: diff --git a/lib/pangea/pages/settings_learning/settings_learning_view.dart b/lib/pangea/pages/settings_learning/settings_learning_view.dart index 6c3a87f00..207600497 100644 --- a/lib/pangea/pages/settings_learning/settings_learning_view.dart +++ b/lib/pangea/pages/settings_learning/settings_learning_view.dart @@ -61,6 +61,16 @@ class SettingsLearningView extends StatelessWidget { pStoreKey: setting.toString(), local: false, ), + PSettingsSwitchListTile.adaptive( + defaultValue: controller.pangeaController.pStoreService.read( + PLocalKey.itAutoPlay, + ) ?? + false, + title: L10n.of(context)!.interactiveTranslatorAutoPlaySliderHeader, + subtitle: L10n.of(context)!.interactiveTranslatorAutoPlayDesc, + pStoreKey: PLocalKey.itAutoPlay, + local: false, + ), PSettingsSwitchListTile.adaptive( defaultValue: controller.pangeaController.pStoreService.read( PLocalKey.autoPlayMessages, diff --git a/lib/pangea/widgets/igc/span_card.dart b/lib/pangea/widgets/igc/span_card.dart index 75738a687..1f31ea07f 100644 --- a/lib/pangea/widgets/igc/span_card.dart +++ b/lib/pangea/widgets/igc/span_card.dart @@ -1,6 +1,7 @@ import 'dart:developer'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pangea/constants/local.key.dart'; import 'package:fluffychat/pangea/enum/span_data_type.dart'; import 'package:fluffychat/pangea/models/span_data.dart'; import 'package:fluffychat/pangea/utils/bot_style.dart'; @@ -15,7 +16,6 @@ import '../../../widgets/matrix.dart'; import '../../choreographer/widgets/choice_array.dart'; import '../../controllers/pangea_controller.dart'; import '../../enum/span_choice_type.dart'; -import '../../models/class_model.dart'; import '../../models/span_card_model.dart'; import '../common/bot_face_svg.dart'; import 'card_header.dart'; @@ -472,7 +472,7 @@ class DontShowSwitchListTileState extends State { value: switchValue, onChanged: (value) => { widget.controller.pStoreService.save( - ToolSetting.itAutoPlay.toString(), + PLocalKey.itAutoPlay.toString(), value, ), setState(() => switchValue = value), From 04a94b074f7031aec773db5ee04ff604d69c10c6 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Wed, 26 Jun 2024 17:52:35 -0400 Subject: [PATCH 25/54] Label analytics filters --- assets/l10n/intl_en.arb | 9 ++++- .../analytics/analytics_language_button.dart | 16 +++++++- .../pages/analytics/base_analytics_view.dart | 21 ++++++---- .../analytics/space_list/space_list_view.dart | 38 ++++++++++--------- .../analytics/time_span_menu_button.dart | 14 ++++++- 5 files changed, 70 insertions(+), 28 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 056c6a347..7df01a3fd 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -4058,5 +4058,12 @@ "suggestToSpaceDesc": "Suggested spaces will appear in the chat lists for their parent spaces", "practice": "Practice", "noLanguagesSet": "No languages set", - "noActivitiesFound": "No practice activities found for this message" + "noActivitiesFound": "No practice activities found for this message", + "languageButtonLabel": "Language: {currentLanguage}", + "@languageButtonLabel": { + "type": "text", + "placeholders": { + "currentLanguage": {} + } + } } \ No newline at end of file diff --git a/lib/pangea/pages/analytics/analytics_language_button.dart b/lib/pangea/pages/analytics/analytics_language_button.dart index d74e07be1..2c3923fb4 100644 --- a/lib/pangea/pages/analytics/analytics_language_button.dart +++ b/lib/pangea/pages/analytics/analytics_language_button.dart @@ -16,7 +16,6 @@ class AnalyticsLanguageButton extends StatelessWidget { @override Widget build(BuildContext context) { return PopupMenuButton( - icon: const Icon(Icons.language_outlined), tooltip: L10n.of(context)!.changeAnalyticsLanguage, initialValue: value, onSelected: (LanguageModel? lang) { @@ -33,6 +32,21 @@ class AnalyticsLanguageButton extends StatelessWidget { child: Text(lang.getDisplayName(context) ?? lang.langCode), ); }).toList(), + child: TextButton.icon( + label: Text( + L10n.of(context)!.languageButtonLabel( + value.getDisplayName(context) ?? value.langCode, + ), + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface, + ), + ), + icon: Icon( + Icons.language_outlined, + color: Theme.of(context).colorScheme.onSurface, + ), + onPressed: null, + ), ); } } diff --git a/lib/pangea/pages/analytics/base_analytics_view.dart b/lib/pangea/pages/analytics/base_analytics_view.dart index 1c0445d5a..449a8d172 100644 --- a/lib/pangea/pages/analytics/base_analytics_view.dart +++ b/lib/pangea/pages/analytics/base_analytics_view.dart @@ -108,7 +108,10 @@ class BaseAnalyticsView extends StatelessWidget { ? Column( children: [ Row( - mainAxisAlignment: MainAxisAlignment.end, + mainAxisAlignment: controller.widget.defaultSelected.type == + AnalyticsEntryType.space + ? MainAxisAlignment.spaceEvenly + : MainAxisAlignment.start, children: [ if (controller.widget.defaultSelected.type == AnalyticsEntryType.student) @@ -159,13 +162,15 @@ class BaseAnalyticsView extends StatelessWidget { ), Expanded( child: SingleChildScrollView( - child: SizedBox( - height: max( - controller.widget.tabs[0].items.length + - 1, - controller.widget.tabs[1].items.length, - ) * - 72, + child: ConstrainedBox( + constraints: BoxConstraints( + maxHeight: max( + controller.widget.tabs[0].items.length + + 1, + controller.widget.tabs[1].items.length, + ) * + 73, + ), child: TabBarView( physics: const NeverScrollableScrollPhysics(), children: [ diff --git a/lib/pangea/pages/analytics/space_list/space_list_view.dart b/lib/pangea/pages/analytics/space_list/space_list_view.dart index 5f5bf22da..877efdca2 100644 --- a/lib/pangea/pages/analytics/space_list/space_list_view.dart +++ b/lib/pangea/pages/analytics/space_list/space_list_view.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/pangea/enum/time_span.dart'; import 'package:fluffychat/pangea/pages/analytics/analytics_language_button.dart'; import 'package:fluffychat/pangea/pages/analytics/analytics_list_tile.dart'; import 'package:fluffychat/pangea/pages/analytics/time_span_menu_button.dart'; @@ -5,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:go_router/go_router.dart'; -import '../../../enum/time_span.dart'; import '../base_analytics.dart'; import 'space_list.dart'; @@ -32,25 +32,29 @@ class AnalyticsSpaceListView extends StatelessWidget { icon: const Icon(Icons.close_outlined), onPressed: () => context.pop(), ), - actions: [ - TimeSpanMenuButton( - value: - controller.pangeaController.analytics.currentAnalyticsTimeSpan, - onChange: (TimeSpan value) => controller.toggleTimeSpan( - context, - value, - ), - ), - AnalyticsLanguageButton( - value: - controller.pangeaController.analytics.currentAnalyticsSpaceLang, - onChange: (lang) => controller.toggleSpaceLang(lang), - languages: controller.pangeaController.pLanguageStore.targetOptions, - ), - ], ), body: Column( children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + TimeSpanMenuButton( + value: controller + .pangeaController.analytics.currentAnalyticsTimeSpan, + onChange: (TimeSpan value) => controller.toggleTimeSpan( + context, + value, + ), + ), + AnalyticsLanguageButton( + value: controller + .pangeaController.analytics.currentAnalyticsSpaceLang, + onChange: (lang) => controller.toggleSpaceLang(lang), + languages: + controller.pangeaController.pLanguageStore.targetOptions, + ), + ], + ), Flexible( child: ListView.builder( itemCount: controller.spaces.length, diff --git a/lib/pangea/pages/analytics/time_span_menu_button.dart b/lib/pangea/pages/analytics/time_span_menu_button.dart index 23d2ad0c8..32f6668bc 100644 --- a/lib/pangea/pages/analytics/time_span_menu_button.dart +++ b/lib/pangea/pages/analytics/time_span_menu_button.dart @@ -15,7 +15,6 @@ class TimeSpanMenuButton extends StatelessWidget { @override Widget build(BuildContext context) { return PopupMenuButton( - icon: const Icon(Icons.calendar_month_outlined), tooltip: L10n.of(context)!.changeDateRange, initialValue: value, onSelected: (TimeSpan? timeSpan) { @@ -32,6 +31,19 @@ class TimeSpanMenuButton extends StatelessWidget { child: Text(timeSpan.string(context)), ); }).toList(), + child: TextButton.icon( + label: Text( + value.string(context), + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface, + ), + ), + icon: Icon( + Icons.calendar_month_outlined, + color: Theme.of(context).colorScheme.onSurface, + ), + onPressed: null, + ), ); } } From 122519d9ce1466655c422b3a779df94c4db63268 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Thu, 27 Jun 2024 10:01:20 -0400 Subject: [PATCH 26/54] Make scrollbar draggable --- .../p_class_widgets/class_description_button.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart b/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart index 24c934953..ff7d0068a 100644 --- a/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart +++ b/lib/pangea/pages/class_settings/p_class_widgets/class_description_button.dart @@ -17,6 +17,7 @@ class ClassDescriptionButton extends StatelessWidget { @override Widget build(BuildContext context) { final iconColor = Theme.of(context).textTheme.bodyLarge!.color; + final ScrollController scrollController = ScrollController(); return Column( children: [ ListTile( @@ -31,9 +32,11 @@ class ClassDescriptionButton extends StatelessWidget { maxHeight: 190, ), child: Scrollbar( + controller: scrollController, + interactive: true, child: SingleChildScrollView( + controller: scrollController, primary: false, - controller: ScrollController(), child: Text( room.topic.isEmpty ? (room.isRoomAdmin From 941508222731b9053a0df471769a65b4d4ca01f9 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 27 Jun 2024 10:21:33 -0400 Subject: [PATCH 27/54] base last updated on target lang --- .../controllers/my_analytics_controller.dart | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index ea0d06c56..614fcf9db 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -25,20 +25,23 @@ class MyAnalyticsController extends BaseController { final int _maxMessagesCached = 10; final int _minutesBeforeUpdate = 5; + /// the time since the last update that will trigger an automatic update + final Duration _timeSinceUpdate = const Duration(days: 1); + MyAnalyticsController(PangeaController pangeaController) { _pangeaController = pangeaController; } - // adds the listener that handles when to run automatic updates - // to analytics - either after a certain number of messages sent/ - // received or after a certain amount of time without an update + /// adds the listener that handles when to run automatic updates + /// to analytics - either after a certain number of messages sent/ + /// received or after a certain amount of time [_timeSinceUpdate] without an update Future addEventsListener() async { final Client client = _pangeaController.matrixState.client; // if analytics haven't been updated in the last day, update them DateTime? lastUpdated = await _pangeaController.analytics .myAnalyticsLastUpdated(PangeaEventTypes.summaryAnalytics); - final DateTime yesterday = DateTime.now().subtract(const Duration(days: 1)); + final DateTime yesterday = DateTime.now().subtract(_timeSinceUpdate); if (lastUpdated?.isBefore(yesterday) ?? true) { debugPrint("analytics out-of-date, updating"); await updateAnalytics(); @@ -53,9 +56,9 @@ class MyAnalyticsController extends BaseController { }); } - // given an update from sync stream, check if the update contains - // messages for which analytics will be saved. If so, reset the timer - // and add the event ID to the cache of un-added event IDs + /// given an update from sync stream, check if the update contains + /// messages for which analytics will be saved. If so, reset the timer + /// and add the event ID to the cache of un-added event IDs void updateAnalyticsTimer(SyncUpdate update, DateTime? lastUpdated) { for (final entry in update.rooms!.join!.entries) { final Room room = @@ -160,6 +163,7 @@ class MyAnalyticsController extends BaseController { _updateCompleter = Completer(); try { await _updateAnalytics(); + clearMessagesSinceUpdate(); } catch (err, s) { ErrorHandler.logError( e: err, @@ -172,6 +176,9 @@ class MyAnalyticsController extends BaseController { } } + // top level analytics sending function. Send analytics + // for each type of analytics event + // to each of the applicable analytics rooms Future _updateAnalytics() async { // if the user's l2 is not sent, don't send analytics final String? userL2 = _pangeaController.languageController.activeL2Code(); @@ -179,11 +186,6 @@ class MyAnalyticsController extends BaseController { return; } - // top level analytics sending function. Send analytics - // for each type of analytics event - // to each of the applicable analytics rooms - clearMessagesSinceUpdate(); - // fetch a list of all the chats that the user is studying // and a list of all the spaces in which the user is studying await setStudentChats(); @@ -199,9 +201,21 @@ class MyAnalyticsController extends BaseController { .where((lastUpdate) => lastUpdate != null) .cast() .toList(); - lastUpdates.sort((a, b) => a.compareTo(b)); - final DateTime? leastRecentUpdate = - lastUpdates.isNotEmpty ? lastUpdates.first : null; + + /// Get the last time that analytics to for current target language + /// were updated. This my present a problem is the user has analytics + /// rooms for multiple languages, and a non-target language was updated + /// less recently than the target language. In this case, some data may + /// be missing, but a case like that seems relatively rare, and could + /// result in unnecessaily going too far back in the chat history + DateTime? l2AnalyticsLastUpdated = lastUpdatedMap[userL2]; + if (l2AnalyticsLastUpdated == null) { + /// if the target language has never been updated, use the least + /// recent update time + lastUpdates.sort((a, b) => a.compareTo(b)); + l2AnalyticsLastUpdated = + lastUpdates.isNotEmpty ? lastUpdates.first : null; + } // for each chat the user is studying in, get all the messages // since the least recent update analytics update, and sort them @@ -209,7 +223,7 @@ class MyAnalyticsController extends BaseController { final Map> langCodeToMsgs = await getLangCodesToMsgs( userL2, - leastRecentUpdate, + l2AnalyticsLastUpdated, ); final List langCodes = langCodeToMsgs.keys.toList(); @@ -223,7 +237,7 @@ class MyAnalyticsController extends BaseController { // message in this language at the time of the last analytics update // so fallback to the least recent update time final DateTime? lastUpdated = - lastUpdatedMap[analyticsRoom.id] ?? leastRecentUpdate; + lastUpdatedMap[analyticsRoom.id] ?? l2AnalyticsLastUpdated; // get the corresponding list of recent messages for this langCode final List recentMsgs = From 0d896e24d2808a95aeb3ffd556f88e37aa754f5a Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 27 Jun 2024 10:39:35 -0400 Subject: [PATCH 28/54] added explanation for scroll configuation --- lib/pages/chat_details/chat_details_view.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart index cf4668637..93496beee 100644 --- a/lib/pages/chat_details/chat_details_view.dart +++ b/lib/pages/chat_details/chat_details_view.dart @@ -105,6 +105,8 @@ class ChatDetailsView extends StatelessWidget { ), body: MaxWidthBody( // #Pangea + // chat description title has its own scrollbar so we disable the parent one + // otherwise they scroll with each other child: ScrollConfiguration( behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), @@ -420,7 +422,8 @@ class ChatDetailsView extends StatelessWidget { // trailing: const Icon(Icons.chevron_right_outlined), // Pangea# onTap: () => context.push( - '/rooms/${room.id}/details/permissions'), + '/rooms/${room.id}/details/permissions', + ), ), Divider( height: 1, From 8b981ddce9302169cf2e7e192666a5f9be166053 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Thu, 27 Jun 2024 11:08:38 -0400 Subject: [PATCH 29/54] Make buttons same for my and space analytics --- .../pages/analytics/base_analytics_view.dart | 406 +++++++++--------- 1 file changed, 193 insertions(+), 213 deletions(-) diff --git a/lib/pangea/pages/analytics/base_analytics_view.dart b/lib/pangea/pages/analytics/base_analytics_view.dart index 449a8d172..36bda7e48 100644 --- a/lib/pangea/pages/analytics/base_analytics_view.dart +++ b/lib/pangea/pages/analytics/base_analytics_view.dart @@ -104,228 +104,208 @@ class BaseAnalyticsView extends StatelessWidget { ), body: MaxWidthBody( withScrolling: false, - child: controller.widget.selectedView != null - ? Column( + child: Column( + children: [ + if (controller.widget.selectedView != null) + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - Row( - mainAxisAlignment: controller.widget.defaultSelected.type == - AnalyticsEntryType.space - ? MainAxisAlignment.spaceEvenly - : MainAxisAlignment.start, + TimeSpanMenuButton( + value: controller.currentTimeSpan, + onChange: (TimeSpan value) => + controller.toggleTimeSpan(context, value), + ), + AnalyticsLanguageButton( + value: controller + .pangeaController.analytics.currentAnalyticsSpaceLang, + onChange: (lang) => controller.toggleSpaceLang(lang), + languages: controller + .pangeaController.pLanguageStore.targetOptions, + ), + ], + ), + if (controller.widget.selectedView != null) + Expanded( + flex: 1, + child: chartView(context), + ), + if (controller.widget.selectedView != null) + Expanded( + flex: 1, + child: DefaultTabController( + length: 2, + child: Column( children: [ - if (controller.widget.defaultSelected.type == - AnalyticsEntryType.student) - IconButton( - icon: const Icon(Icons.refresh), - onPressed: controller.onRefresh, - tooltip: L10n.of(context)!.refresh, - ), - TimeSpanMenuButton( - value: controller.currentTimeSpan, - onChange: (TimeSpan value) => - controller.toggleTimeSpan(context, value), - ), - if (controller.widget.defaultSelected.type == - AnalyticsEntryType.space) - AnalyticsLanguageButton( - value: controller.pangeaController.analytics - .currentAnalyticsSpaceLang, - onChange: (lang) => controller.toggleSpaceLang(lang), - languages: controller - .pangeaController.pLanguageStore.targetOptions, - ), - ], - ), - Expanded( - flex: 1, - child: chartView(context), - ), - Expanded( - flex: 1, - child: DefaultTabController( - length: 2, - child: Column( - children: [ - TabBar( - tabs: [ - ...controller.widget.tabs.map( - (tab) => Tab( - icon: Icon( - tab.icon, - color: Theme.of(context) - .colorScheme - .onSurfaceVariant, - ), - ), - ), - ], - ), - Expanded( - child: SingleChildScrollView( - child: ConstrainedBox( - constraints: BoxConstraints( - maxHeight: max( - controller.widget.tabs[0].items.length + - 1, - controller.widget.tabs[1].items.length, - ) * - 73, - ), - child: TabBarView( - physics: const NeverScrollableScrollPhysics(), - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.stretch, - children: [ - ...controller.widget.tabs[0].items.map( - (item) => AnalyticsListTile( - refreshStream: - controller.refreshStream, - avatar: item.avatar, - defaultSelected: controller - .widget.defaultSelected, - selected: AnalyticsSelected( - item.id, - controller.widget.tabs[0].type, - item.displayName, - ), - isSelected: - controller.isSelected(item.id), - onTap: (_) => - controller.toggleSelection( - AnalyticsSelected( - item.id, - controller.widget.tabs[0].type, - item.displayName, - ), - ), - allowNavigateOnSelect: controller - .widget - .tabs[0] - .allowNavigateOnSelect, - pangeaController: - controller.pangeaController, - controller: controller, - ), - ), - if (controller - .widget.defaultSelected.type == - AnalyticsEntryType.space) - AnalyticsListTile( - refreshStream: - controller.refreshStream, - defaultSelected: controller - .widget.defaultSelected, - avatar: null, - selected: AnalyticsSelected( - controller - .widget.defaultSelected.id, - AnalyticsEntryType.privateChats, - L10n.of(context)!.allPrivateChats, - ), - allowNavigateOnSelect: false, - isSelected: controller.isSelected( - controller - .widget.defaultSelected.id, - ), - onTap: controller.toggleSelection, - pangeaController: - controller.pangeaController, - controller: controller, - ), - ], - ), - Column( - crossAxisAlignment: - CrossAxisAlignment.stretch, - children: controller.widget.tabs[1].items - .map( - (item) => AnalyticsListTile( - refreshStream: - controller.refreshStream, - avatar: item.avatar, - defaultSelected: controller - .widget.defaultSelected, - selected: AnalyticsSelected( - item.id, - controller.widget.tabs[1].type, - item.displayName, - ), - isSelected: controller - .isSelected(item.id), - onTap: controller.toggleSelection, - allowNavigateOnSelect: controller - .widget - .tabs[1] - .allowNavigateOnSelect, - pangeaController: - controller.pangeaController, - controller: controller, - ), - ) - .toList(), - ), - ], - ), + TabBar( + tabs: [ + ...controller.widget.tabs.map( + (tab) => Tab( + icon: Icon( + tab.icon, + color: Theme.of(context) + .colorScheme + .onSurfaceVariant, ), ), ), ], ), - ), + Expanded( + child: SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + maxHeight: max( + controller.widget.tabs[0].items.length + 1, + controller.widget.tabs[1].items.length, + ) * + 73, + ), + child: TabBarView( + physics: const NeverScrollableScrollPhysics(), + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.stretch, + children: [ + ...controller.widget.tabs[0].items.map( + (item) => AnalyticsListTile( + refreshStream: controller.refreshStream, + avatar: item.avatar, + defaultSelected: + controller.widget.defaultSelected, + selected: AnalyticsSelected( + item.id, + controller.widget.tabs[0].type, + item.displayName, + ), + isSelected: + controller.isSelected(item.id), + onTap: (_) => + controller.toggleSelection( + AnalyticsSelected( + item.id, + controller.widget.tabs[0].type, + item.displayName, + ), + ), + allowNavigateOnSelect: controller.widget + .tabs[0].allowNavigateOnSelect, + pangeaController: + controller.pangeaController, + controller: controller, + ), + ), + if (controller + .widget.defaultSelected.type == + AnalyticsEntryType.space) + AnalyticsListTile( + refreshStream: controller.refreshStream, + defaultSelected: + controller.widget.defaultSelected, + avatar: null, + selected: AnalyticsSelected( + controller.widget.defaultSelected.id, + AnalyticsEntryType.privateChats, + L10n.of(context)!.allPrivateChats, + ), + allowNavigateOnSelect: false, + isSelected: controller.isSelected( + controller.widget.defaultSelected.id, + ), + onTap: controller.toggleSelection, + pangeaController: + controller.pangeaController, + controller: controller, + ), + ], + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.stretch, + children: controller.widget.tabs[1].items + .map( + (item) => AnalyticsListTile( + refreshStream: + controller.refreshStream, + avatar: item.avatar, + defaultSelected: + controller.widget.defaultSelected, + selected: AnalyticsSelected( + item.id, + controller.widget.tabs[1].type, + item.displayName, + ), + isSelected: + controller.isSelected(item.id), + onTap: controller.toggleSelection, + allowNavigateOnSelect: controller + .widget + .tabs[1] + .allowNavigateOnSelect, + pangeaController: + controller.pangeaController, + controller: controller, + ), + ) + .toList(), + ), + ], + ), + ), + ), + ), + ], ), - ], - ) - : Column( - children: [ - const Divider(height: 1), - ListTile( - title: Text(L10n.of(context)!.grammarAnalytics), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: - Theme.of(context).textTheme.bodyLarge!.color, - child: Icon(BarChartViewSelection.grammar.icon), - ), - trailing: const Icon(Icons.chevron_right), - onTap: () { - String route = - "/rooms/${controller.widget.defaultSelected.type.route}"; - if (controller.widget.defaultSelected.type == - AnalyticsEntryType.space) { - route += "/${controller.widget.defaultSelected.id}"; - } - route += "/${BarChartViewSelection.grammar.route}"; - context.go(route); - }, - ), - const Divider(height: 1), - ListTile( - title: Text(L10n.of(context)!.messageAnalytics), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: - Theme.of(context).textTheme.bodyLarge!.color, - child: Icon(BarChartViewSelection.messages.icon), - ), - trailing: const Icon(Icons.chevron_right), - onTap: () { - String route = - "/rooms/${controller.widget.defaultSelected.type.route}"; - if (controller.widget.defaultSelected.type == - AnalyticsEntryType.space) { - route += "/${controller.widget.defaultSelected.id}"; - } - route += "/${BarChartViewSelection.messages.route}"; - context.go(route); - }, - ), - const Divider(height: 1), - ], + ), ), + if (controller.widget.selectedView == null) + const Divider(height: 1), + if (controller.widget.selectedView == null) + ListTile( + title: Text(L10n.of(context)!.grammarAnalytics), + leading: CircleAvatar( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + foregroundColor: Theme.of(context).textTheme.bodyLarge!.color, + child: Icon(BarChartViewSelection.grammar.icon), + ), + trailing: const Icon(Icons.chevron_right), + onTap: () { + String route = + "/rooms/${controller.widget.defaultSelected.type.route}"; + if (controller.widget.defaultSelected.type == + AnalyticsEntryType.space) { + route += "/${controller.widget.defaultSelected.id}"; + } + route += "/${BarChartViewSelection.grammar.route}"; + context.go(route); + }, + ), + if (controller.widget.selectedView == null) + const Divider(height: 1), + if (controller.widget.selectedView == null) + ListTile( + title: Text(L10n.of(context)!.messageAnalytics), + leading: CircleAvatar( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + foregroundColor: Theme.of(context).textTheme.bodyLarge!.color, + child: Icon(BarChartViewSelection.messages.icon), + ), + trailing: const Icon(Icons.chevron_right), + onTap: () { + String route = + "/rooms/${controller.widget.defaultSelected.type.route}"; + if (controller.widget.defaultSelected.type == + AnalyticsEntryType.space) { + route += "/${controller.widget.defaultSelected.id}"; + } + route += "/${BarChartViewSelection.messages.route}"; + context.go(route); + }, + ), + if (controller.widget.selectedView == null) + const Divider(height: 1), + ], + ), ), ); } From 0a69ddbe16ecaf479f3aea05037efebea2d603b0 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 27 Jun 2024 11:54:35 -0400 Subject: [PATCH 30/54] reload space analytics list after changing dropdown values --- .../message_analytics_controller.dart | 2 + .../analytics/space_list/space_list.dart | 12 ++ needed-translations.txt | 150 ++++++++++++------ 3 files changed, 114 insertions(+), 50 deletions(-) diff --git a/lib/pangea/controllers/message_analytics_controller.dart b/lib/pangea/controllers/message_analytics_controller.dart index 7083efbfd..531dd4cb3 100644 --- a/lib/pangea/controllers/message_analytics_controller.dart +++ b/lib/pangea/controllers/message_analytics_controller.dart @@ -62,6 +62,7 @@ class AnalyticsController extends BaseController { timeSpan.toString(), local: true, ); + setState(); } ///////// SPACE ANALYTICS LANGUAGES ////////// @@ -89,6 +90,7 @@ class AnalyticsController extends BaseController { lang.langCode, local: true, ); + setState(); } Future myAnalyticsLastUpdated(String type) async { diff --git a/lib/pangea/pages/analytics/space_list/space_list.dart b/lib/pangea/pages/analytics/space_list/space_list.dart index 058d54e63..0965b8334 100644 --- a/lib/pangea/pages/analytics/space_list/space_list.dart +++ b/lib/pangea/pages/analytics/space_list/space_list.dart @@ -22,6 +22,7 @@ class AnalyticsSpaceList extends StatefulWidget { class AnalyticsSpaceListController extends State { PangeaController pangeaController = MatrixState.pangeaController; List spaces = []; + StreamSubscription? stateSub; @override void initState() { @@ -38,6 +39,17 @@ class AnalyticsSpaceListController extends State { spaces = spaceList; setState(() {}); }); + + // reload dropdowns when their values change in analytics page + stateSub = pangeaController.analytics.stateStream.listen( + (_) => setState(() {}), + ); + } + + @override + void dispose() { + stateSub?.cancel(); + super.dispose(); } StreamController refreshStream = StreamController.broadcast(); diff --git a/needed-translations.txt b/needed-translations.txt index 1355bb368..d577d89d9 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -863,7 +863,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "be": [ @@ -2363,7 +2364,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "bn": [ @@ -3859,7 +3861,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "bo": [ @@ -5359,7 +5362,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ca": [ @@ -6261,7 +6265,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "cs": [ @@ -7245,7 +7250,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "de": [ @@ -8112,7 +8118,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "el": [ @@ -9563,7 +9570,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "eo": [ @@ -10712,7 +10720,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "es": [ @@ -10727,7 +10736,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "et": [ @@ -11594,7 +11604,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "eu": [ @@ -12463,7 +12474,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "fa": [ @@ -13469,7 +13481,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "fi": [ @@ -14439,7 +14452,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "fil": [ @@ -15765,7 +15779,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "fr": [ @@ -16770,7 +16785,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ga": [ @@ -17904,7 +17920,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "gl": [ @@ -18771,7 +18788,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "he": [ @@ -20024,7 +20042,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "hi": [ @@ -21517,7 +21536,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "hr": [ @@ -22463,7 +22483,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "hu": [ @@ -23346,7 +23367,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ia": [ @@ -24832,7 +24854,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "id": [ @@ -25705,7 +25728,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ie": [ @@ -26962,7 +26986,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "it": [ @@ -27886,7 +27911,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ja": [ @@ -28921,7 +28947,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ka": [ @@ -30275,7 +30302,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ko": [ @@ -31144,7 +31172,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "lt": [ @@ -32179,7 +32208,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "lv": [ @@ -33054,7 +33084,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "nb": [ @@ -34253,7 +34284,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "nl": [ @@ -35216,7 +35248,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "pl": [ @@ -36188,7 +36221,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "pt": [ @@ -37666,7 +37700,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "pt_BR": [ @@ -38539,7 +38574,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "pt_PT": [ @@ -39739,7 +39775,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ro": [ @@ -40746,7 +40783,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ru": [ @@ -41619,7 +41657,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "sk": [ @@ -42885,7 +42924,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "sl": [ @@ -44281,7 +44321,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "sr": [ @@ -45451,7 +45492,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "sv": [ @@ -46355,7 +46397,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "ta": [ @@ -47852,7 +47895,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "th": [ @@ -49303,7 +49347,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "tr": [ @@ -50170,7 +50215,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "uk": [ @@ -51074,7 +51120,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "vi": [ @@ -52426,7 +52473,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "zh": [ @@ -53293,7 +53341,8 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ], "zh_Hant": [ @@ -54441,6 +54490,7 @@ "suggestToSpaceDesc", "practice", "noLanguagesSet", - "noActivitiesFound" + "noActivitiesFound", + "languageButtonLabel" ] } From 989964681b061b22bbae47437b770cbe01a6ad9a Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 27 Jun 2024 12:14:49 -0400 Subject: [PATCH 31/54] inital work on add language dropdown to my analytics --- .../message_analytics_controller.dart | 99 +++++++++---------- .../pages/analytics/base_analytics.dart | 2 +- .../pages/analytics/base_analytics_view.dart | 2 +- .../analytics/space_list/space_list.dart | 2 +- .../analytics/space_list/space_list_view.dart | 4 +- 5 files changed, 50 insertions(+), 59 deletions(-) diff --git a/lib/pangea/controllers/message_analytics_controller.dart b/lib/pangea/controllers/message_analytics_controller.dart index 531dd4cb3..1475c0e6e 100644 --- a/lib/pangea/controllers/message_analytics_controller.dart +++ b/lib/pangea/controllers/message_analytics_controller.dart @@ -68,7 +68,7 @@ class AnalyticsController extends BaseController { ///////// SPACE ANALYTICS LANGUAGES ////////// String get _analyticsSpaceLangKey => "ANALYTICS_SPACE_LANG_KEY"; - LanguageModel get currentAnalyticsSpaceLang { + LanguageModel get currentAnalyticsLang { try { final String? str = _pangeaController.pStoreService.read( _analyticsSpaceLangKey, @@ -84,7 +84,7 @@ class AnalyticsController extends BaseController { } } - Future setCurrentAnalyticsSpaceLang(LanguageModel lang) async { + Future setCurrentAnalyticsLang(LanguageModel lang) async { await _pangeaController.pStoreService.save( _analyticsSpaceLangKey, lang.langCode, @@ -93,33 +93,34 @@ class AnalyticsController extends BaseController { setState(); } + /// given an analytics event type and the current analytics language, + /// get the last time the user updated their analytics Future myAnalyticsLastUpdated(String type) async { - // given an analytics event type, get the last updated times - // for each of the user's analytics rooms and return the most recent - // Most Recent instead of the oldest because, for instance: - // My last Spanish event was sent 3 days ago. - // My last English event was sent 1 day ago. - // When I go to check if the cached data is out of date, the cached item was set 2 days ago. - // I know there’s new data available because the English update data (the most recent) is after the cache’s creation time. - // So, I should update the cache. final List analyticsRooms = _pangeaController .matrixState.client.allMyAnalyticsRooms .where((room) => room.isAnalyticsRoom) .toList(); - final List lastUpdates = []; + final Map langCodeLastUpdates = {}; for (final Room analyticsRoom in analyticsRooms) { + final String? roomLang = analyticsRoom.madeForLang; + if (roomLang == null) continue; final DateTime? lastUpdated = await analyticsRoom.analyticsLastUpdated( type, _pangeaController.matrixState.client.userID!, ); if (lastUpdated != null) { - lastUpdates.add(lastUpdated); + langCodeLastUpdates[roomLang] = lastUpdated; } } - if (lastUpdates.isEmpty) return null; - return lastUpdates.reduce( + if (langCodeLastUpdates.isEmpty) return null; + final String? l2Code = + _pangeaController.languageController.userL2?.langCode; + if (l2Code != null && langCodeLastUpdates.containsKey(l2Code)) { + return langCodeLastUpdates[l2Code]; + } + return langCodeLastUpdates.values.reduce( (check, mostRecent) => check.isAfter(mostRecent) ? check : mostRecent, ); } @@ -136,7 +137,7 @@ class AnalyticsController extends BaseController { final List> lastUpdatedFutures = []; for (final student in space.students) { final Room? analyticsRoom = _pangeaController.matrixState.client - .analyticsRoomLocal(currentAnalyticsSpaceLang.langCode, student.id); + .analyticsRoomLocal(currentAnalyticsLang.langCode, student.id); if (analyticsRoom == null) continue; lastUpdatedFutures.add( analyticsRoom.analyticsLastUpdated( @@ -179,28 +180,20 @@ class AnalyticsController extends BaseController { //////////////////////////// MESSAGE SUMMARY ANALYTICS //////////////////////////// + /// get all the summary analytics events for the current user + /// in the current language's analytics room Future> mySummaryAnalytics() async { - // gets all the summary analytics events for the user - // since the current timespace's cut off date - final analyticsRooms = - _pangeaController.matrixState.client.allMyAnalyticsRooms; + final Room? analyticsRoom = _pangeaController.matrixState.client + .analyticsRoomLocal(currentAnalyticsLang.langCode); + if (analyticsRoom == null) return []; - final List allEvents = []; - - // TODO switch to using list of futures - for (final Room analyticsRoom in analyticsRooms) { - final List? roomEvents = - await analyticsRoom.getAnalyticsEvents( - type: PangeaEventTypes.summaryAnalytics, - since: currentAnalyticsTimeSpan.cutOffDate, - userId: _pangeaController.matrixState.client.userID!, - ); - - allEvents.addAll( - roomEvents?.cast() ?? [], - ); - } - return allEvents; + final List? roomEvents = + await analyticsRoom.getAnalyticsEvents( + type: PangeaEventTypes.summaryAnalytics, + since: currentAnalyticsTimeSpan.cutOffDate, + userId: _pangeaController.matrixState.client.userID!, + ); + return roomEvents?.cast() ?? []; } Future> spaceMemberAnalytics( @@ -218,7 +211,7 @@ class AnalyticsController extends BaseController { final List analyticsEvents = []; for (final student in space.students) { final Room? analyticsRoom = _pangeaController.matrixState.client - .analyticsRoomLocal(currentAnalyticsSpaceLang.langCode, student.id); + .analyticsRoomLocal(currentAnalyticsLang.langCode, student.id); if (analyticsRoom != null) { final List? roomEvents = @@ -263,7 +256,7 @@ class AnalyticsController extends BaseController { (e.defaultSelected.type == defaultSelected.type) && (e.selected?.id == selected?.id) && (e.selected?.type == selected?.type) && - (e.langCode == currentAnalyticsSpaceLang.langCode), + (e.langCode == currentAnalyticsLang.langCode), ); if (index != -1) { @@ -291,7 +284,7 @@ class AnalyticsController extends BaseController { chartAnalyticsModel: chartAnalyticsModel, defaultSelected: defaultSelected, selected: selected, - langCode: currentAnalyticsSpaceLang.langCode, + langCode: currentAnalyticsLang.langCode, ), ); } @@ -527,20 +520,18 @@ class AnalyticsController extends BaseController { //////////////////////////// CONSTRUCTS //////////////////////////// Future> allMyConstructs() async { - final List analyticsRooms = - _pangeaController.matrixState.client.allMyAnalyticsRooms; + final Room? analyticsRoom = _pangeaController.matrixState.client + .analyticsRoomLocal(currentAnalyticsLang.langCode); + if (analyticsRoom == null) return []; - final List allConstructs = []; - for (final Room analyticsRoom in analyticsRooms) { - final List? roomEvents = - (await analyticsRoom.getAnalyticsEvents( - type: PangeaEventTypes.construct, - since: currentAnalyticsTimeSpan.cutOffDate, - userId: _pangeaController.matrixState.client.userID!, - )) - ?.cast(); - allConstructs.addAll(roomEvents ?? []); - } + final List? roomEvents = + (await analyticsRoom.getAnalyticsEvents( + type: PangeaEventTypes.construct, + since: currentAnalyticsTimeSpan.cutOffDate, + userId: _pangeaController.matrixState.client.userID!, + )) + ?.cast(); + final List allConstructs = roomEvents ?? []; final List adminSpaceRooms = await _pangeaController.matrixState.client.teacherRoomIds; @@ -563,7 +554,7 @@ class AnalyticsController extends BaseController { final List constructEvents = []; for (final student in space.students) { final Room? analyticsRoom = _pangeaController.matrixState.client - .analyticsRoomLocal(currentAnalyticsSpaceLang.langCode, student.id); + .analyticsRoomLocal(currentAnalyticsLang.langCode, student.id); if (analyticsRoom != null) { final List? roomEvents = (await analyticsRoom.getAnalyticsEvents( @@ -663,7 +654,7 @@ class AnalyticsController extends BaseController { e.defaultSelected.type == defaultSelected.type && e.selected?.id == selected?.id && e.selected?.type == selected?.type && - e.langCode == currentAnalyticsSpaceLang.langCode, + e.langCode == currentAnalyticsLang.langCode, ); if (index > -1) { @@ -689,7 +680,7 @@ class AnalyticsController extends BaseController { events: List.from(events), defaultSelected: defaultSelected, selected: selected, - langCode: currentAnalyticsSpaceLang.langCode, + langCode: currentAnalyticsLang.langCode, ); _cachedConstructs.add(entry); } diff --git a/lib/pangea/pages/analytics/base_analytics.dart b/lib/pangea/pages/analytics/base_analytics.dart index f62e5f6b5..0e3ae49a7 100644 --- a/lib/pangea/pages/analytics/base_analytics.dart +++ b/lib/pangea/pages/analytics/base_analytics.dart @@ -159,7 +159,7 @@ class BaseAnalyticsController extends State { } Future toggleSpaceLang(LanguageModel lang) async { - await pangeaController.analytics.setCurrentAnalyticsSpaceLang(lang); + await pangeaController.analytics.setCurrentAnalyticsLang(lang); await setChartData(); refreshStream.add(false); } diff --git a/lib/pangea/pages/analytics/base_analytics_view.dart b/lib/pangea/pages/analytics/base_analytics_view.dart index 36bda7e48..3495591fd 100644 --- a/lib/pangea/pages/analytics/base_analytics_view.dart +++ b/lib/pangea/pages/analytics/base_analytics_view.dart @@ -117,7 +117,7 @@ class BaseAnalyticsView extends StatelessWidget { ), AnalyticsLanguageButton( value: controller - .pangeaController.analytics.currentAnalyticsSpaceLang, + .pangeaController.analytics.currentAnalyticsLang, onChange: (lang) => controller.toggleSpaceLang(lang), languages: controller .pangeaController.pLanguageStore.targetOptions, diff --git a/lib/pangea/pages/analytics/space_list/space_list.dart b/lib/pangea/pages/analytics/space_list/space_list.dart index 0965b8334..bc2f7836c 100644 --- a/lib/pangea/pages/analytics/space_list/space_list.dart +++ b/lib/pangea/pages/analytics/space_list/space_list.dart @@ -61,7 +61,7 @@ class AnalyticsSpaceListController extends State { } Future toggleSpaceLang(LanguageModel lang) async { - await pangeaController.analytics.setCurrentAnalyticsSpaceLang(lang); + await pangeaController.analytics.setCurrentAnalyticsLang(lang); refreshStream.add(false); setState(() {}); } diff --git a/lib/pangea/pages/analytics/space_list/space_list_view.dart b/lib/pangea/pages/analytics/space_list/space_list_view.dart index 877efdca2..7ef5fb45e 100644 --- a/lib/pangea/pages/analytics/space_list/space_list_view.dart +++ b/lib/pangea/pages/analytics/space_list/space_list_view.dart @@ -47,8 +47,8 @@ class AnalyticsSpaceListView extends StatelessWidget { ), ), AnalyticsLanguageButton( - value: controller - .pangeaController.analytics.currentAnalyticsSpaceLang, + value: + controller.pangeaController.analytics.currentAnalyticsLang, onChange: (lang) => controller.toggleSpaceLang(lang), languages: controller.pangeaController.pLanguageStore.targetOptions, From d975e52a04f58f9793d728dbd82287254f7cb35e Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Thu, 27 Jun 2024 12:30:25 -0400 Subject: [PATCH 32/54] inlined tooltip --- lib/pages/chat/chat_event_list.dart | 2 +- .../choreographer/widgets/it_bar_buttons.dart | 9 +-- .../controllers/my_analytics_controller.dart | 1 + lib/pangea/utils/instructions.dart | 56 +++++++++++++++++-- .../chat/message_speech_to_text_card.dart | 6 +- lib/pangea/widgets/igc/pangea_rich_text.dart | 2 +- 6 files changed, 64 insertions(+), 12 deletions(-) diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index 048b54443..114aadd84 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -46,7 +46,7 @@ class ChatEventList extends StatelessWidget { // card, attach it on top of the first shown message WidgetsBinding.instance.addPostFrameCallback((_) { if (events.isEmpty) return; - controller.pangeaController.instructions.show( + controller.pangeaController.instructions.showInstructionsPopup( context, InstructionsEnum.clickMessage, events[0].eventId, diff --git a/lib/pangea/choreographer/widgets/it_bar_buttons.dart b/lib/pangea/choreographer/widgets/it_bar_buttons.dart index 815020d17..e06855f26 100644 --- a/lib/pangea/choreographer/widgets/it_bar_buttons.dart +++ b/lib/pangea/choreographer/widgets/it_bar_buttons.dart @@ -1,8 +1,8 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/utils/instructions.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; + import '../../widgets/common/bot_face_svg.dart'; import '../controllers/choreographer.dart'; import '../controllers/it_controller.dart'; @@ -37,7 +37,7 @@ class ITBotButton extends StatelessWidget { @override Widget build(BuildContext context) { - choreographer.pangeaController.instructions.show( + choreographer.pangeaController.instructions.showInstructionsPopup( context, InstructionsEnum.itInstructions, choreographer.itBotTransformTargetKey, @@ -46,7 +46,8 @@ class ITBotButton extends StatelessWidget { return IconButton( icon: const BotFace(width: 40.0, expression: BotExpression.right), - onPressed: () => choreographer.pangeaController.instructions.show( + onPressed: () => + choreographer.pangeaController.instructions.showInstructionsPopup( context, InstructionsEnum.itInstructions, choreographer.itBotTransformTargetKey, diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index 614fcf9db..067083e38 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -305,6 +305,7 @@ class MyAnalyticsController extends BaseController { // if there's new content to be sent, or if lastUpdated hasn't been // set yet for this room, send the analytics events + if (summaryContent.isNotEmpty || lastUpdated == null) { await SummaryAnalyticsEvent.sendSummaryAnalyticsEvent( analyticsRoom, diff --git a/lib/pangea/utils/instructions.dart b/lib/pangea/utils/instructions.dart index b9eecd799..4fe3ea627 100644 --- a/lib/pangea/utils/instructions.dart +++ b/lib/pangea/utils/instructions.dart @@ -14,17 +14,26 @@ import 'overlay.dart'; class InstructionsController { late PangeaController _pangeaController; + /// Instruction popup was closed by the user final Map _instructionsClosed = {}; + + /// Instructions that were shown in that session final Map _instructionsShown = {}; + /// Returns true if the instructions were turned off by the user via the toggle switch + bool? toggledOff(InstructionsEnum key) => + _pangeaController.pStoreService.read(key.toString()); + + /// We have these three methods to make sure that the instructions are not shown too much + InstructionsController(PangeaController pangeaController) { _pangeaController = pangeaController; } + /// Returns true if the instructions were turned off by the user + /// via the toggle switch bool wereInstructionsTurnedOff(InstructionsEnum key) => - _pangeaController.pStoreService.read(key.toString()) ?? - _instructionsClosed[key] ?? - false; + toggledOff(key) ?? _instructionsClosed[key] ?? false; Future updateEnableInstructions( InstructionsEnum key, @@ -35,7 +44,30 @@ class InstructionsController { value, ); - Future show( + // return a text widget with constainer that expands to fill a parent container + // and displays instructions text defined in the enum extension + Future getInlineTooltip( + BuildContext context, + InstructionsEnum key, + ) async { + if (wereInstructionsTurnedOff(key)) { + return const SizedBox(); + } + if (L10n.of(context) == null) { + ErrorHandler.logError( + m: "null context in ITBotButton.showCard", + s: StackTrace.current, + ); + return const SizedBox(); + } + if (_instructionsShown[key] ?? false) { + return const SizedBox(); + } + + return key.inlineTooltip(context); + } + + Future showInstructionsPopup( BuildContext context, InstructionsEnum key, String transformTargetKey, [ @@ -135,6 +167,22 @@ extension Copy on InstructionsEnum { : L10n.of(context)!.tooltipInstructionsBrowserBody; } } + + Widget inlineTooltip(BuildContext context) { + switch (this) { + case InstructionsEnum.itInstructions: + return Padding( + padding: const EdgeInsets.all(6.0), + child: Text( + body(context), + style: BotStyle.text(context), + ), + ); + default: + print('inlineTooltip not implemented for $this'); + return const SizedBox(); + } + } } class InstructionsToggle extends StatefulWidget { diff --git a/lib/pangea/widgets/chat/message_speech_to_text_card.dart b/lib/pangea/widgets/chat/message_speech_to_text_card.dart index 9099b9b95..68295789a 100644 --- a/lib/pangea/widgets/chat/message_speech_to_text_card.dart +++ b/lib/pangea/widgets/chat/message_speech_to_text_card.dart @@ -172,7 +172,8 @@ class MessageSpeechToTextCardState extends State { number: "${selectedToken?.confidence ?? speechToTextResponse!.transcript.confidence}%", toolTip: L10n.of(context)!.accuracy, - onPressed: () => MatrixState.pangeaController.instructions.show( + onPressed: () => MatrixState.pangeaController.instructions + .showInstructionsPopup( context, InstructionsEnum.tooltipInstructions, widget.messageEvent.eventId, @@ -184,7 +185,8 @@ class MessageSpeechToTextCardState extends State { number: wordsPerMinuteString != null ? "$wordsPerMinuteString" : "??", toolTip: L10n.of(context)!.wordsPerMinute, - onPressed: () => MatrixState.pangeaController.instructions.show( + onPressed: () => MatrixState.pangeaController.instructions + .showInstructionsPopup( context, InstructionsEnum.tooltipInstructions, widget.messageEvent.eventId, diff --git a/lib/pangea/widgets/igc/pangea_rich_text.dart b/lib/pangea/widgets/igc/pangea_rich_text.dart index bbd6868bf..05875c25c 100644 --- a/lib/pangea/widgets/igc/pangea_rich_text.dart +++ b/lib/pangea/widgets/igc/pangea_rich_text.dart @@ -115,7 +115,7 @@ class PangeaRichTextState extends State { @override Widget build(BuildContext context) { if (blur > 0) { - pangeaController.instructions.show( + pangeaController.instructions.showInstructionsPopup( context, InstructionsEnum.blurMeansTranslate, widget.pangeaMessageEvent.eventId, From 4749974a9b2b9353b99761a53d6968c60df6ce62 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 27 Jun 2024 12:40:48 -0400 Subject: [PATCH 33/54] set target langs based on user's target language and analytics rooms --- .../student_analytics/student_analytics.dart | 23 +++++++++++++++++++ .../student_analytics_view.dart | 1 + 2 files changed, 24 insertions(+) diff --git a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart index 65bd533e8..d6bc9d766 100644 --- a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart +++ b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart @@ -1,7 +1,12 @@ import 'dart:async'; import 'dart:developer'; +import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart'; +import 'package:fluffychat/pangea/extensions/client_extension/client_extension.dart'; +import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/widgets/common/list_placeholder.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -75,6 +80,24 @@ class StudentAnalyticsController extends State { return id; } + List get targetLanguages { + final LanguageModel? l2 = + _pangeaController.languageController.activeL2Model(); + final List analyticsRoomLangs = + _pangeaController.matrixState.client.allMyAnalyticsRooms + .map((analyticsRoom) => analyticsRoom.madeForLang) + .where((langCode) => langCode != null) + .map((langCode) => PangeaLanguage.byLangCode(langCode!)) + .where( + (langModel) => langModel.langCode != LanguageKeys.unknownLanguage, + ) + .toList(); + if (l2 != null) { + analyticsRoomLangs.add(l2); + } + return analyticsRoomLangs.toSet().toList(); + } + @override Widget build(BuildContext context) { return PLoadingStatusV2( diff --git a/lib/pangea/pages/analytics/student_analytics/student_analytics_view.dart b/lib/pangea/pages/analytics/student_analytics/student_analytics_view.dart index 5b8924581..6ea754891 100644 --- a/lib/pangea/pages/analytics/student_analytics/student_analytics_view.dart +++ b/lib/pangea/pages/analytics/student_analytics/student_analytics_view.dart @@ -59,6 +59,7 @@ class StudentAnalyticsView extends StatelessWidget { AnalyticsEntryType.student, L10n.of(context)!.allChatsAndClasses, ), + targetLanguages: controller.targetLanguages, ) : const SizedBox(); } From a7e1dbc85f770534c5a7e7f8d34351e0ea753551 Mon Sep 17 00:00:00 2001 From: WilsonLe Date: Thu, 27 Jun 2024 12:57:39 -0400 Subject: [PATCH 34/54] remove mysterious auto generated files --- .../widgets/start_igc_button 2.dart | 168 ------------------ .../controllers/span_data_controller 2.dart | 89 ---------- .../room_capacity_button 2.dart | 157 ---------------- lib/utils/voip/video_renderer 2.dart | 86 --------- 4 files changed, 500 deletions(-) delete mode 100644 lib/pangea/choreographer/widgets/start_igc_button 2.dart delete mode 100644 lib/pangea/controllers/span_data_controller 2.dart delete mode 100644 lib/pangea/pages/class_settings/p_class_widgets/room_capacity_button 2.dart delete mode 100644 lib/utils/voip/video_renderer 2.dart diff --git a/lib/pangea/choreographer/widgets/start_igc_button 2.dart b/lib/pangea/choreographer/widgets/start_igc_button 2.dart deleted file mode 100644 index ceb5af193..000000000 --- a/lib/pangea/choreographer/widgets/start_igc_button 2.dart +++ /dev/null @@ -1,168 +0,0 @@ -import 'dart:async'; -import 'dart:math' as math; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; -import 'package:fluffychat/pangea/constants/colors.dart'; -import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import '../../../pages/chat/chat.dart'; - -class StartIGCButton extends StatefulWidget { - const StartIGCButton({ - super.key, - required this.controller, - }); - - final ChatController controller; - - @override - State createState() => StartIGCButtonState(); -} - -class StartIGCButtonState extends State - with SingleTickerProviderStateMixin { - AssistanceState get assistanceState => - widget.controller.choreographer.assistanceState; - AnimationController? _controller; - StreamSubscription? choreoListener; - AssistanceState? prevState; - - @override - void initState() { - _controller = AnimationController( - vsync: this, - duration: const Duration(seconds: 2), - ); - choreoListener = widget.controller.choreographer.stateListener.stream - .listen(updateSpinnerState); - super.initState(); - } - - void updateSpinnerState(_) { - if (prevState != AssistanceState.fetching && - assistanceState == AssistanceState.fetching) { - _controller?.repeat(); - } else if (prevState == AssistanceState.fetching && - assistanceState != AssistanceState.fetching) { - _controller?.stop(); - _controller?.reverse(); - } - setState(() => prevState = assistanceState); - } - - @override - Widget build(BuildContext context) { - final bool itEnabled = widget.controller.choreographer.itEnabled; - final bool igcEnabled = widget.controller.choreographer.igcEnabled; - final CanSendStatus canSendStatus = - widget.controller.pangeaController.subscriptionController.canSendStatus; - final bool grammarCorrectionEnabled = - (itEnabled || igcEnabled) && canSendStatus == CanSendStatus.subscribed; - - if (!grammarCorrectionEnabled || - widget.controller.choreographer.isAutoIGCEnabled || - widget.controller.choreographer.choreoMode == ChoreoMode.it) { - return const SizedBox.shrink(); - } - - final Widget icon = Icon( - Icons.autorenew_rounded, - size: 46, - color: assistanceState.stateColor(context), - ); - - return SizedBox( - height: 50, - width: 50, - child: FloatingActionButton( - tooltip: assistanceState.tooltip( - L10n.of(context)!, - ), - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - disabledElevation: 0, - shape: const CircleBorder(), - onPressed: () { - if (assistanceState != AssistanceState.complete) { - widget.controller.choreographer - .getLanguageHelp( - false, - true, - ) - .then((_) { - if (widget.controller.choreographer.igc.igcTextData != null && - widget.controller.choreographer.igc.igcTextData!.matches - .isNotEmpty) { - widget.controller.choreographer.igc.showFirstMatch(context); - } - }); - } - }, - child: Stack( - alignment: Alignment.center, - children: [ - _controller != null - ? RotationTransition( - turns: Tween(begin: 0.0, end: math.pi * 2) - .animate(_controller!), - child: icon, - ) - : icon, - Container( - width: 26, - height: 26, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Theme.of(context).scaffoldBackgroundColor, - ), - ), - Container( - width: 20, - height: 20, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: assistanceState.stateColor(context), - ), - ), - Icon( - size: 16, - Icons.check, - color: Theme.of(context).scaffoldBackgroundColor, - ), - ], - ), - ), - ); - } -} - -extension AssistanceStateExtension on AssistanceState { - Color stateColor(context) { - switch (this) { - case AssistanceState.noMessage: - case AssistanceState.notFetched: - case AssistanceState.fetching: - return Theme.of(context).colorScheme.primary; - case AssistanceState.fetched: - return PangeaColors.igcError; - case AssistanceState.complete: - return AppConfig.success; - } - } - - String tooltip(L10n l10n) { - switch (this) { - case AssistanceState.noMessage: - case AssistanceState.notFetched: - return l10n.runGrammarCorrection; - case AssistanceState.fetching: - return ""; - case AssistanceState.fetched: - return l10n.grammarCorrectionFailed; - case AssistanceState.complete: - return l10n.grammarCorrectionComplete; - } - } -} diff --git a/lib/pangea/controllers/span_data_controller 2.dart b/lib/pangea/controllers/span_data_controller 2.dart deleted file mode 100644 index 5f83f1a53..000000000 --- a/lib/pangea/controllers/span_data_controller 2.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'dart:async'; -import 'dart:developer'; - -import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; -import 'package:fluffychat/pangea/models/span_data.dart'; -import 'package:fluffychat/pangea/repo/span_data_repo.dart'; -import 'package:fluffychat/pangea/utils/error_handler.dart'; -import 'package:flutter/foundation.dart'; - -class _SpanDetailsCacheItem { - Future data; - - _SpanDetailsCacheItem({required this.data}); -} - -class SpanDataController { - late Choreographer choreographer; - final Map _cache = {}; - Timer? _cacheClearTimer; - - SpanDataController(this.choreographer) { - _initializeCacheClearing(); - } - - void _initializeCacheClearing() { - const duration = Duration(minutes: 2); - _cacheClearTimer = Timer.periodic(duration, (Timer t) => clearCache()); - } - - void clearCache() { - _cache.clear(); - } - - void dispose() { - _cacheClearTimer?.cancel(); - } - - Future getSpanDetails(int matchIndex) async { - if (choreographer.igc.igcTextData == null || - choreographer.igc.igcTextData!.matches.isEmpty || - matchIndex < 0 || - matchIndex >= choreographer.igc.igcTextData!.matches.length) { - debugger(when: kDebugMode); - return; - } - - /// Retrieves the span data from the `igcTextData` matches at the specified `matchIndex`. - /// Creates a `SpanDetailsRepoReqAndRes` object with the retrieved span data and other parameters. - /// Generates a cache key based on the created `SpanDetailsRepoReqAndRes` object. - final SpanData span = - choreographer.igc.igcTextData!.matches[matchIndex].match; - final req = SpanDetailsRepoReqAndRes( - userL1: choreographer.l1LangCode!, - userL2: choreographer.l2LangCode!, - enableIGC: choreographer.igcEnabled, - enableIT: choreographer.itEnabled, - span: span, - ); - final int cacheKey = req.hashCode; - - /// Retrieves the [SpanDetailsRepoReqAndRes] response from the cache if it exists, - /// otherwise makes an API call to get the response and stores it in the cache. - Future response; - if (_cache.containsKey(cacheKey)) { - response = _cache[cacheKey]!.data; - } else { - response = SpanDataRepo.getSpanDetails( - await choreographer.accessToken, - request: SpanDetailsRepoReqAndRes( - userL1: choreographer.l1LangCode!, - userL2: choreographer.l2LangCode!, - enableIGC: choreographer.igcEnabled, - enableIT: choreographer.itEnabled, - span: span, - ), - ); - _cache[cacheKey] = _SpanDetailsCacheItem(data: response); - } - - try { - choreographer.igc.igcTextData!.matches[matchIndex].match = - (await response).span; - } catch (err, s) { - ErrorHandler.logError(e: err, s: s); - } - - choreographer.setState(); - } -} diff --git a/lib/pangea/pages/class_settings/p_class_widgets/room_capacity_button 2.dart b/lib/pangea/pages/class_settings/p_class_widgets/room_capacity_button 2.dart deleted file mode 100644 index 7be6e8ec3..000000000 --- a/lib/pangea/pages/class_settings/p_class_widgets/room_capacity_button 2.dart +++ /dev/null @@ -1,157 +0,0 @@ -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:fluffychat/pages/chat_details/chat_details.dart'; -import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; - -class RoomCapacityButton extends StatefulWidget { - final Room? room; - final ChatDetailsController? controller; - const RoomCapacityButton({ - super.key, - this.room, - this.controller, - }); - - @override - RoomCapacityButtonState createState() => RoomCapacityButtonState(); -} - -class RoomCapacityButtonState extends State { - int? capacity; - String? nonAdmins; - - RoomCapacityButtonState({Key? key}); - - @override - void initState() { - super.initState(); - capacity = widget.room?.capacity; - widget.room?.numNonAdmins.then( - (value) => setState(() { - nonAdmins = value.toString(); - overCapacity(); - }), - ); - } - - @override - void didUpdateWidget(RoomCapacityButton oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.room != widget.room) { - capacity = widget.room?.capacity; - widget.room?.numNonAdmins.then( - (value) => setState(() { - nonAdmins = value.toString(); - overCapacity(); - }), - ); - } - } - - Future overCapacity() async { - if ((widget.room?.isRoomAdmin ?? false) && - capacity != null && - nonAdmins != null && - int.parse(nonAdmins!) > capacity!) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - L10n.of(context)!.roomExceedsCapacity, - ), - ), - ); - } - } - - @override - Widget build(BuildContext context) { - final iconColor = Theme.of(context).textTheme.bodyLarge!.color; - return Column( - children: [ - ListTile( - onTap: (widget.room?.isRoomAdmin ?? true) ? setRoomCapacity : null, - leading: CircleAvatar( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon(Icons.reduce_capacity), - ), - subtitle: Text( - (capacity == null) - ? L10n.of(context)!.capacityNotSet - : (nonAdmins != null) - ? '$nonAdmins/$capacity' - : '$capacity', - ), - title: Text( - L10n.of(context)!.roomCapacity, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ); - } - - Future setCapacity(int newCapacity) async { - capacity = newCapacity; - } - - Future setRoomCapacity() async { - final input = await showTextInputDialog( - context: context, - title: L10n.of(context)!.roomCapacity, - message: L10n.of(context)!.roomCapacityExplanation, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - initialText: ((capacity != null) ? '$capacity' : ''), - keyboardType: TextInputType.number, - maxLength: 3, - validator: (value) { - if (value == null || - value.isEmpty || - int.tryParse(value) == null || - int.parse(value) < 0) { - return L10n.of(context)!.enterNumber; - } - if (nonAdmins != null && int.parse(value) < int.parse(nonAdmins!)) { - return L10n.of(context)!.capacitySetTooLow; - } - return null; - }, - ), - ], - ); - if (input == null || - input.first == "" || - int.tryParse(input.first) == null) { - return; - } - - final newCapacity = int.parse(input.first); - final success = await showFutureLoadingDialog( - context: context, - future: () => ((widget.room != null) - ? (widget.room!.updateRoomCapacity( - capacity = newCapacity, - )) - : setCapacity(newCapacity)), - ); - if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - L10n.of(context)!.roomCapacityHasBeenChanged, - ), - ), - ); - setState(() {}); - } - } -} diff --git a/lib/utils/voip/video_renderer 2.dart b/lib/utils/voip/video_renderer 2.dart deleted file mode 100644 index 46171fdb5..000000000 --- a/lib/utils/voip/video_renderer 2.dart +++ /dev/null @@ -1,86 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -import 'package:flutter_webrtc/flutter_webrtc.dart'; -import 'package:matrix/matrix.dart'; - -class VideoRenderer extends StatefulWidget { - final WrappedMediaStream? stream; - final bool mirror; - final RTCVideoViewObjectFit fit; - - const VideoRenderer( - this.stream, { - this.mirror = false, - this.fit = RTCVideoViewObjectFit.RTCVideoViewObjectFitContain, - super.key, - }); - - @override - State createState() => _VideoRendererState(); -} - -class _VideoRendererState extends State { - RTCVideoRenderer? _renderer; - bool _rendererReady = false; - MediaStream? get mediaStream => widget.stream?.stream; - StreamSubscription? _streamChangeSubscription; - - Future _initializeRenderer() async { - _renderer ??= RTCVideoRenderer(); - await _renderer!.initialize(); - _renderer!.srcObject = mediaStream; - return _renderer!; - } - - void disposeRenderer() { - try { - _renderer?.srcObject = null; - _renderer?.dispose(); - _renderer = null; - // ignore: empty_catches - } catch (e) {} - } - - @override - void initState() { - _streamChangeSubscription = - widget.stream?.onStreamChanged.stream.listen((stream) { - setState(() { - _renderer?.srcObject = stream; - }); - }); - setupRenderer(); - super.initState(); - } - - Future setupRenderer() async { - await _initializeRenderer(); - setState(() => _rendererReady = true); - } - - @override - void dispose() { - _streamChangeSubscription?.cancel(); - disposeRenderer(); - super.dispose(); - } - - @override - Widget build(BuildContext context) => !_rendererReady - ? Container() - : Builder( - key: widget.key, - builder: (ctx) { - return RTCVideoView( - _renderer!, - mirror: widget.mirror, - filterQuality: FilterQuality.medium, - objectFit: widget.fit, - placeholderBuilder: (_) => - Container(color: Colors.white.withOpacity(0.18)), - ); - }, - ); -} From ac0031d4915d34250c2945b8c49e2fb35f5db80b Mon Sep 17 00:00:00 2001 From: WilsonLe Date: Thu, 27 Jun 2024 13:11:18 -0400 Subject: [PATCH 35/54] remove more mysterious files --- .../.gradle/6.7.1/fileHashes/fileHashes.lock | Bin 17 -> 39 bytes .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 39 bytes .../android/.gradle/checksums/checksums.lock | Bin 17 -> 39 bytes sentry 2.properties | 6 ------ 4 files changed, 6 deletions(-) delete mode 100644 sentry 2.properties diff --git a/pangea_packages/fcm_shared_isolate/android/.gradle/6.7.1/fileHashes/fileHashes.lock b/pangea_packages/fcm_shared_isolate/android/.gradle/6.7.1/fileHashes/fileHashes.lock index 7cb52b3f842396598d593e360f52c43265089f07..f1facd8351bcedf036c6985ed1ac7b5c21ff1f87 100644 GIT binary patch literal 39 qcmZQ(pPrsFC-<%*0|YQLGcepv|Nb(2y-ILJJp-$ufrX_x0|Nlj?+P*i literal 17 UcmZQ(pPrsFC-<%*0|YPw04fjzcK`qY diff --git a/pangea_packages/fcm_shared_isolate/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/pangea_packages/fcm_shared_isolate/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 487a88833085c25d183c663046ee06e3b9888272..ea7da199a9aab10e1551a086bd1892ebf1cea816 100644 GIT binary patch literal 39 qcmZQ}bn=zC_JSdv0Rm*085nM-N1x~La=fsziGkJ7z{1j;fdK%xu?aK) literal 17 TcmZQ}bn=zC_JSdv0Rm(IB}W4( diff --git a/pangea_packages/fcm_shared_isolate/android/.gradle/checksums/checksums.lock b/pangea_packages/fcm_shared_isolate/android/.gradle/checksums/checksums.lock index b99989c33f39a2bacad6d6ee7ad3244b27d3a856..a148f5b0ee85072228e5cdc5e1edaa30a4ae84ab 100644 GIT binary patch literal 39 scmZSnAb4*|_KHR73}C?S%gn%VJ6-3|)`{1Oo98gF8X8zwnlmr}0Q(>dwg3PC literal 17 VcmZSnAb4*|_KHR73}C?S3jjDZ1g8K1 diff --git a/sentry 2.properties b/sentry 2.properties deleted file mode 100644 index 876598ba5..000000000 --- a/sentry 2.properties +++ /dev/null @@ -1,6 +0,0 @@ -upload_debug_symbols=true -upload_source_maps=true -upload_sources=true -wait_for_processing=false -log_level=info -commits=auto From d0e03aea97017944817437c4221628092432b06f Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 27 Jun 2024 15:59:57 -0400 Subject: [PATCH 36/54] seperating practice activity-specific logic and functionality from navigation / event sending logic --- lib/pangea/constants/pangea_event_types.dart | 10 +- ...actice_activity_generation_controller.dart | 2 +- .../extensions/pangea_event_extension.dart | 2 +- .../pangea_message_event.dart | 54 +++++---- .../practice_activity_event.dart | 30 +++-- lib/pangea/widgets/chat/message_toolbar.dart | 1 - .../multiple_choice_activity_view.dart | 86 +++++++++++-- .../practice_activity/practice_activity.dart | 68 +---------- .../practice_activity_card.dart | 114 +++++++----------- 9 files changed, 182 insertions(+), 185 deletions(-) diff --git a/lib/pangea/constants/pangea_event_types.dart b/lib/pangea/constants/pangea_event_types.dart index 27b177a35..9ca975dc0 100644 --- a/lib/pangea/constants/pangea_event_types.dart +++ b/lib/pangea/constants/pangea_event_types.dart @@ -26,7 +26,13 @@ class PangeaEventTypes { static const String report = 'm.report'; static const textToSpeechRule = "p.rule.text_to_speech"; - static const pangeaActivityRes = "pangea.activity_res"; - static const acitivtyRequest = "pangea.activity_req"; + /// A request to the server to generate activities + static const activityRequest = "pangea.activity_req"; + + /// A practice activity that is related to a message + static const pangeaActivity = "pangea.activity_res"; + + /// A record of completion of an activity. There + /// can be one per user per activity. static const activityRecord = "pangea.activity_completion"; } diff --git a/lib/pangea/controllers/practice_activity_generation_controller.dart b/lib/pangea/controllers/practice_activity_generation_controller.dart index 29047d0c4..8ea5b5c82 100644 --- a/lib/pangea/controllers/practice_activity_generation_controller.dart +++ b/lib/pangea/controllers/practice_activity_generation_controller.dart @@ -51,7 +51,7 @@ class PracticeGenerationController { final Event? activityEvent = await pangeaMessageEvent.room.sendPangeaEvent( content: model.toJson(), parentEventId: pangeaMessageEvent.eventId, - type: PangeaEventTypes.pangeaActivityRes, + type: PangeaEventTypes.pangeaActivity, ); if (activityEvent == null) { diff --git a/lib/pangea/extensions/pangea_event_extension.dart b/lib/pangea/extensions/pangea_event_extension.dart index 17e14ed86..f18ee23b7 100644 --- a/lib/pangea/extensions/pangea_event_extension.dart +++ b/lib/pangea/extensions/pangea_event_extension.dart @@ -28,7 +28,7 @@ extension PangeaEvent on Event { return PangeaRepresentation.fromJson(json) as V; case PangeaEventTypes.choreoRecord: return ChoreoRecord.fromJson(json) as V; - case PangeaEventTypes.pangeaActivityRes: + case PangeaEventTypes.pangeaActivity: return PracticeActivityModel.fromJson(json) as V; case PangeaEventTypes.activityRecord: return PracticeActivityRecordModel.fromJson(json) as V; diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index 306376df8..6621874f7 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -566,10 +566,8 @@ class PangeaMessageEvent { /// If any activity is not complete, it returns true, indicating that the activity icon should be shown. /// Otherwise, it returns false. bool get hasUncompletedActivity { - if (l2Code == null) return false; - final List activities = practiceActivities(l2Code!); - if (activities.isEmpty) return false; - return activities.any((activity) => !(activity.isComplete)); + if (practiceActivities.isEmpty) return false; + return practiceActivities.any((activity) => !(activity.isComplete)); } String? get l2Code => @@ -603,34 +601,36 @@ class PangeaMessageEvent { return steps; } - List get _practiceActivityEvents => _latestEdit - .aggregatedEvents( - timeline, - PangeaEventTypes.pangeaActivityRes, - ) - .map( - (e) => PracticeActivityEvent( - timeline: timeline, - event: e, - ), - ) - .toList(); + /// Returns a list of all [PracticeActivityEvent] objects + /// associated with this message event. + List get _practiceActivityEvents { + return _latestEdit + .aggregatedEvents( + timeline, + PangeaEventTypes.pangeaActivity, + ) + .map( + (e) => PracticeActivityEvent( + timeline: timeline, + event: e, + ), + ) + .toList(); + } + /// Returns a boolean value indicating whether there are any + /// activities associated with this message event for the user's active l2 bool get hasActivities { try { - final String? l2code = - MatrixState.pangeaController.languageController.activeL2Code(); - - if (l2code == null) return false; - - return practiceActivities(l2code).isNotEmpty; + return practiceActivities.isNotEmpty; } catch (e, s) { ErrorHandler.logError(e: e, s: s); return false; } } - List practiceActivities( + /// Returns a list of [PracticeActivityEvent] objects for the given [langCode]. + List practiceActivitiesByLangCode( String langCode, { bool debug = false, }) { @@ -650,6 +650,14 @@ class PangeaMessageEvent { } } + /// Returns a list of [PracticeActivityEvent] for the user's active l2. + List get practiceActivities { + final String? l2code = + MatrixState.pangeaController.languageController.activeL2Code(); + if (l2code == null) return []; + return practiceActivitiesByLangCode(l2code); + } + // List get activities => //each match is turned into an activity that other students can access //they're not told the answer but have to find it themselves diff --git a/lib/pangea/matrix_event_wrappers/practice_activity_event.dart b/lib/pangea/matrix_event_wrappers/practice_activity_event.dart index c5f35be91..10dd814ec 100644 --- a/lib/pangea/matrix_event_wrappers/practice_activity_event.dart +++ b/lib/pangea/matrix_event_wrappers/practice_activity_event.dart @@ -27,7 +27,7 @@ class PracticeActivityEvent { _content = content; } } - if (event.type != PangeaEventTypes.pangeaActivityRes) { + if (event.type != PangeaEventTypes.pangeaActivity) { throw Exception( "${event.type} should not be used to make a PracticeActivityEvent", ); @@ -39,7 +39,7 @@ class PracticeActivityEvent { return _content!; } - //in aggregatedEvents for the event, find all practiceActivityRecordEvents whose sender matches the client's userId + /// All completion records assosiated with this activity List get allRecords { if (timeline == null) { debugger(when: kDebugMode); @@ -54,14 +54,24 @@ class PracticeActivityEvent { .toList(); } - List get userRecords => allRecords - .where( - (recordEvent) => - recordEvent.event.senderId == recordEvent.event.room.client.userID, - ) - .toList(); + /// Completion record assosiated with this activity + /// for the logged in user, null if there is none + PracticeActivityRecordEvent? get userRecord { + final List records = allRecords + .where( + (recordEvent) => + recordEvent.event.senderId == + recordEvent.event.room.client.userID, + ) + .toList(); + if (records.length > 1) { + debugPrint("There should only be one record per user per activity"); + debugger(when: kDebugMode); + } + return records.firstOrNull; + } - /// Checks if there are any user records in the list for this activity, + /// Checks if there is a user record for this activity, /// and, if so, then the activity is complete - bool get isComplete => userRecords.isNotEmpty; + bool get isComplete => userRecord != null; } diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index 2468d6b96..7c7c7ba6f 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -302,7 +302,6 @@ class MessageToolbarState extends State { void showPracticeActivity() { toolbarContent = PracticeActivityCard( pangeaMessageEvent: widget.pangeaMessageEvent, - controller: this, ); } diff --git a/lib/pangea/widgets/practice_activity/multiple_choice_activity_view.dart b/lib/pangea/widgets/practice_activity/multiple_choice_activity_view.dart index 100da3456..28fc00bd1 100644 --- a/lib/pangea/widgets/practice_activity/multiple_choice_activity_view.dart +++ b/lib/pangea/widgets/practice_activity/multiple_choice_activity_view.dart @@ -2,29 +2,89 @@ import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/choreographer/widgets/choice_array.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_model.dart'; -import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity.dart'; +import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; +import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_card.dart'; import 'package:flutter/material.dart'; -class MultipleChoiceActivityView extends StatelessWidget { - final PracticeActivityContentState controller; - final Function(int) updateChoice; - final bool isActive; +/// The multiple choice activity view +class MultipleChoiceActivity extends StatefulWidget { + final MessagePracticeActivityCardState controller; + final PracticeActivityEvent? currentActivity; - const MultipleChoiceActivityView({ + const MultipleChoiceActivity({ super.key, required this.controller, - required this.updateChoice, - required this.isActive, + required this.currentActivity, }); - PracticeActivityEvent get practiceEvent => controller.practiceEvent; + @override + MultipleChoiceActivityState createState() => MultipleChoiceActivityState(); +} - int? get selectedChoiceIndex => controller.selectedChoiceIndex; +class MultipleChoiceActivityState extends State { + int? selectedChoiceIndex; + + PracticeActivityRecordModel? get currentRecordModel => + widget.controller.currentRecordModel; + + bool get isSubmitted => + widget.currentActivity?.userRecord?.record?.latestResponse != null; + + @override + void initState() { + super.initState(); + setCompletionRecord(); + } + + @override + void didUpdateWidget(covariant MultipleChoiceActivity oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.currentActivity?.event.eventId != + widget.currentActivity?.event.eventId) { + setCompletionRecord(); + } + } + + /// Sets the completion record for the multiple choice activity. + /// If the user record is null, it creates a new record model with the question + /// from the current activity and sets the selected choice index to null. + /// Otherwise, it sets the current model to the user record's record and + /// determines the selected choice index. + void setCompletionRecord() { + if (widget.currentActivity?.userRecord?.record == null) { + widget.controller.setCurrentModel( + PracticeActivityRecordModel( + question: + widget.currentActivity?.practiceActivity.multipleChoice!.question, + ), + ); + selectedChoiceIndex = null; + } else { + widget.controller + .setCurrentModel(widget.currentActivity!.userRecord!.record); + selectedChoiceIndex = widget + .currentActivity?.practiceActivity.multipleChoice! + .choiceIndex(currentRecordModel!.latestResponse!); + } + setState(() {}); + } + + void updateChoice(int index) { + currentRecordModel?.addResponse( + text: widget.controller.currentActivity?.practiceActivity.multipleChoice! + .choices[index], + ); + setState(() => selectedChoiceIndex = index); + } @override Widget build(BuildContext context) { - final PracticeActivityModel practiceActivity = - practiceEvent.practiceActivity; + final PracticeActivityModel? practiceActivity = + widget.currentActivity?.practiceActivity; + + if (practiceActivity == null) { + return const SizedBox(); + } return Container( padding: const EdgeInsets.all(8), @@ -55,7 +115,7 @@ class MultipleChoiceActivityView extends StatelessWidget { ), ) .toList(), - isActive: isActive, + isActive: !isSubmitted, ), ], ), diff --git a/lib/pangea/widgets/practice_activity/practice_activity.dart b/lib/pangea/widgets/practice_activity/practice_activity.dart index 5606aceff..1c6b38495 100644 --- a/lib/pangea/widgets/practice_activity/practice_activity.dart +++ b/lib/pangea/widgets/practice_activity/practice_activity.dart @@ -1,20 +1,17 @@ import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; -import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; -import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; import 'package:fluffychat/pangea/widgets/practice_activity/multiple_choice_activity_view.dart'; import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_card.dart'; import 'package:flutter/material.dart'; +/// Practice activity content class PracticeActivity extends StatefulWidget { final PracticeActivityEvent practiceEvent; - final PangeaMessageEvent pangeaMessageEvent; final MessagePracticeActivityCardState controller; const PracticeActivity({ super.key, required this.practiceEvent, - required this.pangeaMessageEvent, required this.controller, }); @@ -23,66 +20,12 @@ class PracticeActivity extends StatefulWidget { } class PracticeActivityContentState extends State { - PracticeActivityEvent get practiceEvent => widget.practiceEvent; - int? selectedChoiceIndex; - bool isSubmitted = false; - - @override - void initState() { - super.initState(); - setRecord(); - } - - @override - void didUpdateWidget(covariant PracticeActivity oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.practiceEvent.event.eventId != - widget.practiceEvent.event.eventId) { - setRecord(); - } - } - - // sets the record model for the activity - // either a new record model that will be sent after submitting the - // activity or the record model from the user's previous response - void setRecord() { - if (widget.controller.recordEvent?.record == null) { - final String question = - practiceEvent.practiceActivity.multipleChoice!.question; - widget.controller.recordModel = - PracticeActivityRecordModel(question: question); - } else { - widget.controller.recordModel = widget.controller.recordEvent!.record; - - // Note that only MultipleChoice activities will have this so we - // probably should move this logic to the MultipleChoiceActivity widget - selectedChoiceIndex = - widget.controller.recordModel?.latestResponse != null - ? widget.practiceEvent.practiceActivity.multipleChoice - ?.choiceIndex(widget.controller.recordModel!.latestResponse!) - : null; - isSubmitted = widget.controller.recordModel?.latestResponse != null; - } - setState(() {}); - } - - void updateChoice(int index) { - setState(() { - selectedChoiceIndex = index; - widget.controller.recordModel!.addResponse( - text: widget - .practiceEvent.practiceActivity.multipleChoice!.choices[index], - ); - }); - } - Widget get activityWidget { switch (widget.practiceEvent.practiceActivity.activityType) { case ActivityTypeEnum.multipleChoice: - return MultipleChoiceActivityView( - controller: this, - updateChoice: updateChoice, - isActive: !isSubmitted, + return MultipleChoiceActivity( + controller: widget.controller, + currentActivity: widget.practiceEvent, ); default: return const SizedBox.shrink(); @@ -91,9 +34,6 @@ class PracticeActivityContentState extends State { @override Widget build(BuildContext context) { - debugPrint( - "MessagePracticeActivityContentState.build with selectedChoiceIndex: $selectedChoiceIndex", - ); return Column( children: [ activityWidget, diff --git a/lib/pangea/widgets/practice_activity/practice_activity_card.dart b/lib/pangea/widgets/practice_activity/practice_activity_card.dart index e28dabe9d..879c96dec 100644 --- a/lib/pangea/widgets/practice_activity/practice_activity_card.dart +++ b/lib/pangea/widgets/practice_activity/practice_activity_card.dart @@ -1,29 +1,24 @@ -import 'dart:developer'; - -import 'package:collection/collection.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; -import 'package:fluffychat/pangea/matrix_event_wrappers/practice_acitivity_record_event.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; import 'package:fluffychat/pangea/utils/bot_style.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; -import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; +/// The wrapper for practice activity content. +/// Handles the activities assosiated with a message, +/// their navigation, and the management of completion records class PracticeActivityCard extends StatefulWidget { final PangeaMessageEvent pangeaMessageEvent; - final MessageToolbarState controller; const PracticeActivityCard({ super.key, required this.pangeaMessageEvent, - required this.controller, }); @override @@ -32,13 +27,15 @@ class PracticeActivityCard extends StatefulWidget { } class MessagePracticeActivityCardState extends State { - List practiceActivities = []; - PracticeActivityEvent? practiceEvent; - PracticeActivityRecordModel? recordModel; + PracticeActivityEvent? currentActivity; + PracticeActivityRecordModel? currentRecordModel; bool sending = false; + List get practiceActivities => + widget.pangeaMessageEvent.practiceActivities; + int get practiceEventIndex => practiceActivities.indexWhere( - (activity) => activity.event.eventId == practiceEvent?.event.eventId, + (activity) => activity.event.eventId == currentActivity?.event.eventId, ); bool get isPrevEnabled => @@ -49,80 +46,59 @@ class MessagePracticeActivityCardState extends State { practiceEventIndex >= 0 && practiceEventIndex < practiceActivities.length - 1; - // the first record for this practice activity - // assosiated with the current user - PracticeActivityRecordEvent? get recordEvent => - practiceEvent?.userRecords.firstOrNull; - @override void initState() { super.initState(); - setPracticeActivities(); + setCurrentActivity(); } - String? get langCode { - final String? langCode = MatrixState.pangeaController.languageController - .activeL2Model() - ?.langCode; - - if (langCode == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.noLanguagesSet)), - ); - debugger(when: kDebugMode); - return null; - } - return langCode; - } - - /// Initalizes the practice activities for the current language - /// and sets the first activity as the current activity - void setPracticeActivities() { - if (langCode == null) return; - practiceActivities = - widget.pangeaMessageEvent.practiceActivities(langCode!); + /// Initalizes the current activity. + /// If the current activity hasn't been set yet, show the first + /// uncompleted activity if there is one. + /// If not, show the first activity + void setCurrentActivity() { if (practiceActivities.isEmpty) return; - - practiceActivities.sort( - (a, b) => a.event.originServerTs.compareTo(b.event.originServerTs), - ); - - // if the current activity hasn't been set yet, show the first uncompleted activity - // if there is one. If not, show the first activity final List incompleteActivities = practiceActivities.where((element) => !element.isComplete).toList(); - practiceEvent ??= incompleteActivities.isNotEmpty + currentActivity ??= incompleteActivities.isNotEmpty ? incompleteActivities.first : practiceActivities.first; setState(() {}); } - void navigateActivities({Direction? direction, int? index}) { + void setCurrentModel(PracticeActivityRecordModel? recordModel) { + currentRecordModel = recordModel; + } + + /// Sets the current acitivity based on the given [direction]. + void navigateActivities(Direction direction) { final bool enableNavigation = (direction == Direction.f && isNextEnabled) || - (direction == Direction.b && isPrevEnabled) || - (index != null && index >= 0 && index < practiceActivities.length); + (direction == Direction.b && isPrevEnabled); if (enableNavigation) { - final int newIndex = index ?? - (direction == Direction.f - ? practiceEventIndex + 1 - : practiceEventIndex - 1); - practiceEvent = practiceActivities[newIndex]; + currentActivity = practiceActivities[direction == Direction.f + ? practiceEventIndex + 1 + : practiceEventIndex - 1]; setState(() {}); } } + /// Sends the current record model and activity to the server. + /// If either the currentRecordModel or currentActivity is null, the method returns early. + /// Sets the [sending] flag to true before sending the record and activity. + /// Logs any errors that occur during the send operation. + /// Sets the [sending] flag to false when the send operation is complete. void sendRecord() { - if (recordModel == null || practiceEvent == null) return; + if (currentRecordModel == null || currentActivity == null) return; setState(() => sending = true); MatrixState.pangeaController.activityRecordController - .send(recordModel!, practiceEvent!) + .send(currentRecordModel!, currentActivity!) .catchError((error) { ErrorHandler.logError( e: error, s: StackTrace.current, data: { - 'recordModel': recordModel?.toJson(), - 'practiceEvent': practiceEvent?.event.toJson(), + 'recordModel': currentRecordModel?.toJson(), + 'practiceEvent': currentActivity?.event.toJson(), }, ); return null; @@ -138,20 +114,20 @@ class MessagePracticeActivityCardState extends State { Opacity( opacity: isPrevEnabled ? 1.0 : 0, child: IconButton( - onPressed: isPrevEnabled - ? () => navigateActivities(direction: Direction.b) - : null, + onPressed: + isPrevEnabled ? () => navigateActivities(Direction.b) : null, icon: const Icon(Icons.keyboard_arrow_left_outlined), tooltip: L10n.of(context)!.previous, ), ), Expanded( child: Opacity( - opacity: recordEvent == null ? 1.0 : 0.5, + opacity: currentActivity?.userRecord == null ? 1.0 : 0.5, child: sending ? const CircularProgressIndicator.adaptive() : TextButton( - onPressed: recordEvent == null ? sendRecord : null, + onPressed: + currentActivity?.userRecord == null ? sendRecord : null, style: ButtonStyle( backgroundColor: WidgetStateProperty.all( AppConfig.primaryColor, @@ -164,9 +140,8 @@ class MessagePracticeActivityCardState extends State { Opacity( opacity: isNextEnabled ? 1.0 : 0, child: IconButton( - onPressed: isNextEnabled - ? () => navigateActivities(direction: Direction.f) - : null, + onPressed: + isNextEnabled ? () => navigateActivities(Direction.f) : null, icon: const Icon(Icons.keyboard_arrow_right_outlined), tooltip: L10n.of(context)!.next, ), @@ -174,7 +149,7 @@ class MessagePracticeActivityCardState extends State { ], ); - if (practiceEvent == null || practiceActivities.isEmpty) { + if (currentActivity == null || practiceActivities.isEmpty) { return Text( L10n.of(context)!.noActivitiesFound, style: BotStyle.text(context), @@ -187,8 +162,7 @@ class MessagePracticeActivityCardState extends State { return Column( children: [ PracticeActivity( - pangeaMessageEvent: widget.pangeaMessageEvent, - practiceEvent: practiceEvent!, + practiceEvent: currentActivity!, controller: this, ), navigationButtons, From f81e5957a5198f7f1757d8e7bf62ca389f591108 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 27 Jun 2024 16:01:52 -0400 Subject: [PATCH 37/54] renamed multiple choice activity file name --- ..._choice_activity_view.dart => multiple_choice_activity.dart} | 0 lib/pangea/widgets/practice_activity/practice_activity.dart | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename lib/pangea/widgets/practice_activity/{multiple_choice_activity_view.dart => multiple_choice_activity.dart} (100%) diff --git a/lib/pangea/widgets/practice_activity/multiple_choice_activity_view.dart b/lib/pangea/widgets/practice_activity/multiple_choice_activity.dart similarity index 100% rename from lib/pangea/widgets/practice_activity/multiple_choice_activity_view.dart rename to lib/pangea/widgets/practice_activity/multiple_choice_activity.dart diff --git a/lib/pangea/widgets/practice_activity/practice_activity.dart b/lib/pangea/widgets/practice_activity/practice_activity.dart index 1c6b38495..6de31829c 100644 --- a/lib/pangea/widgets/practice_activity/practice_activity.dart +++ b/lib/pangea/widgets/practice_activity/practice_activity.dart @@ -1,6 +1,6 @@ import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; -import 'package:fluffychat/pangea/widgets/practice_activity/multiple_choice_activity_view.dart'; +import 'package:fluffychat/pangea/widgets/practice_activity/multiple_choice_activity.dart'; import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_card.dart'; import 'package:flutter/material.dart'; From 6eb003dee3ffcc789df83097ef377e248433e4a3 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 27 Jun 2024 16:04:32 -0400 Subject: [PATCH 38/54] renamed practice activity content file name --- .../widgets/practice_activity/practice_activity_card.dart | 2 +- .../{practice_activity.dart => practice_activity_content.dart} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename lib/pangea/widgets/practice_activity/{practice_activity.dart => practice_activity_content.dart} (100%) diff --git a/lib/pangea/widgets/practice_activity/practice_activity_card.dart b/lib/pangea/widgets/practice_activity/practice_activity_card.dart index 879c96dec..5d0b81662 100644 --- a/lib/pangea/widgets/practice_activity/practice_activity_card.dart +++ b/lib/pangea/widgets/practice_activity/practice_activity_card.dart @@ -4,7 +4,7 @@ import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event. import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; import 'package:fluffychat/pangea/utils/bot_style.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; -import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity.dart'; +import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_content.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; diff --git a/lib/pangea/widgets/practice_activity/practice_activity.dart b/lib/pangea/widgets/practice_activity/practice_activity_content.dart similarity index 100% rename from lib/pangea/widgets/practice_activity/practice_activity.dart rename to lib/pangea/widgets/practice_activity/practice_activity_content.dart From bc2d4a38471536136f6f56b0351ad2180d9dfdd3 Mon Sep 17 00:00:00 2001 From: Matthew <119624750+casualWaist@users.noreply.github.com> Date: Wed, 26 Jun 2024 16:21:57 -0400 Subject: [PATCH 39/54] itAutoPlay moved from ToolSettings to PLocalKey --- .../controllers/choreographer.dart | 8 +-- lib/pangea/constants/local.key.dart | 1 + lib/pangea/controllers/local_settings.dart | 3 +- lib/pangea/controllers/user_controller.dart | 18 +++---- lib/pangea/models/class_model.dart | 51 +++++++------------ lib/pangea/models/user_model.dart | 6 +-- .../settings_learning_view.dart | 10 ++++ lib/pangea/widgets/igc/span_card.dart | 4 +- 8 files changed, 48 insertions(+), 53 deletions(-) diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 529ba95b4..5921c6eb7 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -15,6 +15,7 @@ import 'package:fluffychat/pangea/models/class_model.dart'; import 'package:fluffychat/pangea/models/it_step.dart'; import 'package:fluffychat/pangea/models/representation_content_model.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; +import 'package:fluffychat/pangea/models/user_model.dart'; import 'package:fluffychat/pangea/utils/any_state_holder.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/overlay.dart'; @@ -513,10 +514,9 @@ class Choreographer { chatController.room, ); - bool get itAutoPlayEnabled => pangeaController.permissionsController.isToolEnabled( - ToolSetting.itAutoPlay, - chatController.room, - ); + bool get itAutoPlayEnabled => pangeaController.pStoreService.read( + MatrixProfile.itAutoPlay.title, + ) ?? false; bool get definitionsEnabled => pangeaController.permissionsController.isToolEnabled( diff --git a/lib/pangea/constants/local.key.dart b/lib/pangea/constants/local.key.dart index c0390c2ba..8dc496bf8 100644 --- a/lib/pangea/constants/local.key.dart +++ b/lib/pangea/constants/local.key.dart @@ -11,4 +11,5 @@ class PLocalKey { static const String dismissedPaywall = 'dismissedPaywall'; static const String paywallBackoff = 'paywallBackoff'; static const String autoPlayMessages = 'autoPlayMessages'; + static const String itAutoPlay = 'itAutoPlay'; } diff --git a/lib/pangea/controllers/local_settings.dart b/lib/pangea/controllers/local_settings.dart index d6ae119a5..5984a7bf5 100644 --- a/lib/pangea/controllers/local_settings.dart +++ b/lib/pangea/controllers/local_settings.dart @@ -9,8 +9,7 @@ class LocalSettings { } bool userLanguageToolSetting(ToolSetting setting) => - _pangeaController.pStoreService.read(setting.toString()) - ?? setting != ToolSetting.itAutoPlay; + _pangeaController.pStoreService.read(setting.toString()) ?? true; // bool get userEnableIT => // _pangeaController.pStoreService.read(ToolSetting.interactiveTranslator.toString()) ?? true; diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index 0e336fdf6..31cde897f 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -123,10 +123,10 @@ class UserController extends BaseController { : null; final bool? autoPlay = migratedProfileInfo(MatrixProfile.autoPlayMessages); + final bool? itAutoPlay = migratedProfileInfo(MatrixProfile.itAutoPlay); final bool? trial = migratedProfileInfo(MatrixProfile.activatedFreeTrial); final bool? interactiveTranslator = migratedProfileInfo(MatrixProfile.interactiveTranslator); - final bool? itAutoPlay = migratedProfileInfo(MatrixProfile.itAutoPlay); final bool? interactiveGrammar = migratedProfileInfo(MatrixProfile.interactiveGrammar); final bool? immersionMode = @@ -143,9 +143,9 @@ class UserController extends BaseController { await updateMatrixProfile( dateOfBirth: dob, autoPlayMessages: autoPlay, + itAutoPlay: itAutoPlay, activatedFreeTrial: trial, interactiveTranslator: interactiveTranslator, - itAutoPlay: itAutoPlay, interactiveGrammar: interactiveGrammar, immersionMode: immersionMode, definitions: definitions, @@ -225,9 +225,9 @@ class UserController extends BaseController { Future updateMatrixProfile({ String? dateOfBirth, bool? autoPlayMessages, + bool? itAutoPlay, bool? activatedFreeTrial, bool? interactiveTranslator, - bool? itAutoPlay, bool? interactiveGrammar, bool? immersionMode, bool? definitions, @@ -253,6 +253,12 @@ class UserController extends BaseController { autoPlayMessages, ); } + if (itAutoPlay != null) { + await _pangeaController.pStoreService.save( + MatrixProfile.itAutoPlay.title, + itAutoPlay, + ); + } if (activatedFreeTrial != null) { await _pangeaController.pStoreService.save( MatrixProfile.activatedFreeTrial.title, @@ -265,12 +271,6 @@ class UserController extends BaseController { interactiveTranslator, ); } - if (itAutoPlay != null) { - await _pangeaController.pStoreService.save( - MatrixProfile.itAutoPlay.title, - itAutoPlay, - ); - } if (interactiveGrammar != null) { await _pangeaController.pStoreService.save( MatrixProfile.interactiveGrammar.title, diff --git a/lib/pangea/models/class_model.dart b/lib/pangea/models/class_model.dart index f663af8ce..0bebdac2f 100644 --- a/lib/pangea/models/class_model.dart +++ b/lib/pangea/models/class_model.dart @@ -31,13 +31,13 @@ class ClassSettingsModel { }); static ClassSettingsModel get newClass => ClassSettingsModel( - city: null, - country: null, - dominantLanguage: ClassDefaultValues.defaultDominantLanguage, - languageLevel: null, - schoolName: null, - targetLanguage: ClassDefaultValues.defaultTargetLanguage, - ); + city: null, + country: null, + dominantLanguage: ClassDefaultValues.defaultDominantLanguage, + languageLevel: null, + schoolName: null, + targetLanguage: ClassDefaultValues.defaultTargetLanguage, + ); factory ClassSettingsModel.fromJson(Map json) { return ClassSettingsModel( @@ -100,9 +100,9 @@ class ClassSettingsModel { } StateEvent get toStateEvent => StateEvent( - content: toJson(), - type: PangeaEventTypes.classSettings, - ); + content: toJson(), + type: PangeaEventTypes.classSettings, + ); } class PangeaRoomRules { @@ -120,7 +120,6 @@ class PangeaRoomRules { bool isInviteOnlyStudents; // 0 = forbidden, 1 = allow individual to choose, 2 = require int interactiveTranslator; - int itAutoPlay; int interactiveGrammar; int immersionMode; int definitions; @@ -139,7 +138,6 @@ class PangeaRoomRules { this.isVoiceNotes = true, this.isInviteOnlyStudents = true, this.interactiveTranslator = ClassDefaultValues.languageToolPermissions, - this.itAutoPlay = ClassDefaultValues.languageToolPermissions, this.interactiveGrammar = ClassDefaultValues.languageToolPermissions, this.immersionMode = ClassDefaultValues.languageToolPermissions, this.definitions = ClassDefaultValues.languageToolPermissions, @@ -191,9 +189,6 @@ class PangeaRoomRules { case ToolSetting.interactiveTranslator: interactiveTranslator = value; break; - case ToolSetting.itAutoPlay: - itAutoPlay = value; - break; case ToolSetting.interactiveGrammar: interactiveGrammar = value; break; @@ -212,9 +207,9 @@ class PangeaRoomRules { } StateEvent get toStateEvent => StateEvent( - content: toJson(), - type: PangeaEventTypes.rules, - ); + content: toJson(), + type: PangeaEventTypes.rules, + ); factory PangeaRoomRules.fromJson(Map json) => PangeaRoomRules( @@ -232,16 +227,14 @@ class PangeaRoomRules { isInviteOnlyStudents: json['is_invite_only_students'] ?? true, interactiveTranslator: json['interactive_translator'] ?? ClassDefaultValues.languageToolPermissions, - itAutoPlay: json['it_auto_play'] ?? - ClassDefaultValues.languageToolPermissions, interactiveGrammar: json['interactive_grammar'] ?? ClassDefaultValues.languageToolPermissions, immersionMode: json['immersion_mode'] ?? ClassDefaultValues.languageToolPermissions, definitions: - json['definitions'] ?? ClassDefaultValues.languageToolPermissions, + json['definitions'] ?? ClassDefaultValues.languageToolPermissions, translations: - json['translations'] ?? ClassDefaultValues.languageToolPermissions, + json['translations'] ?? ClassDefaultValues.languageToolPermissions, ); Map toJson() { @@ -259,7 +252,6 @@ class PangeaRoomRules { data['is_voice_notes'] = isVoiceNotes; data['is_invite_only_students'] = isInviteOnlyStudents; data['interactive_translator'] = interactiveTranslator; - data['it_auto_play'] = itAutoPlay; data['interactive_grammar'] = interactiveGrammar; data['immersion_mode'] = immersionMode; data['definitions'] = definitions; @@ -271,8 +263,6 @@ class PangeaRoomRules { switch (setting) { case ToolSetting.interactiveTranslator: return interactiveTranslator; - case ToolSetting.itAutoPlay: - return itAutoPlay; case ToolSetting.interactiveGrammar: return interactiveGrammar; case ToolSetting.immersionMode: @@ -287,9 +277,9 @@ class PangeaRoomRules { } String languageToolPermissionsText( - BuildContext context, - ToolSetting setting, - ) { + BuildContext context, + ToolSetting setting, + ) { switch (getToolSettings(setting)) { case 0: return L10n.of(context)!.interactiveTranslatorNotAllowed; @@ -305,7 +295,6 @@ class PangeaRoomRules { enum ToolSetting { interactiveTranslator, - itAutoPlay, interactiveGrammar, immersionMode, definitions, @@ -317,8 +306,6 @@ extension SettingCopy on ToolSetting { switch (this) { case ToolSetting.interactiveTranslator: return L10n.of(context)!.interactiveTranslatorSliderHeader; - case ToolSetting.itAutoPlay: - return L10n.of(context)!.interactiveTranslatorAutoPlaySliderHeader; case ToolSetting.interactiveGrammar: return L10n.of(context)!.interactiveGrammarSliderHeader; case ToolSetting.immersionMode: @@ -337,8 +324,6 @@ extension SettingCopy on ToolSetting { return L10n.of(context)!.itToggleDescription; case ToolSetting.interactiveGrammar: return L10n.of(context)!.igcToggleDescription; - case ToolSetting.itAutoPlay: - return L10n.of(context)!.interactiveTranslatorAutoPlayDesc; case ToolSetting.immersionMode: return L10n.of(context)!.toggleImmersionModeDesc; case ToolSetting.definitions: diff --git a/lib/pangea/models/user_model.dart b/lib/pangea/models/user_model.dart index 396bcaccb..3721da95c 100644 --- a/lib/pangea/models/user_model.dart +++ b/lib/pangea/models/user_model.dart @@ -54,9 +54,9 @@ class PUserModel { enum MatrixProfile { dateOfBirth, autoPlayMessages, + itAutoPlay, activatedFreeTrial, interactiveTranslator, - itAutoPlay, interactiveGrammar, immersionMode, definitions, @@ -78,12 +78,12 @@ extension MatrixProfileExtension on MatrixProfile { return ModelKey.userDateOfBirth; case MatrixProfile.autoPlayMessages: return PLocalKey.autoPlayMessages; + case MatrixProfile.itAutoPlay: + return PLocalKey.itAutoPlay; case MatrixProfile.activatedFreeTrial: return PLocalKey.activatedTrialKey; case MatrixProfile.interactiveTranslator: return ToolSetting.interactiveTranslator.toString(); - case MatrixProfile.itAutoPlay: - return ToolSetting.itAutoPlay.toString(); case MatrixProfile.interactiveGrammar: return ToolSetting.interactiveGrammar.toString(); case MatrixProfile.immersionMode: diff --git a/lib/pangea/pages/settings_learning/settings_learning_view.dart b/lib/pangea/pages/settings_learning/settings_learning_view.dart index 6c3a87f00..207600497 100644 --- a/lib/pangea/pages/settings_learning/settings_learning_view.dart +++ b/lib/pangea/pages/settings_learning/settings_learning_view.dart @@ -61,6 +61,16 @@ class SettingsLearningView extends StatelessWidget { pStoreKey: setting.toString(), local: false, ), + PSettingsSwitchListTile.adaptive( + defaultValue: controller.pangeaController.pStoreService.read( + PLocalKey.itAutoPlay, + ) ?? + false, + title: L10n.of(context)!.interactiveTranslatorAutoPlaySliderHeader, + subtitle: L10n.of(context)!.interactiveTranslatorAutoPlayDesc, + pStoreKey: PLocalKey.itAutoPlay, + local: false, + ), PSettingsSwitchListTile.adaptive( defaultValue: controller.pangeaController.pStoreService.read( PLocalKey.autoPlayMessages, diff --git a/lib/pangea/widgets/igc/span_card.dart b/lib/pangea/widgets/igc/span_card.dart index 75738a687..1f31ea07f 100644 --- a/lib/pangea/widgets/igc/span_card.dart +++ b/lib/pangea/widgets/igc/span_card.dart @@ -1,6 +1,7 @@ import 'dart:developer'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pangea/constants/local.key.dart'; import 'package:fluffychat/pangea/enum/span_data_type.dart'; import 'package:fluffychat/pangea/models/span_data.dart'; import 'package:fluffychat/pangea/utils/bot_style.dart'; @@ -15,7 +16,6 @@ import '../../../widgets/matrix.dart'; import '../../choreographer/widgets/choice_array.dart'; import '../../controllers/pangea_controller.dart'; import '../../enum/span_choice_type.dart'; -import '../../models/class_model.dart'; import '../../models/span_card_model.dart'; import '../common/bot_face_svg.dart'; import 'card_header.dart'; @@ -472,7 +472,7 @@ class DontShowSwitchListTileState extends State { value: switchValue, onChanged: (value) => { widget.controller.pStoreService.save( - ToolSetting.itAutoPlay.toString(), + PLocalKey.itAutoPlay.toString(), value, ), setState(() => switchValue = value), From 929e30a499f388ca3f879dae205aec181ee934b3 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Fri, 28 Jun 2024 08:54:37 -0400 Subject: [PATCH 40/54] Design and insert inline tooltip --- assets/l10n/intl_en.arb | 4 +- lib/pages/chat/chat_event_list.dart | 2 +- .../choreographer/widgets/it_bar_buttons.dart | 2 +- lib/pangea/enum/instructions_enum.dart | 68 +++++++++ lib/pangea/models/user_model.dart | 2 +- lib/pangea/utils/instructions.dart | 133 +++++++----------- .../chat/message_speech_to_text_card.dart | 11 +- lib/pangea/widgets/chat/message_toolbar.dart | 2 + lib/pangea/widgets/igc/pangea_rich_text.dart | 2 +- 9 files changed, 141 insertions(+), 85 deletions(-) create mode 100644 lib/pangea/enum/instructions_enum.dart diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index cb319c9c7..134f46d0a 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -4058,5 +4058,7 @@ "suggestToSpaceDesc": "Suggested spaces will appear in the chat lists for their parent spaces", "practice": "Practice", "noLanguagesSet": "No languages set", - "noActivitiesFound": "No practice activities found for this message" + "noActivitiesFound": "No practice activities found for this message", + "hintTitle": "Hint:", + "speechToTextBody": "See how well you did by looking at your Accuracy and Words Per Minute scores" } \ No newline at end of file diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index 114aadd84..24508bb62 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -4,8 +4,8 @@ import 'package:fluffychat/pages/chat/events/message.dart'; import 'package:fluffychat/pages/chat/seen_by_row.dart'; import 'package:fluffychat/pages/chat/typing_indicators.dart'; import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; +import 'package:fluffychat/pangea/enum/instructions_enum.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; -import 'package:fluffychat/pangea/utils/instructions.dart'; import 'package:fluffychat/pangea/widgets/chat/locked_chat_message.dart'; import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; diff --git a/lib/pangea/choreographer/widgets/it_bar_buttons.dart b/lib/pangea/choreographer/widgets/it_bar_buttons.dart index e06855f26..77de39818 100644 --- a/lib/pangea/choreographer/widgets/it_bar_buttons.dart +++ b/lib/pangea/choreographer/widgets/it_bar_buttons.dart @@ -1,5 +1,5 @@ import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; -import 'package:fluffychat/pangea/utils/instructions.dart'; +import 'package:fluffychat/pangea/enum/instructions_enum.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; diff --git a/lib/pangea/enum/instructions_enum.dart b/lib/pangea/enum/instructions_enum.dart new file mode 100644 index 000000000..8bcd3f3f9 --- /dev/null +++ b/lib/pangea/enum/instructions_enum.dart @@ -0,0 +1,68 @@ +import 'package:fluffychat/pangea/utils/bot_style.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +enum InstructionsEnum { + itInstructions, + clickMessage, + blurMeansTranslate, + tooltipInstructions, + speechToText, +} + +extension Copy on InstructionsEnum { + String title(BuildContext context) { + switch (this) { + case InstructionsEnum.itInstructions: + return L10n.of(context)!.itInstructionsTitle; + case InstructionsEnum.clickMessage: + return L10n.of(context)!.clickMessageTitle; + case InstructionsEnum.blurMeansTranslate: + return L10n.of(context)!.blurMeansTranslateTitle; + case InstructionsEnum.tooltipInstructions: + return L10n.of(context)!.tooltipInstructionsTitle; + case InstructionsEnum.speechToText: + return L10n.of(context)!.hintTitle; + } + } + + String body(BuildContext context) { + switch (this) { + case InstructionsEnum.itInstructions: + return L10n.of(context)!.itInstructionsBody; + case InstructionsEnum.clickMessage: + return L10n.of(context)!.clickMessageBody; + case InstructionsEnum.blurMeansTranslate: + return L10n.of(context)!.blurMeansTranslateBody; + case InstructionsEnum.speechToText: + return L10n.of(context)!.speechToTextBody; + case InstructionsEnum.tooltipInstructions: + return PlatformInfos.isMobile + ? L10n.of(context)!.tooltipInstructionsMobileBody + : L10n.of(context)!.tooltipInstructionsBrowserBody; + } + } + + Widget inlineTooltip(BuildContext context) { + switch (this) { + case InstructionsEnum.speechToText: + return Column( + children: [ + Text( + title(context), + style: BotStyle.text(context), + ), + Text( + body(context), + style: BotStyle.text(context), + ), + // ), + ], + ); + default: + debugPrint('inlineTooltip not implemented for $this'); + return const SizedBox(); + } + } +} diff --git a/lib/pangea/models/user_model.dart b/lib/pangea/models/user_model.dart index f8e929a13..afe910610 100644 --- a/lib/pangea/models/user_model.dart +++ b/lib/pangea/models/user_model.dart @@ -4,8 +4,8 @@ import 'package:country_picker/country_picker.dart'; import 'package:fluffychat/pangea/constants/local.key.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; +import 'package:fluffychat/pangea/enum/instructions_enum.dart'; import 'package:fluffychat/pangea/models/space_model.dart'; -import 'package:fluffychat/pangea/utils/instructions.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; diff --git a/lib/pangea/utils/instructions.dart b/lib/pangea/utils/instructions.dart index 4fe3ea627..a21b664a9 100644 --- a/lib/pangea/utils/instructions.dart +++ b/lib/pangea/utils/instructions.dart @@ -1,4 +1,4 @@ -import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/pangea/enum/instructions_enum.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -14,24 +14,24 @@ import 'overlay.dart'; class InstructionsController { late PangeaController _pangeaController; + // We have these three methods to make sure that the instructions are not shown too much + /// Instruction popup was closed by the user final Map _instructionsClosed = {}; - /// Instructions that were shown in that session + /// Instruction popup has already been shown this session final Map _instructionsShown = {}; - /// Returns true if the instructions were turned off by the user via the toggle switch + /// Returns true if the user requested this popup not be shown again bool? toggledOff(InstructionsEnum key) => _pangeaController.pStoreService.read(key.toString()); - /// We have these three methods to make sure that the instructions are not shown too much - InstructionsController(PangeaController pangeaController) { _pangeaController = pangeaController; } - /// Returns true if the instructions were turned off by the user - /// via the toggle switch + /// Returns true if the instructions were closed + /// or turned off by the user via the toggle switch bool wereInstructionsTurnedOff(InstructionsEnum key) => toggledOff(key) ?? _instructionsClosed[key] ?? false; @@ -44,29 +44,6 @@ class InstructionsController { value, ); - // return a text widget with constainer that expands to fill a parent container - // and displays instructions text defined in the enum extension - Future getInlineTooltip( - BuildContext context, - InstructionsEnum key, - ) async { - if (wereInstructionsTurnedOff(key)) { - return const SizedBox(); - } - if (L10n.of(context) == null) { - ErrorHandler.logError( - m: "null context in ITBotButton.showCard", - s: StackTrace.current, - ); - return const SizedBox(); - } - if (_instructionsShown[key] ?? false) { - return const SizedBox(); - } - - return key.inlineTooltip(context); - } - Future showInstructionsPopup( BuildContext context, InstructionsEnum key, @@ -130,58 +107,56 @@ class InstructionsController { ), ); } -} -enum InstructionsEnum { - itInstructions, - clickMessage, - blurMeansTranslate, - tooltipInstructions, -} - -extension Copy on InstructionsEnum { - String title(BuildContext context) { - switch (this) { - case InstructionsEnum.itInstructions: - return L10n.of(context)!.itInstructionsTitle; - case InstructionsEnum.clickMessage: - return L10n.of(context)!.clickMessageTitle; - case InstructionsEnum.blurMeansTranslate: - return L10n.of(context)!.blurMeansTranslateTitle; - case InstructionsEnum.tooltipInstructions: - return L10n.of(context)!.tooltipInstructionsTitle; + /// Returns a widget that will be added to existing widget + /// that displays hint text defined in the enum extension + Widget getInlineTooltip( + BuildContext context, + InstructionsEnum key, + Function refreshOnClose, + ) { + if (wereInstructionsTurnedOff(key)) { + // Uncomment this line to make hint viewable again + // _instructionsClosed[key] = false; + return const SizedBox(); } - } - - String body(BuildContext context) { - switch (this) { - case InstructionsEnum.itInstructions: - return L10n.of(context)!.itInstructionsBody; - case InstructionsEnum.clickMessage: - return L10n.of(context)!.clickMessageBody; - case InstructionsEnum.blurMeansTranslate: - return L10n.of(context)!.blurMeansTranslateBody; - case InstructionsEnum.tooltipInstructions: - return PlatformInfos.isMobile - ? L10n.of(context)!.tooltipInstructionsMobileBody - : L10n.of(context)!.tooltipInstructionsBrowserBody; - } - } - - Widget inlineTooltip(BuildContext context) { - switch (this) { - case InstructionsEnum.itInstructions: - return Padding( - padding: const EdgeInsets.all(6.0), - child: Text( - body(context), - style: BotStyle.text(context), - ), - ); - default: - print('inlineTooltip not implemented for $this'); - return const SizedBox(); + if (L10n.of(context) == null) { + ErrorHandler.logError( + m: "null context in ITBotButton.showCard", + s: StackTrace.current, + ); + return const SizedBox(); } + return Column( + children: [ + Row( + children: [ + const Expanded( + child: Divider(), + ), + CircleAvatar( + radius: 10, + backgroundColor: + Theme.of(context).colorScheme.primary.withAlpha(50), + child: IconButton( + padding: EdgeInsets.zero, + icon: const Icon( + Icons.close_outlined, + size: 15, + ), + onPressed: () { + _instructionsClosed[key] = true; + refreshOnClose(); + }, + ), + ), + ], + ), + key.inlineTooltip(context), + const SizedBox(height: 9), + const Divider(), + ], + ); } } diff --git a/lib/pangea/widgets/chat/message_speech_to_text_card.dart b/lib/pangea/widgets/chat/message_speech_to_text_card.dart index 68295789a..9f76e060a 100644 --- a/lib/pangea/widgets/chat/message_speech_to_text_card.dart +++ b/lib/pangea/widgets/chat/message_speech_to_text_card.dart @@ -1,9 +1,9 @@ import 'dart:developer'; +import 'package:fluffychat/pangea/enum/instructions_enum.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/speech_to_text_models.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; -import 'package:fluffychat/pangea/utils/instructions.dart'; import 'package:fluffychat/pangea/widgets/chat/toolbar_content_loading_indicator.dart'; import 'package:fluffychat/pangea/widgets/common/icon_number_widget.dart'; import 'package:fluffychat/pangea/widgets/igc/card_error_widget.dart'; @@ -65,6 +65,10 @@ class MessageSpeechToTextCardState extends State { } } + void refreshOnCloseHint() { + setState(() {}); + } + TextSpan _buildTranscriptText(BuildContext context) { final Transcript transcript = speechToTextResponse!.transcript; final List spans = []; @@ -195,6 +199,11 @@ class MessageSpeechToTextCardState extends State { ), ], ), + MatrixState.pangeaController.instructions.getInlineTooltip( + context, + InstructionsEnum.speechToText, + refreshOnCloseHint, + ), ], ); } diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index 2468d6b96..13ebd3103 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -134,6 +134,8 @@ class ToolbarDisplayController { ? Alignment.bottomLeft : Alignment.topLeft, backgroundColor: const Color.fromRGBO(0, 0, 0, 1).withAlpha(100), + closePrevOverlay: + MatrixState.pangeaController.subscriptionController.isSubscribed, ); if (MatrixState.pAnyState.entries.isNotEmpty) { diff --git a/lib/pangea/widgets/igc/pangea_rich_text.dart b/lib/pangea/widgets/igc/pangea_rich_text.dart index 05875c25c..1dd1cd16e 100644 --- a/lib/pangea/widgets/igc/pangea_rich_text.dart +++ b/lib/pangea/widgets/igc/pangea_rich_text.dart @@ -3,10 +3,10 @@ import 'dart:ui'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; +import 'package:fluffychat/pangea/enum/instructions_enum.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/representation_content_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; -import 'package:fluffychat/pangea/utils/instructions.dart'; import 'package:fluffychat/pangea/widgets/chat/message_context_menu.dart'; import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; import 'package:fluffychat/widgets/matrix.dart'; From 493146120913155e2a92a06b666b10e4782fd309 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Fri, 28 Jun 2024 10:56:42 -0400 Subject: [PATCH 41/54] Adjust hint box design --- lib/pangea/enum/instructions_enum.dart | 18 +++++-- lib/pangea/utils/instructions.dart | 66 +++++++++++++++----------- 2 files changed, 52 insertions(+), 32 deletions(-) diff --git a/lib/pangea/enum/instructions_enum.dart b/lib/pangea/enum/instructions_enum.dart index 8bcd3f3f9..16564ef07 100644 --- a/lib/pangea/enum/instructions_enum.dart +++ b/lib/pangea/enum/instructions_enum.dart @@ -49,9 +49,21 @@ extension Copy on InstructionsEnum { case InstructionsEnum.speechToText: return Column( children: [ - Text( - title(context), - style: BotStyle.text(context), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.record_voice_over_outlined, + size: 20, + ), + const SizedBox( + width: 7, + ), + Text( + title(context), + style: BotStyle.text(context), + ), + ], ), Text( body(context), diff --git a/lib/pangea/utils/instructions.dart b/lib/pangea/utils/instructions.dart index a21b664a9..fb917dedd 100644 --- a/lib/pangea/utils/instructions.dart +++ b/lib/pangea/utils/instructions.dart @@ -44,6 +44,8 @@ class InstructionsController { value, ); + /// Instruction Card gives users tips on + /// how to use Pangea Chat's features Future showInstructionsPopup( BuildContext context, InstructionsEnum key, @@ -109,7 +111,7 @@ class InstructionsController { } /// Returns a widget that will be added to existing widget - /// that displays hint text defined in the enum extension + /// which displays hint text defined in the enum extension Widget getInlineTooltip( BuildContext context, InstructionsEnum key, @@ -127,39 +129,45 @@ class InstructionsController { ); return const SizedBox(); } - return Column( - children: [ - Row( - children: [ - const Expanded( - child: Divider(), - ), - CircleAvatar( - radius: 10, - backgroundColor: - Theme.of(context).colorScheme.primary.withAlpha(50), - child: IconButton( - padding: EdgeInsets.zero, - icon: const Icon( - Icons.close_outlined, - size: 15, - ), - onPressed: () { - _instructionsClosed[key] = true; - refreshOnClose(); - }, - ), - ), - ], + return Badge( + offset: const Offset(0, -7), + backgroundColor: Colors.transparent, + label: CircleAvatar( + radius: 10, + backgroundColor: Theme.of(context).colorScheme.primary.withAlpha(20), + child: IconButton( + padding: EdgeInsets.zero, + icon: const Icon( + Icons.close_outlined, + size: 15, + ), + onPressed: () { + _instructionsClosed[key] = true; + refreshOnClose(); + }, ), - key.inlineTooltip(context), - const SizedBox(height: 9), - const Divider(), - ], + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10, + ), + color: Theme.of(context).colorScheme.primary.withAlpha(20), + // border: Border.all( + // color: Theme.of(context).colorScheme.primary.withAlpha(50), + // ), + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: key.inlineTooltip(context), + ), + ), ); } } +/// User can toggle on to prevent Instruction Card +/// from appearing in future sessions class InstructionsToggle extends StatefulWidget { const InstructionsToggle({ super.key, From ffbc62ba555a1faa378a00268da5072a527c33a4 Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Fri, 28 Jun 2024 11:34:55 -0400 Subject: [PATCH 42/54] consolidating language constants and using for unknown detection instance --- lib/pages/chat/chat_input_row.dart | 2 +- .../controllers/choreographer.dart | 114 ++++++++++-------- .../controllers/it_controller.dart | 3 - .../controllers/message_options.dart | 2 +- lib/pangea/constants/keys.dart | 4 - lib/pangea/constants/language_constants.dart | 24 ++++ lib/pangea/constants/language_keys.dart | 6 - lib/pangea/constants/language_level_type.dart | 3 - lib/pangea/constants/language_list_keys.dart | 4 - .../controllers/language_controller.dart | 2 +- .../language_detection_controller.dart | 18 ++- .../controllers/language_list_controller.dart | 3 +- .../controllers/my_analytics_controller.dart | 2 +- lib/pangea/controllers/user_controller.dart | 2 +- .../controllers/word_net_controller.dart | 2 +- .../pangea_room_extension.dart | 2 +- .../pangea_message_event.dart | 2 +- .../pangea_representation_event.dart | 2 +- lib/pangea/models/language_model.dart | 2 +- lib/pangea/models/space_model.dart | 2 +- lib/pangea/models/user_model.dart | 2 +- .../student_analytics/student_analytics.dart | 2 +- .../utils/get_chat_list_item_subtitle.dart | 2 +- lib/pangea/widgets/igc/word_data_card.dart | 2 +- .../space/language_level_dropdown.dart | 2 +- .../user_settings/p_language_dialog.dart | 2 +- lib/utils/background_push.dart | 2 +- 27 files changed, 113 insertions(+), 102 deletions(-) delete mode 100644 lib/pangea/constants/keys.dart create mode 100644 lib/pangea/constants/language_constants.dart delete mode 100644 lib/pangea/constants/language_keys.dart delete mode 100644 lib/pangea/constants/language_level_type.dart delete mode 100644 lib/pangea/constants/language_list_keys.dart diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 6bf19a850..0577d6094 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -3,7 +3,7 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; import 'package:fluffychat/pangea/choreographer/widgets/it_bar.dart'; import 'package:fluffychat/pangea/choreographer/widgets/send_button.dart'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index a0c6a5f6b..9a7f38428 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -5,13 +5,12 @@ import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pangea/choreographer/controllers/alternative_translator.dart'; import 'package:fluffychat/pangea/choreographer/controllers/igc_controller.dart'; import 'package:fluffychat/pangea/choreographer/controllers/message_options.dart'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; import 'package:fluffychat/pangea/enum/assistance_state_enum.dart'; import 'package:fluffychat/pangea/enum/edit_type.dart'; import 'package:fluffychat/pangea/models/it_step.dart'; -import 'package:fluffychat/pangea/models/language_detection_model.dart'; import 'package:fluffychat/pangea/models/representation_content_model.dart'; import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; @@ -94,63 +93,67 @@ class Choreographer { } Future _sendWithIGC(BuildContext context) async { - if (igc.canSendMessage) { - final PangeaRepresentation? originalWritten = - choreoRecord.includedIT && itController.sourceText != null - ? PangeaRepresentation( - langCode: l1LangCode ?? LanguageKeys.unknownLanguage, - text: itController.sourceText!, - originalWritten: true, - originalSent: false, - ) - : null; + if (!igc.canSendMessage) { + igc.showFirstMatch(context); + return; + } - final PangeaRepresentation originalSent = PangeaRepresentation( - langCode: langCodeOfCurrentText ?? LanguageKeys.unknownLanguage, - text: currentText, - originalSent: true, - originalWritten: originalWritten == null, - ); - final ChoreoRecord? applicableChoreo = - isITandIGCEnabled && igc.igcTextData != null ? choreoRecord : null; + final PangeaRepresentation? originalWritten = + choreoRecord.includedIT && itController.sourceText != null + ? PangeaRepresentation( + langCode: l1LangCode ?? LanguageKeys.unknownLanguage, + text: itController.sourceText!, + originalWritten: true, + originalSent: false, + ) + : null; + //TODO - confirm that IT is indeed making sure the message is in the user's L1 - // if the message has not been processed to determine its language - // then run it through the language detection endpoint. If the detection - // confidence is high enough, use that language code as the message's language - // to save that pangea representation - if (applicableChoreo == null) { - final resp = await pangeaController.languageDetection.detectLanguage( + // if the message has not been processed to determine its language + // then run it through the language detection endpoint. If the detection + // confidence is high enough, use that language code as the message's language + // to save that pangea representation + // TODO - move this to somewhere such that the message can be cleared from the input field + // before the language detection is complete. Otherwise, user is going to be waiting + // in cases of slow internet or slow language detection + final String originalSentLangCode = langCodeOfCurrentText ?? + (await pangeaController.languageDetection.detectLanguage( currentText, pangeaController.languageController.userL2?.langCode, pangeaController.languageController.userL1?.langCode, - ); - final LanguageDetection? bestDetection = resp.bestDetection(); - if (bestDetection != null) { - originalSent.langCode = bestDetection.langCode; - } - } + )) + .bestDetection() + .langCode; - final UseType useType = useTypeCalculator(applicableChoreo); - debugPrint("use type in choreographer $useType"); + final PangeaRepresentation originalSent = PangeaRepresentation( + langCode: originalSentLangCode, + text: currentText, + originalSent: true, + originalWritten: originalWritten == null, + ); - chatController.send( - // PTODO - turn this back on in conjunction with saving tokens - // we need to save those tokens as well, in order for exchanges to work - // properly. in an exchange, the other user will want - // originalWritten: originalWritten, - originalSent: originalSent, - tokensSent: igc.igcTextData?.tokens != null - ? PangeaMessageTokens(tokens: igc.igcTextData!.tokens) - : null, - //TODO - save originalwritten tokens - choreo: applicableChoreo, - useType: useType, - ); + // TODO - why does both it and igc need to be enabled for choreo to be applicable? + final ChoreoRecord? applicableChoreo = + isITandIGCEnabled && igc.igcTextData != null ? choreoRecord : null; - clear(); - } else { - igc.showFirstMatch(context); - } + final UseType useType = useTypeCalculator(applicableChoreo); + debugPrint("use type in choreographer $useType"); + + chatController.send( + // PTODO - turn this back on in conjunction with saving tokens + // we need to save those tokens as well, in order for exchanges to work + // properly. in an exchange, the other user will want + // originalWritten: originalWritten, + originalSent: originalSent, + tokensSent: igc.igcTextData?.tokens != null + ? PangeaMessageTokens(tokens: igc.igcTextData!.tokens) + : null, + //TODO - save originalwritten tokens + choreo: applicableChoreo, + useType: useType, + ); + + clear(); } _resetDebounceTimer() { @@ -481,10 +484,17 @@ class Choreographer { bool get editTypeIsKeyboard => EditType.keyboard == _textController.editType; + /// If there is applicable igcTextData, return the detected langCode + /// Otherwise, if the IT controller is open, return the user's L2 langCode + /// This second piece assumes that IT is being used to translate into the user's L2 + /// and could be spotty. It's a bit of a hack, and should be tested more. String? get langCodeOfCurrentText { if (igc.detectedLangCode != null) return igc.detectedLangCode!; - if (itController.isOpen) return l2LangCode!; + // TODO - this is a bit of a hack, and should be tested more + // we should also check that user has not done customInput + if (itController.completedITSteps.isNotEmpty && itController.allCorrect) + return l2LangCode!; return null; } diff --git a/lib/pangea/choreographer/controllers/it_controller.dart b/lib/pangea/choreographer/controllers/it_controller.dart index 632db7e9b..a79f2d6fa 100644 --- a/lib/pangea/choreographer/controllers/it_controller.dart +++ b/lib/pangea/choreographer/controllers/it_controller.dart @@ -340,9 +340,6 @@ class ITController { bool get isLoading => choreographer.isFetching; - bool get correctChoicesSelected => - completedITSteps.every((ITStep step) => step.isCorrect); - String latestChoiceFeedback(BuildContext context) => completedITSteps.isNotEmpty ? completedITSteps.last.choiceFeedback(context) diff --git a/lib/pangea/choreographer/controllers/message_options.dart b/lib/pangea/choreographer/controllers/message_options.dart index 0e5e68461..96df5d921 100644 --- a/lib/pangea/choreographer/controllers/message_options.dart +++ b/lib/pangea/choreographer/controllers/message_options.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/utils/firebase_analytics.dart'; diff --git a/lib/pangea/constants/keys.dart b/lib/pangea/constants/keys.dart deleted file mode 100644 index 092b1b0a9..000000000 --- a/lib/pangea/constants/keys.dart +++ /dev/null @@ -1,4 +0,0 @@ -class PrefKey { - static const lastFetched = 'LAST_FETCHED'; - static const flags = 'flags'; -} diff --git a/lib/pangea/constants/language_constants.dart b/lib/pangea/constants/language_constants.dart new file mode 100644 index 000000000..73137a300 --- /dev/null +++ b/lib/pangea/constants/language_constants.dart @@ -0,0 +1,24 @@ +import 'package:fluffychat/pangea/models/language_detection_model.dart'; + +class LanguageKeys { + static const unknownLanguage = "unk"; + static const mixedLanguage = "mixed"; + static const defaultLanguage = "en"; + static const multiLanguage = "multi"; +} + +class LanguageLevelType { + static List get allInts => [0, 1, 2, 3, 4, 5, 6]; +} + +class PrefKey { + static const lastFetched = 'p_lang_lastfetched'; + static const flags = 'p_lang_flag'; +} + +final LanguageDetection unknownLanguageDetection = LanguageDetection( + langCode: LanguageKeys.unknownLanguage, + confidence: 0.5, +); + +const double languageDetectionConfidenceThreshold = 0.95; diff --git a/lib/pangea/constants/language_keys.dart b/lib/pangea/constants/language_keys.dart deleted file mode 100644 index cfe0c96c0..000000000 --- a/lib/pangea/constants/language_keys.dart +++ /dev/null @@ -1,6 +0,0 @@ -class LanguageKeys { - static const unknownLanguage = "unk"; - static const mixedLanguage = "mixed"; - static const defaultLanguage = "en"; - static const multiLanguage = "multi"; -} diff --git a/lib/pangea/constants/language_level_type.dart b/lib/pangea/constants/language_level_type.dart deleted file mode 100644 index 49136ca77..000000000 --- a/lib/pangea/constants/language_level_type.dart +++ /dev/null @@ -1,3 +0,0 @@ -class LanguageLevelType { - static List get allInts => [0, 1, 2, 3, 4, 5, 6]; -} diff --git a/lib/pangea/constants/language_list_keys.dart b/lib/pangea/constants/language_list_keys.dart deleted file mode 100644 index 7fff924a9..000000000 --- a/lib/pangea/constants/language_list_keys.dart +++ /dev/null @@ -1,4 +0,0 @@ -class PrefKey { - static const lastFetched = 'p_lang_lastfetched'; - static const flags = 'p_lang_flag'; -} diff --git a/lib/pangea/controllers/language_controller.dart b/lib/pangea/controllers/language_controller.dart index c906e6b4e..b1bc02380 100644 --- a/lib/pangea/controllers/language_controller.dart +++ b/lib/pangea/controllers/language_controller.dart @@ -1,6 +1,6 @@ import 'dart:developer'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/models/language_model.dart'; diff --git a/lib/pangea/controllers/language_detection_controller.dart b/lib/pangea/controllers/language_detection_controller.dart index 4ddfabc88..08f38ea2c 100644 --- a/lib/pangea/controllers/language_detection_controller.dart +++ b/lib/pangea/controllers/language_detection_controller.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:fluffychat/pangea/config/environment.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/models/language_detection_model.dart'; import 'package:fluffychat/pangea/network/urls.dart'; @@ -75,19 +76,16 @@ class LanguageDetectionResponse { }; } - LanguageDetection? get _bestDetection { + LanguageDetection get _bestDetection { detections.sort((a, b) => b.confidence.compareTo(a.confidence)); - return detections.isNotEmpty ? detections.first : null; + return detections.firstOrNull ?? unknownLanguageDetection; } - final double _confidenceThreshold = 0.95; - - LanguageDetection? bestDetection({double? threshold}) { - threshold ??= _confidenceThreshold; - return (_bestDetection?.confidence ?? 0) >= _confidenceThreshold - ? _bestDetection! - : null; - } + LanguageDetection bestDetection({double? threshold}) => + _bestDetection.confidence >= + (threshold ?? languageDetectionConfidenceThreshold) + ? _bestDetection + : unknownLanguageDetection; } class _LanguageDetectionCacheItem { diff --git a/lib/pangea/controllers/language_list_controller.dart b/lib/pangea/controllers/language_list_controller.dart index 59c3cce88..31e4513fa 100644 --- a/lib/pangea/controllers/language_list_controller.dart +++ b/lib/pangea/controllers/language_list_controller.dart @@ -1,13 +1,12 @@ import 'dart:async'; import 'dart:developer'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/repo/language_repo.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; -import '../constants/language_list_keys.dart'; import '../utils/shared_prefs.dart'; class PangeaLanguage { diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index 614fcf9db..99fdb14c7 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:developer'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/constants/local.key.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/controllers/base_controller.dart'; diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index c7a35b3e8..390f17b9d 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:collection/collection.dart'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/controllers/base_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; diff --git a/lib/pangea/controllers/word_net_controller.dart b/lib/pangea/controllers/word_net_controller.dart index ce8324ebe..a67941465 100644 --- a/lib/pangea/controllers/word_net_controller.dart +++ b/lib/pangea/controllers/word_net_controller.dart @@ -1,7 +1,7 @@ import 'package:collection/collection.dart'; import 'package:http/http.dart' as http; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/repo/word_repo.dart'; import '../models/word_data_model.dart'; import 'base_controller.dart'; diff --git a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index b8dae7ab3..298a519ad 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -4,7 +4,7 @@ import 'dart:developer'; import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index 951b77dfc..4ead9982c 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -22,7 +22,7 @@ import 'package:matrix/matrix.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import '../../widgets/matrix.dart'; -import '../constants/language_keys.dart'; +import '../constants/language_constants.dart'; import '../constants/pangea_event_types.dart'; import '../enum/use_type.dart'; import '../utils/error_handler.dart'; diff --git a/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart b/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart index e774dc4f2..e6e45b756 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart @@ -12,7 +12,7 @@ import 'package:matrix/src/utils/markdown.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import '../../widgets/matrix.dart'; -import '../constants/language_keys.dart'; +import '../constants/language_constants.dart'; import '../constants/pangea_event_types.dart'; import '../models/choreo_record.dart'; import '../models/representation_content_model.dart'; diff --git a/lib/pangea/models/language_model.dart b/lib/pangea/models/language_model.dart index ae960b212..be3cc71ba 100644 --- a/lib/pangea/models/language_model.dart +++ b/lib/pangea/models/language_model.dart @@ -1,6 +1,6 @@ import 'dart:developer'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; diff --git a/lib/pangea/models/space_model.dart b/lib/pangea/models/space_model.dart index f17507fa8..946da6dc7 100644 --- a/lib/pangea/models/space_model.dart +++ b/lib/pangea/models/space_model.dart @@ -7,7 +7,7 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; import '../constants/class_default_values.dart'; -import '../constants/language_keys.dart'; +import '../constants/language_constants.dart'; import '../constants/pangea_event_types.dart'; import 'language_model.dart'; diff --git a/lib/pangea/models/user_model.dart b/lib/pangea/models/user_model.dart index f8e929a13..10b7ae747 100644 --- a/lib/pangea/models/user_model.dart +++ b/lib/pangea/models/user_model.dart @@ -9,7 +9,7 @@ import 'package:fluffychat/pangea/utils/instructions.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import '../constants/language_keys.dart'; +import '../constants/language_constants.dart'; import 'language_model.dart'; PUserModel pUserModelFromJson(String str) => diff --git a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart index d6bc9d766..a345243ff 100644 --- a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart +++ b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:developer'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart'; import 'package:fluffychat/pangea/extensions/client_extension/client_extension.dart'; diff --git a/lib/pangea/utils/get_chat_list_item_subtitle.dart b/lib/pangea/utils/get_chat_list_item_subtitle.dart index 5adc0040c..bd8d064f5 100644 --- a/lib/pangea/utils/get_chat_list_item_subtitle.dart +++ b/lib/pangea/utils/get_chat_list_item_subtitle.dart @@ -1,5 +1,5 @@ import 'package:collection/collection.dart'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; diff --git a/lib/pangea/widgets/igc/word_data_card.dart b/lib/pangea/widgets/igc/word_data_card.dart index 5a785c795..1d789424d 100644 --- a/lib/pangea/widgets/igc/word_data_card.dart +++ b/lib/pangea/widgets/igc/word_data_card.dart @@ -1,6 +1,6 @@ import 'dart:developer'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/controllers/contextual_definition_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/models/language_model.dart'; diff --git a/lib/pangea/widgets/space/language_level_dropdown.dart b/lib/pangea/widgets/space/language_level_dropdown.dart index 3b2678e29..aeb1cfd36 100644 --- a/lib/pangea/widgets/space/language_level_dropdown.dart +++ b/lib/pangea/widgets/space/language_level_dropdown.dart @@ -1,4 +1,4 @@ -import 'package:fluffychat/pangea/constants/language_level_type.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/utils/language_level_copy.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; diff --git a/lib/pangea/widgets/user_settings/p_language_dialog.dart b/lib/pangea/widgets/user_settings/p_language_dialog.dart index 51082a7e6..8b7ae33b5 100644 --- a/lib/pangea/widgets/user_settings/p_language_dialog.dart +++ b/lib/pangea/widgets/user_settings/p_language_dialog.dart @@ -1,6 +1,6 @@ import 'dart:developer'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/models/language_model.dart'; diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 00ebd3cb5..093b78f81 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -24,7 +24,7 @@ import 'dart:io'; import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/utils/push_helper.dart'; import 'package:fluffychat/widgets/fluffy_chat_app.dart'; From 8ceb7851e5923ec7455f2930507d53065e071e05 Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Fri, 28 Jun 2024 11:36:10 -0400 Subject: [PATCH 43/54] refactoring of my analytics controller and related flows --- assets/l10n/intl_en.arb | 2 +- assets/l10n/intl_es.arb | 2 +- lib/pages/chat_list/chat_list.dart | 2 +- .../controllers/my_analytics_controller.dart | 304 +++++++++--------- .../client_extension/client_extension.dart | 4 +- .../client_extension/space_extension.dart | 12 + .../events_extension.dart | 34 +- .../pangea_room_extension.dart | 1 + .../room_analytics_extension.dart | 34 +- .../models/analytics/analytics_event.dart | 30 -- .../models/analytics/constructs_event.dart | 15 - .../analytics/summary_analytics_event.dart | 14 - .../practice_activity_record_model.dart | 22 +- .../student_analytics/student_analytics.dart | 35 +- 14 files changed, 241 insertions(+), 270 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index f0aba0219..986cb9cb0 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -3109,7 +3109,7 @@ "prettyGood": "Pretty good! Here's what I would have said.", "letMeThink": "Hmm, let's see how you did!", "clickMessageTitle": "Need help?", - "clickMessageBody": "Click messages to access definitions, translations, and audio!", + "clickMessageBody": "Click a message for language help! Click and hold to react 😀.", "understandingMessagesTitle": "Definitions and translations!", "understandingMessagesBody": "Click underlined words for definitions. Translate with message options (upper right).", "allDone": "All done!", diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb index dc328294a..e771c86a3 100644 --- a/assets/l10n/intl_es.arb +++ b/assets/l10n/intl_es.arb @@ -4512,7 +4512,7 @@ "definitions": "definiciones", "subscribedToUnlockTools": "Suscríbase para desbloquear herramientas lingüísticas, como", "clickMessageTitle": "¿Necesitas ayuda?", - "clickMessageBody": "Haga clic en los mensajes para acceder a las definiciones, traducciones y audio.", + "clickMessageBody": "¡Lame un mensaje para obtener ayuda con el idioma! Haz clic y mantén presionado para reaccionar 😀", "more": "Más", "translationTooltip": "Traducir", "audioTooltip": "Reproducir audio", diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 569eba880..89f31fd68 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -917,7 +917,7 @@ class ChatListController extends State if (mounted) { GoogleAnalytics.analyticsUserUpdate(client.userID); await pangeaController.subscriptionController.initialize(); - await pangeaController.myAnalytics.addEventsListener(); + await pangeaController.myAnalytics.initialize(); pangeaController.afterSyncAndFirstLoginInitialization(context); await pangeaController.inviteBotToExistingSpaces(); await pangeaController.setPangeaPushRules(); diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index 99fdb14c7..82b7af3c7 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -1,16 +1,17 @@ import 'dart:async'; import 'dart:developer'; +<<<<<<< Updated upstream import 'package:fluffychat/pangea/constants/language_constants.dart'; +======= +>>>>>>> Stashed changes import 'package:fluffychat/pangea/constants/local.key.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; -import 'package:fluffychat/pangea/controllers/base_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; -import 'package:fluffychat/pangea/models/analytics/constructs_event.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; -import 'package:fluffychat/pangea/models/analytics/summary_analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_model.dart'; +import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:matrix/matrix.dart'; @@ -18,11 +19,18 @@ import 'package:matrix/matrix.dart'; import '../extensions/client_extension/client_extension.dart'; import '../extensions/pangea_room_extension/pangea_room_extension.dart'; -// controls the sending of analytics events -class MyAnalyticsController extends BaseController { +/// handles the processing of analytics for +/// 1) messages sent by the user and +/// 2) constructs used by the user, both in sending messages and doing practice activities +class MyAnalyticsController { late PangeaController _pangeaController; Timer? _updateTimer; + + /// the max number of messages that will be cached before + /// an automatic update is triggered final int _maxMessagesCached = 10; + + /// the number of minutes before an automatic update is triggered final int _minutesBeforeUpdate = 5; /// the time since the last update that will trigger an automatic update @@ -33,41 +41,50 @@ class MyAnalyticsController extends BaseController { } /// adds the listener that handles when to run automatic updates - /// to analytics - either after a certain number of messages sent/ + /// to analytics - either after a certain number of messages sent /// received or after a certain amount of time [_timeSinceUpdate] without an update - Future addEventsListener() async { - final Client client = _pangeaController.matrixState.client; + Future initialize() async { + final lastUpdated = await _refreshAnalyticsIfOutdated(); - // if analytics haven't been updated in the last day, update them - DateTime? lastUpdated = await _pangeaController.analytics - .myAnalyticsLastUpdated(PangeaEventTypes.summaryAnalytics); - final DateTime yesterday = DateTime.now().subtract(_timeSinceUpdate); - if (lastUpdated?.isBefore(yesterday) ?? true) { - debugPrint("analytics out-of-date, updating"); - await updateAnalytics(); - lastUpdated = await _pangeaController.analytics - .myAnalyticsLastUpdated(PangeaEventTypes.summaryAnalytics); - } - - client.onSync.stream + // listen for new messages and updateAnalytics timer + // we are doing this in an attempt to update analytics when activitiy is low + // both in messages sent by this client and other clients that you're connected with + // doesn't account for messages sent by other clients that you're not connected with + _client.onSync.stream .where((SyncUpdate update) => update.rooms?.join != null) .listen((update) { updateAnalyticsTimer(update, lastUpdated); }); } - /// given an update from sync stream, check if the update contains + /// If analytics haven't been updated in the last day, update them + Future _refreshAnalyticsIfOutdated() async { + DateTime? lastUpdated = await _pangeaController.analytics + .myAnalyticsLastUpdated(PangeaEventTypes.summaryAnalytics); + final DateTime yesterday = DateTime.now().subtract(_timeSinceUpdate); + + if (lastUpdated?.isBefore(yesterday) ?? true) { + debugPrint("analytics out-of-date, updating"); + await updateAnalytics(); + lastUpdated = await _pangeaController.analytics + .myAnalyticsLastUpdated(PangeaEventTypes.summaryAnalytics); + } + return lastUpdated; + } + + Client get _client => _pangeaController.matrixState.client; + + /// Given an update from sync stream, check if the update contains /// messages for which analytics will be saved. If so, reset the timer /// and add the event ID to the cache of un-added event IDs void updateAnalyticsTimer(SyncUpdate update, DateTime? lastUpdated) { for (final entry in update.rooms!.join!.entries) { - final Room room = - _pangeaController.matrixState.client.getRoomById(entry.key)!; + final Room room = _client.getRoomById(entry.key)!; // get the new events in this sync that are messages final List? events = entry.value.timeline?.events ?.map((event) => Event.fromMatrixEvent(event, room)) - .where((event) => eventHasAnalytics(event, lastUpdated)) + .where((event) => hasUserAnalyticsToCache(event, lastUpdated)) .toList(); // add their event IDs to the cache of un-added event IDs @@ -87,8 +104,9 @@ class MyAnalyticsController extends BaseController { } // checks if event from sync update is a message that should have analytics - bool eventHasAnalytics(Event event, DateTime? lastUpdated) { - return (lastUpdated == null || event.originServerTs.isAfter(lastUpdated)) && + bool hasUserAnalyticsToCache(Event event, DateTime? lastUpdated) { + return event.senderId == _client.userID && + (lastUpdated == null || event.originServerTs.isAfter(lastUpdated)) && event.type == EventTypes.Message && event.messageType == MessageTypes.Text && !(event.eventId.contains("web") && @@ -176,21 +194,18 @@ class MyAnalyticsController extends BaseController { } } + String? get userL2 => _pangeaController.languageController.activeL2Code(); + // top level analytics sending function. Send analytics // for each type of analytics event // to each of the applicable analytics rooms Future _updateAnalytics() async { - // if the user's l2 is not sent, don't send analytics - final String? userL2 = _pangeaController.languageController.activeL2Code(); - if (userL2 == null) { + // if missing important info, don't send analytics + if (userL2 == null || _client.userID == null) { + debugger(when: kDebugMode); return; } - // fetch a list of all the chats that the user is studying - // and a list of all the spaces in which the user is studying - await setStudentChats(); - await setStudentSpaces(); - // get the last updated time for each analytics room // and the least recent update, which will be used to determine // how far to go back in the chat history to get messages @@ -217,151 +232,128 @@ class MyAnalyticsController extends BaseController { lastUpdates.isNotEmpty ? lastUpdates.first : null; } - // for each chat the user is studying in, get all the messages - // since the least recent update analytics update, and sort them - // by their langCodes - final Map> langCodeToMsgs = - await getLangCodesToMsgs( - userL2, + final List chats = await _client.chatsImAStudentIn; + + final List recentMsgs = + await _getMessagesWithUnsavedAnalytics( l2AnalyticsLastUpdated, + chats, ); - final List langCodes = langCodeToMsgs.keys.toList(); - for (final String langCode in langCodes) { - // for each of the langs that the user has sent message in, get - // the corresponding analytics room (or create it) - final Room analyticsRoom = await _pangeaController.matrixState.client - .getMyAnalyticsRoom(langCode); + final List recentActivities = + await getRecentActivities(userL2!, l2AnalyticsLastUpdated, chats); - // if there is no analytics room for this langCode, then user hadn't sent - // message in this language at the time of the last analytics update - // so fallback to the least recent update time - final DateTime? lastUpdated = - lastUpdatedMap[analyticsRoom.id] ?? l2AnalyticsLastUpdated; + // FOR DISCUSSION: + // we want to make sure we save something for every message send + // however, we're currently saving analytics for messages not in the userL2 + // based on bad language detection results. maybe it would be better to + // save the analytics for these messages in the userL2 analytics room, but + // with useType of unknown - // get the corresponding list of recent messages for this langCode - final List recentMsgs = - langCodeToMsgs[langCode] ?? []; + final Room analyticsRoom = await _client.getMyAnalyticsRoom(userL2!); - // finally, send the analytics events to the analytics room - await sendAnalyticsEvents( - analyticsRoom, - recentMsgs, - lastUpdated, + // if there is no analytics room for this langCode, then user hadn't sent + // message in this language at the time of the last analytics update + // so fallback to the least recent update time + final DateTime? lastUpdated = + lastUpdatedMap[analyticsRoom.id] ?? l2AnalyticsLastUpdated; + + // final String msgLangCode = (msg.originalSent?.langCode != null && + // msg.originalSent?.langCode != LanguageKeys.unknownLanguage) + // ? msg.originalSent!.langCode + // : userL2; + + // finally, send the analytics events to the analytics room + await _sendAnalyticsEvents( + analyticsRoom, + recentMsgs, + lastUpdated, + recentActivities, + ); + } + + Future> getRecentActivities( + String userL2, + DateTime? lastUpdated, + List chats, + ) async { + final List>> recentActivityFutures = []; + for (final Room chat in chats) { + recentActivityFutures.add( + chat.getEventsBySender( + type: PangeaEventTypes.activityRecord, + sender: _client.userID!, + since: lastUpdated, + ), ); } + final List> recentActivityLists = + await Future.wait(recentActivityFutures); + + return recentActivityLists + .expand((e) => e) + .map((e) => ActivityRecordResponse.fromJson(e.content)) + .toList(); } - Future>> getLangCodesToMsgs( - String userL2, + /// Returns the new messages that have not yet been saved to analytics. + /// The keys in the map correspond to different categories or groups of messages, + /// while the values are lists of [PangeaMessageEvent] objects belonging to each category. + Future> _getMessagesWithUnsavedAnalytics( DateTime? since, + List chats, ) async { - // get a map of langCodes to messages for each chat the user is studying in - final Map> langCodeToMsgs = {}; - for (final Room chat in _studentChats) { - List? recentMsgs; - try { - recentMsgs = await chat.myMessageEventsInChat( + // get the recent messages for each chat + final List>> futures = []; + for (final Room chat in chats) { + futures.add( + chat.myMessageEventsInChat( since: since, - ); - } catch (err) { - debugPrint("failed to fetch messages for chat ${chat.id}"); - continue; - } - - // sort those messages by their langCode - // langCode is hopefully based on the original sent rep, but if that - // is null or unk, it will be based on the user's current l2 - for (final msg in recentMsgs) { - final String msgLangCode = (msg.originalSent?.langCode != null && - msg.originalSent?.langCode != LanguageKeys.unknownLanguage) - ? msg.originalSent!.langCode - : userL2; - langCodeToMsgs[msgLangCode] ??= []; - langCodeToMsgs[msgLangCode]!.add(msg); - } + ), + ); } - return langCodeToMsgs; + final List> recentMsgLists = + await Future.wait(futures); + + // flatten the list of lists of messages + return recentMsgLists.expand((e) => e).toList(); } - Future sendAnalyticsEvents( + Future _sendAnalyticsEvents( Room analyticsRoom, List recentMsgs, DateTime? lastUpdated, + List recentActivities, ) async { - // remove messages that were sent before the last update - if (recentMsgs.isEmpty) return; - if (lastUpdated != null) { - recentMsgs.removeWhere( - (msg) => msg.event.originServerTs.isBefore(lastUpdated), - ); + final List constructContent = []; + + if (recentMsgs.isNotEmpty) { + // remove messages that were sent before the last update + + // format the analytics data + final List summaryContent = + SummaryAnalyticsModel.formatSummaryContent(recentMsgs); + // if there's new content to be sent, or if lastUpdated hasn't been + // set yet for this room, send the analytics events + if (summaryContent.isNotEmpty || lastUpdated == null) { + await analyticsRoom.sendSummaryAnalyticsEvent( + summaryContent, + ); + } + + constructContent + .addAll(ConstructAnalyticsModel.formatConstructsContent(recentMsgs)); } - // format the analytics data - final List summaryContent = - SummaryAnalyticsModel.formatSummaryContent(recentMsgs); - final List constructContent = - ConstructAnalyticsModel.formatConstructsContent(recentMsgs); - - // if there's new content to be sent, or if lastUpdated hasn't been - // set yet for this room, send the analytics events - if (summaryContent.isNotEmpty || lastUpdated == null) { - await SummaryAnalyticsEvent.sendSummaryAnalyticsEvent( - analyticsRoom, - summaryContent, - ); + if (recentActivities.isNotEmpty) { + // TODO - Concert recentActivities into list of constructUse objects. + // First, We need to get related practiceActivityEvent from timeline in order to get its related constructs. Alternatively we + // could search for completed practice activities and see which have been completed by the user. + // It's not clear which is the best approach at the moment and we should consider both. } - if (constructContent.isNotEmpty) { - await ConstructAnalyticsEvent.sendConstructsEvent( - analyticsRoom, - constructContent, - ); - } - } - - List _studentChats = []; - - Future setStudentChats() async { - final List teacherRoomIds = - await _pangeaController.matrixState.client.teacherRoomIds; - _studentChats = _pangeaController.matrixState.client.rooms - .where( - (r) => - !r.isSpace && - !r.isAnalyticsRoom && - !teacherRoomIds.contains(r.id), - ) - .toList(); - setState(data: _studentChats); - } - - List get studentChats { - try { - if (_studentChats.isNotEmpty) return _studentChats; - setStudentChats(); - return _studentChats; - } catch (err) { - debugger(when: kDebugMode); - return []; - } - } - - List _studentSpaces = []; - - Future setStudentSpaces() async { - _studentSpaces = - await _pangeaController.matrixState.client.spacesImStudyingIn; - } - - List get studentSpaces { - try { - if (_studentSpaces.isNotEmpty) return _studentSpaces; - setStudentSpaces(); - return _studentSpaces; - } catch (err) { - debugger(when: kDebugMode); - return []; - } + await analyticsRoom.sendConstructsEvent( + constructContent, + ); } } diff --git a/lib/pangea/extensions/client_extension/client_extension.dart b/lib/pangea/extensions/client_extension/client_extension.dart index 779f8ee0a..3dda99237 100644 --- a/lib/pangea/extensions/client_extension/client_extension.dart +++ b/lib/pangea/extensions/client_extension/client_extension.dart @@ -51,7 +51,9 @@ extension PangeaClient on Client { Future> get spacesImTeaching async => await _spacesImTeaching; - Future> get spacesImStudyingIn async => await _spacesImStudyingIn; + Future> get chatsImAStudentIn async => await _chatsImAStudentIn; + + Future> get spaceImAStudentIn async => await _spacesImStudyingIn; List get spacesImIn => _spacesImIn; diff --git a/lib/pangea/extensions/client_extension/space_extension.dart b/lib/pangea/extensions/client_extension/space_extension.dart index 3bef46e45..0adc70469 100644 --- a/lib/pangea/extensions/client_extension/space_extension.dart +++ b/lib/pangea/extensions/client_extension/space_extension.dart @@ -19,6 +19,18 @@ extension SpaceClientExtension on Client { return spaces; } + Future> get _chatsImAStudentIn async { + final List nowteacherRoomIds = await teacherRoomIds; + return rooms + .where( + (r) => + !r.isSpace && + !r.isAnalyticsRoom && + !nowteacherRoomIds.contains(r.id), + ) + .toList(); + } + Future> get _spacesImStudyingIn async { final List joinedSpaces = rooms .where( diff --git a/lib/pangea/extensions/pangea_room_extension/events_extension.dart b/lib/pangea/extensions/pangea_room_extension/events_extension.dart index 2d67db5b2..6cdde1ce2 100644 --- a/lib/pangea/extensions/pangea_room_extension/events_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/events_extension.dart @@ -429,21 +429,27 @@ extension EventsRoomExtension on Room { Future> myMessageEventsInChat({ DateTime? since, }) async { - final List msgEvents = await getEventsBySender( - type: EventTypes.Message, - sender: client.userID!, - since: since, - ); - final Timeline timeline = await getTimeline(); - return msgEvents - .where((event) => (event.content['msgtype'] == MessageTypes.Text)) - .map((event) { - return PangeaMessageEvent( - event: event, - timeline: timeline, - ownMessage: true, + try { + final List msgEvents = await getEventsBySender( + type: EventTypes.Message, + sender: client.userID!, + since: since, ); - }).toList(); + final Timeline timeline = await getTimeline(); + return msgEvents + .where((event) => (event.content['msgtype'] == MessageTypes.Text)) + .map((event) { + return PangeaMessageEvent( + event: event, + timeline: timeline, + ownMessage: true, + ); + }).toList(); + } catch (err, s) { + debugger(when: kDebugMode); + ErrorHandler.logError(e: err, s: s); + return []; + } } // fetch event of a certain type by a certain sender diff --git a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index 298a519ad..78ecb9cc0 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -11,6 +11,7 @@ import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/analytics/analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_event.dart'; +import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_model.dart'; import 'package:fluffychat/pangea/models/bot_options_model.dart'; diff --git a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart index e3d00f8a8..04e168612 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart @@ -99,7 +99,7 @@ extension AnalyticsRoomExtension on Room { return; } - for (final Room space in (await client.spacesImStudyingIn)) { + for (final Room space in (await client.spaceImAStudentIn)) { if (space.spaceChildren.any((sc) => sc.roomId == id)) continue; await space.addAnalyticsRoomToSpace(this); } @@ -175,7 +175,7 @@ extension AnalyticsRoomExtension on Room { return; } - for (final Room space in (await client.spacesImStudyingIn)) { + for (final Room space in (await client.spaceImAStudentIn)) { await space.inviteSpaceTeachersToAnalyticsRoom(this); } } @@ -249,4 +249,34 @@ extension AnalyticsRoomExtension on Room { return creationContent?.tryGet(ModelKey.langCode) == langCode || creationContent?.tryGet(ModelKey.oldLangCode) == langCode; } + + Future sendSummaryAnalyticsEvent( + List records, + ) async { + if (records.isEmpty) return null; + + final SummaryAnalyticsModel analyticsModel = SummaryAnalyticsModel( + messages: records, + ); + final String? eventId = await sendEvent( + analyticsModel.toJson(), + type: PangeaEventTypes.summaryAnalytics, + ); + return eventId; + } + + Future sendConstructsEvent( + List uses, + ) async { + if (uses.isEmpty) return null; + final ConstructAnalyticsModel constructsModel = ConstructAnalyticsModel( + uses: uses, + ); + + final String? eventId = await sendEvent( + constructsModel.toJson(), + type: PangeaEventTypes.construct, + ); + return eventId; + } } diff --git a/lib/pangea/models/analytics/analytics_event.dart b/lib/pangea/models/analytics/analytics_event.dart index 2453e62ef..7010d3591 100644 --- a/lib/pangea/models/analytics/analytics_event.dart +++ b/lib/pangea/models/analytics/analytics_event.dart @@ -1,8 +1,6 @@ import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/models/analytics/analytics_model.dart'; -import 'package:fluffychat/pangea/models/analytics/constructs_event.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; -import 'package:fluffychat/pangea/models/analytics/summary_analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_model.dart'; import 'package:matrix/matrix.dart'; @@ -28,32 +26,4 @@ abstract class AnalyticsEvent { } return contentCache!; } - - static List analyticsEventTypes = [ - PangeaEventTypes.summaryAnalytics, - PangeaEventTypes.construct, - ]; - - static Future sendEvent( - Room analyticsRoom, - String type, - List analyticsContent, - ) async { - String? eventId; - switch (type) { - case PangeaEventTypes.summaryAnalytics: - eventId = await SummaryAnalyticsEvent.sendSummaryAnalyticsEvent( - analyticsRoom, - analyticsContent.cast(), - ); - break; - case PangeaEventTypes.construct: - eventId = await ConstructAnalyticsEvent.sendConstructsEvent( - analyticsRoom, - analyticsContent.cast(), - ); - break; - } - return eventId; - } } diff --git a/lib/pangea/models/analytics/constructs_event.dart b/lib/pangea/models/analytics/constructs_event.dart index c2930faba..481051b1c 100644 --- a/lib/pangea/models/analytics/constructs_event.dart +++ b/lib/pangea/models/analytics/constructs_event.dart @@ -18,19 +18,4 @@ class ConstructAnalyticsEvent extends AnalyticsEvent { contentCache ??= ConstructAnalyticsModel.fromJson(event.content); return contentCache as ConstructAnalyticsModel; } - - static Future sendConstructsEvent( - Room analyticsRoom, - List uses, - ) async { - final ConstructAnalyticsModel constructsModel = ConstructAnalyticsModel( - uses: uses, - ); - - final String? eventId = await analyticsRoom.sendEvent( - constructsModel.toJson(), - type: PangeaEventTypes.construct, - ); - return eventId; - } } diff --git a/lib/pangea/models/analytics/summary_analytics_event.dart b/lib/pangea/models/analytics/summary_analytics_event.dart index e7034eaa4..a764d5597 100644 --- a/lib/pangea/models/analytics/summary_analytics_event.dart +++ b/lib/pangea/models/analytics/summary_analytics_event.dart @@ -18,18 +18,4 @@ class SummaryAnalyticsEvent extends AnalyticsEvent { contentCache ??= SummaryAnalyticsModel.fromJson(event.content); return contentCache as SummaryAnalyticsModel; } - - static Future sendSummaryAnalyticsEvent( - Room analyticsRoom, - List records, - ) async { - final SummaryAnalyticsModel analyticsModel = SummaryAnalyticsModel( - messages: records, - ); - final String? eventId = await analyticsRoom.sendEvent( - analyticsModel.toJson(), - type: PangeaEventTypes.summaryAnalytics, - ); - return eventId; - } } diff --git a/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart b/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart index 3fe3e859d..e5c3a1c18 100644 --- a/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart +++ b/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart @@ -7,14 +7,14 @@ import 'dart:typed_data'; class PracticeActivityRecordModel { final String? question; - late List responses; + late List responses; PracticeActivityRecordModel({ required this.question, - List? responses, + List? responses, }) { if (responses == null) { - this.responses = List.empty(growable: true); + this.responses = List.empty(growable: true); } else { this.responses = responses; } @@ -26,7 +26,9 @@ class PracticeActivityRecordModel { return PracticeActivityRecordModel( question: json['question'] as String, responses: (json['responses'] as List) - .map((e) => ActivityResponse.fromJson(e as Map)) + .map( + (e) => ActivityRecordResponse.fromJson(e as Map), + ) .toList(), ); } @@ -55,7 +57,7 @@ class PracticeActivityRecordModel { }) { try { responses.add( - ActivityResponse( + ActivityRecordResponse( text: text, audioBytes: audioBytes, imageBytes: imageBytes, @@ -84,7 +86,7 @@ class PracticeActivityRecordModel { int get hashCode => question.hashCode ^ responses.hashCode; } -class ActivityResponse { +class ActivityRecordResponse { // the user's response // has nullable string, nullable audio bytes, nullable image bytes, and timestamp final String? text; @@ -92,15 +94,15 @@ class ActivityResponse { final Uint8List? imageBytes; final DateTime timestamp; - ActivityResponse({ + ActivityRecordResponse({ this.text, this.audioBytes, this.imageBytes, required this.timestamp, }); - factory ActivityResponse.fromJson(Map json) { - return ActivityResponse( + factory ActivityRecordResponse.fromJson(Map json) { + return ActivityRecordResponse( text: json['text'] as String?, audioBytes: json['audio'] as Uint8List?, imageBytes: json['image'] as Uint8List?, @@ -121,7 +123,7 @@ class ActivityResponse { bool operator ==(Object other) { if (identical(this, other)) return true; - return other is ActivityResponse && + return other is ActivityRecordResponse && other.text == text && other.audioBytes == audioBytes && other.imageBytes == imageBytes && diff --git a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart index a345243ff..5c694b6ca 100644 --- a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart +++ b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'dart:developer'; import 'package:fluffychat/pangea/constants/language_constants.dart'; @@ -29,49 +28,35 @@ class StudentAnalyticsPage extends StatefulWidget { class StudentAnalyticsController extends State { final PangeaController _pangeaController = MatrixState.pangeaController; AnalyticsSelected? selected; - StreamSubscription? stateSub; @override void initState() { super.initState(); - - final listFutures = [ - _pangeaController.myAnalytics.setStudentChats(), - _pangeaController.myAnalytics.setStudentSpaces(), - ]; - Future.wait(listFutures).then((_) => setState(() {})); - - stateSub = _pangeaController.myAnalytics.stateStream.listen((_) { - setState(() {}); - }); } @override void dispose() { - stateSub?.cancel(); super.dispose(); } + List _chats = []; List get chats { - if (_pangeaController.myAnalytics.studentChats.isEmpty) { - _pangeaController.myAnalytics.setStudentChats().then((_) { - if (_pangeaController.myAnalytics.studentChats.isNotEmpty) { - setState(() {}); - } + if (_chats.isEmpty) { + _pangeaController.matrixState.client.chatsImAStudentIn.then((result) { + setState(() => _chats = result); }); } - return _pangeaController.myAnalytics.studentChats; + return _chats; } + List _spaces = []; List get spaces { - if (_pangeaController.myAnalytics.studentSpaces.isEmpty) { - _pangeaController.myAnalytics.setStudentSpaces().then((_) { - if (_pangeaController.myAnalytics.studentSpaces.isNotEmpty) { - setState(() {}); - } + if (_spaces.isEmpty) { + _pangeaController.matrixState.client.spaceImAStudentIn.then((result) { + setState(() => _spaces = result); }); } - return _pangeaController.myAnalytics.studentSpaces; + return _spaces; } String? get userId { From c8079b7df1b67699cddb918773dd20302b4177c2 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Fri, 28 Jun 2024 12:16:19 -0400 Subject: [PATCH 44/54] commented out postframe callback around showing toolbar to prevent delay in showing toolbar after message tap --- lib/pangea/widgets/chat/message_toolbar.dart | 103 ++++++++++--------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index 2468d6b96..dda1fd01c 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -94,59 +94,62 @@ class ToolbarDisplayController { previousEvent: previousEvent, ); - WidgetsBinding.instance.addPostFrameCallback((timeStamp) { - Widget overlayEntry; - if (toolbar == null) return; - try { - overlayEntry = Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: pangeaMessageEvent.ownMessage - ? CrossAxisAlignment.end - : CrossAxisAlignment.start, - children: [ - toolbarUp ? toolbar! : overlayMessage, - const SizedBox(height: 6), - toolbarUp ? overlayMessage : toolbar!, - ], - ); - } catch (err) { - debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: StackTrace.current); - return; - } - - OverlayUtil.showOverlay( - context: context, - child: overlayEntry, - transformTargetId: targetId, - targetAnchor: pangeaMessageEvent.ownMessage - ? toolbarUp - ? Alignment.bottomRight - : Alignment.topRight - : toolbarUp - ? Alignment.bottomLeft - : Alignment.topLeft, - followerAnchor: pangeaMessageEvent.ownMessage - ? toolbarUp - ? Alignment.bottomRight - : Alignment.topRight - : toolbarUp - ? Alignment.bottomLeft - : Alignment.topLeft, - backgroundColor: const Color.fromRGBO(0, 0, 0, 1).withAlpha(100), + // I'm not sure why I put this here, but it causes the toolbar + // not to open immediately after clicking (user has to scroll or move their cursor) + // so I'm commenting it out for now + // WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + Widget overlayEntry; + if (toolbar == null) return; + try { + overlayEntry = Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: pangeaMessageEvent.ownMessage + ? CrossAxisAlignment.end + : CrossAxisAlignment.start, + children: [ + toolbarUp ? toolbar! : overlayMessage, + const SizedBox(height: 6), + toolbarUp ? overlayMessage : toolbar!, + ], ); + } catch (err) { + debugger(when: kDebugMode); + ErrorHandler.logError(e: err, s: StackTrace.current); + return; + } - if (MatrixState.pAnyState.entries.isNotEmpty) { - overlayId = MatrixState.pAnyState.entries.last.hashCode.toString(); - } + OverlayUtil.showOverlay( + context: context, + child: overlayEntry, + transformTargetId: targetId, + targetAnchor: pangeaMessageEvent.ownMessage + ? toolbarUp + ? Alignment.bottomRight + : Alignment.topRight + : toolbarUp + ? Alignment.bottomLeft + : Alignment.topLeft, + followerAnchor: pangeaMessageEvent.ownMessage + ? toolbarUp + ? Alignment.bottomRight + : Alignment.topRight + : toolbarUp + ? Alignment.bottomLeft + : Alignment.topLeft, + backgroundColor: const Color.fromRGBO(0, 0, 0, 1).withAlpha(100), + ); - if (mode != null) { - Future.delayed( - const Duration(milliseconds: 100), - () => toolbarModeStream.add(mode), - ); - } - }); + if (MatrixState.pAnyState.entries.isNotEmpty) { + overlayId = MatrixState.pAnyState.entries.last.hashCode.toString(); + } + + if (mode != null) { + Future.delayed( + const Duration(milliseconds: 100), + () => toolbarModeStream.add(mode), + ); + } + // }); } bool get highlighted { From ccca876bb07392d6ce36dda395337e12b7c22020 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Fri, 28 Jun 2024 12:34:07 -0400 Subject: [PATCH 45/54] move _instructionsShown up to be the first check in instructions show function --- lib/pangea/utils/instructions.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/pangea/utils/instructions.dart b/lib/pangea/utils/instructions.dart index d3a2b0ba0..ff0fea8f6 100644 --- a/lib/pangea/utils/instructions.dart +++ b/lib/pangea/utils/instructions.dart @@ -41,6 +41,11 @@ class InstructionsController { String transformTargetKey, [ bool showToggle = true, ]) async { + if (_instructionsShown[key] ?? false) { + return; + } + _instructionsShown[key] = true; + if (wereInstructionsTurnedOff(key)) { return; } @@ -51,9 +56,6 @@ class InstructionsController { ); return; } - if (_instructionsShown[key] ?? false) { - return; - } final bool userLangsSet = await _pangeaController.userController.areUserLanguagesSet; @@ -61,8 +63,6 @@ class InstructionsController { return; } - _instructionsShown[key] = true; - final botStyle = BotStyle.text(context); Future.delayed( const Duration(seconds: 1), From 5c8666b3e27b3391353f7781493868eeaae85501 Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Fri, 28 Jun 2024 15:30:57 -0400 Subject: [PATCH 46/54] rough draft complete --- .../message_analytics_controller.dart | 12 +- .../controllers/my_analytics_controller.dart | 208 +++++++----------- ...actice_activity_generation_controller.dart | 2 +- lib/pangea/enum/construct_type_enum.dart | 16 +- lib/pangea/enum/construct_use_type_enum.dart | 93 ++++++++ .../events_extension.dart | 26 --- .../pangea_message_event.dart | 151 ++++++++++++- .../practice_acitivity_record_event.dart | 24 -- .../practice_activity_event.dart | 4 +- .../practice_activity_record_event.dart | 89 ++++++++ .../models/analytics/analytics_model.dart | 6 +- .../models/analytics/constructs_model.dart | 127 +---------- lib/pangea/models/choreo_record.dart | 134 ----------- lib/pangea/models/headwords.dart | 24 +- .../practice_activity_model.dart | 4 +- .../practice_activity_record_model.dart | 21 +- .../pages/analytics/base_analytics_view.dart | 2 +- .../pages/analytics/construct_list.dart | 4 +- .../practice_activity_content.dart | 11 +- 19 files changed, 484 insertions(+), 474 deletions(-) create mode 100644 lib/pangea/enum/construct_use_type_enum.dart delete mode 100644 lib/pangea/matrix_event_wrappers/practice_acitivity_record_event.dart create mode 100644 lib/pangea/matrix_event_wrappers/practice_activity_record_event.dart diff --git a/lib/pangea/controllers/message_analytics_controller.dart b/lib/pangea/controllers/message_analytics_controller.dart index 1475c0e6e..3739b2596 100644 --- a/lib/pangea/controllers/message_analytics_controller.dart +++ b/lib/pangea/controllers/message_analytics_controller.dart @@ -641,7 +641,7 @@ class AnalyticsController extends BaseController { List? getConstructsLocal({ required TimeSpan timeSpan, - required ConstructType constructType, + required ConstructTypeEnum constructType, required AnalyticsSelected defaultSelected, AnalyticsSelected? selected, DateTime? lastUpdated, @@ -669,7 +669,7 @@ class AnalyticsController extends BaseController { } void cacheConstructs({ - required ConstructType constructType, + required ConstructTypeEnum constructType, required List events, required AnalyticsSelected defaultSelected, AnalyticsSelected? selected, @@ -687,7 +687,7 @@ class AnalyticsController extends BaseController { Future> getMyConstructs({ required AnalyticsSelected defaultSelected, - required ConstructType constructType, + required ConstructTypeEnum constructType, AnalyticsSelected? selected, }) async { final List unfilteredConstructs = @@ -706,7 +706,7 @@ class AnalyticsController extends BaseController { } Future> getSpaceConstructs({ - required ConstructType constructType, + required ConstructTypeEnum constructType, required Room space, required AnalyticsSelected defaultSelected, AnalyticsSelected? selected, @@ -768,7 +768,7 @@ class AnalyticsController extends BaseController { } Future?> getConstructs({ - required ConstructType constructType, + required ConstructTypeEnum constructType, required AnalyticsSelected defaultSelected, AnalyticsSelected? selected, bool removeIT = true, @@ -898,7 +898,7 @@ abstract class CacheEntry { } class ConstructCacheEntry extends CacheEntry { - final ConstructType type; + final ConstructTypeEnum type; final List events; ConstructCacheEntry({ diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index 82b7af3c7..ef6baad1e 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -1,17 +1,13 @@ import 'dart:async'; import 'dart:developer'; -<<<<<<< Updated upstream -import 'package:fluffychat/pangea/constants/language_constants.dart'; -======= ->>>>>>> Stashed changes import 'package:fluffychat/pangea/constants/local.key.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_record_event.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_model.dart'; -import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:matrix/matrix.dart'; @@ -196,9 +192,8 @@ class MyAnalyticsController { String? get userL2 => _pangeaController.languageController.activeL2Code(); - // top level analytics sending function. Send analytics - // for each type of analytics event - // to each of the applicable analytics rooms + /// top level analytics sending function. Gather recent messages and activity records, + /// convert them into the correct formats, and send them to the analytics room Future _updateAnalytics() async { // if missing important info, don't send analytics if (userL2 == null || _client.userID == null) { @@ -206,151 +201,108 @@ class MyAnalyticsController { return; } - // get the last updated time for each analytics room - // and the least recent update, which will be used to determine - // how far to go back in the chat history to get messages - final Map lastUpdatedMap = await _pangeaController - .matrixState.client - .allAnalyticsRoomsLastUpdated(); - final List lastUpdates = lastUpdatedMap.values - .where((lastUpdate) => lastUpdate != null) - .cast() - .toList(); - - /// Get the last time that analytics to for current target language - /// were updated. This my present a problem is the user has analytics - /// rooms for multiple languages, and a non-target language was updated - /// less recently than the target language. In this case, some data may - /// be missing, but a case like that seems relatively rare, and could - /// result in unnecessaily going too far back in the chat history - DateTime? l2AnalyticsLastUpdated = lastUpdatedMap[userL2]; - if (l2AnalyticsLastUpdated == null) { - /// if the target language has never been updated, use the least - /// recent update time - lastUpdates.sort((a, b) => a.compareTo(b)); - l2AnalyticsLastUpdated = - lastUpdates.isNotEmpty ? lastUpdates.first : null; - } - - final List chats = await _client.chatsImAStudentIn; - - final List recentMsgs = - await _getMessagesWithUnsavedAnalytics( - l2AnalyticsLastUpdated, - chats, - ); - - final List recentActivities = - await getRecentActivities(userL2!, l2AnalyticsLastUpdated, chats); - - // FOR DISCUSSION: - // we want to make sure we save something for every message send - // however, we're currently saving analytics for messages not in the userL2 - // based on bad language detection results. maybe it would be better to - // save the analytics for these messages in the userL2 analytics room, but - // with useType of unknown - + // analytics room for the user and current target language final Room analyticsRoom = await _client.getMyAnalyticsRoom(userL2!); - // if there is no analytics room for this langCode, then user hadn't sent - // message in this language at the time of the last analytics update - // so fallback to the least recent update time - final DateTime? lastUpdated = - lastUpdatedMap[analyticsRoom.id] ?? l2AnalyticsLastUpdated; - - // final String msgLangCode = (msg.originalSent?.langCode != null && - // msg.originalSent?.langCode != LanguageKeys.unknownLanguage) - // ? msg.originalSent!.langCode - // : userL2; - - // finally, send the analytics events to the analytics room - await _sendAnalyticsEvents( - analyticsRoom, - recentMsgs, - lastUpdated, - recentActivities, + // get the last time analytics were updated for this room + final DateTime? l2AnalyticsLastUpdated = + await analyticsRoom.analyticsLastUpdated( + PangeaEventTypes.summaryAnalytics, + _client.userID!, ); - } - Future> getRecentActivities( - String userL2, - DateTime? lastUpdated, - List chats, - ) async { + // all chats in which user is a student + final List chats = await _client.chatsImAStudentIn; + + // get the recent message events and activity records for each chat + final List>> recentMsgFutures = []; final List>> recentActivityFutures = []; for (final Room chat in chats) { + chat.getEventsBySender( + type: EventTypes.Message, + sender: _client.userID!, + since: l2AnalyticsLastUpdated, + ); recentActivityFutures.add( chat.getEventsBySender( type: PangeaEventTypes.activityRecord, sender: _client.userID!, - since: lastUpdated, + since: l2AnalyticsLastUpdated, ), ); } - final List> recentActivityLists = - await Future.wait(recentActivityFutures); + final List> recentMsgs = + (await Future.wait(recentMsgFutures)).toList(); + final List recentActivityReconds = + (await Future.wait(recentActivityFutures)) + .expand((e) => e) + .map((event) => PracticeActivityRecordEvent(event: event)) + .toList(); - return recentActivityLists - .expand((e) => e) - .map((e) => ActivityRecordResponse.fromJson(e.content)) - .toList(); - } + // get the timelines for each chat + final List> timelineFutures = []; + for (final chat in chats) { + timelineFutures.add(chat.getTimeline()); + } + final List timelines = await Future.wait(timelineFutures); + final Map timelineMap = + Map.fromIterables(chats.map((e) => e.id), timelines); - /// Returns the new messages that have not yet been saved to analytics. - /// The keys in the map correspond to different categories or groups of messages, - /// while the values are lists of [PangeaMessageEvent] objects belonging to each category. - Future> _getMessagesWithUnsavedAnalytics( - DateTime? since, - List chats, - ) async { - // get the recent messages for each chat - final List>> futures = []; - for (final Room chat in chats) { - futures.add( - chat.myMessageEventsInChat( - since: since, - ), + //convert into PangeaMessageEvents + final List> recentPangeaMessageEvents = []; + for (final (index, eventList) in recentMsgs.indexed) { + recentPangeaMessageEvents.add( + eventList + .map( + (event) => PangeaMessageEvent( + event: event, + timeline: timelines[index], + ownMessage: true, + ), + ) + .toList(), ); } - final List> recentMsgLists = - await Future.wait(futures); - // flatten the list of lists of messages - return recentMsgLists.expand((e) => e).toList(); - } + final List allRecentMessages = + recentPangeaMessageEvents.expand((e) => e).toList(); - Future _sendAnalyticsEvents( - Room analyticsRoom, - List recentMsgs, - DateTime? lastUpdated, - List recentActivities, - ) async { + final List summaryContent = + SummaryAnalyticsModel.formatSummaryContent(allRecentMessages); + // if there's new content to be sent, or if lastUpdated hasn't been + // set yet for this room, send the analytics events + if (summaryContent.isNotEmpty || l2AnalyticsLastUpdated == null) { + await analyticsRoom.sendSummaryAnalyticsEvent( + summaryContent, + ); + } + + // get constructs for messages final List constructContent = []; + for (final PangeaMessageEvent message in allRecentMessages) { + constructContent.addAll(message.allConstructUses); + } - if (recentMsgs.isNotEmpty) { - // remove messages that were sent before the last update - - // format the analytics data - final List summaryContent = - SummaryAnalyticsModel.formatSummaryContent(recentMsgs); - // if there's new content to be sent, or if lastUpdated hasn't been - // set yet for this room, send the analytics events - if (summaryContent.isNotEmpty || lastUpdated == null) { - await analyticsRoom.sendSummaryAnalyticsEvent( - summaryContent, + // get constructs for practice activities + final List>> constructFutures = []; + for (final PracticeActivityRecordEvent activity in recentActivityReconds) { + final Timeline? timeline = timelineMap[activity.event.roomId!]; + if (timeline == null) { + debugger(when: kDebugMode); + ErrorHandler.logError( + m: "PracticeActivityRecordEvent has null timeline", + data: activity.event.toJson(), ); + continue; } - - constructContent - .addAll(ConstructAnalyticsModel.formatConstructsContent(recentMsgs)); + constructFutures.add(activity.uses(timeline)); } + final List> constructLists = + await Future.wait(constructFutures); - if (recentActivities.isNotEmpty) { - // TODO - Concert recentActivities into list of constructUse objects. - // First, We need to get related practiceActivityEvent from timeline in order to get its related constructs. Alternatively we - // could search for completed practice activities and see which have been completed by the user. - // It's not clear which is the best approach at the moment and we should consider both. - } + constructContent.addAll(constructLists.expand((e) => e)); + + debugger(when: kDebugMode); await analyticsRoom.sendConstructsEvent( constructContent, diff --git a/lib/pangea/controllers/practice_activity_generation_controller.dart b/lib/pangea/controllers/practice_activity_generation_controller.dart index 29047d0c4..8ecdc8740 100644 --- a/lib/pangea/controllers/practice_activity_generation_controller.dart +++ b/lib/pangea/controllers/practice_activity_generation_controller.dart @@ -88,7 +88,7 @@ class PracticeGenerationController { PracticeActivityModel dummyModel(PangeaMessageEvent event) => PracticeActivityModel( tgtConstructs: [ - ConstructIdentifier(lemma: "be", type: ConstructType.vocab), + ConstructIdentifier(lemma: "be", type: ConstructTypeEnum.vocab), ], activityType: ActivityTypeEnum.multipleChoice, langCode: event.messageDisplayLangCode, diff --git a/lib/pangea/enum/construct_type_enum.dart b/lib/pangea/enum/construct_type_enum.dart index 2a7d5583d..7db7f9cd5 100644 --- a/lib/pangea/enum/construct_type_enum.dart +++ b/lib/pangea/enum/construct_type_enum.dart @@ -1,30 +1,30 @@ -enum ConstructType { +enum ConstructTypeEnum { grammar, vocab, } -extension ConstructExtension on ConstructType { +extension ConstructExtension on ConstructTypeEnum { String get string { switch (this) { - case ConstructType.grammar: + case ConstructTypeEnum.grammar: return 'grammar'; - case ConstructType.vocab: + case ConstructTypeEnum.vocab: return 'vocab'; } } } class ConstructTypeUtil { - static ConstructType fromString(String? string) { + static ConstructTypeEnum fromString(String? string) { switch (string) { case 'g': case 'grammar': - return ConstructType.grammar; + return ConstructTypeEnum.grammar; case 'v': case 'vocab': - return ConstructType.vocab; + return ConstructTypeEnum.vocab; default: - return ConstructType.vocab; + return ConstructTypeEnum.vocab; } } } diff --git a/lib/pangea/enum/construct_use_type_enum.dart b/lib/pangea/enum/construct_use_type_enum.dart new file mode 100644 index 000000000..0e3c52bbb --- /dev/null +++ b/lib/pangea/enum/construct_use_type_enum.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; + +enum ConstructUseTypeEnum { + /// produced in chat by user, igc was run, and we've judged it to be a correct use + wa, + + /// produced in chat by user, igc was run, and we've judged it to be a incorrect use + /// Note: if the IGC match is ignored, this is not counted as an incorrect use + ga, + + /// produced in chat by user and igc was not run + unk, + + /// selected correctly in IT flow + corIt, + + /// encountered as IT distractor and correctly ignored it + ignIt, + + /// encountered as it distractor and selected it + incIt, + + /// encountered in igc match and ignored match + ignIGC, + + /// selected correctly in IGC flow + corIGC, + + /// encountered as distractor in IGC flow and selected it + incIGC, + + /// selected correctly in practice activity flow + corPA, + + /// was target construct in practice activity but user did not select correctly + incPA, +} + +extension ConstructUseTypeExtension on ConstructUseTypeEnum { + String get string { + switch (this) { + case ConstructUseTypeEnum.ga: + return 'ga'; + case ConstructUseTypeEnum.wa: + return 'wa'; + case ConstructUseTypeEnum.corIt: + return 'corIt'; + case ConstructUseTypeEnum.incIt: + return 'incIt'; + case ConstructUseTypeEnum.ignIt: + return 'ignIt'; + case ConstructUseTypeEnum.ignIGC: + return 'ignIGC'; + case ConstructUseTypeEnum.corIGC: + return 'corIGC'; + case ConstructUseTypeEnum.incIGC: + return 'incIGC'; + case ConstructUseTypeEnum.unk: + return 'unk'; + case ConstructUseTypeEnum.corPA: + return 'corPA'; + case ConstructUseTypeEnum.incPA: + return 'incPA'; + } + } + + IconData get icon { + switch (this) { + case ConstructUseTypeEnum.ga: + return Icons.check; + case ConstructUseTypeEnum.wa: + return Icons.thumb_up_sharp; + case ConstructUseTypeEnum.corIt: + return Icons.check; + case ConstructUseTypeEnum.incIt: + return Icons.close; + case ConstructUseTypeEnum.ignIt: + return Icons.close; + case ConstructUseTypeEnum.ignIGC: + return Icons.close; + case ConstructUseTypeEnum.corIGC: + return Icons.check; + case ConstructUseTypeEnum.incIGC: + return Icons.close; + case ConstructUseTypeEnum.corPA: + return Icons.check; + case ConstructUseTypeEnum.incPA: + return Icons.close; + case ConstructUseTypeEnum.unk: + return Icons.help; + } + } +} diff --git a/lib/pangea/extensions/pangea_room_extension/events_extension.dart b/lib/pangea/extensions/pangea_room_extension/events_extension.dart index 6cdde1ce2..0f40da5c7 100644 --- a/lib/pangea/extensions/pangea_room_extension/events_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/events_extension.dart @@ -426,32 +426,6 @@ extension EventsRoomExtension on Room { // } // } - Future> myMessageEventsInChat({ - DateTime? since, - }) async { - try { - final List msgEvents = await getEventsBySender( - type: EventTypes.Message, - sender: client.userID!, - since: since, - ); - final Timeline timeline = await getTimeline(); - return msgEvents - .where((event) => (event.content['msgtype'] == MessageTypes.Text)) - .map((event) { - return PangeaMessageEvent( - event: event, - timeline: timeline, - ownMessage: true, - ); - }).toList(); - } catch (err, s) { - debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: s); - return []; - } - } - // fetch event of a certain type by a certain sender // since a certain time or up to a certain amount Future> getEventsBySender({ diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index 4ead9982c..080b07617 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -2,14 +2,20 @@ import 'dart:convert'; import 'dart:developer'; import 'package:collection/collection.dart'; +import 'package:fluffychat/pangea/constants/choreo_constants.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/controllers/text_to_speech_controller.dart'; import 'package:fluffychat/pangea/enum/audio_encoding_enum.dart'; +import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; +import 'package:fluffychat/pangea/enum/construct_use_type_enum.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_representation_event.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; +import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; import 'package:fluffychat/pangea/models/choreo_record.dart'; +import 'package:fluffychat/pangea/models/lemma.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart'; +import 'package:fluffychat/pangea/models/pangea_token_model.dart'; import 'package:fluffychat/pangea/models/representation_content_model.dart'; import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/models/speech_to_text_models.dart'; @@ -658,14 +664,145 @@ class PangeaMessageEvent { } } - // List get activities => - //each match is turned into an activity that other students can access - //they're not told the answer but have to find it themselves - //the message has a blank piece which they fill in themselves + List get allConstructUses => + [...grammarConstructUses, ..._vocabUses]; - // replication of logic from message_content.dart - // bool get isHtml => - // AppConfig.renderHtml && !_event.redacted && _event.isRichMessage; + /// [tokens] is the final list of tokens that were sent + /// if no ga or ta, + /// make wa use for each and return + /// else + /// for each saveable vocab in the final message + /// if vocab is contained in an accepted replacement, make ga use + /// if vocab is contained in ta choice, + /// if selected as choice, corIt + /// if written as customInput, corIt? (account for score in this) + /// for each it step + /// for each continuance + /// if not within the final message, save ignIT/incIT + List get _vocabUses { + final List uses = []; + + if (event.roomId == null) return uses; + + List lemmasToVocabUses( + List lemmas, + ConstructUseTypeEnum type, + ) { + final List uses = []; + for (final lemma in lemmas) { + if (lemma.saveVocab) { + uses.add( + OneConstructUse( + useType: type, + chatId: event.roomId!, + timeStamp: event.originServerTs, + lemma: lemma.text, + form: lemma.form, + msgId: event.eventId, + constructType: ConstructTypeEnum.vocab, + ), + ); + } + } + return uses; + } + + List getVocabUseForToken(PangeaToken token) { + if (originalSent?.choreo == null) { + final bool inUserL2 = originalSent?.langCode == l2Code; + return lemmasToVocabUses( + token.lemmas, + inUserL2 ? ConstructUseTypeEnum.wa : ConstructUseTypeEnum.unk, + ); + } + + for (final step in originalSent!.choreo!.choreoSteps) { + /// if 1) accepted match 2) token is in the replacement and 3) replacement + /// is in the overall step text, then token was a ga + if (step.acceptedOrIgnoredMatch?.status == PangeaMatchStatus.accepted && + (step.acceptedOrIgnoredMatch!.match.choices?.any( + (r) => + r.value.contains(token.text.content) && + step.text.contains(r.value), + ) ?? + false)) { + return lemmasToVocabUses(token.lemmas, ConstructUseTypeEnum.ga); + } + if (step.itStep != null) { + final bool pickedThroughIT = step.itStep!.chosenContinuance?.text + .contains(token.text.content) ?? + false; + if (pickedThroughIT) { + return lemmasToVocabUses(token.lemmas, ConstructUseTypeEnum.corIt); + //PTODO - check if added via custom input in IT flow + } + } + } + return lemmasToVocabUses(token.lemmas, ConstructUseTypeEnum.wa); + } + + /// for each token, record whether selected in ga, ta, or wa + if (originalSent?.tokens != null) { + for (final token in originalSent!.tokens!) { + uses.addAll(getVocabUseForToken(token)); + } + } + + if (originalSent?.choreo == null) return uses; + + for (final itStep in originalSent!.choreo!.itSteps) { + for (final continuance in itStep.continuances) { + // this seems to always be false for continuances right now + + if (originalSent!.choreo!.finalMessage.contains(continuance.text)) { + continue; + } + if (continuance.wasClicked) { + //PTODO - account for end of flow score + if (continuance.level != ChoreoConstants.levelThresholdForGreen) { + uses.addAll( + lemmasToVocabUses(continuance.lemmas, ConstructUseTypeEnum.incIt), + ); + } + } else { + if (continuance.level != ChoreoConstants.levelThresholdForGreen) { + uses.addAll( + lemmasToVocabUses(continuance.lemmas, ConstructUseTypeEnum.ignIt), + ); + } + } + } + } + + return uses; + } + + List get grammarConstructUses { + final List uses = []; + + if (originalSent?.choreo == null || event.roomId == null) return uses; + + for (final step in originalSent!.choreo!.choreoSteps) { + if (step.acceptedOrIgnoredMatch?.status == PangeaMatchStatus.accepted) { + final String name = step.acceptedOrIgnoredMatch!.match.rule?.id ?? + step.acceptedOrIgnoredMatch!.match.shortMessage ?? + step.acceptedOrIgnoredMatch!.match.type.typeName.name; + uses.add( + OneConstructUse( + useType: ConstructUseTypeEnum.ga, + chatId: event.roomId!, + timeStamp: event.originServerTs, + lemma: name, + form: name, + msgId: event.eventId, + constructType: ConstructTypeEnum.grammar, + id: "${event.eventId}_${step.acceptedOrIgnoredMatch!.match.offset}_${step.acceptedOrIgnoredMatch!.match.length}", + ), + ); + } + } + return uses; + } } class URLFinder { diff --git a/lib/pangea/matrix_event_wrappers/practice_acitivity_record_event.dart b/lib/pangea/matrix_event_wrappers/practice_acitivity_record_event.dart deleted file mode 100644 index d4b9cde23..000000000 --- a/lib/pangea/matrix_event_wrappers/practice_acitivity_record_event.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:fluffychat/pangea/extensions/pangea_event_extension.dart'; -import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; -import 'package:matrix/matrix.dart'; - -import '../constants/pangea_event_types.dart'; - -class PracticeActivityRecordEvent { - Event event; - - PracticeActivityRecordModel? _content; - - PracticeActivityRecordEvent({required this.event}) { - if (event.type != PangeaEventTypes.activityRecord) { - throw Exception( - "${event.type} should not be used to make a PracticeActivityRecordEvent", - ); - } - } - - PracticeActivityRecordModel? get record { - _content ??= event.getPangeaContent(); - return _content!; - } -} diff --git a/lib/pangea/matrix_event_wrappers/practice_activity_event.dart b/lib/pangea/matrix_event_wrappers/practice_activity_event.dart index c5f35be91..9d7b17ccc 100644 --- a/lib/pangea/matrix_event_wrappers/practice_activity_event.dart +++ b/lib/pangea/matrix_event_wrappers/practice_activity_event.dart @@ -1,7 +1,7 @@ import 'dart:developer'; import 'package:fluffychat/pangea/extensions/pangea_event_extension.dart'; -import 'package:fluffychat/pangea/matrix_event_wrappers/practice_acitivity_record_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_record_event.dart'; import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_model.dart'; import 'package:flutter/foundation.dart'; import 'package:matrix/matrix.dart'; @@ -61,6 +61,8 @@ class PracticeActivityEvent { ) .toList(); + String get parentMessageId => event.relationshipEventId!; + /// Checks if there are any user records in the list for this activity, /// and, if so, then the activity is complete bool get isComplete => userRecords.isNotEmpty; diff --git a/lib/pangea/matrix_event_wrappers/practice_activity_record_event.dart b/lib/pangea/matrix_event_wrappers/practice_activity_record_event.dart new file mode 100644 index 000000000..77b4948fd --- /dev/null +++ b/lib/pangea/matrix_event_wrappers/practice_activity_record_event.dart @@ -0,0 +1,89 @@ +import 'dart:developer'; + +import 'package:fluffychat/pangea/extensions/pangea_event_extension.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; +import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; +import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_model.dart'; +import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; +import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:flutter/foundation.dart'; +import 'package:matrix/matrix.dart'; + +import '../constants/pangea_event_types.dart'; + +class PracticeActivityRecordEvent { + Event event; + + PracticeActivityRecordModel? _content; + + PracticeActivityRecordEvent({required this.event}) { + if (event.type != PangeaEventTypes.activityRecord) { + throw Exception( + "${event.type} should not be used to make a PracticeActivityRecordEvent", + ); + } + } + + PracticeActivityRecordModel get record { + _content ??= event.getPangeaContent(); + return _content!; + } + + Future> uses(Timeline timeline) async { + try { + final String? parent = event.relationshipEventId; + if (parent == null) { + debugger(when: kDebugMode); + ErrorHandler.logError( + m: "PracticeActivityRecordEvent has null event.relationshipEventId", + data: event.toJson(), + ); + return []; + } + + final Event? practiceEvent = + await timeline.getEventById(event.relationshipEventId!); + + if (practiceEvent == null) { + debugger(when: kDebugMode); + ErrorHandler.logError( + m: "PracticeActivityRecordEvent has null practiceActivityEvent with id $parent", + data: event.toJson(), + ); + return []; + } + + final PracticeActivityEvent practiceActivity = PracticeActivityEvent( + event: practiceEvent, + timeline: timeline, + ); + + final List uses = []; + + final List constructIds = + practiceActivity.practiceActivity.tgtConstructs; + + for (final construct in constructIds) { + uses.add( + OneConstructUse( + lemma: construct.lemma, + constructType: construct.type, + useType: record.useType, + //TODO - find form of construct within the message + //this is related to the feature of highlighting the target construct in the message + form: construct.lemma, + chatId: event.roomId ?? practiceEvent.roomId ?? timeline.room.id, + msgId: practiceActivity.parentMessageId, + timeStamp: event.originServerTs, + ), + ); + } + + return uses; + } catch (e, s) { + debugger(when: kDebugMode); + ErrorHandler.logError(e: e, s: s, data: event.toJson()); + rethrow; + } + } +} diff --git a/lib/pangea/models/analytics/analytics_model.dart b/lib/pangea/models/analytics/analytics_model.dart index bdb3bc6d5..d8732ad97 100644 --- a/lib/pangea/models/analytics/analytics_model.dart +++ b/lib/pangea/models/analytics/analytics_model.dart @@ -12,7 +12,11 @@ abstract class AnalyticsModel { case PangeaEventTypes.summaryAnalytics: return SummaryAnalyticsModel.formatSummaryContent(recentMsgs); case PangeaEventTypes.construct: - return ConstructAnalyticsModel.formatConstructsContent(recentMsgs); + final List uses = []; + for (final msg in recentMsgs) { + uses.addAll(msg.allConstructUses); + } + return uses; } return []; } diff --git a/lib/pangea/models/analytics/constructs_model.dart b/lib/pangea/models/analytics/constructs_model.dart index 18c6d3d5a..54e81789f 100644 --- a/lib/pangea/models/analytics/constructs_model.dart +++ b/lib/pangea/models/analytics/constructs_model.dart @@ -1,11 +1,9 @@ import 'dart:developer'; -import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; +import 'package:fluffychat/pangea/enum/construct_use_type_enum.dart'; import 'package:fluffychat/pangea/models/analytics/analytics_model.dart'; -import 'package:fluffychat/pangea/models/pangea_token_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import '../../enum/construct_type_enum.dart'; @@ -24,7 +22,7 @@ class ConstructAnalyticsModel extends AnalyticsModel { if (json[_usesKey] is List) { // This is the new format uses.addAll( - json[_usesKey] + (json[_usesKey] as List) .map((use) => OneConstructUse.fromJson(use)) .cast() .toList(), @@ -39,13 +37,13 @@ class ConstructAnalyticsModel extends AnalyticsModel { final lemmaUses = useValue[_usesKey]; for (final useData in lemmaUses) { final use = OneConstructUse( - useType: ConstructUseType.ga, + useType: ConstructUseTypeEnum.ga, chatId: useData["chatId"], timeStamp: DateTime.parse(useData["timeStamp"]), lemma: lemma, form: useData["form"], msgId: useData["msgId"], - constructType: ConstructType.grammar, + constructType: ConstructTypeEnum.grammar, ); uses.add(use); } @@ -70,122 +68,13 @@ class ConstructAnalyticsModel extends AnalyticsModel { _usesKey: uses.map((use) => use.toJson()).toList(), }; } - - static List formatConstructsContent( - List recentMsgs, - ) { - final List filtered = List.from(recentMsgs); - final List uses = []; - - for (final msg in filtered) { - if (msg.originalSent?.choreo == null) continue; - uses.addAll( - msg.originalSent!.choreo!.toGrammarConstructUse( - msg.eventId, - msg.room.id, - msg.originServerTs, - ), - ); - - final List? tokens = msg.originalSent?.tokens; - if (tokens == null) continue; - uses.addAll( - msg.originalSent!.choreo!.toVocabUse( - tokens, - msg.room.id, - msg.eventId, - msg.originServerTs, - ), - ); - } - - return uses; - } -} - -enum ConstructUseType { - /// produced in chat by user, igc was run, and we've judged it to be a correct use - wa, - - /// produced in chat by user, igc was run, and we've judged it to be a incorrect use - /// Note: if the IGC match is ignored, this is not counted as an incorrect use - ga, - - /// produced in chat by user and igc was not run - unk, - - /// selected correctly in IT flow - corIt, - - /// encountered as IT distractor and correctly ignored it - ignIt, - - /// encountered as it distractor and selected it - incIt, - - /// encountered in igc match and ignored match - ignIGC, - - /// selected correctly in IGC flow - corIGC, - - /// encountered as distractor in IGC flow and selected it - incIGC, -} - -extension on ConstructUseType { - String get string { - switch (this) { - case ConstructUseType.ga: - return 'ga'; - case ConstructUseType.wa: - return 'wa'; - case ConstructUseType.corIt: - return 'corIt'; - case ConstructUseType.incIt: - return 'incIt'; - case ConstructUseType.ignIt: - return 'ignIt'; - case ConstructUseType.ignIGC: - return 'ignIGC'; - case ConstructUseType.corIGC: - return 'corIGC'; - case ConstructUseType.incIGC: - return 'incIGC'; - case ConstructUseType.unk: - return 'unk'; - } - } - - IconData get icon { - switch (this) { - case ConstructUseType.ga: - return Icons.check; - case ConstructUseType.wa: - return Icons.thumb_up_sharp; - case ConstructUseType.corIt: - return Icons.check; - case ConstructUseType.incIt: - return Icons.close; - case ConstructUseType.ignIt: - return Icons.close; - case ConstructUseType.ignIGC: - return Icons.close; - case ConstructUseType.corIGC: - return Icons.check; - case ConstructUseType.incIGC: - return Icons.close; - case ConstructUseType.unk: - return Icons.help; - } - } } class OneConstructUse { String? lemma; - ConstructType? constructType; + ConstructTypeEnum? constructType; String? form; - ConstructUseType useType; + ConstructUseTypeEnum useType; String chatId; String? msgId; DateTime timeStamp; @@ -204,7 +93,7 @@ class OneConstructUse { factory OneConstructUse.fromJson(Map json) { return OneConstructUse( - useType: ConstructUseType.values + useType: ConstructUseTypeEnum.values .firstWhere((e) => e.string == json['useType']), chatId: json['chatId'], timeStamp: DateTime.parse(json['timeStamp']), @@ -248,7 +137,7 @@ class OneConstructUse { class ConstructUses { final List uses; - final ConstructType constructType; + final ConstructTypeEnum constructType; final String lemma; ConstructUses({ diff --git a/lib/pangea/models/choreo_record.dart b/lib/pangea/models/choreo_record.dart index 413f00716..3586fcee1 100644 --- a/lib/pangea/models/choreo_record.dart +++ b/lib/pangea/models/choreo_record.dart @@ -1,13 +1,8 @@ import 'dart:convert'; -import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart'; -import 'package:fluffychat/pangea/models/pangea_token_model.dart'; -import '../constants/choreo_constants.dart'; -import '../enum/construct_type_enum.dart'; import 'it_step.dart'; -import 'lemma.dart'; /// this class lives within a [PangeaIGCEvent] /// it always has a [RepresentationEvent] parent @@ -111,135 +106,6 @@ class ChoreoRecord { openMatches: [], ); - /// [tokens] is the final list of tokens that were sent - /// if no ga or ta, - /// make wa use for each and return - /// else - /// for each saveable vocab in the final message - /// if vocab is contained in an accepted replacement, make ga use - /// if vocab is contained in ta choice, - /// if selected as choice, corIt - /// if written as customInput, corIt? (account for score in this) - /// for each it step - /// for each continuance - /// if not within the final message, save ignIT/incIT - List toVocabUse( - List tokens, - String chatId, - String msgId, - DateTime timestamp, - ) { - final List uses = []; - final DateTime now = DateTime.now(); - List lemmasToVocabUses( - List lemmas, - ConstructUseType type, - ) { - final List uses = []; - for (final lemma in lemmas) { - if (lemma.saveVocab) { - uses.add( - OneConstructUse( - useType: type, - chatId: chatId, - timeStamp: timestamp, - lemma: lemma.text, - form: lemma.form, - msgId: msgId, - constructType: ConstructType.vocab, - ), - ); - } - } - return uses; - } - - List getVocabUseForToken(PangeaToken token) { - for (final step in choreoSteps) { - /// if 1) accepted match 2) token is in the replacement and 3) replacement - /// is in the overall step text, then token was a ga - if (step.acceptedOrIgnoredMatch?.status == PangeaMatchStatus.accepted && - (step.acceptedOrIgnoredMatch!.match.choices?.any( - (r) => - r.value.contains(token.text.content) && - step.text.contains(r.value), - ) ?? - false)) { - return lemmasToVocabUses(token.lemmas, ConstructUseType.ga); - } - if (step.itStep != null) { - final bool pickedThroughIT = step.itStep!.chosenContinuance?.text - .contains(token.text.content) ?? - false; - if (pickedThroughIT) { - return lemmasToVocabUses(token.lemmas, ConstructUseType.corIt); - //PTODO - check if added via custom input in IT flow - } - } - } - return lemmasToVocabUses(token.lemmas, ConstructUseType.wa); - } - - /// for each token, record whether selected in ga, ta, or wa - for (final token in tokens) { - uses.addAll(getVocabUseForToken(token)); - } - - for (final itStep in itSteps) { - for (final continuance in itStep.continuances) { - // this seems to always be false for continuances right now - - if (finalMessage.contains(continuance.text)) { - continue; - } - if (continuance.wasClicked) { - //PTODO - account for end of flow score - if (continuance.level != ChoreoConstants.levelThresholdForGreen) { - uses.addAll( - lemmasToVocabUses(continuance.lemmas, ConstructUseType.incIt), - ); - } - } else { - if (continuance.level != ChoreoConstants.levelThresholdForGreen) { - uses.addAll( - lemmasToVocabUses(continuance.lemmas, ConstructUseType.ignIt), - ); - } - } - } - } - - return uses; - } - - List toGrammarConstructUse( - String msgId, - String chatId, - DateTime timestamp, - ) { - final List uses = []; - for (final step in choreoSteps) { - if (step.acceptedOrIgnoredMatch?.status == PangeaMatchStatus.accepted) { - final String name = step.acceptedOrIgnoredMatch!.match.rule?.id ?? - step.acceptedOrIgnoredMatch!.match.shortMessage ?? - step.acceptedOrIgnoredMatch!.match.type.typeName.name; - uses.add( - OneConstructUse( - useType: ConstructUseType.ga, - chatId: chatId, - timeStamp: timestamp, - lemma: name, - form: name, - msgId: msgId, - constructType: ConstructType.grammar, - id: "${msgId}_${step.acceptedOrIgnoredMatch!.match.offset}_${step.acceptedOrIgnoredMatch!.match.length}", - ), - ); - } - } - return uses; - } - List get itSteps => choreoSteps.where((e) => e.itStep != null).map((e) => e.itStep!).toList(); diff --git a/lib/pangea/models/headwords.dart b/lib/pangea/models/headwords.dart index 497381fa1..a55eeb188 100644 --- a/lib/pangea/models/headwords.dart +++ b/lib/pangea/models/headwords.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:developer'; +import 'package:fluffychat/pangea/enum/construct_use_type_enum.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; @@ -154,32 +155,37 @@ class VocabTotals { void addVocabUseBasedOnUseType(List uses) { for (final use in uses) { switch (use.useType) { - case ConstructUseType.ga: + case ConstructUseTypeEnum.ga: ga++; break; - case ConstructUseType.wa: + case ConstructUseTypeEnum.wa: wa++; break; - case ConstructUseType.corIt: + case ConstructUseTypeEnum.corIt: corIt++; break; - case ConstructUseType.incIt: + case ConstructUseTypeEnum.incIt: incIt++; break; - case ConstructUseType.ignIt: + case ConstructUseTypeEnum.ignIt: ignIt++; break; //TODO - these shouldn't be counted as such - case ConstructUseType.ignIGC: + case ConstructUseTypeEnum.ignIGC: ignIt++; break; - case ConstructUseType.corIGC: + case ConstructUseTypeEnum.corIGC: corIt++; break; - case ConstructUseType.incIGC: + case ConstructUseTypeEnum.incIGC: incIt++; break; - case ConstructUseType.unk: + //TODO if we bring back Headwords then we need to add these + case ConstructUseTypeEnum.corPA: + break; + case ConstructUseTypeEnum.incPA: + break; + case ConstructUseTypeEnum.unk: break; } } diff --git a/lib/pangea/models/practice_activities.dart/practice_activity_model.dart b/lib/pangea/models/practice_activities.dart/practice_activity_model.dart index ae8455c7f..bd597b6a2 100644 --- a/lib/pangea/models/practice_activities.dart/practice_activity_model.dart +++ b/lib/pangea/models/practice_activities.dart/practice_activity_model.dart @@ -8,7 +8,7 @@ import 'package:flutter/foundation.dart'; class ConstructIdentifier { final String lemma; - final ConstructType type; + final ConstructTypeEnum type; ConstructIdentifier({required this.lemma, required this.type}); @@ -16,7 +16,7 @@ class ConstructIdentifier { try { return ConstructIdentifier( lemma: json['lemma'] as String, - type: ConstructType.values.firstWhere( + type: ConstructTypeEnum.values.firstWhere( (e) => e.string == json['type'], ), ); diff --git a/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart b/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart index e5c3a1c18..0c4ea52bf 100644 --- a/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart +++ b/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart @@ -5,6 +5,8 @@ import 'dart:developer'; import 'dart:typed_data'; +import 'package:fluffychat/pangea/enum/construct_use_type_enum.dart'; + class PracticeActivityRecordModel { final String? question; late List responses; @@ -42,18 +44,25 @@ class PracticeActivityRecordModel { /// get the latest response index according to the response timeStamp /// sort the responses by timestamp and get the index of the last response - String? get latestResponse { + ActivityRecordResponse? get latestResponse { if (responses.isEmpty) { return null; } responses.sort((a, b) => a.timestamp.compareTo(b.timestamp)); - return responses[responses.length - 1].text; + return responses[responses.length - 1]; } + ConstructUseTypeEnum get useType => latestResponse?.score != null + ? (latestResponse!.score > 0 + ? ConstructUseTypeEnum.corPA + : ConstructUseTypeEnum.incPA) + : ConstructUseTypeEnum.unk; + void addResponse({ String? text, Uint8List? audioBytes, Uint8List? imageBytes, + required double score, }) { try { responses.add( @@ -62,6 +71,7 @@ class PracticeActivityRecordModel { audioBytes: audioBytes, imageBytes: imageBytes, timestamp: DateTime.now(), + score: score, ), ); } catch (e) { @@ -93,11 +103,13 @@ class ActivityRecordResponse { final Uint8List? audioBytes; final Uint8List? imageBytes; final DateTime timestamp; + final double score; ActivityRecordResponse({ this.text, this.audioBytes, this.imageBytes, + required this.score, required this.timestamp, }); @@ -107,6 +119,10 @@ class ActivityRecordResponse { audioBytes: json['audio'] as Uint8List?, imageBytes: json['image'] as Uint8List?, timestamp: DateTime.parse(json['timestamp'] as String), + // this has a default of 1 to make this backwards compatible + // score was added later and is not present in all records + // currently saved to Matrix + score: json['score'] ?? 1.0, ); } @@ -116,6 +132,7 @@ class ActivityRecordResponse { 'audio': audioBytes, 'image': imageBytes, 'timestamp': timestamp.toIso8601String(), + 'score': score, }; } diff --git a/lib/pangea/pages/analytics/base_analytics_view.dart b/lib/pangea/pages/analytics/base_analytics_view.dart index 3d70c9b4c..cca0c7f4e 100644 --- a/lib/pangea/pages/analytics/base_analytics_view.dart +++ b/lib/pangea/pages/analytics/base_analytics_view.dart @@ -35,7 +35,7 @@ class BaseAnalyticsView extends StatelessWidget { ); case BarChartViewSelection.grammar: return ConstructList( - constructType: ConstructType.grammar, + constructType: ConstructTypeEnum.grammar, defaultSelected: controller.widget.defaultSelected, selected: controller.selected, controller: controller, diff --git a/lib/pangea/pages/analytics/construct_list.dart b/lib/pangea/pages/analytics/construct_list.dart index 8651b7a74..d46936c86 100644 --- a/lib/pangea/pages/analytics/construct_list.dart +++ b/lib/pangea/pages/analytics/construct_list.dart @@ -19,7 +19,7 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; class ConstructList extends StatefulWidget { - final ConstructType constructType; + final ConstructTypeEnum constructType; final AnalyticsSelected defaultSelected; final AnalyticsSelected? selected; final BaseAnalyticsController controller; @@ -94,7 +94,7 @@ class ConstructListView extends StatefulWidget { } class ConstructListViewState extends State { - final ConstructType constructType = ConstructType.grammar; + final ConstructTypeEnum constructType = ConstructTypeEnum.grammar; final Map _timelinesCache = {}; final Map _msgEventCache = {}; final List _msgEvents = []; diff --git a/lib/pangea/widgets/practice_activity/practice_activity_content.dart b/lib/pangea/widgets/practice_activity/practice_activity_content.dart index 8080c27ee..af43081f3 100644 --- a/lib/pangea/widgets/practice_activity/practice_activity_content.dart +++ b/lib/pangea/widgets/practice_activity/practice_activity_content.dart @@ -2,7 +2,7 @@ import 'package:collection/collection.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; -import 'package:fluffychat/pangea/matrix_event_wrappers/practice_acitivity_record_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_record_event.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; @@ -11,6 +11,7 @@ import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_ca import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:get_storage/get_storage.dart'; class PracticeActivityContent extends StatefulWidget { final PracticeActivityEvent practiceEvent; @@ -65,9 +66,9 @@ class MessagePracticeActivityContentState recordModel = recordEvent!.record; //Note that only MultipleChoice activities will have this so we probably should move this logic to the MultipleChoiceActivity widget - selectedChoiceIndex = recordModel?.latestResponse != null + selectedChoiceIndex = recordModel?.latestResponse?.text != null ? widget.practiceEvent.practiceActivity.multipleChoice - ?.choiceIndex(recordModel!.latestResponse!) + ?.choiceIndex(recordModel!.latestResponse!.text!) : null; recordSubmittedPreviousSession = true; @@ -80,6 +81,10 @@ class MessagePracticeActivityContentState setState(() { selectedChoiceIndex = index; recordModel!.addResponse( + score: widget.practiceEvent.practiceActivity.multipleChoice! + .isCorrect(index) + ? 1 + : 0, text: widget .practiceEvent.practiceActivity.multipleChoice!.choices[index], ); From 466136ec9bd1309223f2bed3936f30e15b988c03 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Fri, 28 Jun 2024 15:51:43 -0400 Subject: [PATCH 47/54] removed needed translation file from git tracking --- needed-translations.txt | 54844 -------------------------------------- 1 file changed, 54844 deletions(-) delete mode 100644 needed-translations.txt diff --git a/needed-translations.txt b/needed-translations.txt deleted file mode 100644 index 34dd4c00f..000000000 --- a/needed-translations.txt +++ /dev/null @@ -1,54844 +0,0 @@ -{ - "ar": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "be": [ - "repeatPassword", - "notAnImage", - "remove", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "about", - "accept", - "acceptedTheInvitation", - "account", - "accountInformation", - "activatedEndToEndEncryption", - "addEmail", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "addToSpace", - "admin", - "alias", - "all", - "allChats", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "answeredTheCall", - "anyoneCanJoin", - "appLock", - "appLockDescription", - "archive", - "areGuestsAllowedToJoin", - "areYouSure", - "areYouSureYouWantToLogout", - "askSSSSSign", - "askVerificationRequest", - "autoplayImages", - "badServerLoginTypesException", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "sendOnEnter", - "badServerVersionsException", - "banFromChat", - "banned", - "bannedUser", - "blockDevice", - "blocked", - "botMessages", - "cancel", - "cantOpenUri", - "changeDeviceName", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changePassword", - "changeTheHomeserver", - "changeTheme", - "changeTheNameOfTheGroup", - "changeYourAvatar", - "channelCorruptedDecryptError", - "chat", - "yourChatBackupHasBeenSetUp", - "chatBackup", - "chatBackupDescription", - "chatDetails", - "chatHasBeenAddedToThisSpace", - "chats", - "chooseAStrongPassword", - "clearArchive", - "close", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "configureChat", - "confirm", - "connect", - "contactHasBeenInvitedToTheGroup", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copiedToClipboard", - "copy", - "copyToClipboard", - "couldNotDecryptMessage", - "countParticipants", - "create", - "createdTheChat", - "createGroup", - "createNewGroup", - "currentlyActive", - "darkTheme", - "dateAndTimeOfDay", - "dateWithoutYear", - "dateWithYear", - "deactivateAccountWarning", - "defaultPermissionLevel", - "delete", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "bn": [ - "repeatPassword", - "notAnImage", - "remove", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "activatedEndToEndEncryption", - "addEmail", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "addToSpace", - "admin", - "alias", - "all", - "allChats", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "answeredTheCall", - "anyoneCanJoin", - "appLock", - "appLockDescription", - "archive", - "areGuestsAllowedToJoin", - "areYouSure", - "areYouSureYouWantToLogout", - "askSSSSSign", - "askVerificationRequest", - "autoplayImages", - "badServerLoginTypesException", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "sendOnEnter", - "badServerVersionsException", - "banFromChat", - "banned", - "bannedUser", - "blockDevice", - "blocked", - "botMessages", - "cancel", - "cantOpenUri", - "changeDeviceName", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changePassword", - "changeTheHomeserver", - "changeTheme", - "changeTheNameOfTheGroup", - "changeYourAvatar", - "channelCorruptedDecryptError", - "chat", - "yourChatBackupHasBeenSetUp", - "chatBackup", - "chatBackupDescription", - "chatDetails", - "chatHasBeenAddedToThisSpace", - "chats", - "chooseAStrongPassword", - "clearArchive", - "close", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "configureChat", - "confirm", - "connect", - "contactHasBeenInvitedToTheGroup", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copiedToClipboard", - "copy", - "copyToClipboard", - "couldNotDecryptMessage", - "countParticipants", - "create", - "createdTheChat", - "createGroup", - "createNewGroup", - "currentlyActive", - "darkTheme", - "dateAndTimeOfDay", - "dateWithoutYear", - "dateWithYear", - "deactivateAccountWarning", - "defaultPermissionLevel", - "delete", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "bo": [ - "repeatPassword", - "notAnImage", - "remove", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "about", - "accept", - "acceptedTheInvitation", - "account", - "accountInformation", - "activatedEndToEndEncryption", - "addEmail", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "addToSpace", - "admin", - "alias", - "all", - "allChats", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "answeredTheCall", - "anyoneCanJoin", - "appLock", - "appLockDescription", - "archive", - "areGuestsAllowedToJoin", - "areYouSure", - "areYouSureYouWantToLogout", - "askSSSSSign", - "askVerificationRequest", - "autoplayImages", - "badServerLoginTypesException", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "sendOnEnter", - "badServerVersionsException", - "banFromChat", - "banned", - "bannedUser", - "blockDevice", - "blocked", - "botMessages", - "cancel", - "cantOpenUri", - "changeDeviceName", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changePassword", - "changeTheHomeserver", - "changeTheme", - "changeTheNameOfTheGroup", - "changeYourAvatar", - "channelCorruptedDecryptError", - "chat", - "yourChatBackupHasBeenSetUp", - "chatBackup", - "chatBackupDescription", - "chatDetails", - "chatHasBeenAddedToThisSpace", - "chats", - "chooseAStrongPassword", - "clearArchive", - "close", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "configureChat", - "confirm", - "connect", - "contactHasBeenInvitedToTheGroup", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copiedToClipboard", - "copy", - "copyToClipboard", - "couldNotDecryptMessage", - "countParticipants", - "create", - "createdTheChat", - "createGroup", - "createNewGroup", - "currentlyActive", - "darkTheme", - "dateAndTimeOfDay", - "dateWithoutYear", - "dateWithYear", - "deactivateAccountWarning", - "defaultPermissionLevel", - "delete", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ca": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "writeAMessageFlag", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "publicChatAddresses", - "createNewAddress", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "cs": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "presenceStyle", - "presencesToggle", - "writeAMessageFlag", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "youInvitedToBy", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "callingAccount", - "appearOnTopDetails", - "noKeyForThisMessage", - "enterSpace", - "enterRoom", - "hideUnimportantStateEvents", - "hidePresences", - "noBackupWarning", - "readUpToHere", - "reportErrorDescription", - "report", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "de": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "el": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "changeDeviceName", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changePassword", - "changeTheHomeserver", - "changeTheme", - "changeTheNameOfTheGroup", - "changeYourAvatar", - "channelCorruptedDecryptError", - "chat", - "yourChatBackupHasBeenSetUp", - "chatBackup", - "chatBackupDescription", - "chatDetails", - "chatHasBeenAddedToThisSpace", - "chats", - "chooseAStrongPassword", - "clearArchive", - "close", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "configureChat", - "confirm", - "connect", - "contactHasBeenInvitedToTheGroup", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copiedToClipboard", - "copy", - "copyToClipboard", - "couldNotDecryptMessage", - "countParticipants", - "create", - "createdTheChat", - "createGroup", - "createNewGroup", - "currentlyActive", - "darkTheme", - "dateAndTimeOfDay", - "dateWithoutYear", - "dateWithYear", - "deactivateAccountWarning", - "defaultPermissionLevel", - "delete", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "eo": [ - "repeatPassword", - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "yourChatBackupHasBeenSetUp", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "createGroup", - "createNewGroup", - "allRooms", - "chatPermissions", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "messagesStyle", - "shareInviteLink", - "scanQrCode", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "pleaseEnterRecoveryKey", - "redactedBy", - "directChat", - "redactedByBecause", - "recoveryKey", - "recoveryKeyLost", - "separateChatTypes", - "setChatDescription", - "presenceStyle", - "presencesToggle", - "startFirstChat", - "unverified", - "writeAMessageFlag", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "es": [ - "searchIn", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel" - ], - - "et": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "eu": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "fa": [ - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "createGroup", - "createNewGroup", - "chatPermissions", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "messagesStyle", - "shareInviteLink", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "redactedBy", - "directChat", - "redactedByBecause", - "setChatDescription", - "presenceStyle", - "presencesToggle", - "writeAMessageFlag", - "youInvitedToBy", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "hidePresences", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "fi": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "presenceStyle", - "presencesToggle", - "writeAMessageFlag", - "youInvitedToBy", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "hidePresences", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "fil": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "fr": [ - "exportEmotePack", - "replace", - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "chatDescription", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "messagesStyle", - "shareInviteLink", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "redactedBy", - "directChat", - "redactedByBecause", - "setChatDescription", - "presenceStyle", - "presencesToggle", - "writeAMessageFlag", - "youInvitedToBy", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "hidePresences", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ga": [ - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_discardsession", - "commandHint_dm", - "createGroup", - "createNewGroup", - "allRooms", - "chatPermissions", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "messagesStyle", - "shareInviteLink", - "oneClientLoggedOut", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "pleaseEnterRecoveryKey", - "redactedBy", - "directChat", - "redactedByBecause", - "recoveryKey", - "recoveryKeyLost", - "separateChatTypes", - "setChatDescription", - "presenceStyle", - "presencesToggle", - "startFirstChat", - "unverified", - "writeAMessageFlag", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "experimentalVideoCalls", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "gl": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "he": [ - "notAnImage", - "remove", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "commandHint_markasdm", - "commandHint_markasgroup", - "createGroup", - "createNewGroup", - "allRooms", - "chatPermissions", - "editChatPermissions", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "enableEmotesGlobally", - "enterAGroupName", - "enterASpacepName", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "messagesStyle", - "noEmotesFound", - "shareInviteLink", - "ok", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "pleaseEnterRecoveryKey", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "hi": [ - "replace", - "about", - "accept", - "acceptedTheInvitation", - "account", - "accountInformation", - "activatedEndToEndEncryption", - "addEmail", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "addToSpace", - "admin", - "alias", - "all", - "allChats", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "answeredTheCall", - "anyoneCanJoin", - "appLock", - "appLockDescription", - "archive", - "areGuestsAllowedToJoin", - "areYouSure", - "areYouSureYouWantToLogout", - "askSSSSSign", - "askVerificationRequest", - "autoplayImages", - "badServerLoginTypesException", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "sendOnEnter", - "badServerVersionsException", - "banFromChat", - "banned", - "bannedUser", - "blockDevice", - "blocked", - "botMessages", - "cancel", - "cantOpenUri", - "changeDeviceName", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changePassword", - "changeTheHomeserver", - "changeTheme", - "changeTheNameOfTheGroup", - "changeYourAvatar", - "channelCorruptedDecryptError", - "chat", - "yourChatBackupHasBeenSetUp", - "chatBackup", - "chatBackupDescription", - "chatDetails", - "chatHasBeenAddedToThisSpace", - "chats", - "chooseAStrongPassword", - "clearArchive", - "close", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "configureChat", - "confirm", - "connect", - "contactHasBeenInvitedToTheGroup", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copiedToClipboard", - "copy", - "copyToClipboard", - "couldNotDecryptMessage", - "countParticipants", - "create", - "createdTheChat", - "createGroup", - "createNewGroup", - "currentlyActive", - "darkTheme", - "dateAndTimeOfDay", - "dateWithoutYear", - "dateWithYear", - "deactivateAccountWarning", - "defaultPermissionLevel", - "delete", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "hr": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "globalChatId", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "blockListDescription", - "noGoogleServicesWarning", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "presenceStyle", - "presencesToggle", - "writeAMessageFlag", - "youInvitedToBy", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "hidePresences", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "hu": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "globalChatId", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "writeAMessageFlag", - "usersMustKnock", - "knock", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "commandHint_ignore", - "commandHint_unignore", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ia": [ - "accountInformation", - "activatedEndToEndEncryption", - "confirmMatrixId", - "addGroupDescription", - "addNewFriend", - "addToSpace", - "admin", - "alias", - "all", - "allChats", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "answeredTheCall", - "anyoneCanJoin", - "appLock", - "appLockDescription", - "archive", - "areGuestsAllowedToJoin", - "areYouSure", - "areYouSureYouWantToLogout", - "askSSSSSign", - "askVerificationRequest", - "autoplayImages", - "badServerLoginTypesException", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "sendOnEnter", - "badServerVersionsException", - "banFromChat", - "banned", - "bannedUser", - "blockDevice", - "blocked", - "botMessages", - "cancel", - "cantOpenUri", - "changeDeviceName", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changePassword", - "changeTheHomeserver", - "changeTheme", - "changeTheNameOfTheGroup", - "changeYourAvatar", - "channelCorruptedDecryptError", - "chat", - "yourChatBackupHasBeenSetUp", - "chatBackup", - "chatBackupDescription", - "chatDetails", - "chatHasBeenAddedToThisSpace", - "chats", - "chooseAStrongPassword", - "clearArchive", - "close", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "configureChat", - "confirm", - "connect", - "contactHasBeenInvitedToTheGroup", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copiedToClipboard", - "copy", - "copyToClipboard", - "couldNotDecryptMessage", - "countParticipants", - "create", - "createdTheChat", - "createGroup", - "createNewGroup", - "currentlyActive", - "darkTheme", - "dateAndTimeOfDay", - "dateWithoutYear", - "dateWithYear", - "deactivateAccountWarning", - "defaultPermissionLevel", - "delete", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "id": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "searchIn", - "searchMore", - "gallery", - "files", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ie": [ - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "activatedEndToEndEncryption", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "answeredTheCall", - "appLock", - "appLockDescription", - "areGuestsAllowedToJoin", - "askSSSSSign", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changeTheNameOfTheGroup", - "channelCorruptedDecryptError", - "yourChatBackupHasBeenSetUp", - "chatBackupDescription", - "chatHasBeenAddedToThisSpace", - "chooseAStrongPassword", - "commandHint_markasdm", - "commandHint_ban", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_react", - "commandHint_unban", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "contactHasBeenInvitedToTheGroup", - "contentHasBeenReported", - "couldNotDecryptMessage", - "createdTheChat", - "createGroup", - "createNewGroup", - "deactivateAccountWarning", - "defaultPermissionLevel", - "allRooms", - "displaynameHasBeenChanged", - "chatPermissions", - "editChatPermissions", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteWarnNeedToPick", - "enableEmotesGlobally", - "enableEncryptionWarning", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "errorObtainingLocation", - "goToTheNewRoom", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "inviteText", - "joinedTheChat", - "kicked", - "kickedAndBanned", - "kickFromChat", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "logInTo", - "messagesStyle", - "needPantalaimonWarning", - "newMessageInFluffyChat", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "noPasswordRecoveryDescription", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openVideoCamera", - "oneClientLoggedOut", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "serverRequiresEmail", - "optionalGroupName", - "passphraseOrKey", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "pickImage", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "rejectedTheInvitation", - "removeAllOtherDevices", - "removedBy", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "roomHasBeenUpgraded", - "recoveryKeyLost", - "seenByUser", - "sendAMessage", - "sendAsText", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "sharedTheLocation", - "presenceStyle", - "presencesToggle", - "singlesignon", - "spaceIsPublic", - "startedACall", - "startFirstChat", - "statusExampleMessage", - "synchronizingPleaseWait", - "theyDontMatch", - "toggleFavorite", - "toggleMuted", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unbannedUser", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "userSentUnknownEvent", - "verifySuccess", - "verifyTitle", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "removeFromSpace", - "addToSpaceDescription", - "pleaseEnterRecoveryKeyDescription", - "markAsRead", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "placeCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "foregroundServiceRunning", - "screenSharingDetail", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "it": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "presenceStyle", - "writeAMessageFlag", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "searchForUsers", - "passwordsDoNotMatch", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "sessionLostBody", - "restoreSessionBody", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "stickers", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ja": [ - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_cuddle", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "commandHint_kick", - "commandHint_me", - "commandHint_op", - "commandHint_unban", - "createGroup", - "createNewGroup", - "allRooms", - "chatPermissions", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "messagesStyle", - "shareInviteLink", - "openInMaps", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "redactedBy", - "directChat", - "redactedByBecause", - "separateChatTypes", - "setChatDescription", - "presenceStyle", - "presencesToggle", - "writeAMessageFlag", - "dismiss", - "indexedDbErrorLong", - "widgetEtherpad", - "youInvitedToBy", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "saveKeyManuallyDescription", - "callingAccountDetails", - "appearOnTop", - "noKeyForThisMessage", - "hidePresences", - "newSpaceDescription", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "pleaseTryAgainLaterOrChooseDifferentServer", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ka": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "badServerVersionsException", - "commandHint_markasdm", - "createNewGroup", - "editChatPermissions", - "emoteKeyboardNoRecents", - "emotePacks", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ko": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "lt": [ - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "createGroup", - "createNewGroup", - "allRooms", - "chatPermissions", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "messagesStyle", - "shareInviteLink", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "redactedBy", - "directChat", - "redactedByBecause", - "setChatDescription", - "presenceStyle", - "presencesToggle", - "startFirstChat", - "writeAMessageFlag", - "youInvitedToBy", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "lv": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "searchIn", - "searchMore", - "gallery", - "files", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "nb": [ - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "yourChatBackupHasBeenSetUp", - "chatHasBeenAddedToThisSpace", - "chats", - "clearArchive", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "createGroup", - "createNewGroup", - "allRooms", - "chatPermissions", - "editChatPermissions", - "editRoomAliases", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "homeserver", - "errorObtainingLocation", - "goToTheNewRoom", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "messagesStyle", - "noEncryptionForPublicRooms", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "obtainingLocation", - "oopsPushError", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "people", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPin", - "redactedBy", - "directChat", - "redactedByBecause", - "redactMessage", - "register", - "removeYourAvatar", - "roomVersion", - "saveFile", - "recoveryKey", - "recoveryKeyLost", - "sendAsText", - "sendSticker", - "separateChatTypes", - "setAsCanonicalAlias", - "setChatDescription", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "spaceIsPublic", - "spaceName", - "startFirstChat", - "synchronizingPleaseWait", - "unverified", - "verified", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "wipeChatBackup", - "writeAMessageFlag", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "nl": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "presenceStyle", - "presencesToggle", - "writeAMessageFlag", - "youInvitedToBy", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "hidePresences", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "pl": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "blockListDescription", - "blockUsername", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "presenceStyle", - "presencesToggle", - "writeAMessageFlag", - "youInvitedToBy", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "hidePresences", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "pt": [ - "repeatPassword", - "notAnImage", - "remove", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accept", - "acceptedTheInvitation", - "accountInformation", - "activatedEndToEndEncryption", - "addEmail", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "addToSpace", - "alias", - "all", - "allChats", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "answeredTheCall", - "anyoneCanJoin", - "appLock", - "appLockDescription", - "archive", - "areGuestsAllowedToJoin", - "areYouSureYouWantToLogout", - "askSSSSSign", - "askVerificationRequest", - "autoplayImages", - "badServerLoginTypesException", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "sendOnEnter", - "badServerVersionsException", - "banFromChat", - "banned", - "bannedUser", - "blockDevice", - "blocked", - "botMessages", - "cantOpenUri", - "changeDeviceName", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changePassword", - "changeTheHomeserver", - "changeTheme", - "changeTheNameOfTheGroup", - "changeYourAvatar", - "channelCorruptedDecryptError", - "chat", - "yourChatBackupHasBeenSetUp", - "chatBackup", - "chatBackupDescription", - "chatDetails", - "chatHasBeenAddedToThisSpace", - "chats", - "chooseAStrongPassword", - "clearArchive", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "configureChat", - "confirm", - "connect", - "contactHasBeenInvitedToTheGroup", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copy", - "copyToClipboard", - "couldNotDecryptMessage", - "countParticipants", - "create", - "createdTheChat", - "createGroup", - "createNewGroup", - "currentlyActive", - "darkTheme", - "deactivateAccountWarning", - "defaultPermissionLevel", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "logInTo", - "memberChanges", - "mention", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "publicRooms", - "pushRules", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "pt_BR": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "searchIn", - "searchMore", - "gallery", - "files", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "pt_PT": [ - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "commandHint_markasdm", - "commandHint_markasgroup", - "createGroup", - "createNewGroup", - "allRooms", - "chatPermissions", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "fromJoining", - "fromTheInvitation", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "messagesStyle", - "shareInviteLink", - "scanQrCode", - "openVideoCamera", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "pleaseEnterRecoveryKey", - "pushRules", - "redactedBy", - "directChat", - "redactedByBecause", - "recoveryKey", - "recoveryKeyLost", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ro": [ - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "createGroup", - "createNewGroup", - "chatPermissions", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "messagesStyle", - "shareInviteLink", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "redactedBy", - "directChat", - "redactedByBecause", - "setChatDescription", - "presenceStyle", - "presencesToggle", - "writeAMessageFlag", - "youInvitedToBy", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "hidePresences", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ru": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "searchIn", - "searchMore", - "gallery", - "files", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "sk": [ - "notAnImage", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "autoplayImages", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "blocked", - "botMessages", - "changeYourAvatar", - "chatBackupDescription", - "chatHasBeenAddedToThisSpace", - "clearArchive", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "configureChat", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copyToClipboard", - "createGroup", - "createNewGroup", - "deactivateAccountWarning", - "defaultPermissionLevel", - "deleteAccount", - "deviceId", - "directChats", - "allRooms", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editRoomAliases", - "editRoomAvatar", - "emoteKeyboardNoRecents", - "emotePacks", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enableEmotesGlobally", - "enableEncryption", - "encrypted", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fontSize", - "goToTheNewRoom", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "inoffensive", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "inviteForMe", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "newChat", - "next", - "no", - "noConnectionToTheServer", - "noEncryptionForPublicRooms", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "noPasswordRecoveryDescription", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "online", - "oopsPushError", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "pin", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPin", - "pleaseFollowInstructionsOnWeb", - "privacy", - "pushRules", - "reason", - "redactedBy", - "directChat", - "redactedByBecause", - "redactMessage", - "register", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "saveFile", - "recoveryKey", - "recoveryKeyLost", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "synchronizingPleaseWait", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "unavailable", - "unpin", - "unverified", - "verified", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessageFlag", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "sl": [ - "notAnImage", - "remove", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "createGroup", - "createNewGroup", - "delete", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "sr": [ - "repeatPassword", - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "addToSpace", - "allChats", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "autoplayImages", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "sendOnEnter", - "cantOpenUri", - "yourChatBackupHasBeenSetUp", - "chatHasBeenAddedToThisSpace", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_myroomavatar", - "commandInvalid", - "commandMissing", - "createGroup", - "createNewGroup", - "allRooms", - "chatPermissions", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "homeserver", - "errorObtainingLocation", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "redactMessageDescription", - "optionalRedactReason", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "messagesStyle", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "obtainingLocation", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "pleaseEnterRecoveryKey", - "redactedBy", - "directChat", - "redactedByBecause", - "saveFile", - "recoveryKey", - "recoveryKeyLost", - "sendAsText", - "sendSticker", - "separateChatTypes", - "setChatDescription", - "shareLocation", - "presenceStyle", - "presencesToggle", - "spaceIsPublic", - "spaceName", - "startFirstChat", - "synchronizingPleaseWait", - "unverified", - "writeAMessageFlag", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "sv": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "writeAMessageFlag", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "publicChatAddresses", - "createNewAddress", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "ta": [ - "repeatPassword", - "notAnImage", - "remove", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "account", - "accountInformation", - "activatedEndToEndEncryption", - "addEmail", - "confirmMatrixId", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "addToSpace", - "admin", - "alias", - "all", - "allChats", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "answeredTheCall", - "anyoneCanJoin", - "appLock", - "appLockDescription", - "archive", - "areGuestsAllowedToJoin", - "areYouSure", - "areYouSureYouWantToLogout", - "askSSSSSign", - "askVerificationRequest", - "autoplayImages", - "badServerLoginTypesException", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "sendOnEnter", - "badServerVersionsException", - "banFromChat", - "banned", - "bannedUser", - "blockDevice", - "blocked", - "botMessages", - "cancel", - "cantOpenUri", - "changeDeviceName", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changePassword", - "changeTheHomeserver", - "changeTheme", - "changeTheNameOfTheGroup", - "changeYourAvatar", - "channelCorruptedDecryptError", - "chat", - "yourChatBackupHasBeenSetUp", - "chatBackup", - "chatBackupDescription", - "chatDetails", - "chatHasBeenAddedToThisSpace", - "chats", - "chooseAStrongPassword", - "clearArchive", - "close", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "configureChat", - "confirm", - "connect", - "contactHasBeenInvitedToTheGroup", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copiedToClipboard", - "copy", - "copyToClipboard", - "couldNotDecryptMessage", - "countParticipants", - "create", - "createdTheChat", - "createGroup", - "createNewGroup", - "currentlyActive", - "darkTheme", - "dateAndTimeOfDay", - "dateWithoutYear", - "dateWithYear", - "deactivateAccountWarning", - "defaultPermissionLevel", - "delete", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "th": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "badServerVersionsException", - "banFromChat", - "banned", - "bannedUser", - "blockDevice", - "blocked", - "botMessages", - "cancel", - "cantOpenUri", - "changeDeviceName", - "changedTheChatAvatar", - "changedTheChatDescriptionTo", - "changedTheChatNameTo", - "changedTheChatPermissions", - "changedTheDisplaynameTo", - "changedTheGuestAccessRules", - "changedTheGuestAccessRulesTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changedTheProfileAvatar", - "changedTheRoomAliases", - "changedTheRoomInvitationLink", - "changePassword", - "changeTheHomeserver", - "changeTheme", - "changeTheNameOfTheGroup", - "changeYourAvatar", - "channelCorruptedDecryptError", - "yourChatBackupHasBeenSetUp", - "chatBackup", - "chatBackupDescription", - "chatHasBeenAddedToThisSpace", - "chats", - "chooseAStrongPassword", - "clearArchive", - "close", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "compareEmojiMatch", - "compareNumbersMatch", - "configureChat", - "confirm", - "connect", - "contactHasBeenInvitedToTheGroup", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copiedToClipboard", - "copyToClipboard", - "couldNotDecryptMessage", - "countParticipants", - "create", - "createdTheChat", - "createGroup", - "createNewGroup", - "currentlyActive", - "darkTheme", - "dateAndTimeOfDay", - "dateWithoutYear", - "dateWithYear", - "deactivateAccountWarning", - "defaultPermissionLevel", - "deleteAccount", - "deleteMessage", - "device", - "deviceId", - "devices", - "directChats", - "allRooms", - "displaynameHasBeenChanged", - "downloadFile", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editDisplayname", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "emoteSettings", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "everythingReady", - "extremeOffensive", - "fileName", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "next", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noEncryptionForPublicRooms", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notifications", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "pleaseFollowInstructionsOnWeb", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendSticker", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "settings", - "share", - "sharedTheLocation", - "shareLocation", - "showPassword", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "transferFromAnotherDevice", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "discover", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "tr": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "uk": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "writeAMessageFlag", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "publicChatAddresses", - "createNewAddress", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "vi": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "askSSSSSign", - "autoplayImages", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "sendOnEnter", - "botMessages", - "cantOpenUri", - "changedTheDisplaynameTo", - "changedTheHistoryVisibility", - "changedTheHistoryVisibilityTo", - "changedTheJoinRules", - "changedTheJoinRulesTo", - "changeTheme", - "changeYourAvatar", - "channelCorruptedDecryptError", - "yourChatBackupHasBeenSetUp", - "chatHasBeenAddedToThisSpace", - "chats", - "clearArchive", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_ban", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_html", - "commandHint_invite", - "commandHint_join", - "commandHint_kick", - "commandHint_leave", - "commandHint_me", - "commandHint_myroomavatar", - "commandHint_myroomnick", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "commandHint_unban", - "commandInvalid", - "commandMissing", - "configureChat", - "containsDisplayName", - "containsUserName", - "contentHasBeenReported", - "copiedToClipboard", - "copyToClipboard", - "createGroup", - "createNewGroup", - "darkTheme", - "defaultPermissionLevel", - "directChats", - "allRooms", - "edit", - "editBlockedServers", - "chatPermissions", - "editChatPermissions", - "editRoomAliases", - "editRoomAvatar", - "emoteExists", - "emoteInvalid", - "emoteKeyboardNoRecents", - "emotePacks", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "emoteShortcode", - "emoteWarnNeedToPick", - "emptyChat", - "enableEmotesGlobally", - "enableEncryption", - "enableEncryptionWarning", - "encrypted", - "encryption", - "encryptionNotEnabled", - "endedTheCall", - "enterAGroupName", - "enterAnEmailAddress", - "enterASpacepName", - "homeserver", - "enterYourHomeserver", - "errorObtainingLocation", - "extremeOffensive", - "fileName", - "fluffychat", - "fontSize", - "forward", - "fromJoining", - "fromTheInvitation", - "goToTheNewRoom", - "group", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupIsPublic", - "groupDescription", - "groupDescriptionHasBeenChanged", - "groups", - "groupWith", - "guestsAreForbidden", - "guestsCanJoin", - "hasWithdrawnTheInvitationFor", - "help", - "hideRedactedEvents", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "howOffensiveIsThisContent", - "id", - "identity", - "ignore", - "ignoredUsers", - "ignoreListDescription", - "ignoreUsername", - "block", - "blockedUsers", - "blockListDescription", - "blockUsername", - "iHaveClickedOnLink", - "incorrectPassphraseOrKey", - "inoffensive", - "inviteContact", - "inviteContactToGroupQuestion", - "inviteContactToGroup", - "noChatDescriptionYet", - "tryAgain", - "invalidServerName", - "invited", - "redactMessageDescription", - "optionalRedactReason", - "invitedUser", - "invitedUsersOnly", - "inviteForMe", - "inviteText", - "isTyping", - "joinedTheChat", - "joinRoom", - "kicked", - "kickedAndBanned", - "kickFromChat", - "lastActiveAgo", - "leave", - "leftTheChat", - "license", - "lightTheme", - "loadCountMoreParticipants", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "loadingPleaseWait", - "loadMore", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "login", - "logInTo", - "logout", - "memberChanges", - "mention", - "messages", - "messagesStyle", - "moderator", - "muteChat", - "needPantalaimonWarning", - "newChat", - "newMessageInFluffyChat", - "newVerificationRequest", - "no", - "noConnectionToTheServer", - "noEmotesFound", - "noGoogleServicesWarning", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "none", - "noPasswordRecoveryDescription", - "noPermission", - "noRoomsFound", - "notificationsEnabledForThisAccount", - "numUsersTyping", - "obtainingLocation", - "offensive", - "offline", - "ok", - "online", - "onlineKeyBackupEnabled", - "oopsPushError", - "oopsSomethingWentWrong", - "openAppToReadMessages", - "openCamera", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "participant", - "passphraseOrKey", - "password", - "passwordForgotten", - "passwordHasBeenChanged", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "passwordRecoverySettings", - "passwordRecovery", - "people", - "pickImage", - "pin", - "play", - "pleaseChoose", - "pleaseChooseAPasscode", - "pleaseClickOnLink", - "pleaseEnter4Digits", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPassword", - "pleaseEnterYourPin", - "pleaseEnterYourUsername", - "privacy", - "publicRooms", - "pushRules", - "reason", - "recording", - "redactedBy", - "directChat", - "redactedByBecause", - "redactedAnEvent", - "redactMessage", - "register", - "reject", - "rejectedTheInvitation", - "rejoin", - "removeAllOtherDevices", - "removedBy", - "removeDevice", - "unbanFromChat", - "removeYourAvatar", - "replaceRoomWithNewerVersion", - "reply", - "reportMessage", - "requestPermission", - "roomHasBeenUpgraded", - "roomVersion", - "saveFile", - "search", - "security", - "recoveryKey", - "recoveryKeyLost", - "seenByUser", - "send", - "sendAMessage", - "sendAsText", - "sendAudio", - "sendFile", - "sendImage", - "sendMessages", - "sendOriginal", - "sendVideo", - "sentAFile", - "sentAnAudio", - "sentAPicture", - "sentASticker", - "sentAVideo", - "sentCallInformations", - "separateChatTypes", - "setAsCanonicalAlias", - "setCustomEmotes", - "setChatDescription", - "setInvitationLink", - "setPermissionsLevel", - "setStatus", - "share", - "sharedTheLocation", - "shareLocation", - "presenceStyle", - "presencesToggle", - "singlesignon", - "skip", - "sourceCode", - "spaceIsPublic", - "spaceName", - "startedACall", - "startFirstChat", - "status", - "statusExampleMessage", - "submit", - "synchronizingPleaseWait", - "systemTheme", - "theyDontMatch", - "theyMatch", - "title", - "toggleFavorite", - "toggleMuted", - "toggleUnread", - "tooManyRequestsWarning", - "tryToSendAgain", - "unavailable", - "unbannedUser", - "unblockDevice", - "unknownDevice", - "unknownEncryptionAlgorithm", - "unknownEvent", - "unmuteChat", - "unpin", - "unreadChats", - "userAndOthersAreTyping", - "userAndUserAreTyping", - "userIsTyping", - "userLeftTheChat", - "username", - "userSentUnknownEvent", - "unverified", - "verify", - "verifyStart", - "verifySuccess", - "verifyTitle", - "videoCall", - "visibilityOfTheChatHistory", - "visibleForAllParticipants", - "visibleForEveryone", - "voiceMessage", - "waitingPartnerAcceptRequest", - "waitingPartnerEmoji", - "waitingPartnerNumbers", - "wallpaper", - "warning", - "weSentYouAnEmail", - "whoCanPerformWhichAction", - "whoIsAllowedToJoinThisGroup", - "whyDoYouWantToReportThis", - "wipeChatBackup", - "withTheseAddressesRecoveryDescription", - "writeAMessage", - "writeAMessageFlag", - "yes", - "you", - "youAreNoLongerParticipatingInThisChat", - "youHaveBeenBannedFromThisChat", - "yourPublicKey", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "deviceKeys", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "yourGlobalUserIdIs", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "zh": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "createNewGroup", - "editChatPermissions", - "enterAGroupName", - "enterASpacepName", - "groupDescription", - "groupDescriptionHasBeenChanged", - "ignoreListDescription", - "ignoreUsername", - "optionalGroupName", - "writeAMessageFlag", - "requests", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ], - - "zh_Hant": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_html", - "commandHint_me", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "createGroup", - "createNewGroup", - "allRooms", - "chatPermissions", - "editChatPermissions", - "emoteKeyboardNoRecents", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "enterAGroupName", - "enterASpacepName", - "errorObtainingLocation", - "chatDescription", - "chatDescriptionHasBeenChanged", - "groupDescription", - "groupDescriptionHasBeenChanged", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "ignoreListDescription", - "ignoreUsername", - "blockUsername", - "inviteContactToGroupQuestion", - "noChatDescriptionYet", - "tryAgain", - "redactMessageDescription", - "optionalRedactReason", - "dehydrate", - "dehydrateWarning", - "dehydrateTor", - "dehydrateTorLong", - "hydrateTor", - "hydrateTorLong", - "hydrate", - "locationDisabledNotice", - "locationPermissionDeniedNotice", - "messagesStyle", - "noMatrixServer", - "shareInviteLink", - "scanQrCode", - "obtainingLocation", - "oopsPushError", - "openVideoCamera", - "oneClientLoggedOut", - "addAccount", - "editBundlesForAccount", - "addToBundle", - "removeFromBundle", - "bundleName", - "enableMultiAccounts", - "openInMaps", - "link", - "serverRequiresEmail", - "optionalGroupName", - "or", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "pleaseChoose", - "pleaseEnterRecoveryKey", - "pleaseEnterYourPin", - "redactedBy", - "directChat", - "redactedByBecause", - "register", - "removeYourAvatar", - "saveFile", - "recoveryKey", - "recoveryKeyLost", - "sendAsText", - "sendSticker", - "separateChatTypes", - "setAsCanonicalAlias", - "setChatDescription", - "shareLocation", - "presenceStyle", - "presencesToggle", - "singlesignon", - "spaceIsPublic", - "spaceName", - "startFirstChat", - "synchronizingPleaseWait", - "unverified", - "writeAMessageFlag", - "messageInfo", - "time", - "messageType", - "sender", - "openGallery", - "removeFromSpace", - "addToSpaceDescription", - "start", - "pleaseEnterRecoveryKeyDescription", - "publish", - "videoWithSize", - "openChat", - "markAsRead", - "reportUser", - "dismiss", - "reactedWith", - "pinMessage", - "confirmEventUnpin", - "emojis", - "placeCall", - "voiceCall", - "unsupportedAndroidVersion", - "unsupportedAndroidVersionLong", - "videoCallsBetaWarning", - "experimentalVideoCalls", - "emailOrUsername", - "indexedDbErrorTitle", - "indexedDbErrorLong", - "switchToAccount", - "nextAccount", - "previousAccount", - "addWidget", - "widgetVideo", - "widgetEtherpad", - "widgetJitsi", - "widgetCustom", - "widgetName", - "widgetUrlError", - "widgetNameError", - "errorAddingWidget", - "youRejectedTheInvitation", - "youJoinedTheChat", - "youAcceptedTheInvitation", - "youBannedUser", - "youHaveWithdrawnTheInvitationFor", - "youInvitedToBy", - "youInvitedBy", - "youInvitedUser", - "youKicked", - "youKickedAndBanned", - "youUnbannedUser", - "hasKnocked", - "usersMustKnock", - "noOneCanJoin", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "users", - "unlockOldMessages", - "storeInSecureStorageDescription", - "saveKeyManuallyDescription", - "storeInAndroidKeystore", - "storeInAppleKeyChain", - "storeSecurlyOnThisDevice", - "countFiles", - "user", - "custom", - "foregroundServiceRunning", - "screenSharingTitle", - "screenSharingDetail", - "callingPermissions", - "callingAccount", - "callingAccountDetails", - "appearOnTop", - "appearOnTopDetails", - "otherCallingPermissions", - "whyIsThisMessageEncrypted", - "noKeyForThisMessage", - "newGroup", - "newSpace", - "enterSpace", - "enterRoom", - "allSpaces", - "numChats", - "hideUnimportantStateEvents", - "hidePresences", - "doNotShowAgain", - "wasDirectChatDisplayName", - "newSpaceDescription", - "encryptThisChat", - "disableEncryptionWarning", - "sorryThatsNotPossible", - "deviceKeys", - "reopenChat", - "noBackupWarning", - "noOtherDevicesFound", - "fileIsTooBigForServer", - "fileHasBeenSavedAt", - "jumpToLastReadMessage", - "readUpToHere", - "jump", - "openLinkInBrowser", - "reportErrorDescription", - "report", - "signInWithPassword", - "pleaseTryAgainLaterOrChooseDifferentServer", - "signInWith", - "profileNotFound", - "setTheme", - "setColorTheme", - "invite", - "requests", - "inviteGroupChat", - "invitePrivateChat", - "invalidInput", - "wrongPinEntered", - "allCorrect", - "newWayAllGood", - "othersAreBetter", - "holdForInfo", - "greenFeedback", - "yellowFeedback", - "redFeedback", - "customInputFeedbackChoice", - "itInstructionsTitle", - "itInstructionsBody", - "toggleLanguages", - "classWelcomeChat", - "deleteSpace", - "deleteGroup", - "areYouSureDeleteClass", - "areYouSureDeleteGroup", - "cannotBeReversed", - "enterDeletedClassName", - "incorrectClassName", - "oneday", - "oneweek", - "onemonth", - "sixmonth", - "oneyear", - "gaTooltip", - "taTooltip", - "unTooltip", - "interactiveTranslatorSliderHeader", - "interactiveGrammarSliderHeader", - "interactiveTranslatorNotAllowed", - "interactiveTranslatorAllowed", - "interactiveTranslatorRequired", - "interactiveTranslatorNotAllowedDesc", - "interactiveTranslatorAllowedDesc", - "interactiveTranslatorRequiredDesc", - "notYetSet", - "multiLingualSpace", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "spaceAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "languageSettings", - "languageSettingsDesc", - "selectSpaceDominantLanguage", - "selectSpaceTargetLanguage", - "whatIsYourSpaceLanguageLevel", - "studentPermissions", - "interactiveTranslator", - "oneToOneChatsWithinClass", - "oneToOneChatsWithinClassDesc", - "createGroupChats", - "createGroupChatsDesc", - "shareVideo", - "shareVideoDesc", - "sharePhotos", - "sharePhotosDesc", - "shareFiles", - "shareFilesDesc", - "shareLocationDesc", - "selectLanguageLevel", - "noIdenticalLanguages", - "iWantALanguagePartnerFrom", - "worldWide", - "noResults", - "searchBy", - "iWantAConversationPartner", - "iWantALanguagePartnerWhoSpeaks", - "iWantALanguagePartnerWhoIsLearning", - "yourBirthdayPlease", - "invalidDob", - "enterYourDob", - "getStarted", - "mustBe13", - "yourBirthdayPleaseShort", - "joinWithClassCode", - "joinWithClassCodeDesc", - "joinWithClassCodeHint", - "unableToFindClass", - "languageLevelPreA1", - "languageLevelA1", - "languageLevelA2", - "languageLevelB1", - "languageLevelB2", - "languageLevelC1", - "languageLevelC2", - "changeTheNameOfTheClass", - "changeTheNameOfTheChat", - "welcomeToYourNewClass", - "welcomeToClass", - "welcomeToPangea18Plus", - "welcomeToPangeaMinor", - "findALanguagePartner", - "setToPublicSettingsTitle", - "setToPublicSettingsDesc", - "accountSettings", - "unableToFindClassCode", - "askPangeaBot", - "sorryNoResults", - "ignoreInThisText", - "helpMeTranslate", - "needsItShortMessage", - "needsIGCShortMessage", - "needsItMessage", - "needsIgcMessage", - "tokenTranslationTitle", - "spanTranslationDesc", - "spanTranslationTitle", - "l1SpanAndGrammarTitle", - "l1SpanAndGrammarDesc", - "otherTitle", - "otherDesc", - "countryInformation", - "myLanguages", - "targetLanguage", - "sourceLanguage", - "languagesISpeak", - "updateLanguage", - "whatLanguageYouWantToLearn", - "whatIsYourBaseLanguage", - "saveChanges", - "publicProfileTitle", - "publicProfileDesc", - "errorDisableIT", - "errorDisableIGC", - "errorDisableLanguageAssistance", - "errorDisableITUserDesc", - "errorDisableIGCUserDesc", - "errorDisableLanguageAssistanceUserDesc", - "errorDisableITClassDesc", - "errorDisableIGCClassDesc", - "errorDisableLanguageAssistanceClassDesc", - "itIsDisabled", - "igcIsDisabled", - "goToLearningSettings", - "error405Title", - "error405Desc", - "loginOrSignup", - "iAgreeToThe", - "termsAndConditions", - "andCertifyIAmAtLeast13YearsOfAge", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", - "errorPleaseRefresh", - "findAClass", - "toggleIT", - "toggleIGC", - "toggleToolSettingsDescription", - "connectedToStaging", - "learningSettings", - "classNameRequired", - "sendVoiceNotes", - "sendVoiceNotesDesc", - "chatTopic", - "chatTopicDesc", - "inviteStudentByUserNameDesc", - "classRoster", - "almostPerfect", - "prettyGood", - "letMeThink", - "clickMessageTitle", - "clickMessageBody", - "understandingMessagesTitle", - "understandingMessagesBody", - "allDone", - "vocab", - "low", - "medium", - "high", - "unknownProficiency", - "changeView", - "clearAll", - "generateVocabulary", - "generatePrompts", - "subscribe", - "getAccess", - "subscriptionDesc", - "subscriptionManagement", - "currentSubscription", - "changeSubscription", - "cancelSubscription", - "selectYourPlan", - "subsciptionPlatformTooltip", - "subscriptionManagementUnavailable", - "paymentMethod", - "paymentHistory", - "emptyChatDownloadWarning", - "appUpdateAvailable", - "update", - "updateDesc", - "maybeLater", - "mainMenu", - "toggleImmersionMode", - "toggleImmersionModeDesc", - "itToggleDescription", - "igcToggleDescription", - "sendOnEnterDescription", - "alreadyInClass", - "pleaseLoginFirst", - "originalMessage", - "sentMessage", - "useType", - "notAvailable", - "taAndGaTooltip", - "definitionsToolName", - "messageTranslationsToolName", - "definitionsToolDescription", - "translationsToolDescrption", - "welcomeBack", - "createNewClass", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "redeemPromoCode", - "enterPromoCode", - "downloadTxtFile", - "downloadCSVFile", - "promotionalSubscriptionDesc", - "originalSubscriptionPlatform", - "oneWeekTrial", - "creatingSpacePleaseWait", - "downloadXLSXFile", - "abDisplayName", - "aaDisplayName", - "afDisplayName", - "akDisplayName", - "sqDisplayName", - "amDisplayName", - "arDisplayName", - "anDisplayName", - "hyDisplayName", - "asDisplayName", - "avDisplayName", - "aeDisplayName", - "ayDisplayName", - "azDisplayName", - "bmDisplayName", - "baDisplayName", - "euDisplayName", - "beDisplayName", - "bnDisplayName", - "bhDisplayName", - "biDisplayName", - "bsDisplayName", - "brDisplayName", - "bgDisplayName", - "myDisplayName", - "caDisplayName", - "chDisplayName", - "ceDisplayName", - "nyDisplayName", - "zhDisplayName", - "cvDisplayName", - "kwDisplayName", - "coDisplayName", - "crDisplayName", - "hrDisplayName", - "csDisplayName", - "daDisplayName", - "dvDisplayName", - "nlDisplayName", - "enDisplayName", - "eoDisplayName", - "etDisplayName", - "eeDisplayName", - "foDisplayName", - "fjDisplayName", - "fiDisplayName", - "frDisplayName", - "ffDisplayName", - "glDisplayName", - "kaDisplayName", - "deDisplayName", - "elDisplayName", - "gnDisplayName", - "guDisplayName", - "htDisplayName", - "haDisplayName", - "heDisplayName", - "hzDisplayName", - "hiDisplayName", - "hoDisplayName", - "huDisplayName", - "iaDisplayName", - "idDisplayName", - "ieDisplayName", - "gaDisplayName", - "igDisplayName", - "ikDisplayName", - "ioDisplayName", - "isDisplayName", - "itDisplayName", - "iuDisplayName", - "jaDisplayName", - "jvDisplayName", - "klDisplayName", - "knDisplayName", - "krDisplayName", - "ksDisplayName", - "kkDisplayName", - "kmDisplayName", - "kiDisplayName", - "rwDisplayName", - "kyDisplayName", - "kvDisplayName", - "kgDisplayName", - "koDisplayName", - "kuDisplayName", - "kjDisplayName", - "laDisplayName", - "lbDisplayName", - "lgDisplayName", - "liDisplayName", - "lnDisplayName", - "loDisplayName", - "ltDisplayName", - "luDisplayName", - "lvDisplayName", - "gvDisplayName", - "mkDisplayName", - "mgDisplayName", - "msDisplayName", - "mlDisplayName", - "mtDisplayName", - "miDisplayName", - "mrDisplayName", - "mhDisplayName", - "mnDisplayName", - "naDisplayName", - "nvDisplayName", - "nbDisplayName", - "ndDisplayName", - "neDisplayName", - "ngDisplayName", - "nnDisplayName", - "noDisplayName", - "iiDisplayName", - "nrDisplayName", - "ocDisplayName", - "ojDisplayName", - "cuDisplayName", - "omDisplayName", - "orDisplayName", - "osDisplayName", - "paDisplayName", - "piDisplayName", - "faDisplayName", - "plDisplayName", - "psDisplayName", - "ptDisplayName", - "quDisplayName", - "rmDisplayName", - "rnDisplayName", - "roDisplayName", - "ruDisplayName", - "saDisplayName", - "scDisplayName", - "sdDisplayName", - "seDisplayName", - "smDisplayName", - "sgDisplayName", - "srDisplayName", - "gdDisplayName", - "snDisplayName", - "siDisplayName", - "skDisplayName", - "slDisplayName", - "soDisplayName", - "stDisplayName", - "esDisplayName", - "suDisplayName", - "swDisplayName", - "ssDisplayName", - "svDisplayName", - "taDisplayName", - "teDisplayName", - "tgDisplayName", - "thDisplayName", - "tiDisplayName", - "boDisplayName", - "tkDisplayName", - "tlDisplayName", - "tnDisplayName", - "toDisplayName", - "trDisplayName", - "tsDisplayName", - "ttDisplayName", - "twDisplayName", - "tyDisplayName", - "ugDisplayName", - "ukDisplayName", - "urDisplayName", - "uzDisplayName", - "veDisplayName", - "viDisplayName", - "voDisplayName", - "waDisplayName", - "cyDisplayName", - "woDisplayName", - "fyDisplayName", - "xhDisplayName", - "yiDisplayName", - "yoDisplayName", - "zaDisplayName", - "unkDisplayName", - "zuDisplayName", - "hawDisplayName", - "hmnDisplayName", - "multiDisplayName", - "cebDisplayName", - "dzDisplayName", - "iwDisplayName", - "jwDisplayName", - "moDisplayName", - "shDisplayName", - "wwCountryDisplayName", - "afCountryDisplayName", - "axCountryDisplayName", - "alCountryDisplayName", - "dzCountryDisplayName", - "asCountryDisplayName", - "adCountryDisplayName", - "aoCountryDisplayName", - "aiCountryDisplayName", - "agCountryDisplayName", - "arCountryDisplayName", - "amCountryDisplayName", - "awCountryDisplayName", - "acCountryDisplayName", - "auCountryDisplayName", - "atCountryDisplayName", - "azCountryDisplayName", - "bsCountryDisplayName", - "bhCountryDisplayName", - "bdCountryDisplayName", - "bbCountryDisplayName", - "byCountryDisplayName", - "beCountryDisplayName", - "bzCountryDisplayName", - "bjCountryDisplayName", - "bmCountryDisplayName", - "btCountryDisplayName", - "boCountryDisplayName", - "baCountryDisplayName", - "bwCountryDisplayName", - "brCountryDisplayName", - "ioCountryDisplayName", - "vgCountryDisplayName", - "bnCountryDisplayName", - "bgCountryDisplayName", - "bfCountryDisplayName", - "biCountryDisplayName", - "khCountryDisplayName", - "cmCountryDisplayName", - "caCountryDisplayName", - "cvCountryDisplayName", - "bqCountryDisplayName", - "kyCountryDisplayName", - "cfCountryDisplayName", - "tdCountryDisplayName", - "clCountryDisplayName", - "cnCountryDisplayName", - "cxCountryDisplayName", - "ccCountryDisplayName", - "coCountryDisplayName", - "kmCountryDisplayName", - "cdCountryDisplayName", - "cgCountryDisplayName", - "ckCountryDisplayName", - "crCountryDisplayName", - "ciCountryDisplayName", - "hrCountryDisplayName", - "cuCountryDisplayName", - "cwCountryDisplayName", - "cyCountryDisplayName", - "czCountryDisplayName", - "dkCountryDisplayName", - "djCountryDisplayName", - "dmCountryDisplayName", - "doCountryDisplayName", - "tlCountryDisplayName", - "ecCountryDisplayName", - "egCountryDisplayName", - "svCountryDisplayName", - "gqCountryDisplayName", - "erCountryDisplayName", - "eeCountryDisplayName", - "szCountryDisplayName", - "etCountryDisplayName", - "fkCountryDisplayName", - "foCountryDisplayName", - "fjCountryDisplayName", - "fiCountryDisplayName", - "frCountryDisplayName", - "gfCountryDisplayName", - "pfCountryDisplayName", - "gaCountryDisplayName", - "gmCountryDisplayName", - "geCountryDisplayName", - "deCountryDisplayName", - "ghCountryDisplayName", - "giCountryDisplayName", - "grCountryDisplayName", - "glCountryDisplayName", - "gdCountryDisplayName", - "gpCountryDisplayName", - "guCountryDisplayName", - "gtCountryDisplayName", - "ggCountryDisplayName", - "gnCountryDisplayName", - "gwCountryDisplayName", - "gyCountryDisplayName", - "htCountryDisplayName", - "hmCountryDisplayName", - "hnCountryDisplayName", - "hkCountryDisplayName", - "huCountryDisplayName", - "isCountryDisplayName", - "inCountryDisplayName", - "idCountryDisplayName", - "irCountryDisplayName", - "iqCountryDisplayName", - "ieCountryDisplayName", - "imCountryDisplayName", - "ilCountryDisplayName", - "itCountryDisplayName", - "jmCountryDisplayName", - "jpCountryDisplayName", - "jeCountryDisplayName", - "joCountryDisplayName", - "kzCountryDisplayName", - "keCountryDisplayName", - "kiCountryDisplayName", - "xkCountryDisplayName", - "kwCountryDisplayName", - "kgCountryDisplayName", - "laCountryDisplayName", - "lvCountryDisplayName", - "lbCountryDisplayName", - "lsCountryDisplayName", - "lrCountryDisplayName", - "lyCountryDisplayName", - "liCountryDisplayName", - "ltCountryDisplayName", - "luCountryDisplayName", - "moCountryDisplayName", - "mkCountryDisplayName", - "mgCountryDisplayName", - "mwCountryDisplayName", - "myCountryDisplayName", - "mvCountryDisplayName", - "mlCountryDisplayName", - "mtCountryDisplayName", - "mhCountryDisplayName", - "mqCountryDisplayName", - "mrCountryDisplayName", - "muCountryDisplayName", - "ytCountryDisplayName", - "mxCountryDisplayName", - "fmCountryDisplayName", - "mdCountryDisplayName", - "mcCountryDisplayName", - "mnCountryDisplayName", - "meCountryDisplayName", - "msCountryDisplayName", - "maCountryDisplayName", - "mzCountryDisplayName", - "mmCountryDisplayName", - "naCountryDisplayName", - "nrCountryDisplayName", - "npCountryDisplayName", - "nlCountryDisplayName", - "ncCountryDisplayName", - "nzCountryDisplayName", - "niCountryDisplayName", - "neCountryDisplayName", - "ngCountryDisplayName", - "nuCountryDisplayName", - "nfCountryDisplayName", - "kpCountryDisplayName", - "mpCountryDisplayName", - "noCountryDisplayName", - "omCountryDisplayName", - "pkCountryDisplayName", - "pwCountryDisplayName", - "psCountryDisplayName", - "paCountryDisplayName", - "pgCountryDisplayName", - "pyCountryDisplayName", - "peCountryDisplayName", - "phCountryDisplayName", - "plCountryDisplayName", - "ptCountryDisplayName", - "prCountryDisplayName", - "qaCountryDisplayName", - "reCountryDisplayName", - "roCountryDisplayName", - "ruCountryDisplayName", - "rwCountryDisplayName", - "blCountryDisplayName", - "shCountryDisplayName", - "knCountryDisplayName", - "lcCountryDisplayName", - "mfCountryDisplayName", - "pmCountryDisplayName", - "vcCountryDisplayName", - "wsCountryDisplayName", - "smCountryDisplayName", - "stCountryDisplayName", - "saCountryDisplayName", - "snCountryDisplayName", - "rsCountryDisplayName", - "scCountryDisplayName", - "slCountryDisplayName", - "sgCountryDisplayName", - "sxCountryDisplayName", - "skCountryDisplayName", - "siCountryDisplayName", - "sbCountryDisplayName", - "soCountryDisplayName", - "zaCountryDisplayName", - "gsCountryDisplayName", - "krCountryDisplayName", - "ssCountryDisplayName", - "esCountryDisplayName", - "lkCountryDisplayName", - "sdCountryDisplayName", - "srCountryDisplayName", - "sjCountryDisplayName", - "seCountryDisplayName", - "chCountryDisplayName", - "syCountryDisplayName", - "twCountryDisplayName", - "tjCountryDisplayName", - "tzCountryDisplayName", - "thCountryDisplayName", - "tgCountryDisplayName", - "tkCountryDisplayName", - "toCountryDisplayName", - "ttCountryDisplayName", - "tnCountryDisplayName", - "trCountryDisplayName", - "tmCountryDisplayName", - "tcCountryDisplayName", - "tvCountryDisplayName", - "viCountryDisplayName", - "ugCountryDisplayName", - "uaCountryDisplayName", - "aeCountryDisplayName", - "gbCountryDisplayName", - "usCountryDisplayName", - "uyCountryDisplayName", - "uzCountryDisplayName", - "vuCountryDisplayName", - "vaCountryDisplayName", - "veCountryDisplayName", - "vnCountryDisplayName", - "wfCountryDisplayName", - "ehCountryDisplayName", - "yeCountryDisplayName", - "zmCountryDisplayName", - "zwCountryDisplayName", - "pay", - "allPrivateChats", - "unknownPrivateChat", - "copyClassCodeDesc", - "addToSpaceDesc", - "invitedToSpace", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptySpaceNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "viewArchive", - "trialExpiration", - "freeTrialDesc", - "activateTrial", - "inNoSpaces", - "successfullySubscribed", - "clickToManageSubscription", - "emptyInviteWarning", - "errorGettingAudio", - "nothingFound", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "wrongRecoveryKey", - "startConversation", - "commandHint_sendraw", - "databaseMigrationTitle", - "databaseMigrationBody", - "leaveEmptyToClearStatus", - "select", - "searchForUsers", - "pleaseEnterYourCurrentPassword", - "newPassword", - "pleaseChooseAStrongPassword", - "passwordsDoNotMatch", - "passwordIsWrong", - "publicLink", - "publicChatAddresses", - "createNewAddress", - "joinSpace", - "publicSpaces", - "addChatOrSubSpace", - "subspace", - "decline", - "thisDevice", - "initAppError", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "databaseBuildErrorBody", - "sessionLostBody", - "restoreSessionBody", - "forwardMessageTo", - "signUp", - "pleaseChooseAtLeastChars", - "noEmailWarning", - "pleaseEnterValidEmail", - "noAddToSpacePermissions", - "alreadyInSpace", - "pleaseChooseAUsername", - "chooseAUsername", - "define", - "listen", - "addConversationBot", - "addConversationBotDesc", - "convoBotSettingsTitle", - "convoBotSettingsDescription", - "enterAConversationTopic", - "conversationTopic", - "enableModeration", - "enableModerationDesc", - "conversationLanguageLevel", - "showDefinition", - "sendReadReceipts", - "sendTypingNotificationsDescription", - "sendReadReceiptsDescription", - "formattedMessages", - "formattedMessagesDescription", - "verifyOtherUser", - "verifyOtherUserDescription", - "verifyOtherDevice", - "verifyOtherDeviceDescription", - "acceptedKeyVerification", - "canceledKeyVerification", - "completedKeyVerification", - "isReadyForKeyVerification", - "requestedKeyVerification", - "startedKeyVerification", - "subscriptionPopupTitle", - "subscriptionPopupDesc", - "seeOptions", - "continuedWithoutSubscription", - "trialPeriodExpired", - "selectToDefine", - "translations", - "messageAudio", - "definitions", - "subscribedToUnlockTools", - "more", - "translationTooltip", - "audioTooltip", - "speechToTextTooltip", - "certifyAge", - "kickBotWarning", - "joinToView", - "refresh", - "autoPlayTitle", - "autoPlayDesc", - "transparent", - "incomingMessages", - "stickers", - "commandHint_ignore", - "commandHint_unignore", - "unreadChatsInApp", - "messageAnalytics", - "words", - "score", - "accuracy", - "points", - "noPaymentInfo", - "conversationBotModeSelectDescription", - "conversationBotModeSelectOption_discussion", - "conversationBotModeSelectOption_custom", - "conversationBotModeSelectOption_conversation", - "conversationBotModeSelectOption_textAdventure", - "conversationBotDiscussionZone_title", - "conversationBotDiscussionZone_discussionTopicLabel", - "conversationBotDiscussionZone_discussionTopicPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsLabel", - "conversationBotDiscussionZone_discussionKeywordsPlaceholder", - "conversationBotDiscussionZone_discussionKeywordsHintText", - "conversationBotDiscussionZone_discussionTriggerScheduleEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerScheduleHourIntervalLabel", - "conversationBotDiscussionZone_discussionTriggerReactionEnabledLabel", - "conversationBotDiscussionZone_discussionTriggerReactionKeyLabel", - "conversationBotCustomZone_title", - "conversationBotCustomZone_customSystemPromptLabel", - "conversationBotCustomZone_customSystemPromptPlaceholder", - "conversationBotCustomZone_customTriggerReactionEnabledLabel", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "studentAnalyticsNotAvailable", - "roomDataMissing", - "updatePhoneOS", - "wordsPerMinute", - "autoIGCToolName", - "autoIGCToolDescription", - "runGrammarCorrection", - "grammarCorrectionFailed", - "grammarCorrectionComplete", - "leaveRoomDescription", - "archiveSpaceDescription", - "leaveSpaceDescription", - "onlyAdminDescription", - "tooltipInstructionsTitle", - "tooltipInstructionsMobileBody", - "tooltipInstructionsBrowserBody", - "addSpaceToSpaceDescription", - "roomCapacity", - "roomFull", - "topicNotSet", - "capacityNotSet", - "roomCapacityHasBeenChanged", - "roomExceedsCapacity", - "capacitySetTooLow", - "roomCapacityExplanation", - "enterNumber", - "buildTranslation", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace", - "createNewSpace", - "addChatToSpaceDesc", - "addSpaceToSpaceDesc", - "spaceAnalytics", - "changeAnalyticsLanguage", - "suggestToSpace", - "suggestToSpaceDesc", - "practice", - "noLanguagesSet", - "noActivitiesFound", - "previous", - "languageButtonLabel", - "interactiveTranslatorAutoPlaySliderHeader", - "interactiveTranslatorAutoPlayDesc" - ] -} From 919cfc4bd39b8f8b61c2a003f2cf0f6a20eaf38b Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Sun, 30 Jun 2024 10:36:09 -0400 Subject: [PATCH 48/54] improving documentation --- .../controllers/choreographer.dart | 41 ++-- .../controllers/igc_controller.dart | 67 +++--- .../controllers/it_controller.dart | 5 +- .../controllers/span_data_controller.dart | 0 .../widgets/start_igc_button.dart | 4 +- lib/pangea/config/environment.dart | 2 +- .../controllers/my_analytics_controller.dart | 14 +- .../pangea_message_event.dart | 194 ++++++++++-------- lib/pangea/repo/igc_repo.dart | 3 - 9 files changed, 181 insertions(+), 149 deletions(-) rename lib/pangea/{ => choreographer}/controllers/span_data_controller.dart (100%) diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 0e326ab6e..77130f635 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -183,6 +183,7 @@ class Choreographer { _textController.setSystemText("", EditType.itStart); } + /// Handles any changes to the text input _onChangeListener() { if (_noChange) { return; @@ -191,21 +192,26 @@ class Choreographer { if ([ EditType.igc, ].contains(_textController.editType)) { + // this may be unnecessary now that tokens are not used + // to allow click of words in the input field and we're getting this at the end + // TODO - turn it off and tested that this is fine igc.justGetTokensAndAddThemToIGCTextData(); + + // we set editType to keyboard here because that is the default for it + // and we want to make sure that the next change is treated as a keyboard change + // unless the system explicity sets it to something else. this textController.editType = EditType.keyboard; return; } + // not sure if this is necessary now MatrixState.pAnyState.closeOverlay(); if (errorService.isError) { return; } - // if (igc.igcTextData != null) { igc.clear(); - // setState(); - // } _resetDebounceTimer(); @@ -215,7 +221,9 @@ class Choreographer { () => getLanguageHelp(), ); } else { - getLanguageHelp(ChoreoMode.it == choreoMode); + getLanguageHelp( + onlyTokensAndLanguageDetection: ChoreoMode.it == choreoMode, + ); } //Note: we don't set the keyboard type on each keyboard stroke so this is how we default to @@ -224,10 +232,14 @@ class Choreographer { textController.editType = EditType.keyboard; } - Future getLanguageHelp([ - bool tokensOnly = false, + /// Fetches the language help for the current text, including grammar correction, language detection, + /// tokens, and translations. Includes logic to exit the flow if the user is not subscribed, if the tools are not enabled, or + /// or if autoIGC is not enabled and the user has not manually requested it. + /// [onlyTokensAndLanguageDetection] will + Future getLanguageHelp({ + bool onlyTokensAndLanguageDetection = false, bool manual = false, - ]) async { + }) async { try { if (errorService.isError) return; final CanSendStatus canSendStatus = @@ -242,13 +254,15 @@ class Choreographer { startLoading(); if (choreoMode == ChoreoMode.it && itController.isTranslationDone && - !tokensOnly) { + !onlyTokensAndLanguageDetection) { // debugger(when: kDebugMode); } await (choreoMode == ChoreoMode.it && !itController.isTranslationDone ? itController.getTranslationData(_useCustomInput) - : igc.getIGCTextData(tokensOnly: tokensOnly)); + : igc.getIGCTextData( + onlyTokensAndLanguageDetection: onlyTokensAndLanguageDetection, + )); } catch (err, stack) { ErrorHandler.logError(e: err, s: stack); } finally { @@ -494,8 +508,9 @@ class Choreographer { // TODO - this is a bit of a hack, and should be tested more // we should also check that user has not done customInput - if (itController.completedITSteps.isNotEmpty && itController.allCorrect) + if (itController.completedITSteps.isNotEmpty && itController.allCorrect) { return l2LangCode!; + } return null; } @@ -533,9 +548,11 @@ class Choreographer { chatController.room, ); - bool get itAutoPlayEnabled => pangeaController.pStoreService.read( + bool get itAutoPlayEnabled => + pangeaController.pStoreService.read( MatrixProfile.itAutoPlay.title, - ) ?? false; + ) ?? + false; bool get definitionsEnabled => pangeaController.permissionsController.isToolEnabled( diff --git a/lib/pangea/choreographer/controllers/igc_controller.dart b/lib/pangea/choreographer/controllers/igc_controller.dart index 68d81389e..a694c48a5 100644 --- a/lib/pangea/choreographer/controllers/igc_controller.dart +++ b/lib/pangea/choreographer/controllers/igc_controller.dart @@ -3,7 +3,7 @@ import 'dart:developer'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; import 'package:fluffychat/pangea/choreographer/controllers/error_service.dart'; -import 'package:fluffychat/pangea/controllers/span_data_controller.dart'; +import 'package:fluffychat/pangea/choreographer/controllers/span_data_controller.dart'; import 'package:fluffychat/pangea/models/igc_text_data_model.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart'; import 'package:fluffychat/pangea/repo/igc_repo.dart'; @@ -29,59 +29,64 @@ class IgcController { spanDataController = SpanDataController(choreographer); } - Future getIGCTextData({required bool tokensOnly}) async { + Future getIGCTextData({ + required bool onlyTokensAndLanguageDetection, + }) async { try { if (choreographer.currentText.isEmpty) return clear(); // the error spans are going to be reloaded, so clear the cache + // @ggurdin: Why is this separate from the clear() call? + // Also, if the spans are equal according the to the equals method, why not reuse the cached span data? + // It seems this would save some calls if the user makes some tiny changes to the text that don't + // change the matches at all. spanDataController.clearCache(); debugPrint('getIGCTextData called with ${choreographer.currentText}'); - debugPrint('getIGCTextData called with tokensOnly = $tokensOnly'); + debugPrint( + 'getIGCTextData called with tokensOnly = $onlyTokensAndLanguageDetection', + ); final IGCRequestBody reqBody = IGCRequestBody( fullText: choreographer.currentText, userL1: choreographer.l1LangCode!, userL2: choreographer.l2LangCode!, - enableIGC: choreographer.igcEnabled && !tokensOnly, - enableIT: choreographer.itEnabled && !tokensOnly, - tokensOnly: tokensOnly, + enableIGC: choreographer.igcEnabled && !onlyTokensAndLanguageDetection, + enableIT: choreographer.itEnabled && !onlyTokensAndLanguageDetection, ); final IGCTextData igcTextDataResponse = await IgcRepo.getIGC( await choreographer.accessToken, igcRequest: reqBody, ); - // temp fix - igcTextDataResponse.originalInput = reqBody.fullText; - //this will happen when the user changes the input while igc is fetching results + // this will happen when the user changes the input while igc is fetching results if (igcTextDataResponse.originalInput != choreographer.currentText) { - // final current = choreographer.currentText; - // final igctext = igcTextDataResponse.originalInput; - // Sentry.addBreadcrumb( - // Breadcrumb(message: "igc return input does not match current text"), - // ); - // debugger(when: kDebugMode); return; } //TO-DO: in api call, specify turning off IT and/or grammar checking - if (!choreographer.igcEnabled) { - igcTextDataResponse.matches = igcTextDataResponse.matches - .where((match) => !match.isGrammarMatch) - .toList(); - } - if (!choreographer.itEnabled) { - igcTextDataResponse.matches = igcTextDataResponse.matches - .where((match) => !match.isOutOfTargetMatch) - .toList(); - } - if (!choreographer.itEnabled && !choreographer.igcEnabled) { - igcTextDataResponse.matches = []; - } + // UPDATE: This is now done in the API call. New TODO is to test this. + // if (!choreographer.igcEnabled) { + // igcTextDataResponse.matches = igcTextDataResponse.matches + // .where((match) => !match.isGrammarMatch) + // .toList(); + // } + // if (!choreographer.itEnabled) { + // igcTextDataResponse.matches = igcTextDataResponse.matches + // .where((match) => !match.isOutOfTargetMatch) + // .toList(); + // } + // if (!choreographer.itEnabled && !choreographer.igcEnabled) { + // igcTextDataResponse.matches = []; + // } igcTextData = igcTextDataResponse; + // TODO - for each new match, + // check if existing igcTextData has one and only one match with the same error text and correction + // if so, keep the original match and discard the new one + // if not, add the new match to the existing igcTextData + // After fetching igc data, pre-call span details for each match optimistically. // This will make the loading of span details faster for the user if (igcTextData?.matches.isNotEmpty ?? false) { @@ -170,11 +175,9 @@ class IgcController { const int firstMatchIndex = 0; final PangeaMatch match = igcTextData!.matches[firstMatchIndex]; - if ( - match.isITStart && + if (match.isITStart && choreographer.itAutoPlayEnabled && - igcTextData != null - ) { + igcTextData != null) { choreographer.onITStart(igcTextData!.matches[firstMatchIndex]); return; } diff --git a/lib/pangea/choreographer/controllers/it_controller.dart b/lib/pangea/choreographer/controllers/it_controller.dart index 8bd60270b..225d2fec6 100644 --- a/lib/pangea/choreographer/controllers/it_controller.dart +++ b/lib/pangea/choreographer/controllers/it_controller.dart @@ -72,6 +72,7 @@ class ITController { /// if IGC isn't positive that text is full L1 then translate to L1 Future _setSourceText() async { + debugger(when: kDebugMode); // try { if (_itStartData == null || _itStartData!.text.isEmpty) { Sentry.addBreadcrumb( @@ -167,7 +168,7 @@ class ITController { if (isTranslationDone) { choreographer.altTranslator.setTranslationFeedback(); - choreographer.getLanguageHelp(true); + choreographer.getLanguageHelp(onlyTokensAndLanguageDetection: true); } else { getNextTranslationData(); } @@ -218,7 +219,6 @@ class ITController { Future onEditSourceTextSubmit(String newSourceText) async { try { - _isOpen = true; _isEditingSourceText = false; _itStartData = ITStartData(newSourceText, choreographer.l1LangCode); @@ -230,7 +230,6 @@ class ITController { _setSourceText(); getTranslationData(false); - } catch (err, stack) { debugger(when: kDebugMode); if (err is! http.Response) { diff --git a/lib/pangea/controllers/span_data_controller.dart b/lib/pangea/choreographer/controllers/span_data_controller.dart similarity index 100% rename from lib/pangea/controllers/span_data_controller.dart rename to lib/pangea/choreographer/controllers/span_data_controller.dart diff --git a/lib/pangea/choreographer/widgets/start_igc_button.dart b/lib/pangea/choreographer/widgets/start_igc_button.dart index 877158dd2..e8625da95 100644 --- a/lib/pangea/choreographer/widgets/start_igc_button.dart +++ b/lib/pangea/choreographer/widgets/start_igc_button.dart @@ -91,8 +91,8 @@ class StartIGCButtonState extends State if (assistanceState != AssistanceState.fetching) { widget.controller.choreographer .getLanguageHelp( - false, - true, + onlyTokensAndLanguageDetection: false, + manual: true, ) .then((_) { if (widget.controller.choreographer.igc.igcTextData != null && diff --git a/lib/pangea/config/environment.dart b/lib/pangea/config/environment.dart index 4d4378999..de7039f9d 100644 --- a/lib/pangea/config/environment.dart +++ b/lib/pangea/config/environment.dart @@ -5,7 +5,7 @@ class Environment { DateTime.utc(2023, 1, 25).isBefore(DateTime.now()); static String get fileName { - return ".env"; + return ".local_choreo.env"; } static bool get isStaging => synapsURL.contains("staging"); diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index 5a2b9d02a..75a18ad74 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -239,7 +239,7 @@ class MyAnalyticsController { } final List> recentMsgs = (await Future.wait(recentMsgFutures)).toList(); - final List recentActivityReconds = + final List recentActivityRecords = (await Future.wait(recentActivityFutures)) .expand((e) => e) .map((event) => PracticeActivityRecordEvent(event: event)) @@ -284,14 +284,14 @@ class MyAnalyticsController { } // get constructs for messages - final List constructContent = []; + final List recentConstructUses = []; for (final PangeaMessageEvent message in allRecentMessages) { - constructContent.addAll(message.allConstructUses); + recentConstructUses.addAll(message.allConstructUses); } // get constructs for practice activities final List>> constructFutures = []; - for (final PracticeActivityRecordEvent activity in recentActivityReconds) { + for (final PracticeActivityRecordEvent activity in recentActivityRecords) { final Timeline? timeline = timelineMap[activity.event.roomId!]; if (timeline == null) { debugger(when: kDebugMode); @@ -306,13 +306,13 @@ class MyAnalyticsController { final List> constructLists = await Future.wait(constructFutures); - constructContent.addAll(constructLists.expand((e) => e)); + recentConstructUses.addAll(constructLists.expand((e) => e)); //TODO - confirm that this is the correct construct content - debugger(when: kDebugMode); + debugger(when: kDebugMode && recentConstructUses.isNotEmpty); await analyticsRoom.sendConstructsEvent( - constructContent, + recentConstructUses, ); } } diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index b6702d7d2..28253d419 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -656,106 +656,47 @@ class PangeaMessageEvent { } } - List get allConstructUses => - [...grammarConstructUses, ..._vocabUses]; - /// Returns a list of [PracticeActivityEvent] for the user's active l2. - List get practiceActivities { - final String? l2code = - MatrixState.pangeaController.languageController.activeL2Code(); - if (l2code == null) return []; - return practiceActivitiesByLangCode(l2code); - } + List get practiceActivities => + l2Code == null ? [] : practiceActivitiesByLangCode(l2Code!); - // List get activities => - //each match is turned into an activity that other students can access - //they're not told the answer but have to find it themselves - //the message has a blank piece which they fill in themselves + /// all construct uses for the message, including vocab and grammar + List get allConstructUses => + [..._grammarConstructUses, ..._vocabUses]; - /// [tokens] is the final list of tokens that were sent - /// if no ga or ta, - /// make wa use for each and return - /// else - /// for each saveable vocab in the final message - /// if vocab is contained in an accepted replacement, make ga use - /// if vocab is contained in ta choice, - /// if selected as choice, corIt - /// if written as customInput, corIt? (account for score in this) - /// for each it step - /// for each continuance - /// if not within the final message, save ignIT/incIT + /// get construct uses of type vocab for the message List get _vocabUses { + debugger(); final List uses = []; - if (event.roomId == null) return uses; - - List lemmasToVocabUses( - List lemmas, - ConstructUseTypeEnum type, - ) { - final List uses = []; - for (final lemma in lemmas) { - if (lemma.saveVocab) { - uses.add( - OneConstructUse( - useType: type, - chatId: event.roomId!, - timeStamp: event.originServerTs, - lemma: lemma.text, - form: lemma.form, - msgId: event.eventId, - constructType: ConstructTypeEnum.vocab, - ), - ); - } - } + // missing vital info so return. should not happen + if (event.roomId == null) { + debugger(when: kDebugMode); return uses; } - List getVocabUseForToken(PangeaToken token) { - if (originalSent?.choreo == null) { - final bool inUserL2 = originalSent?.langCode == l2Code; - return lemmasToVocabUses( - token.lemmas, - inUserL2 ? ConstructUseTypeEnum.wa : ConstructUseTypeEnum.unk, - ); - } - - // - for (final step in originalSent!.choreo!.choreoSteps) { - /// if 1) accepted match 2) token is in the replacement and 3) replacement - /// is in the overall step text, then token was a ga - if (step.acceptedOrIgnoredMatch?.status == PangeaMatchStatus.accepted && - (step.acceptedOrIgnoredMatch!.match.choices?.any( - (r) => - r.value.contains(token.text.content) && - step.text.contains(r.value), - ) ?? - false)) { - return lemmasToVocabUses(token.lemmas, ConstructUseTypeEnum.ga); - } - if (step.itStep != null) { - final bool pickedThroughIT = step.itStep!.chosenContinuance?.text - .contains(token.text.content) ?? - false; - if (pickedThroughIT) { - return lemmasToVocabUses(token.lemmas, ConstructUseTypeEnum.corIt); - //PTODO - check if added via custom input in IT flow - } - } - } - return lemmasToVocabUses(token.lemmas, ConstructUseTypeEnum.wa); - } - - /// for each token, record whether selected in ga, ta, or wa + // for each token, record whether selected in ga, ta, or wa if (originalSent?.tokens != null) { for (final token in originalSent!.tokens!) { - uses.addAll(getVocabUseForToken(token)); + uses.addAll(_getVocabUseForToken(token)); } } - if (originalSent?.choreo == null) return uses; + // add construct uses related to IT use + uses.addAll(_itStepsToConstructUses); + return uses; + } + + /// Returns a list of [OneConstructUse] from itSteps for which the continuance + /// was selected or ignored. Correct selections are considered in the tokens + /// flow. Once all continuances have lemmas, we can do both correct and incorrect + /// in this flow. It actually doesn't do anything at all right now, because the + /// choregrapher is not returning lemmas for continuances. This is a TODO. + /// So currently only the lemmas can be gotten from the tokens for choices that + /// are actually in the final message. + List get _itStepsToConstructUses { + final List uses = []; for (final itStep in originalSent!.choreo!.itSteps) { for (final continuance in itStep.continuances) { // this seems to always be false for continuances right now @@ -767,23 +708,98 @@ class PangeaMessageEvent { //PTODO - account for end of flow score if (continuance.level != ChoreoConstants.levelThresholdForGreen) { uses.addAll( - lemmasToVocabUses(continuance.lemmas, ConstructUseTypeEnum.incIt), + _lemmasToVocabUses( + continuance.lemmas, + ConstructUseTypeEnum.incIt, + ), ); } } else { if (continuance.level != ChoreoConstants.levelThresholdForGreen) { uses.addAll( - lemmasToVocabUses(continuance.lemmas, ConstructUseTypeEnum.ignIt), + _lemmasToVocabUses( + continuance.lemmas, + ConstructUseTypeEnum.ignIt, + ), ); } } } } - return uses; } - List get grammarConstructUses { + /// Returns a list of [OneConstructUse] objects for the given [token] + /// If there is no [originalSent] or [originalSent.choreo], the [token] is + /// considered to be a [ConstructUseTypeEnum.wa] as long as it matches the target language. + /// Later on, we may want to consider putting it in some category of like 'pending' + /// If the [token] is in the [originalSent.choreo.acceptedOrIgnoredMatch], + /// it is considered to be a [ConstructUseTypeEnum.ga]. + /// If the [token] is in the [originalSent.choreo.acceptedOrIgnoredMatch.choices], + /// it is considered to be a [ConstructUseTypeEnum.corIt]. + /// If the [token] is not included in any choreoStep, it is considered to be a [ConstructUseTypeEnum.wa]. + List _getVocabUseForToken(PangeaToken token) { + debugger(); + if (originalSent?.choreo == null) { + final bool inUserL2 = originalSent?.langCode == l2Code; + return _lemmasToVocabUses( + token.lemmas, + inUserL2 ? ConstructUseTypeEnum.wa : ConstructUseTypeEnum.unk, + ); + } + + for (final step in originalSent!.choreo!.choreoSteps) { + /// if 1) accepted match 2) token is in the replacement and 3) replacement + /// is in the overall step text, then token was a ga + if (step.acceptedOrIgnoredMatch?.status == PangeaMatchStatus.accepted && + (step.acceptedOrIgnoredMatch!.match.choices?.any( + (r) => + r.value.contains(token.text.content) && + step.text.contains(r.value), + ) ?? + false)) { + return _lemmasToVocabUses(token.lemmas, ConstructUseTypeEnum.ga); + } + if (step.itStep != null) { + final bool pickedThroughIT = + step.itStep!.chosenContinuance?.text.contains(token.text.content) ?? + false; + if (pickedThroughIT) { + return _lemmasToVocabUses(token.lemmas, ConstructUseTypeEnum.corIt); + //PTODO - check if added via custom input in IT flow + } + } + } + return _lemmasToVocabUses(token.lemmas, ConstructUseTypeEnum.wa); + } + + /// Convert a list of [lemmas] into a list of vocab uses + /// with the given [type] + List _lemmasToVocabUses( + List lemmas, + ConstructUseTypeEnum type, + ) { + final List uses = []; + for (final lemma in lemmas) { + if (lemma.saveVocab) { + uses.add( + OneConstructUse( + useType: type, + chatId: event.roomId!, + timeStamp: event.originServerTs, + lemma: lemma.text, + form: lemma.form, + msgId: event.eventId, + constructType: ConstructTypeEnum.vocab, + ), + ); + } + } + return uses; + } + + /// get construct uses of type grammar for the message + List get _grammarConstructUses { final List uses = []; if (originalSent?.choreo == null || event.roomId == null) return uses; diff --git a/lib/pangea/repo/igc_repo.dart b/lib/pangea/repo/igc_repo.dart index 9517515d0..5f281abe6 100644 --- a/lib/pangea/repo/igc_repo.dart +++ b/lib/pangea/repo/igc_repo.dart @@ -89,7 +89,6 @@ class IGCRequestBody { String fullText; String userL1; String userL2; - bool tokensOnly; bool enableIT; bool enableIGC; @@ -99,7 +98,6 @@ class IGCRequestBody { required this.userL2, required this.enableIGC, required this.enableIT, - this.tokensOnly = false, }); Map toJson() => { @@ -108,6 +106,5 @@ class IGCRequestBody { ModelKey.userL2: userL2, "enable_it": enableIT, "enable_igc": enableIGC, - "tokens_only": tokensOnly, }; } From 25263317068e058e0f84d58f7cf1d252974f62c0 Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Sun, 30 Jun 2024 12:08:30 -0400 Subject: [PATCH 49/54] using getIGCTextData to fetch tokens and languages if not present --- .../controllers/choreographer.dart | 57 +++----- .../controllers/igc_controller.dart | 133 +++++++----------- .../controllers/it_controller.dart | 13 +- .../controllers/my_analytics_controller.dart | 5 +- .../pangea_message_event.dart | 2 - lib/pangea/models/igc_text_data_model.dart | 26 ++-- lib/pangea/repo/igc_repo.dart | 6 +- 7 files changed, 103 insertions(+), 139 deletions(-) diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 77130f635..42661b81e 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -117,34 +117,39 @@ class Choreographer { // TODO - move this to somewhere such that the message can be cleared from the input field // before the language detection is complete. Otherwise, user is going to be waiting // in cases of slow internet or slow language detection - final String originalSentLangCode = langCodeOfCurrentText ?? - (await pangeaController.languageDetection.detectLanguage( - currentText, - pangeaController.languageController.userL2?.langCode, - pangeaController.languageController.userL1?.langCode, - )) - .bestDetection() - .langCode; - - final PangeaRepresentation originalSent = PangeaRepresentation( - langCode: originalSentLangCode, - text: currentText, - originalSent: true, - originalWritten: originalWritten == null, - ); + final String? originalSentLangCode = igc.igcTextData?.detectedLanguage; // TODO - why does both it and igc need to be enabled for choreo to be applicable? final ChoreoRecord? applicableChoreo = isITandIGCEnabled && igc.igcTextData != null ? choreoRecord : null; final UseType useType = useTypeCalculator(applicableChoreo); - debugPrint("use type in choreographer $useType"); + + // if tokens or language detection are not available, get them + // note that we probably need to move this to after we clear the input field + // or the user could experience some lag here. note that this call is being + // made after we've determined if we have an applicable choreo in order to + // say whether correction was run on the message. we may eventually want + // to edit the useType after + if (igc.igcTextData?.tokens == null || + igc.igcTextData?.detectedLanguage == null) { + await igc.getIGCTextData(onlyTokensAndLanguageDetection: true); + } + + final PangeaRepresentation originalSent = PangeaRepresentation( + langCode: originalSentLangCode ?? LanguageKeys.unknownLanguage, + text: currentText, + originalSent: true, + originalWritten: originalWritten == null, + ); + debugger(when: kDebugMode); chatController.send( // PTODO - turn this back on in conjunction with saving tokens // we need to save those tokens as well, in order for exchanges to work // properly. in an exchange, the other user will want // originalWritten: originalWritten, + originalSent: originalSent, tokensSent: igc.igcTextData?.tokens != null ? PangeaMessageTokens(tokens: igc.igcTextData!.tokens) @@ -170,7 +175,7 @@ class Choreographer { } choreoMode = ChoreoMode.it; itController.initializeIT( - ITStartData(_textController.text, igc.detectedLangCode), + ITStartData(_textController.text, igc.igcTextData?.detectedLanguage), ); itMatch.status = PangeaMatchStatus.accepted; @@ -195,7 +200,7 @@ class Choreographer { // this may be unnecessary now that tokens are not used // to allow click of words in the input field and we're getting this at the end // TODO - turn it off and tested that this is fine - igc.justGetTokensAndAddThemToIGCTextData(); + // igc.justGetTokensAndAddThemToIGCTextData(); // we set editType to keyboard here because that is the default for it // and we want to make sure that the next change is treated as a keyboard change @@ -499,22 +504,6 @@ class Choreographer { bool get editTypeIsKeyboard => EditType.keyboard == _textController.editType; - /// If there is applicable igcTextData, return the detected langCode - /// Otherwise, if the IT controller is open, return the user's L2 langCode - /// This second piece assumes that IT is being used to translate into the user's L2 - /// and could be spotty. It's a bit of a hack, and should be tested more. - String? get langCodeOfCurrentText { - if (igc.detectedLangCode != null) return igc.detectedLangCode!; - - // TODO - this is a bit of a hack, and should be tested more - // we should also check that user has not done customInput - if (itController.completedITSteps.isNotEmpty && itController.allCorrect) { - return l2LangCode!; - } - - return null; - } - setState() { if (!stateListener.isClosed) { stateListener.add(0); diff --git a/lib/pangea/choreographer/controllers/igc_controller.dart b/lib/pangea/choreographer/controllers/igc_controller.dart index a694c48a5..fed4a3167 100644 --- a/lib/pangea/choreographer/controllers/igc_controller.dart +++ b/lib/pangea/choreographer/controllers/igc_controller.dart @@ -10,11 +10,8 @@ import 'package:fluffychat/pangea/repo/igc_repo.dart'; import 'package:fluffychat/pangea/widgets/igc/span_card.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:sentry_flutter/sentry_flutter.dart'; -import '../../models/language_detection_model.dart'; import '../../models/span_card_model.dart'; -import '../../repo/tokens_repo.dart'; import '../../utils/error_handler.dart'; import '../../utils/overlay.dart'; @@ -64,22 +61,6 @@ class IgcController { return; } - //TO-DO: in api call, specify turning off IT and/or grammar checking - // UPDATE: This is now done in the API call. New TODO is to test this. - // if (!choreographer.igcEnabled) { - // igcTextDataResponse.matches = igcTextDataResponse.matches - // .where((match) => !match.isGrammarMatch) - // .toList(); - // } - // if (!choreographer.itEnabled) { - // igcTextDataResponse.matches = igcTextDataResponse.matches - // .where((match) => !match.isOutOfTargetMatch) - // .toList(); - // } - // if (!choreographer.itEnabled && !choreographer.igcEnabled) { - // igcTextDataResponse.matches = []; - // } - igcTextData = igcTextDataResponse; // TODO - for each new match, @@ -106,61 +87,61 @@ class IgcController { } } - Future justGetTokensAndAddThemToIGCTextData() async { - try { - if (igcTextData == null) { - debugger(when: kDebugMode); - choreographer.getLanguageHelp(); - return; - } - igcTextData!.loading = true; - choreographer.startLoading(); - if (igcTextData!.originalInput != choreographer.textController.text) { - debugger(when: kDebugMode); - ErrorHandler.logError( - m: "igcTextData fullText does not match current text", - s: StackTrace.current, - data: igcTextData!.toJson(), - ); - } + // Future justGetTokensAndAddThemToIGCTextData() async { + // try { + // if (igcTextData == null) { + // debugger(when: kDebugMode); + // choreographer.getLanguageHelp(); + // return; + // } + // igcTextData!.loading = true; + // choreographer.startLoading(); + // if (igcTextData!.originalInput != choreographer.textController.text) { + // debugger(when: kDebugMode); + // ErrorHandler.logError( + // m: "igcTextData fullText does not match current text", + // s: StackTrace.current, + // data: igcTextData!.toJson(), + // ); + // } - if (choreographer.l1LangCode == null || - choreographer.l2LangCode == null) { - debugger(when: kDebugMode); - ErrorHandler.logError( - m: "l1LangCode and/or l2LangCode is null", - s: StackTrace.current, - data: { - "l1LangCode": choreographer.l1LangCode, - "l2LangCode": choreographer.l2LangCode, - }, - ); - return; - } + // if (choreographer.l1LangCode == null || + // choreographer.l2LangCode == null) { + // debugger(when: kDebugMode); + // ErrorHandler.logError( + // m: "l1LangCode and/or l2LangCode is null", + // s: StackTrace.current, + // data: { + // "l1LangCode": choreographer.l1LangCode, + // "l2LangCode": choreographer.l2LangCode, + // }, + // ); + // return; + // } - final TokensResponseModel res = await TokensRepo.tokenize( - await choreographer.pangeaController.userController.accessToken, - TokensRequestModel( - fullText: igcTextData!.originalInput, - userL1: choreographer.l1LangCode!, - userL2: choreographer.l2LangCode!, - ), - ); - igcTextData?.tokens = res.tokens; - } catch (err, stack) { - debugger(when: kDebugMode); - choreographer.errorService.setError( - ChoreoError(type: ChoreoErrorType.unknown, raw: err), - ); - Sentry.addBreadcrumb( - Breadcrumb.fromJson({"igctextDdata": igcTextData?.toJson()}), - ); - ErrorHandler.logError(e: err, s: stack); - } finally { - igcTextData?.loading = false; - choreographer.stopLoading(); - } - } + // final TokensResponseModel res = await TokensRepo.tokenize( + // await choreographer.pangeaController.userController.accessToken, + // TokensRequestModel( + // fullText: igcTextData!.originalInput, + // userL1: choreographer.l1LangCode!, + // userL2: choreographer.l2LangCode!, + // ), + // ); + // igcTextData?.tokens = res.tokens; + // } catch (err, stack) { + // debugger(when: kDebugMode); + // choreographer.errorService.setError( + // ChoreoError(type: ChoreoErrorType.unknown, raw: err), + // ); + // Sentry.addBreadcrumb( + // Breadcrumb.fromJson({"igctextDdata": igcTextData?.toJson()}), + // ); + // ErrorHandler.logError(e: err, s: stack); + // } finally { + // igcTextData?.loading = false; + // choreographer.stopLoading(); + // } + // } void showFirstMatch(BuildContext context) { if (igcTextData == null || igcTextData!.matches.isEmpty) { @@ -218,14 +199,6 @@ class IgcController { return true; } - String? get detectedLangCode { - if (!hasRelevantIGCTextData) return null; - - final LanguageDetection first = igcTextData!.detections.first; - - return first.langCode; - } - clear() { igcTextData = null; spanDataController.clearCache(); diff --git a/lib/pangea/choreographer/controllers/it_controller.dart b/lib/pangea/choreographer/controllers/it_controller.dart index 225d2fec6..9e70287cd 100644 --- a/lib/pangea/choreographer/controllers/it_controller.dart +++ b/lib/pangea/choreographer/controllers/it_controller.dart @@ -72,8 +72,6 @@ class ITController { /// if IGC isn't positive that text is full L1 then translate to L1 Future _setSourceText() async { - debugger(when: kDebugMode); - // try { if (_itStartData == null || _itStartData!.text.isEmpty) { Sentry.addBreadcrumb( Breadcrumb( @@ -98,21 +96,12 @@ class ITController { request: FullTextTranslationRequestModel( text: _itStartData!.text, tgtLang: choreographer.l1LangCode!, - srcLang: choreographer.l2LangCode, + srcLang: _itStartData!.langCode, userL1: choreographer.l1LangCode!, userL2: choreographer.l2LangCode!, ), ); sourceText = res.bestTranslation; - // } catch (err, stack) { - // debugger(when: kDebugMode); - // if (_itStartData?.text.isNotEmpty ?? false) { - // ErrorHandler.logError(e: err, s: stack); - // sourceText = _itStartData!.text; - // } else { - // rethrow; - // } - // } } // used 1) at very beginning (with custom input = null) diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index 75a18ad74..14b3555a1 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -309,7 +309,10 @@ class MyAnalyticsController { recentConstructUses.addAll(constructLists.expand((e) => e)); //TODO - confirm that this is the correct construct content - debugger(when: kDebugMode && recentConstructUses.isNotEmpty); + debugger( + when: kDebugMode && + (recentPangeaMessageEvents.isNotEmpty || + recentActivityRecords.isNotEmpty)); await analyticsRoom.sendConstructsEvent( recentConstructUses, diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index 28253d419..2f529e528 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -666,7 +666,6 @@ class PangeaMessageEvent { /// get construct uses of type vocab for the message List get _vocabUses { - debugger(); final List uses = []; // missing vital info so return. should not happen @@ -739,7 +738,6 @@ class PangeaMessageEvent { /// it is considered to be a [ConstructUseTypeEnum.corIt]. /// If the [token] is not included in any choreoStep, it is considered to be a [ConstructUseTypeEnum.wa]. List _getVocabUseForToken(PangeaToken token) { - debugger(); if (originalSent?.choreo == null) { final bool inUserL2 = originalSent?.langCode == l2Code; return _lemmasToVocabUses( diff --git a/lib/pangea/models/igc_text_data_model.dart b/lib/pangea/models/igc_text_data_model.dart index 6a3eec96e..fb9388514 100644 --- a/lib/pangea/models/igc_text_data_model.dart +++ b/lib/pangea/models/igc_text_data_model.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:fluffychat/pangea/controllers/language_detection_controller.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart'; import 'package:fluffychat/pangea/models/pangea_token_model.dart'; import 'package:fluffychat/pangea/models/span_card_model.dart'; @@ -13,12 +14,11 @@ import 'package:matrix/matrix.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import '../constants/model_keys.dart'; -import 'language_detection_model.dart'; // import 'package:language_tool/language_tool.dart'; class IGCTextData { - List detections; + LanguageDetectionResponse detections; String originalInput; String? fullTextCorrection; List tokens; @@ -42,6 +42,17 @@ class IGCTextData { }); factory IGCTextData.fromJson(Map json) { + // changing this to allow for use of the LanguageDetectionResponse methods + // TODO - change API after we're sure all clients are updated. not urgent. + final LanguageDetectionResponse detections = + json[_detectionsKey] is Iterable + ? LanguageDetectionResponse.fromJson({ + "detections": json[_detectionsKey], + "full_text": json["original_input"], + }) + : LanguageDetectionResponse.fromJson( + json[_detectionsKey] as Map); + return IGCTextData( tokens: (json[_tokensKey] as Iterable) .map( @@ -59,12 +70,7 @@ class IGCTextData { .toList() .cast() : [], - detections: (json[_detectionsKey] as Iterable) - .map( - (e) => LanguageDetection.fromJson(e as Map), - ) - .toList() - .cast(), + detections: detections, originalInput: json["original_input"], fullTextCorrection: json["full_text_correction"], userL1: json[ModelKey.userL1], @@ -79,7 +85,7 @@ class IGCTextData { static const String _detectionsKey = "detections"; Map toJson() => { - _detectionsKey: detections.map((e) => e.toJson()).toList(), + _detectionsKey: detections.toJson(), "original_input": originalInput, "full_text_correction": fullTextCorrection, _tokensKey: tokens.map((e) => e.toJson()).toList(), @@ -90,6 +96,8 @@ class IGCTextData { "enable_igc": enableIGC, }; + String get detectedLanguage => detections.bestDetection().langCode; + // reconstruct fullText based on accepted match //update offsets in existing matches to reflect the change //if existing matches overlap with the accepted one, remove them?? diff --git a/lib/pangea/repo/igc_repo.dart b/lib/pangea/repo/igc_repo.dart index 5f281abe6..d3dbbcb6b 100644 --- a/lib/pangea/repo/igc_repo.dart +++ b/lib/pangea/repo/igc_repo.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:fluffychat/pangea/config/environment.dart'; +import 'package:fluffychat/pangea/controllers/language_detection_controller.dart'; import 'package:fluffychat/pangea/models/language_detection_model.dart'; import 'package:fluffychat/pangea/models/lemma.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart'; @@ -39,7 +40,10 @@ class IgcRepo { await Future.delayed(const Duration(seconds: 2)); final IGCTextData igcTextData = IGCTextData( - detections: [LanguageDetection(langCode: "en", confidence: 0.99)], + detections: LanguageDetectionResponse( + detections: [LanguageDetection(langCode: "en", confidence: 0.99)], + fullText: "This be a sample text", + ), tokens: [ PangeaToken( text: PangeaTokenText(content: "This", offset: 0, length: 4), From c6d3f36805eaf8140915b77f8012abcaedd67b08 Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Sun, 30 Jun 2024 18:31:53 -0400 Subject: [PATCH 50/54] saving of tokens, changing of top language calculation, documentation --- lib/pages/chat/chat.dart | 4 -- lib/pages/chat/events/message.dart | 2 +- .../controllers/choreographer.dart | 46 +++++--------- lib/pangea/constants/model_keys.dart | 1 - .../language_detection_controller.dart | 13 ++-- .../controllers/my_analytics_controller.dart | 13 ++-- lib/pangea/enum/use_type.dart | 16 ----- .../events_extension.dart | 4 +- .../pangea_room_extension.dart | 3 - .../pangea_message_event.dart | 61 +++++++++++-------- .../analytics/summary_analytics_model.dart | 2 +- lib/pangea/models/igc_text_data_model.dart | 15 ++++- lib/pangea/models/lemma.dart | 7 +++ lib/pangea/utils/firebase_analytics.dart | 4 +- lib/pangea/widgets/chat/overlay_message.dart | 2 +- lib/pangea/widgets/new_group/vocab_list.dart | 11 ++-- 16 files changed, 96 insertions(+), 108 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 13f09ffb6..5629d809e 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -16,7 +16,6 @@ import 'package:fluffychat/pages/chat/recording_dialog.dart'; import 'package:fluffychat/pages/chat_details/chat_details.dart'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; -import 'package:fluffychat/pangea/enum/use_type.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/choreo_record.dart'; @@ -586,7 +585,6 @@ class ChatController extends State PangeaMessageTokens? tokensSent, PangeaMessageTokens? tokensWritten, ChoreoRecord? choreo, - UseType? useType, }) async { // Pangea# if (sendController.text.trim().isEmpty) return; @@ -630,7 +628,6 @@ class ChatController extends State tokensSent: tokensSent, tokensWritten: tokensWritten, choreo: choreo, - useType: useType, ) .then( (String? msgEventId) async { @@ -644,7 +641,6 @@ class ChatController extends State GoogleAnalytics.sendMessage( room.id, room.classCode, - useType ?? UseType.un, ); if (msgEventId == null) { diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index c5756438c..3b2c1b2fb 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -470,7 +470,7 @@ class Message extends StatelessWidget { ?.showUseType ?? false) ...[ pangeaMessageEvent! - .useType + .msgUseType .iconView( context, textColor diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 42661b81e..3e7668323 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -24,7 +24,6 @@ import 'package:flutter/material.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import '../../../widgets/matrix.dart'; -import '../../enum/use_type.dart'; import '../../models/choreo_record.dart'; import '../../models/language_model.dart'; import '../../models/pangea_match_model.dart'; @@ -108,27 +107,16 @@ class Choreographer { originalSent: false, ) : null; - //TODO - confirm that IT is indeed making sure the message is in the user's L1 - - // if the message has not been processed to determine its language - // then run it through the language detection endpoint. If the detection - // confidence is high enough, use that language code as the message's language - // to save that pangea representation - // TODO - move this to somewhere such that the message can be cleared from the input field - // before the language detection is complete. Otherwise, user is going to be waiting - // in cases of slow internet or slow language detection - final String? originalSentLangCode = igc.igcTextData?.detectedLanguage; // TODO - why does both it and igc need to be enabled for choreo to be applicable? - final ChoreoRecord? applicableChoreo = - isITandIGCEnabled && igc.igcTextData != null ? choreoRecord : null; + // final ChoreoRecord? applicableChoreo = + // isITandIGCEnabled && igc.igcTextData != null ? choreoRecord : null; - final UseType useType = useTypeCalculator(applicableChoreo); - - // if tokens or language detection are not available, get them - // note that we probably need to move this to after we clear the input field - // or the user could experience some lag here. note that this call is being - // made after we've determined if we have an applicable choreo in order to + // if tokens or language detection are not available, we should get them + // notes + // 1) we probably need to move this to after we clear the input field + // or the user could experience some lag here. + // 2) that this call is being made after we've determined if we have an applicable choreo in order to // say whether correction was run on the message. we may eventually want // to edit the useType after if (igc.igcTextData?.tokens == null || @@ -137,26 +125,24 @@ class Choreographer { } final PangeaRepresentation originalSent = PangeaRepresentation( - langCode: originalSentLangCode ?? LanguageKeys.unknownLanguage, + langCode: + igc.igcTextData?.detectedLanguage ?? LanguageKeys.unknownLanguage, text: currentText, originalSent: true, originalWritten: originalWritten == null, ); - debugger(when: kDebugMode); + + final PangeaMessageTokens? tokensSent = igc.igcTextData?.tokens != null + ? PangeaMessageTokens(tokens: igc.igcTextData!.tokens) + : null; chatController.send( - // PTODO - turn this back on in conjunction with saving tokens - // we need to save those tokens as well, in order for exchanges to work - // properly. in an exchange, the other user will want // originalWritten: originalWritten, - originalSent: originalSent, - tokensSent: igc.igcTextData?.tokens != null - ? PangeaMessageTokens(tokens: igc.igcTextData!.tokens) - : null, + tokensSent: tokensSent, //TODO - save originalwritten tokens - choreo: applicableChoreo, - useType: useType, + // choreo: applicableChoreo, + choreo: choreoRecord, ); clear(); diff --git a/lib/pangea/constants/model_keys.dart b/lib/pangea/constants/model_keys.dart index ca59d89b7..372e72606 100644 --- a/lib/pangea/constants/model_keys.dart +++ b/lib/pangea/constants/model_keys.dart @@ -66,7 +66,6 @@ class ModelKey { static const String tokensSent = "tokens_sent"; static const String tokensWritten = "tokens_written"; static const String choreoRecord = "choreo_record"; - static const String useType = "use_type"; static const String baseDefinition = "base_definition"; static const String targetDefinition = "target_definition"; diff --git a/lib/pangea/controllers/language_detection_controller.dart b/lib/pangea/controllers/language_detection_controller.dart index 08f38ea2c..a3e07b0a3 100644 --- a/lib/pangea/controllers/language_detection_controller.dart +++ b/lib/pangea/controllers/language_detection_controller.dart @@ -76,15 +76,20 @@ class LanguageDetectionResponse { }; } - LanguageDetection get _bestDetection { + /// Return the highest confidence detection. + /// If there are no detections, the unknown language detection is returned. + LanguageDetection get highestConfidenceDetection { detections.sort((a, b) => b.confidence.compareTo(a.confidence)); return detections.firstOrNull ?? unknownLanguageDetection; } - LanguageDetection bestDetection({double? threshold}) => - _bestDetection.confidence >= + /// Returns the highest validated detection based on the confidence threshold. + /// If the highest confidence detection is below the threshold, the unknown language + /// detection is returned. + LanguageDetection highestValidatedDetection({double? threshold}) => + highestConfidenceDetection.confidence >= (threshold ?? languageDetectionConfidenceThreshold) - ? _bestDetection + ? highestConfidenceDetection : unknownLanguageDetection; } diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index 14b3555a1..1ae6f2a5b 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -216,8 +216,6 @@ class MyAnalyticsController { .where((room) => !room.isSpace && !room.isAnalyticsRoom) .toList(); - final DateTime now = DateTime.now(); - // get the recent message events and activity records for each chat final List>> recentMsgFutures = []; final List>> recentActivityFutures = []; @@ -309,10 +307,13 @@ class MyAnalyticsController { recentConstructUses.addAll(constructLists.expand((e) => e)); //TODO - confirm that this is the correct construct content - debugger( - when: kDebugMode && - (recentPangeaMessageEvents.isNotEmpty || - recentActivityRecords.isNotEmpty)); + // debugger( + // when: kDebugMode, + // ); + // ; debugger( + // when: kDebugMode && + // (allRecentMessages.isNotEmpty || recentActivityRecords.isNotEmpty), + // ); await analyticsRoom.sendConstructsEvent( recentConstructUses, diff --git a/lib/pangea/enum/use_type.dart b/lib/pangea/enum/use_type.dart index 771b26220..56a4fa3b0 100644 --- a/lib/pangea/enum/use_type.dart +++ b/lib/pangea/enum/use_type.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; - import 'package:flutter_gen/gen_l10n/l10n.dart'; -import '../models/choreo_record.dart'; import '../utils/bot_style.dart'; enum UseType { wa, ta, ga, un } @@ -93,17 +91,3 @@ extension UseTypeMethods on UseType { } } } - -UseType useTypeCalculator( - ChoreoRecord? choreoRecord, -) { - if (choreoRecord == null) { - return UseType.un; - } else if (choreoRecord.includedIT) { - return UseType.ta; - } else if (choreoRecord.hasAcceptedMatches) { - return UseType.ga; - } else { - return UseType.wa; - } -} diff --git a/lib/pangea/extensions/pangea_room_extension/events_extension.dart b/lib/pangea/extensions/pangea_room_extension/events_extension.dart index 0f40da5c7..ce9d3451c 100644 --- a/lib/pangea/extensions/pangea_room_extension/events_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/events_extension.dart @@ -229,7 +229,6 @@ extension EventsRoomExtension on Room { PangeaMessageTokens? tokensSent, PangeaMessageTokens? tokensWritten, ChoreoRecord? choreo, - UseType? useType, }) { // if (parseCommands) { // return client.parseAndRunCommand(this, message, @@ -247,7 +246,6 @@ extension EventsRoomExtension on Room { ModelKey.originalWritten: originalWritten?.toJson(), ModelKey.tokensSent: tokensSent?.toJson(), ModelKey.tokensWritten: tokensWritten?.toJson(), - ModelKey.useType: useType?.string, }; if (parseMarkdown) { final html = markdown( @@ -347,7 +345,7 @@ extension EventsRoomExtension on Room { RecentMessageRecord( eventId: event.eventId, chatId: id, - useType: pMsgEvent.useType, + useType: pMsgEvent.msgUseType, time: event.originServerTs, ), ); diff --git a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index 78ecb9cc0..21f5abac5 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -34,7 +34,6 @@ import 'package:sentry_flutter/sentry_flutter.dart'; import '../../../config/app_config.dart'; import '../../constants/pangea_event_types.dart'; -import '../../enum/use_type.dart'; import '../../models/choreo_record.dart'; import '../../models/representation_content_model.dart'; import '../client_extension/client_extension.dart'; @@ -181,7 +180,6 @@ extension PangeaRoom on Room { PangeaMessageTokens? tokensSent, PangeaMessageTokens? tokensWritten, ChoreoRecord? choreo, - UseType? useType, }) => _pangeaSendTextEvent( message, @@ -198,7 +196,6 @@ extension PangeaRoom on Room { tokensSent: tokensSent, tokensWritten: tokensWritten, choreo: choreo, - useType: useType, ); Future updateStateEvent(Event stateEvent) => diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index 2f529e528..e0820d665 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -37,7 +37,6 @@ class PangeaMessageEvent { late Event _event; final Timeline timeline; final bool ownMessage; - bool _isValidPangeaMessageEvent = true; PangeaMessageEvent({ required Event event, @@ -45,7 +44,7 @@ class PangeaMessageEvent { required this.ownMessage, }) { if (event.type != EventTypes.Message) { - _isValidPangeaMessageEvent = false; + debugger(when: kDebugMode); ErrorHandler.logError( m: "${event.type} should not be used to make a PangeaMessageEvent", ); @@ -548,7 +547,18 @@ class PangeaMessageEvent { originalWritten: false, ); - UseType get useType => useTypeCalculator(originalSent?.choreo); + UseType get msgUseType { + final ChoreoRecord? choreoRecord = originalSent?.choreo; + if (choreoRecord == null) { + return UseType.un; + } else if (choreoRecord.includedIT) { + return UseType.ta; + } else if (choreoRecord.hasAcceptedMatches) { + return UseType.ga; + } else { + return UseType.wa; + } + } bool get showUseType => !ownMessage && @@ -662,30 +672,7 @@ class PangeaMessageEvent { /// all construct uses for the message, including vocab and grammar List get allConstructUses => - [..._grammarConstructUses, ..._vocabUses]; - - /// get construct uses of type vocab for the message - List get _vocabUses { - final List uses = []; - - // missing vital info so return. should not happen - if (event.roomId == null) { - debugger(when: kDebugMode); - return uses; - } - - // for each token, record whether selected in ga, ta, or wa - if (originalSent?.tokens != null) { - for (final token in originalSent!.tokens!) { - uses.addAll(_getVocabUseForToken(token)); - } - } - - // add construct uses related to IT use - uses.addAll(_itStepsToConstructUses); - - return uses; - } + [..._grammarConstructUses, ..._vocabUses, ..._itStepsToConstructUses]; /// Returns a list of [OneConstructUse] from itSteps for which the continuance /// was selected or ignored. Correct selections are considered in the tokens @@ -696,6 +683,8 @@ class PangeaMessageEvent { /// are actually in the final message. List get _itStepsToConstructUses { final List uses = []; + if (originalSent?.choreo == null) return uses; + for (final itStep in originalSent!.choreo!.itSteps) { for (final continuance in itStep.continuances) { // this seems to always be false for continuances right now @@ -728,6 +717,24 @@ class PangeaMessageEvent { return uses; } + /// get construct uses of type vocab for the message + List get _vocabUses { + final List uses = []; + + // missing vital info so return + if (event.roomId == null || originalSent?.tokens == null) { + debugger(when: kDebugMode); + return uses; + } + + // for each token, record whether selected in ga, ta, or wa + for (final token in originalSent!.tokens!) { + uses.addAll(_getVocabUseForToken(token)); + } + + return uses; + } + /// Returns a list of [OneConstructUse] objects for the given [token] /// If there is no [originalSent] or [originalSent.choreo], the [token] is /// considered to be a [ConstructUseTypeEnum.wa] as long as it matches the target language. diff --git a/lib/pangea/models/analytics/summary_analytics_model.dart b/lib/pangea/models/analytics/summary_analytics_model.dart index b09d0a870..0b8e4b27c 100644 --- a/lib/pangea/models/analytics/summary_analytics_model.dart +++ b/lib/pangea/models/analytics/summary_analytics_model.dart @@ -50,7 +50,7 @@ class SummaryAnalyticsModel extends AnalyticsModel { (msg) => RecentMessageRecord( eventId: msg.eventId, chatId: msg.room.id, - useType: msg.useType, + useType: msg.msgUseType, time: msg.originServerTs, ), ) diff --git a/lib/pangea/models/igc_text_data_model.dart b/lib/pangea/models/igc_text_data_model.dart index fb9388514..442bf4a60 100644 --- a/lib/pangea/models/igc_text_data_model.dart +++ b/lib/pangea/models/igc_text_data_model.dart @@ -51,7 +51,8 @@ class IGCTextData { "full_text": json["original_input"], }) : LanguageDetectionResponse.fromJson( - json[_detectionsKey] as Map); + json[_detectionsKey] as Map, + ); return IGCTextData( tokens: (json[_tokensKey] as Iterable) @@ -96,7 +97,17 @@ class IGCTextData { "enable_igc": enableIGC, }; - String get detectedLanguage => detections.bestDetection().langCode; + /// if we haven't run IGC or IT or there are no matches, we use the highest validated detection + /// from [LanguageDetectionResponse.highestValidatedDetection] + /// if we have run igc/it and there are no matches, we can relax the threshold + /// and use the highest confidence detection + String get detectedLanguage { + if (!(enableIGC && enableIT) || matches.isNotEmpty) { + return detections.highestValidatedDetection().langCode; + } else { + return detections.highestConfidenceDetection.langCode; + } + } // reconstruct fullText based on accepted match //update offsets in existing matches to reflect the change diff --git a/lib/pangea/models/lemma.dart b/lib/pangea/models/lemma.dart index 2ad0b2950..56f23d876 100644 --- a/lib/pangea/models/lemma.dart +++ b/lib/pangea/models/lemma.dart @@ -1,6 +1,13 @@ +/// Represents a lemma object class Lemma { + /// [text] ex "ir" - text of the lemma of the word final String text; + + /// [form] ex "vamos" - conjugated form of the lemma and as it appeared in some original text final String form; + + /// [saveVocab] true - whether to save the lemma to the user's vocabulary + /// vocab that are not saved: emails, urls, numbers, punctuation, etc. final bool saveVocab; Lemma({required this.text, required this.saveVocab, required this.form}); diff --git a/lib/pangea/utils/firebase_analytics.dart b/lib/pangea/utils/firebase_analytics.dart index 59485d35b..323a7a172 100644 --- a/lib/pangea/utils/firebase_analytics.dart +++ b/lib/pangea/utils/firebase_analytics.dart @@ -4,7 +4,6 @@ import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; import 'package:flutter/widgets.dart'; import '../../config/firebase_options.dart'; -import '../enum/use_type.dart'; // PageRoute import @@ -90,13 +89,12 @@ class GoogleAnalytics { logEvent('join_group', parameters: {'group_id': classCode}); } - static sendMessage(String chatRoomId, String classCode, UseType useType) { + static sendMessage(String chatRoomId, String classCode) { logEvent( 'sent_message', parameters: { "chat_id": chatRoomId, 'group_id': classCode, - "message_type": useType.toString(), }, ); } diff --git a/lib/pangea/widgets/chat/overlay_message.dart b/lib/pangea/widgets/chat/overlay_message.dart index d7c99f07b..5f3d46c7e 100644 --- a/lib/pangea/widgets/chat/overlay_message.dart +++ b/lib/pangea/widgets/chat/overlay_message.dart @@ -166,7 +166,7 @@ class OverlayMessage extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ if (pangeaMessageEvent.showUseType) ...[ - pangeaMessageEvent.useType.iconView( + pangeaMessageEvent.msgUseType.iconView( context, textColor.withAlpha(164), ), diff --git a/lib/pangea/widgets/new_group/vocab_list.dart b/lib/pangea/widgets/new_group/vocab_list.dart index 240e99a85..67089145e 100644 --- a/lib/pangea/widgets/new_group/vocab_list.dart +++ b/lib/pangea/widgets/new_group/vocab_list.dart @@ -1,9 +1,8 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + import '../../models/chat_topic_model.dart'; import '../../models/lemma.dart'; import '../../repo/topic_data_repo.dart'; @@ -76,7 +75,7 @@ class ChatVocabularyList extends StatelessWidget { for (final word in topic.vocab) Chip( labelStyle: Theme.of(context).textTheme.bodyMedium, - label: Text(word.form), + label: Text(word.text), onDeleted: () { onChanged(topic.vocab..remove(word)); }, @@ -464,7 +463,7 @@ class PromptsFieldState extends State { // button to call API ElevatedButton.icon( - icon: BotFace( + icon: const BotFace( width: 50.0, expression: BotExpression.idle, ), From 61b7583ad259bd373aeef344893a52eb4a09e028 Mon Sep 17 00:00:00 2001 From: Brord van Wierst Date: Mon, 1 Jul 2024 16:09:06 +0200 Subject: [PATCH 51/54] added pub get for sentry --- .github/workflows/main_deploy.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main_deploy.yaml b/.github/workflows/main_deploy.yaml index 6bda0c1db..46f909e1f 100644 --- a/.github/workflows/main_deploy.yaml +++ b/.github/workflows/main_deploy.yaml @@ -79,5 +79,7 @@ jobs: with: name: web path: build/web + - name: Update packages + run: flutter pub get - name: Update sentry run: flutter packages pub run sentry_dart_plugin From e6fa2b1b4b6c361fdf08c370eb4ad469ec689a35 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 1 Jul 2024 11:57:17 -0400 Subject: [PATCH 52/54] changed messages since update back to 10, re-enabled getting tokens after accepting matching in IGC, and allowed saving of initial empty analytics event --- .../controllers/choreographer.dart | 2 +- .../controllers/igc_controller.dart | 114 +++++++++--------- .../controllers/my_analytics_controller.dart | 10 +- .../room_analytics_extension.dart | 3 - .../practice_activity_content.dart | 66 +--------- 5 files changed, 64 insertions(+), 131 deletions(-) diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 3e7668323..66e11808b 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -186,7 +186,7 @@ class Choreographer { // this may be unnecessary now that tokens are not used // to allow click of words in the input field and we're getting this at the end // TODO - turn it off and tested that this is fine - // igc.justGetTokensAndAddThemToIGCTextData(); + igc.justGetTokensAndAddThemToIGCTextData(); // we set editType to keyboard here because that is the default for it // and we want to make sure that the next change is treated as a keyboard change diff --git a/lib/pangea/choreographer/controllers/igc_controller.dart b/lib/pangea/choreographer/controllers/igc_controller.dart index fed4a3167..533b36c83 100644 --- a/lib/pangea/choreographer/controllers/igc_controller.dart +++ b/lib/pangea/choreographer/controllers/igc_controller.dart @@ -7,9 +7,11 @@ import 'package:fluffychat/pangea/choreographer/controllers/span_data_controller import 'package:fluffychat/pangea/models/igc_text_data_model.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart'; import 'package:fluffychat/pangea/repo/igc_repo.dart'; +import 'package:fluffychat/pangea/repo/tokens_repo.dart'; import 'package:fluffychat/pangea/widgets/igc/span_card.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; import '../../models/span_card_model.dart'; import '../../utils/error_handler.dart'; @@ -32,12 +34,6 @@ class IgcController { try { if (choreographer.currentText.isEmpty) return clear(); - // the error spans are going to be reloaded, so clear the cache - // @ggurdin: Why is this separate from the clear() call? - // Also, if the spans are equal according the to the equals method, why not reuse the cached span data? - // It seems this would save some calls if the user makes some tiny changes to the text that don't - // change the matches at all. - spanDataController.clearCache(); debugPrint('getIGCTextData called with ${choreographer.currentText}'); debugPrint( 'getIGCTextData called with tokensOnly = $onlyTokensAndLanguageDetection', @@ -87,61 +83,61 @@ class IgcController { } } - // Future justGetTokensAndAddThemToIGCTextData() async { - // try { - // if (igcTextData == null) { - // debugger(when: kDebugMode); - // choreographer.getLanguageHelp(); - // return; - // } - // igcTextData!.loading = true; - // choreographer.startLoading(); - // if (igcTextData!.originalInput != choreographer.textController.text) { - // debugger(when: kDebugMode); - // ErrorHandler.logError( - // m: "igcTextData fullText does not match current text", - // s: StackTrace.current, - // data: igcTextData!.toJson(), - // ); - // } + Future justGetTokensAndAddThemToIGCTextData() async { + try { + if (igcTextData == null) { + debugger(when: kDebugMode); + choreographer.getLanguageHelp(); + return; + } + igcTextData!.loading = true; + choreographer.startLoading(); + if (igcTextData!.originalInput != choreographer.textController.text) { + debugger(when: kDebugMode); + ErrorHandler.logError( + m: "igcTextData fullText does not match current text", + s: StackTrace.current, + data: igcTextData!.toJson(), + ); + } - // if (choreographer.l1LangCode == null || - // choreographer.l2LangCode == null) { - // debugger(when: kDebugMode); - // ErrorHandler.logError( - // m: "l1LangCode and/or l2LangCode is null", - // s: StackTrace.current, - // data: { - // "l1LangCode": choreographer.l1LangCode, - // "l2LangCode": choreographer.l2LangCode, - // }, - // ); - // return; - // } + if (choreographer.l1LangCode == null || + choreographer.l2LangCode == null) { + debugger(when: kDebugMode); + ErrorHandler.logError( + m: "l1LangCode and/or l2LangCode is null", + s: StackTrace.current, + data: { + "l1LangCode": choreographer.l1LangCode, + "l2LangCode": choreographer.l2LangCode, + }, + ); + return; + } - // final TokensResponseModel res = await TokensRepo.tokenize( - // await choreographer.pangeaController.userController.accessToken, - // TokensRequestModel( - // fullText: igcTextData!.originalInput, - // userL1: choreographer.l1LangCode!, - // userL2: choreographer.l2LangCode!, - // ), - // ); - // igcTextData?.tokens = res.tokens; - // } catch (err, stack) { - // debugger(when: kDebugMode); - // choreographer.errorService.setError( - // ChoreoError(type: ChoreoErrorType.unknown, raw: err), - // ); - // Sentry.addBreadcrumb( - // Breadcrumb.fromJson({"igctextDdata": igcTextData?.toJson()}), - // ); - // ErrorHandler.logError(e: err, s: stack); - // } finally { - // igcTextData?.loading = false; - // choreographer.stopLoading(); - // } - // } + final TokensResponseModel res = await TokensRepo.tokenize( + await choreographer.pangeaController.userController.accessToken, + TokensRequestModel( + fullText: igcTextData!.originalInput, + userL1: choreographer.l1LangCode!, + userL2: choreographer.l2LangCode!, + ), + ); + igcTextData?.tokens = res.tokens; + } catch (err, stack) { + debugger(when: kDebugMode); + choreographer.errorService.setError( + ChoreoError(type: ChoreoErrorType.unknown, raw: err), + ); + Sentry.addBreadcrumb( + Breadcrumb.fromJson({"igctextDdata": igcTextData?.toJson()}), + ); + ErrorHandler.logError(e: err, s: stack); + } finally { + igcTextData?.loading = false; + choreographer.stopLoading(); + } + } void showFirstMatch(BuildContext context) { if (igcTextData == null || igcTextData!.matches.isEmpty) { diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index 1ae6f2a5b..535af6b8b 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -24,7 +24,7 @@ class MyAnalyticsController { /// the max number of messages that will be cached before /// an automatic update is triggered - final int _maxMessagesCached = 1; + final int _maxMessagesCached = 10; /// the number of minutes before an automatic update is triggered final int _minutesBeforeUpdate = 5; @@ -315,8 +315,10 @@ class MyAnalyticsController { // (allRecentMessages.isNotEmpty || recentActivityRecords.isNotEmpty), // ); - await analyticsRoom.sendConstructsEvent( - recentConstructUses, - ); + if (recentConstructUses.isNotEmpty) { + await analyticsRoom.sendConstructsEvent( + recentConstructUses, + ); + } } } diff --git a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart index 34370306e..a27526a2b 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart @@ -253,8 +253,6 @@ extension AnalyticsRoomExtension on Room { Future sendSummaryAnalyticsEvent( List records, ) async { - if (records.isEmpty) return null; - final SummaryAnalyticsModel analyticsModel = SummaryAnalyticsModel( messages: records, ); @@ -268,7 +266,6 @@ extension AnalyticsRoomExtension on Room { Future sendConstructsEvent( List uses, ) async { - if (uses.isEmpty) return null; final ConstructAnalyticsModel constructsModel = ConstructAnalyticsModel( uses: uses, ); diff --git a/lib/pangea/widgets/practice_activity/practice_activity_content.dart b/lib/pangea/widgets/practice_activity/practice_activity_content.dart index 9bdc95eea..6de31829c 100644 --- a/lib/pangea/widgets/practice_activity/practice_activity_content.dart +++ b/lib/pangea/widgets/practice_activity/practice_activity_content.dart @@ -1,7 +1,5 @@ import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; -import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_record_event.dart'; -import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_record_model.dart'; import 'package:fluffychat/pangea/widgets/practice_activity/multiple_choice_activity.dart'; import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_card.dart'; import 'package:flutter/material.dart'; @@ -18,70 +16,10 @@ class PracticeActivity extends StatefulWidget { }); @override - MessagePracticeActivityContentState createState() => - MessagePracticeActivityContentState(); + PracticeActivityContentState createState() => PracticeActivityContentState(); } -class MessagePracticeActivityContentState extends State { - int? selectedChoiceIndex; - PracticeActivityRecordModel? recordModel; - bool recordSubmittedThisSession = false; - bool recordSubmittedPreviousSession = false; - - PracticeActivityEvent get practiceEvent => widget.practiceEvent; - - @override - void initState() { - super.initState(); - initalizeActivity(); - } - - @override - void didUpdateWidget(covariant PracticeActivity oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.practiceEvent.event.eventId != - widget.practiceEvent.event.eventId) { - initalizeActivity(); - } - } - - void initalizeActivity() { - final PracticeActivityRecordEvent? recordEvent = - widget.practiceEvent.userRecord; - if (recordEvent?.record == null) { - recordModel = PracticeActivityRecordModel( - question: - widget.practiceEvent.practiceActivity.multipleChoice!.question, - ); - } else { - recordModel = recordEvent!.record; - - //Note that only MultipleChoice activities will have this so we probably should move this logic to the MultipleChoiceActivity widget - selectedChoiceIndex = recordModel?.latestResponse?.text != null - ? widget.practiceEvent.practiceActivity.multipleChoice - ?.choiceIndex(recordModel!.latestResponse!.text!) - : null; - - recordSubmittedPreviousSession = true; - recordSubmittedThisSession = true; - } - setState(() {}); - } - - void updateChoice(int index) { - setState(() { - selectedChoiceIndex = index; - recordModel!.addResponse( - score: widget.practiceEvent.practiceActivity.multipleChoice! - .isCorrect(index) - ? 1 - : 0, - text: widget - .practiceEvent.practiceActivity.multipleChoice!.choices[index], - ); - }); - } - +class PracticeActivityContentState extends State { Widget get activityWidget { switch (widget.practiceEvent.practiceActivity.activityType) { case ActivityTypeEnum.multipleChoice: From 183247035dce1bc407f8677cd07c34d692d06454 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 1 Jul 2024 15:06:11 -0400 Subject: [PATCH 53/54] removed view selection page in analytics --- assets/l10n/intl_en.arb | 3 +- lib/config/routes.dart | 53 +-- lib/pangea/enum/bar_chart_view_enum.dart | 11 - .../analytics/analytics_language_button.dart | 4 +- .../pages/analytics/analytics_list_tile.dart | 5 +- .../analytics/analytics_view_button.dart | 49 +++ .../pages/analytics/base_analytics.dart | 12 +- .../pages/analytics/base_analytics_view.dart | 383 +++++++----------- .../space_analytics/space_analytics.dart | 4 +- .../student_analytics/student_analytics.dart | 4 +- 10 files changed, 224 insertions(+), 304 deletions(-) create mode 100644 lib/pangea/pages/analytics/analytics_view_button.dart diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 964107cf8..7f44188a6 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -4084,5 +4084,6 @@ "@interactiveTranslatorAutoPlayDesc": { "type": "text", "placeholders": {} - } + }, + "changeAnalyticsView": "Change Analytics View" } \ No newline at end of file diff --git a/lib/config/routes.dart b/lib/config/routes.dart index eba1ae511..51c631ff3 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -170,31 +170,11 @@ abstract class AppRoutes { pageBuilder: (context, state) => defaultPageBuilder( context, state, - const StudentAnalyticsPage(), + const StudentAnalyticsPage( + selectedView: BarChartViewSelection.messages, + ), ), redirect: loggedOutRedirect, - routes: [ - GoRoute( - path: 'messages', - pageBuilder: (context, state) => defaultPageBuilder( - context, - state, - const StudentAnalyticsPage( - selectedView: BarChartViewSelection.messages, - ), - ), - ), - GoRoute( - path: 'errors', - pageBuilder: (context, state) => defaultPageBuilder( - context, - state, - const StudentAnalyticsPage( - selectedView: BarChartViewSelection.grammar, - ), - ), - ), - ], ), GoRoute( path: 'analytics', @@ -207,34 +187,13 @@ abstract class AppRoutes { routes: [ GoRoute( path: ':spaceid', - redirect: loggedOutRedirect, pageBuilder: (context, state) => defaultPageBuilder( context, state, - const SpaceAnalyticsPage(), + const SpaceAnalyticsPage( + selectedView: BarChartViewSelection.messages, + ), ), - routes: [ - GoRoute( - path: 'messages', - pageBuilder: (context, state) => defaultPageBuilder( - context, - state, - const SpaceAnalyticsPage( - selectedView: BarChartViewSelection.messages, - ), - ), - ), - GoRoute( - path: 'errors', - pageBuilder: (context, state) => defaultPageBuilder( - context, - state, - const SpaceAnalyticsPage( - selectedView: BarChartViewSelection.grammar, - ), - ), - ), - ], ), ], ), diff --git a/lib/pangea/enum/bar_chart_view_enum.dart b/lib/pangea/enum/bar_chart_view_enum.dart index 3fe812634..aba0652af 100644 --- a/lib/pangea/enum/bar_chart_view_enum.dart +++ b/lib/pangea/enum/bar_chart_view_enum.dart @@ -29,15 +29,4 @@ extension BarChartViewSelectionExtension on BarChartViewSelection { return Icons.spellcheck_outlined; } } - - String get route { - switch (this) { - case BarChartViewSelection.messages: - return 'messages'; - // case BarChartViewSelection.vocab: - // return 'vocab'; - case BarChartViewSelection.grammar: - return 'errors'; - } - } } diff --git a/lib/pangea/pages/analytics/analytics_language_button.dart b/lib/pangea/pages/analytics/analytics_language_button.dart index 2c3923fb4..08b3220b0 100644 --- a/lib/pangea/pages/analytics/analytics_language_button.dart +++ b/lib/pangea/pages/analytics/analytics_language_button.dart @@ -34,9 +34,7 @@ class AnalyticsLanguageButton extends StatelessWidget { }).toList(), child: TextButton.icon( label: Text( - L10n.of(context)!.languageButtonLabel( - value.getDisplayName(context) ?? value.langCode, - ), + value.getDisplayName(context) ?? value.langCode, style: TextStyle( color: Theme.of(context).colorScheme.onSurface, ), diff --git a/lib/pangea/pages/analytics/analytics_list_tile.dart b/lib/pangea/pages/analytics/analytics_list_tile.dart index 8b1e1ba49..a49ef4cb4 100644 --- a/lib/pangea/pages/analytics/analytics_list_tile.dart +++ b/lib/pangea/pages/analytics/analytics_list_tile.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; -import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -141,9 +140,7 @@ class AnalyticsListTileState extends State { return; } if ((room?.isSpace ?? false) && widget.allowNavigateOnSelect) { - final String selectedView = - widget.controller!.widget.selectedView!.route; - context.go('/rooms/analytics/${room!.id}/$selectedView'); + context.go('/rooms/analytics/${room!.id}'); return; } widget.onTap(widget.selected); diff --git a/lib/pangea/pages/analytics/analytics_view_button.dart b/lib/pangea/pages/analytics/analytics_view_button.dart new file mode 100644 index 000000000..c98bf47fc --- /dev/null +++ b/lib/pangea/pages/analytics/analytics_view_button.dart @@ -0,0 +1,49 @@ +import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +class AnalyticsViewButton extends StatelessWidget { + final BarChartViewSelection value; + final void Function(BarChartViewSelection) onChange; + const AnalyticsViewButton({ + super.key, + required this.value, + required this.onChange, + }); + + @override + Widget build(BuildContext context) { + return PopupMenuButton( + tooltip: L10n.of(context)!.changeAnalyticsView, + initialValue: value, + onSelected: (BarChartViewSelection? view) { + if (view == null) { + debugPrint("when is view null?"); + return; + } + onChange(view); + }, + itemBuilder: (BuildContext context) => BarChartViewSelection.values + .map>( + (BarChartViewSelection view) { + return PopupMenuItem( + value: view, + child: Text(view.string(context)), + ); + }).toList(), + child: TextButton.icon( + label: Text( + value.string(context), + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface, + ), + ), + icon: Icon( + value.icon, + color: Theme.of(context).colorScheme.onSurface, + ), + onPressed: null, + ), + ); + } +} diff --git a/lib/pangea/pages/analytics/base_analytics.dart b/lib/pangea/pages/analytics/base_analytics.dart index 146a5ac70..cd41d2312 100644 --- a/lib/pangea/pages/analytics/base_analytics.dart +++ b/lib/pangea/pages/analytics/base_analytics.dart @@ -20,7 +20,7 @@ import '../../models/analytics/chart_analytics_model.dart'; class BaseAnalyticsPage extends StatefulWidget { final String pageTitle; final List tabs; - final BarChartViewSelection? selectedView; + final BarChartViewSelection selectedView; final AnalyticsSelected defaultSelected; final AnalyticsSelected? alwaysSelected; @@ -33,7 +33,7 @@ class BaseAnalyticsPage extends StatefulWidget { required this.tabs, required this.alwaysSelected, required this.defaultSelected, - this.selectedView, + required this.selectedView, this.myAnalyticsController, targetLanguages, }) : targetLanguages = (targetLanguages?.isNotEmpty ?? false) @@ -50,6 +50,7 @@ class BaseAnalyticsController extends State { String? currentLemma; ChartAnalyticsModel? chartData; StreamController refreshStream = StreamController.broadcast(); + BarChartViewSelection currentView = BarChartViewSelection.messages; bool isSelected(String chatOrStudentId) => chatOrStudentId == selected?.id; @@ -63,6 +64,7 @@ class BaseAnalyticsController extends State { @override void initState() { super.initState(); + currentView = widget.selectedView; if (widget.defaultSelected.type == AnalyticsEntryType.student) { runFirstRefresh(); } @@ -168,6 +170,12 @@ class BaseAnalyticsController extends State { refreshStream.add(false); } + Future toggleView(BarChartViewSelection view) async { + currentView = view; + await setChartData(); + refreshStream.add(false); + } + void setCurrentLemma(String? lemma) { currentLemma = lemma; setState(() {}); diff --git a/lib/pangea/pages/analytics/base_analytics_view.dart b/lib/pangea/pages/analytics/base_analytics_view.dart index cca0c7f4e..13e49aa38 100644 --- a/lib/pangea/pages/analytics/base_analytics_view.dart +++ b/lib/pangea/pages/analytics/base_analytics_view.dart @@ -5,6 +5,7 @@ import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; import 'package:fluffychat/pangea/enum/time_span.dart'; import 'package:fluffychat/pangea/pages/analytics/analytics_language_button.dart'; import 'package:fluffychat/pangea/pages/analytics/analytics_list_tile.dart'; +import 'package:fluffychat/pangea/pages/analytics/analytics_view_button.dart'; import 'package:fluffychat/pangea/pages/analytics/base_analytics.dart'; import 'package:fluffychat/pangea/pages/analytics/construct_list.dart'; import 'package:fluffychat/pangea/pages/analytics/messages_bar_chart.dart'; @@ -24,11 +25,7 @@ class BaseAnalyticsView extends StatelessWidget { final BaseAnalyticsController controller; Widget chartView(BuildContext context) { - if (controller.widget.selectedView == null) { - return const SizedBox(); - } - - switch (controller.widget.selectedView!) { + switch (controller.currentView) { case BarChartViewSelection.messages: return MessagesBarChart( chartAnalytics: controller.chartData, @@ -75,27 +72,13 @@ class BaseAnalyticsView extends StatelessWidget { if (controller.activeSpace != null) TextSpan( text: controller.activeSpace!.getLocalizedDisplayname(), - style: const TextStyle(decoration: TextDecoration.underline), - recognizer: TapGestureRecognizer() - ..onTap = () { - if (controller.widget.selectedView == null) return; - String route = - "/rooms/${controller.widget.defaultSelected.type.route}"; - if (controller.widget.defaultSelected.type == - AnalyticsEntryType.space) { - route += "/${controller.widget.defaultSelected.id}"; - } - context.go(route); - }, - ), - if (controller.widget.selectedView != null) - const TextSpan( - text: " > ", - ), - if (controller.widget.selectedView != null) - TextSpan( - text: controller.widget.selectedView!.string(context), ), + const TextSpan( + text: " > ", + ), + TextSpan( + text: controller.currentView.string(context), + ), ], ), overflow: TextOverflow.ellipsis, @@ -104,220 +87,156 @@ class BaseAnalyticsView extends StatelessWidget { ), body: MaxWidthBody( withScrolling: false, - child: controller.widget.selectedView != null - ? Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - // if (controller.widget.defaultSelected.type == - // AnalyticsEntryType.student) - // IconButton( - // icon: const Icon(Icons.refresh), - // onPressed: controller.onRefresh, - // tooltip: L10n.of(context)!.refresh, - // ), - TimeSpanMenuButton( - value: controller.currentTimeSpan, - onChange: (TimeSpan value) => - controller.toggleTimeSpan(context, value), - ), - AnalyticsLanguageButton( - value: controller - .pangeaController.analytics.currentAnalyticsLang, - onChange: (lang) => controller.toggleSpaceLang(lang), - languages: controller.widget.targetLanguages, - ), - ], - ), - Expanded( - flex: 1, - child: chartView(context), - ), - Expanded( - flex: 1, - child: DefaultTabController( - length: 2, - child: Column( - children: [ - TabBar( - tabs: [ - ...controller.widget.tabs.map( - (tab) => Tab( - icon: Icon( - tab.icon, - color: Theme.of(context) - .colorScheme - .onSurfaceVariant, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TimeSpanMenuButton( + value: controller.currentTimeSpan, + onChange: (TimeSpan value) => + controller.toggleTimeSpan(context, value), + ), + AnalyticsViewButton( + value: controller.currentView, + onChange: controller.toggleView, + ), + AnalyticsLanguageButton( + value: controller + .pangeaController.analytics.currentAnalyticsLang, + onChange: (lang) => controller.toggleSpaceLang(lang), + languages: controller.widget.targetLanguages, + ), + ], + ), + const SizedBox( + height: 10, + ), + Expanded( + flex: 1, + child: chartView(context), + ), + Expanded( + flex: 1, + child: DefaultTabController( + length: 2, + child: Column( + children: [ + TabBar( + tabs: [ + ...controller.widget.tabs.map( + (tab) => Tab( + icon: Icon( + tab.icon, + color: Theme.of(context) + .colorScheme + .onSurfaceVariant, + ), + ), + ), + ], + ), + Expanded( + child: SingleChildScrollView( + child: SizedBox( + height: max( + controller.widget.tabs[0].items.length + 1, + controller.widget.tabs[1].items.length, + ) * + 72, + child: TabBarView( + physics: const NeverScrollableScrollPhysics(), + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ...controller.widget.tabs[0].items.map( + (item) => AnalyticsListTile( + refreshStream: controller.refreshStream, + avatar: item.avatar, + defaultSelected: + controller.widget.defaultSelected, + selected: AnalyticsSelected( + item.id, + controller.widget.tabs[0].type, + item.displayName, + ), + isSelected: + controller.isSelected(item.id), + onTap: (_) => controller.toggleSelection( + AnalyticsSelected( + item.id, + controller.widget.tabs[0].type, + item.displayName, + ), + ), + allowNavigateOnSelect: controller + .widget.tabs[0].allowNavigateOnSelect, + pangeaController: + controller.pangeaController, + controller: controller, + ), ), - ), + if (controller.widget.defaultSelected.type == + AnalyticsEntryType.space) + AnalyticsListTile( + refreshStream: controller.refreshStream, + defaultSelected: + controller.widget.defaultSelected, + avatar: null, + selected: AnalyticsSelected( + controller.widget.defaultSelected.id, + AnalyticsEntryType.privateChats, + L10n.of(context)!.allPrivateChats, + ), + allowNavigateOnSelect: false, + isSelected: controller.isSelected( + controller.widget.defaultSelected.id, + ), + onTap: controller.toggleSelection, + pangeaController: + controller.pangeaController, + controller: controller, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: controller.widget.tabs[1].items + .map( + (item) => AnalyticsListTile( + refreshStream: controller.refreshStream, + avatar: item.avatar, + defaultSelected: + controller.widget.defaultSelected, + selected: AnalyticsSelected( + item.id, + controller.widget.tabs[1].type, + item.displayName, + ), + isSelected: + controller.isSelected(item.id), + onTap: controller.toggleSelection, + allowNavigateOnSelect: controller.widget + .tabs[1].allowNavigateOnSelect, + pangeaController: + controller.pangeaController, + controller: controller, + ), + ) + .toList(), ), ], ), - Expanded( - child: SingleChildScrollView( - child: SizedBox( - height: max( - controller.widget.tabs[0].items.length + - 1, - controller.widget.tabs[1].items.length, - ) * - 72, - child: TabBarView( - physics: const NeverScrollableScrollPhysics(), - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.stretch, - children: [ - ...controller.widget.tabs[0].items.map( - (item) => AnalyticsListTile( - refreshStream: - controller.refreshStream, - avatar: item.avatar, - defaultSelected: controller - .widget.defaultSelected, - selected: AnalyticsSelected( - item.id, - controller.widget.tabs[0].type, - item.displayName, - ), - isSelected: - controller.isSelected(item.id), - onTap: (_) => - controller.toggleSelection( - AnalyticsSelected( - item.id, - controller.widget.tabs[0].type, - item.displayName, - ), - ), - allowNavigateOnSelect: controller - .widget - .tabs[0] - .allowNavigateOnSelect, - pangeaController: - controller.pangeaController, - controller: controller, - ), - ), - if (controller - .widget.defaultSelected.type == - AnalyticsEntryType.space) - AnalyticsListTile( - refreshStream: - controller.refreshStream, - defaultSelected: controller - .widget.defaultSelected, - avatar: null, - selected: AnalyticsSelected( - controller - .widget.defaultSelected.id, - AnalyticsEntryType.privateChats, - L10n.of(context)!.allPrivateChats, - ), - allowNavigateOnSelect: false, - isSelected: controller.isSelected( - controller - .widget.defaultSelected.id, - ), - onTap: controller.toggleSelection, - pangeaController: - controller.pangeaController, - controller: controller, - ), - ], - ), - Column( - crossAxisAlignment: - CrossAxisAlignment.stretch, - children: controller.widget.tabs[1].items - .map( - (item) => AnalyticsListTile( - refreshStream: - controller.refreshStream, - avatar: item.avatar, - defaultSelected: controller - .widget.defaultSelected, - selected: AnalyticsSelected( - item.id, - controller.widget.tabs[1].type, - item.displayName, - ), - isSelected: controller - .isSelected(item.id), - onTap: controller.toggleSelection, - allowNavigateOnSelect: controller - .widget - .tabs[1] - .allowNavigateOnSelect, - pangeaController: - controller.pangeaController, - controller: controller, - ), - ) - .toList(), - ), - ], - ), - ), - ), - ), - ], + ), ), ), - ), - ], - ) - : Column( - children: [ - const Divider(height: 1), - ListTile( - title: Text(L10n.of(context)!.grammarAnalytics), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: - Theme.of(context).textTheme.bodyLarge!.color, - child: Icon(BarChartViewSelection.grammar.icon), - ), - trailing: const Icon(Icons.chevron_right), - onTap: () { - String route = - "/rooms/${controller.widget.defaultSelected.type.route}"; - if (controller.widget.defaultSelected.type == - AnalyticsEntryType.space) { - route += "/${controller.widget.defaultSelected.id}"; - } - route += "/${BarChartViewSelection.grammar.route}"; - context.go(route); - }, - ), - const Divider(height: 1), - ListTile( - title: Text(L10n.of(context)!.messageAnalytics), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: - Theme.of(context).textTheme.bodyLarge!.color, - child: Icon(BarChartViewSelection.messages.icon), - ), - trailing: const Icon(Icons.chevron_right), - onTap: () { - String route = - "/rooms/${controller.widget.defaultSelected.type.route}"; - if (controller.widget.defaultSelected.type == - AnalyticsEntryType.space) { - route += "/${controller.widget.defaultSelected.id}"; - } - route += "/${BarChartViewSelection.messages.route}"; - context.go(route); - }, - ), - const Divider(height: 1), - ], + ], + ), ), + ), + ], + ), ), ); } diff --git a/lib/pangea/pages/analytics/space_analytics/space_analytics.dart b/lib/pangea/pages/analytics/space_analytics/space_analytics.dart index b32780761..2db1acb4c 100644 --- a/lib/pangea/pages/analytics/space_analytics/space_analytics.dart +++ b/lib/pangea/pages/analytics/space_analytics/space_analytics.dart @@ -18,8 +18,8 @@ import '../../../utils/sync_status_util_v2.dart'; import 'space_analytics_view.dart'; class SpaceAnalyticsPage extends StatefulWidget { - final BarChartViewSelection? selectedView; - const SpaceAnalyticsPage({super.key, this.selectedView}); + final BarChartViewSelection selectedView; + const SpaceAnalyticsPage({super.key, required this.selectedView}); @override State createState() => SpaceAnalyticsV2Controller(); diff --git a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart index 5c694b6ca..e06c6d0ba 100644 --- a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart +++ b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart @@ -18,8 +18,8 @@ import '../base_analytics.dart'; import 'student_analytics_view.dart'; class StudentAnalyticsPage extends StatefulWidget { - final BarChartViewSelection? selectedView; - const StudentAnalyticsPage({super.key, this.selectedView}); + final BarChartViewSelection selectedView; + const StudentAnalyticsPage({super.key, required this.selectedView}); @override State createState() => StudentAnalyticsController(); From e7568c1c720efb3765e5b2a1b7307c59264f498f Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 1 Jul 2024 15:10:17 -0400 Subject: [PATCH 54/54] added inline tooltip file --- lib/pangea/utils/inline_tooltip.dart | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 lib/pangea/utils/inline_tooltip.dart diff --git a/lib/pangea/utils/inline_tooltip.dart b/lib/pangea/utils/inline_tooltip.dart new file mode 100644 index 000000000..253288a84 --- /dev/null +++ b/lib/pangea/utils/inline_tooltip.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class InlineTooltip extends StatelessWidget { + final String body; + final VoidCallback onClose; + + const InlineTooltip({ + super.key, + required this.body, + required this.onClose, + }); + + @override + Widget build(BuildContext context) { + return Badge( + offset: const Offset(0, -7), + backgroundColor: Colors.transparent, + label: CircleAvatar( + radius: 10, + child: IconButton( + padding: EdgeInsets.zero, + icon: const Icon( + Icons.close_outlined, + size: 15, + ), + onPressed: onClose, + ), + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Theme.of(context).colorScheme.primary.withAlpha(20), + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: RichText( + textAlign: TextAlign.justify, + text: TextSpan( + children: [ + const WidgetSpan( + child: Icon( + Icons.lightbulb, + size: 16, + ), + ), + const WidgetSpan( + child: SizedBox(width: 5), + ), + TextSpan( + text: body, + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ], + ), + ), + ), + ), + ); + } +}