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 diff --git a/README.md b/README.md index 7c27b6e2e..a1ad9f2b7 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ # Special thanks -* Pangea Chat is a fork of [FluffyChat](https://fluffychat.im), is an open source, nonprofit and cute [[matrix](https://matrix.org)] client written in [Flutter](https://flutter.dev). The goal of FluffyChat is to create an easy to use instant messenger which is open source and accessible for everyone. You can [support the primary maker of FluffyChat directly here.](https://ko-fi.com/C1C86VN53) +* Pangea Chat is a fork of [FluffyChat](https://fluffychat.im) which is a [[matrix](https://matrix.org)] client written in [Flutter](https://flutter.dev). You can [support the primary maker of FluffyChat directly here.](https://ko-fi.com/C1C86VN53) * Fabiyamada is a graphics designer and has made the fluffychat logo and the banner. Big thanks for her great designs. diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 3281b68e4..7f44188a6 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -410,7 +410,6 @@ "type": "text", "placeholders": {} }, - "classes": "Classes", "chooseAStrongPassword": "Choose a strong password", "@chooseAStrongPassword": { "type": "text", @@ -616,16 +615,11 @@ } }, "createGroup": "Create group", - "createNewSpace": "Create an exchange space", "createNewGroup": "Create a new chat", "@createNewGroup": { "type": "text", "placeholders": {} }, - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Currently active", "@currentlyActive": { "type": "text", @@ -2401,7 +2395,7 @@ "@noKeyForThisMessage": {}, "newGroup": "New chat", "@newGroup": {}, - "newSpace": "New class", + "newSpace": "New space", "@newSpace": {}, "enterSpace": "Enter space", "@enterSpace": {}, @@ -2540,7 +2534,7 @@ "type": "text", "placeholders": {} }, - "interactiveTranslatorNotAllowedDesc": "Translation assistance is disabled in space group chats for all participants. This restriction does not apply to Class/Exchange Admin or direct chats.", + "interactiveTranslatorNotAllowedDesc": "Translation assistance is disabled in space group chats for all participants. This restriction does not apply to space admins or direct chats.", "@interactiveTranslatorNotAllowedDesc": { "type": "text", "placeholders": {} @@ -2550,7 +2544,7 @@ "type": "text", "placeholders": {} }, - "interactiveTranslatorRequiredDesc": "Students cannot turn off translation assistance. They can choose not to accept the translation suggestions. This restriction does not apply to Class/Exchange or direct chats.", + "interactiveTranslatorRequiredDesc": "Students cannot turn off translation assistance. They can choose not to accept the translation suggestions. This restriction does not apply to spaces or direct chats.", "@interactiveTranslatorRequiredDesc": { "type": "text", "placeholders": {} @@ -2560,12 +2554,7 @@ "type": "text", "placeholders": {} }, - "multiLingualClass": "Multilingual Class", - "classAnalytics": "Class Analytics", - "@classAnalytics": { - "type": "text", - "placeholders": {} - }, + "multiLingualSpace": "Multilingual Space", "allClasses": "All Classes", "@allClasses": { "type": "text", @@ -2601,18 +2590,8 @@ "type": "text", "placeholders": {} }, - "requestAnExchange": "Request an Exchange", - "@requestAnExchange": { - "type": "text", - "placeholders": {} - }, - "findLanguageExchange": "Find a class exchange partner", - "@findLanguageExchange": { - "type": "text", - "placeholders": {} - }, - "classAnalyticsDesc": "Detailed information on student engagement and language use", - "@classAnalyticsDesc": { + "spaceAnalyticsDesc": "Detailed information on student engagement and language use", + "@spaceAnalyticsDesc": { "type": "text", "placeholders": {} }, @@ -2629,28 +2608,28 @@ "type": "text", "placeholders": {} }, - "classSettings": "Class Settings", - "@classSettings": { + "languageSettings": "Language Settings", + "@languageSettings": { "type": "text", "placeholders": {} }, - "classSettingsDesc": "Edit class languages and proficiency level.", - "@classSettingsDesc": { + "languageSettingsDesc": "Edit space languages and proficiency level.", + "@languageSettingsDesc": { "type": "text", "placeholders": {} }, - "selectClassRoomDominantLanguage": "What is the base language of your class?", - "@selectClassRoomDominantLanguage": { + "selectSpaceDominantLanguage": "What's the most common language of space members?", + "@selectSpaceDominantLanguage": { "type": "text", "placeholders": {} }, - "selectTargetLanguage": "What language are you teaching?", - "@selectTargetLanguage": { + "selectSpaceTargetLanguage": "What is the most common target language of the space?", + "@selectSpaceTargetLanguage": { "type": "text", "placeholders": {} }, - "whatIsYourClassLanguageLevel": "What is the average language level of your class?", - "@whatIsYourClassLanguageLevel": { + "whatIsYourSpaceLanguageLevel": "What is the average language level of the space?", + "@whatIsYourSpaceLanguageLevel": { "type": "text", "placeholders": {} }, @@ -2679,7 +2658,7 @@ "type": "text", "placeholders": {} }, - "createGroupChatsDesc": "Toggle this on to allow students to create group chats within the class/exchange space.", + "createGroupChatsDesc": "Toggle this on to allow students to create group chats within the space.", "@createGroupChatsDesc": { "type": "text", "placeholders": {} @@ -2794,12 +2773,12 @@ "type": "text", "placeholders": {} }, - "joinWithClassCode": "Join class or exchange", + "joinWithClassCode": "Join space", "@joinWithClassCode": { "type": "text", "placeholders": {} }, - "joinWithClassCodeDesc": "Connect to a class or exchange space with the 6-digit invite code provided by the space administrator.", + "joinWithClassCodeDesc": "Connect to a space with the 6-digit invite code provided by the space administrator.", "@joinWithClassCodeDesc": { "type": "text", "placeholders": {} @@ -2809,7 +2788,7 @@ "type": "text", "placeholders": {} }, - "unableToFindClass": "We are unable to find the class or exchange. Please double-check the information with the space administrator. If you are still experiencing an issue, please contact support@pangea.chat.", + "unableToFindClass": "We are unable to find the space. Please double-check the information with the space administrator. If you are still experiencing an issue, please contact support@pangea.chat.", "@unableToFindClass": { "type": "text", "placeholders": {} @@ -2869,12 +2848,12 @@ "type": "text", "placeholders": {} }, - "welcomeToPangea18Plus": "Welcome to Pangea Chat! 🙂\nWhat's next?\nCreate or join a class!\nOr search for a conversation partner!", + "welcomeToPangea18Plus": "Welcome to Pangea Chat! 🙂\nWhat's next?\nCreate or join a space!\nOr search for a conversation partner!", "@welcomeToPangea18Plus": { "type": "text", "placeholders": {} }, - "welcomeToPangeaMinor": "Welcome to Pangea Chat! 🙂\nWhat's next?\nJoin a class!\nAsk your teacher for an invite code.", + "welcomeToPangeaMinor": "Welcome to Pangea Chat! 🙂\nWhat's next?\nJoin a space!\nAsk your teacher for an invite code.", "@welcomeToPangeaMinor": { "type": "text", "placeholders": {} @@ -2915,21 +2894,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.", @@ -3130,7 +3111,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!", @@ -3174,7 +3155,7 @@ "igcToggleDescription": "This language learning tool will identify common spelling, grammar and punctuation errors in your message and suggest corrections. Though rare, the AI can make correction errors.", "sendOnEnterDescription": "Turn this off to be able to add line spaces in messages. When the toggle is off on the browser app, you can press Shift + Enter to start a new line. When the toggle is off on mobile apps, just Enter will start a new line.", "alreadyInClass": "You are already in this space.", - "pleaseLoginFirst": "Please login or sign up first and then you will be added to your class/exchange space.", + "pleaseLoginFirst": "Please login or sign up first and then you will be added to your space.", "originalMessage": "Original Message", "sentMessage": "Sent Message", "useType": "Use Type", @@ -3185,16 +3166,13 @@ "definitionsToolDescription": "When enabled, words underlined in blue can be clicked for definitions. Click messages to access definitions.", "translationsToolDescrption": "When enabled, click a message and the translation icon to see a message in your base language.", "welcomeBack": "Welcome back! If you were part of the 2023-2024 pilot, please contact us for your special pilot subscription. If you are a teacher who has (or whose institution has) purchased licenses for your class, contact us for your teacher subscription.", - "classExchanges": "Exchanges", "createNewClass": "New class space", - "newExchange": "New exchange space", "kickAllStudents": "Kick All Students", "kickAllStudentsConfirmation": "Are you sure you want to kick all students?", "inviteAllStudents": "Invite All Students", "inviteAllStudentsConfirmation": "Are you sure you want to invite all students?", "inviteStudentsFromOtherClasses": "Invite students from other spaces", "inviteUsersFromPangea": "Add teachers", - "allExchanges": "All Exchanges", "redeemPromoCode": "Redeem Promo Code", "enterPromoCode": "Enter Promo Code", "downloadTxtFile": "Download Text File", @@ -3652,22 +3630,24 @@ "pay": "Pay", "allPrivateChats": "Direct chats", "unknownPrivateChat": "Unknown private chat", - "copyClassCodeDesc": "Students who are already in the app can 'Join class or exchange' via the main menu.", - "addToClass": "Add exchange to class", - "addToClassDesc": "Adding an exchange to a class will make the exchange appear within the class for students and give them access to all chats within the exchange.", - "addToClassOrExchange": "Add chat to class or exchange", - "addToClassOrExchangeDesc": "Adding a chat to a class or exchange will make the chat appear within the class or exchange for students and give them access.", - "invitedToClassOrExchange": "{user} has invited you to join a space: {classOrExchange}! Do you wish to accept?", - "@invitedToClassOrExchange": { + "copyClassCodeDesc": "Students who are already in the app can 'Join space' via the main menu.", + "addToSpaceDesc": "Adding a chat to a space will make the chat appear within the space for students and give them access.", + "@addToSpaceDesc": { "placeholders": { - "classOrExchange": {}, + "roomtype": {} + } + }, + "invitedToSpace": "{user} has invited you to join a space: {space}! Do you wish to accept?", + "@invitedToSpace": { + "placeholders": { + "space": {}, "user": {} } }, "declinedInvitation": "Declined invitation", "acceptedInvitation": "Accepted invitation", "youreInvited": "📩 You're invited!", - "studentPermissionsDesc": "Set permissions for this space. They will only apply to the class/exchange space. They will override individual user settings.", + "studentPermissionsDesc": "Set permissions for this space. They will only apply to the space. They will override individual user settings.", "noEligibleSpaces": "There are no eligible spaces to add this to.", "youAddedToSpace": "You added {child} to {space}", "@youAddedToSpace": { @@ -3705,9 +3685,9 @@ }, "emptyChatNameWarning": "Please enter a name for this chat", "emptyClassNameWarning": "Please enter a name for this class", - "emptyExchangeNameWarning": "Please enter a name for this exchange", + "emptySpaceNameWarning": "Please enter a name for this space", "blurMeansTranslateTitle": "Why is the message blurred?", - "blurMeansTranslateBody": "While Immersion Mode is on, messages that are sent in your base language will be blurred while Pangea Bot translates them to your target language. Immersion Mode can be toggled in individual and class settings.", + "blurMeansTranslateBody": "While Immersion Mode is on, messages that are sent in your base language will be blurred while Pangea Bot translates them to your target language. Immersion Mode can be toggled in individual and space settings.", "someErrorTitle": "Hm, something's not right", "someErrorBody": "It could be an error or something in your base language.", "bestCorrectionFeedback": "That's correct!", @@ -3717,7 +3697,7 @@ "practiceDefaultPrompt": "What is the best answer?", "correctionDefaultPrompt": "What is the best replacement?", "itStartDefaultPrompt": "Do you want help translating?", - "languageLevelWarning": "Please select a class language level", + "languageLevelWarning": "Please select a space language level", "lockedChatWarning": "🔒 This chat has been locked", "lockSpace": "Lock Space", "lockChat": "Lock Chat", @@ -3730,7 +3710,6 @@ "why": "Why?", "definition": "Definition", "exampleSentence": "Example Sentence", - "addToClassTitle": "Add Exchange to Class", "reportToTeacher": "Who do you want to report this message to?", "reportMessageTitle": "{reportingUserId} has reported a message from {reportedUserId} in the chat {roomName}", "@reportMessageTitle": { @@ -3777,7 +3756,6 @@ }, "searchChatsRooms": "Search for #chats, @users...", "createClass": "Create class", - "createExchange": "Create exchange", "viewArchive": "View Archive", "trialExpiration": "Your free trial expires on {expiration}", "@trialExpiration": { @@ -3787,10 +3765,10 @@ }, "freeTrialDesc": "New users recieve a one week free trial of Pangea Chat", "activateTrial": "Activate Free Trial", - "inNoSpaces": "You are not a member of any classes or exchanges", + "inNoSpaces": "You are not a member of any spaces", "successfullySubscribed": "You have successfully subscribed!", "clickToManageSubscription": "Click here to manage your subscription.", - "emptyInviteWarning": "Add this chat to a class or exchange to invite other users.", + "emptyInviteWarning": "Add this chat to a space to invite other users.", "errorGettingAudio": "Error getting audio. Please refresh and try again.", "nothingFound": "Nothing found...", "groupName": "Group name", @@ -4022,6 +4000,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", @@ -4034,9 +4016,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.", @@ -4069,27 +4051,39 @@ "nonexistentSelection": "Selection no longer exists.", "cantAddSpaceChild": "You do not have permission to add a child to this space.", "roomAddedToSpace": "Room(s) have been added to the selected space.", - "versionNotFound": "Version Not Found", - "fetchingVersion": "Fetching version...", - "versionFetchError": "Error fetching version", - "connectedToStaging": "Connected to Staging", - "versionText": "Version: {version}+{buildNumber}", - "@versionText": { - "description": "Text displaying the app version and build number.", + "createNewSpace": "New space", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "addChatToSpaceDesc": "Adding a chat to a space will make the chat appear within the space for students and give them access.", + "addSpaceToSpaceDesc": "Adding a space to another space will make the child space appear within the parent space for students and give them access.", + "spaceAnalytics": "Space Analytics", + "changeAnalyticsLanguage": "Change Analytics Language", + "suggestToSpace": "Suggest this space", + "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", + "hintTitle": "Hint:", + "speechToTextBody": "See how well you did by looking at your Accuracy and Words Per Minute scores", + "previous": "Previous", + "languageButtonLabel": "Language: {currentLanguage}", + "@languageButtonLabel": { "type": "text", "placeholders": { - "version": { - "type": "String", - "description": "The current version of the app." - }, - "buildNumber": { - "type": "String", - "description": "The build number of the app." - } + "currentLanguage": {} } - } - - - - + }, + "interactiveTranslatorAutoPlaySliderHeader": "Autoplay translation", + "@interactiveTranslatorAutoPlaySliderHeader": { + "type": "text", + "placeholders": {} + }, + "interactiveTranslatorAutoPlayDesc": "Launches the interactive translator without asking.", + "@interactiveTranslatorAutoPlayDesc": { + "type": "text", + "placeholders": {} + }, + "changeAnalyticsView": "Change Analytics View" } \ No newline at end of file diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb index 6cc89cc65..ac6b30c76 100644 --- a/assets/l10n/intl_es.arb +++ b/assets/l10n/intl_es.arb @@ -2752,31 +2752,11 @@ "type": "text", "placeholders": {} }, - "openToExchanges": "¿Abierto a intercambios?", - "@openToExchanges": { - "type": "text", - "placeholders": {} - }, - "oneToOneChatsWithinExchanges": "Chats Privados dentro de Intercambios", - "@oneToOneChatsWithinExchanges": { - "type": "text", - "placeholders": {} - }, "createGroupChats": "Crear Chats Grupales", "@createGroupChats": { "type": "text", "placeholders": {} }, - "createGroupChatsInExchanges": "Crear Chats Grupales en Intercambios", - "@createGroupChatsInExchanges": { - "type": "text", - "placeholders": {} - }, - "createGroupChatsInExchangesDesc": "Active esta opción para permitir que los estudiantes creen chats grupales dentro de los intercambios.", - "@createGroupChatsInExchangesDesc": { - "type": "text", - "placeholders": {} - }, "shareStories": "Subir historias", "@shareStories": { "type": "text", @@ -2917,21 +2897,11 @@ "type": "text", "placeholders": {} }, - "findLanguageExchange": "Encuentre una clase de intercambio", - "@findLanguageExchange": { - "type": "text", - "placeholders": {} - }, "requestToEnroll": "Solicitar inscripción", "@requestToEnroll": { "type": "text", "placeholders": {} }, - "requestAnExchange": "Solicitar un intercambio", - "@requestAnExchange": { - "type": "text", - "placeholders": {} - }, "targetLanguage": "Idioma a aprender", "@targetLanguage": { "type": "text", @@ -2982,11 +2952,6 @@ "type": "text", "placeholders": {} }, - "classSettings": "Ajustes de clase", - "@classSettings": { - "type": "text", - "placeholders": {} - }, "suggestToClass": "Sugiera el chat a", "@suggestToClass": { "type": "text", @@ -3032,8 +2997,8 @@ "type": "text", "placeholders": {} }, - "classAnalyticsDesc": "Información detallada sobre la participación de los estudiantes y el uso del idioma", - "@classAnalyticsDesc": { + "spaceAnalyticsDesc": "Información detallada sobre la participación de los estudiantes y el uso del idioma", + "@spaceAnalyticsDesc": { "type": "text", "placeholders": {} }, @@ -3099,6 +3064,17 @@ "type": "text", "placeholders": {} }, + "interactiveTranslatorAutoPlaySliderHeader": "Traducción 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", @@ -3161,10 +3137,16 @@ "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?", + "@needsItMessage": { + "type": "text", + "placeholders": { + "targetLanguage": {} + } + }, "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", @@ -3815,7 +3797,6 @@ "sentMessage": "Mensaje enviado", "useType": "Tipo de Uso", "notAvailable": "No disponible", - "classExchanges": "Intercambios", "kickAllStudents": "Patear a todos los estudiantes", "kickAllStudentsConfirmation": "¿Estás seguro de que quieres echar a todos los estudiantes?", "inviteAllStudents": "Invitar a todos los estudiantes", @@ -4296,7 +4277,6 @@ "copyClassLink": "Copiar enlace de invitación", "copyClassLinkDesc": "Al hacer clic en este enlace, los usuarios accederán a la aplicación, se abrirán una cuenta y se unirán automáticamente a este espacio.", "copyClassCode": "Copiar código de invitación", - "classSettingsDesc": "Editar idiomas de clase y nivel", "createGroupChatsDesc": "Active esta opción para permitir a los estudiantes crear chats de grupo dentro del espacio de clase/intercambio.", "joinWithClassCode": "Únete a una clase o a un intercambio", "joinWithClassCodeDesc": "Conéctese a una clase o espacio de intercambio con el código de invitación de 6 dígitos proporcionado por el administrador del espacio.", @@ -4304,8 +4284,6 @@ "unableToFindClass": "No podemos encontrar la clase o el intercambio. Por favor, vuelva a comprobar la información con el administrador del espacio. Si sigue teniendo problemas, póngase en contacto con support@pangea.chat.", "welcomeToYourNewClass": "Bienvenido 🙂", "welcomeToClass": "Bienvenido! 🙂\n- ¡Prueba a unirte a un chat!\n- ¡Diviértete chateando!", - "welcomeToPangea18Plus": "Bienvenido al chat de Pangea 🙂 .\n¿Qué es lo siguiente?\n¡Crea una clase o únete a ella!\n¡O busca un compañero de conversación!", - "welcomeToPangeaMinor": "Bienvenido al chat de Pangea 🙂 .\n¿Qué es lo siguiente?\n¡Únete a una clase!\nPide a tu profesor un código de invitación.", "unableToFindClassCode": "No se puede encontrar el código.", "errorDisableITClassDesc": "La ayuda a la traducción está desactivada para el espacio en el que se encuentra este chat.", "errorDisableIGCClassDesc": "La asistencia gramatical está desactivada para el espacio en el que se encuentra este chat.", @@ -4317,26 +4295,14 @@ "pleaseLoginFirst": "Inicie sesión o regístrese primero y, a continuación, se le añadirá a su clase/espacio de intercambio.", "welcomeBack": "¡Bienvenido de nuevo! Si formó parte del piloto 2023-2024, póngase en contacto con nosotros para obtener su suscripción especial de piloto. Si es usted un profesor que ha adquirido (o cuya institución ha adquirido) licencias para su clase, póngase en contacto con nosotros para obtener su suscripción de profesor.", "createNewClass": "Nuevo espacio para clases", - "newExchange": "Nuevo espacio de intercambio", "inviteStudentsFromOtherClasses": "Invitar a estudiantes de otros espacios", - "allExchanges": "Todos los intercambios", "creatingSpacePleaseWait": "Creando espacio. Por favor, espere...", "pay": "Pagar", "copyClassCodeDesc": "Los estudiantes que ya están en la aplicación pueden 'Unirse a una clase o a un intercambio' a través del menú principal.", "inviteUsersFromPangea": "Añadir profesores", "addToClass": "Añadir intercambio a la clase", - "addToClassOrExchange": "Añadir chat a la clase o al intercambio", - "classAnalytics": "Análisis de clase", "myLearning": "Mis análisis", "addToClassDesc": "Añadir un intercambio a una clase hará que el intercambio aparezca dentro de la clase para los estudiantes y les dará acceso a todos los chats dentro del intercambio.", - "addToClassOrExchangeDesc": "Añadir un chat a una clase o intercambio hará que el chat aparezca dentro de la clase o intercambio para los estudiantes y les dará acceso.", - "invitedToClassOrExchange": "{user} te ha invitado a unirte a ¡{classOrExchange}! ¿Deseas aceptar?", - "@invitedToClassOrExchange": { - "placeholders": { - "classOrExchange": {}, - "user": {} - } - }, "decline": "Disminución", "declinedInvitation": "Invitación rechazada", "acceptedInvitation": "Invitación aceptada", @@ -4369,14 +4335,11 @@ }, "emptyChatNameWarning": "Introduzca un nombre para este chat", "emptyClassNameWarning": "Introduzca un nombre para esta clase", - "emptyExchangeNameWarning": "Introduzca un nombre para este intercambio", "blurMeansTranslateTitle": "¿Por qué está borroso el mensaje?", - "blurMeansTranslateBody": "Mientras el Modo Inmersión esté activado, los mensajes que se envíen en su idioma base aparecerán borrosos mientras Pangea Bot los traduce a su idioma de destino. El modo inmersión puede activarse en los ajustes individuales y de clase.", "monthlySubscription": "Mensualmente", "yearlySubscription": "Anualmente", "defaultSubscription": "Suscripción al chat de Pangea", "freeTrial": "Prueba gratuita", - "languageLevelWarning": "Seleccione un nivel de idioma de clase", "lockedChatWarning": "🔒 Este chat ha sido bloqueado", "lockSpace": "Espacio de bloqueo", "lockChat": "Chat de bloqueo", @@ -4393,7 +4356,6 @@ "itStartDefaultPrompt": "¿Quiere ayuda para traducir?", "suggestTo": "Sugerir a {spaceName}", "suggestChatDesc": "Los chats sugeridos aparecerán en la lista de chats de {spaceName}.", - "suggestExchangeDesc": "Los intercambios sugeridos aparecerán en la lista de chat de {spaceName}.", "acceptSelection": "Aceptar corrección", "acceptSelectionAnyway": "Use esto de todos modos", "makingActivity": "Actividad de fabricación", @@ -4460,7 +4422,6 @@ "groupCanBeFoundViaSearch": "El grupo se puede encontrar a través de la búsqueda", "inNoSpaces": "No es miembro de ninguna clase o bolsa", "createClass": "Crear clase", - "createExchange": "Crear intercambio", "viewArchive": "Ver archivo", "trialExpiration": "Su prueba gratuita caduca el {expiration}.", "@trialExpiration": { @@ -4568,7 +4529,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", @@ -4665,9 +4626,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.", @@ -4676,24 +4637,85 @@ "tooltipInstructionsMobileBody": "Mantenga pulsados los elementos para ver la información sobre herramientas.", "tooltipInstructionsBrowserBody": "Pase el ratón sobre los elementos para ver información sobre herramientas.", "buildTranslation": "Construye tu traducción a partir de las opciones anteriores", - "versionNotFound": "Versión no encontrada", - "fetchingVersion": "Obteniendo versión...", - "versionFetchError": "Error al obtener la versión", - "connectedToStaging": "Conectado al entorno de pruebas", - "versionText": "Versión: {version}+{buildNumber}", - "@versionText": { - "description": "Texto que muestra la versión y el número de compilación de la aplicación.", + "appLockDescription": "Bloquea la aplicación cuando no la uses con un código pin", + "swipeRightToLeftToReply": "Desliza el dedo de derecha a izquierda para responder", + "globalChatId": "ID global del chat", + "accessAndVisibility": "Acceso y visibilidad", + "accessAndVisibilityDescription": "Quién puede participar en este chat y cómo se puede descubrir el chat.", + "calls": "Llamadas", + "customEmojisAndStickers": "Emojis y pegatinas personalizados", + "customEmojisAndStickersBody": "Añade o comparte emojis o stickers personalizados que podrás utilizar en cualquier chat.", + "hideRedactedMessages": "Ocultar mensajes redactados", + "hideRedactedMessagesBody": "Si alguien borra un mensaje, éste ya no será visible en el chat.", + "hideInvalidOrUnknownMessageFormats": "Ocultar formatos de mensaje no válidos o desconocidos", + "hideMemberChangesInPublicChats": "Ocultar los cambios de los miembros en los chats públicos", + "hideMemberChangesInPublicChatsBody": "No mostrar en la línea de tiempo del chat si alguien se une o abandona un chat público para mejorar la legibilidad.", + "overview": "Visión general", + "notifyMeFor": "Notificarme para", + "passwordRecoverySettings": "Configuración de recuperación de contraseña", + "usersMustKnock": "Los usuarios deben golpear", + "userWouldLikeToChangeTheChat": "{user} desea unirse al chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Aún no se ha creado ningún enlace público", + "knock": "Knock", + "multiLingualSpace": "Espacio multilingüe", + "languageSettings": "Ajustes de idioma", + "languageSettingsDesc": "Editar idiomas espaciales y nivel de competencia.", + "selectSpaceDominantLanguage": "¿Cuál es la lengua más común de los miembros del espacio?", + "selectSpaceTargetLanguage": "¿Cuál es la lengua de destino más común del espacio?", + "whatIsYourSpaceLanguageLevel": "¿Cuál es el nivel lingüístico medio del espacio?", + "welcomeToPangea18Plus": "Bienvenido al chat de Pangea 🙂 .\n¿Qué es lo siguiente?\n¡Crea o únete a un espacio!\n¡O busca un compañero de conversación!", + "welcomeToPangeaMinor": "Bienvenido al chat de Pangea 🙂 .\n¿Qué es lo siguiente?\n¡Únete a un espacio!\nPide a tu profesor un código de invitación.", + "addToSpaceDesc": "Añadir un chat a un espacio hará que el chat aparezca dentro del espacio para los estudiantes y les dará acceso.", + "invitedToSpace": "{user} te ha invitado a unirte a un espacio: ¡{space}! ¿Deseas aceptar?", + "@invitedToSpace": { + "placeholders": { + "space": {}, + "user": {} + } + }, + "emptySpaceNameWarning": "Introduzca un nombre para este espacio", + "blurMeansTranslateBody": "Mientras el Modo Inmersión esté activado, los mensajes que se envíen en tu idioma base aparecerán borrosos mientras Pangea Bot los traduce a tu idioma de destino. El Modo Inmersión puede activarse en los ajustes individuales y espaciales.", + "languageLevelWarning": "Seleccione un nivel de lengua espacial", + "knocking": "Golpeando", + "chatCanBeDiscoveredViaSearchOnServer": "El chat puede descubrirse mediante la búsqueda en {server}.", + "@chatCanBeDiscoveredViaSearchOnServer": { "type": "text", "placeholders": { - "version": { - "type": "String", - "description": "La versión actual de la aplicación." - }, - "buildNumber": { - "type": "String", - "description": "El número de compilación de la aplicación." - } + "server": {} } - } - + }, + "publicChatAddresses": "Direcciones de chat públicas", + "createNewAddress": "Crear una nueva dirección", + "userRole": "Función del usuario", + "minimumPowerLevel": "{level} es el nivel mínimo de potencia.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "searchMore": "Buscar más...", + "gallery": "Galería", + "files": "Archivos", + "addSpaceToSpaceDescription": "Seleccione un espacio para añadir como padre", + "noDatabaseEncryption": "La encriptación de la base de datos no es compatible con esta plataforma", + "thereAreCountUsersBlocked": "Ahora mismo hay {count} usuarios bloqueados.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "restricted": "Restringido", + "knockRestricted": "Golpe restringido", + "nonexistentSelection": "La selección ya no existe.", + "cantAddSpaceChild": "No tiene permiso para añadir un niño a este espacio.", + "roomAddedToSpace": "Se han añadido habitaciones al espacio seleccionado.", + "addChatToSpaceDesc": "Añadir un chat a un espacio hará que el chat aparezca dentro del espacio para los estudiantes y les dará acceso.", + "addSpaceToSpaceDesc": "Añadir un espacio a otro espacio hará que el espacio hijo aparezca dentro del espacio padre para los estudiantes y les dará acceso.", + "spaceAnalytics": "Analítica espacial", + "changeAnalyticsLanguage": "Cambiar el lenguaje analítico" } \ No newline at end of file diff --git a/assets/pangea/bot_faces/pangea_bot.riv b/assets/pangea/bot_faces/pangea_bot.riv new file mode 100644 index 000000000..94244a30f Binary files /dev/null and b/assets/pangea/bot_faces/pangea_bot.riv differ 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; diff --git a/lib/config/routes.dart b/lib/config/routes.dart index d4eaa5d85..51c631ff3 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -29,7 +29,6 @@ import 'package:fluffychat/pages/settings_style/settings_style.dart'; import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart'; import 'package:fluffychat/pangea/guard/p_vguard.dart'; import 'package:fluffychat/pangea/pages/analytics/student_analytics/student_analytics.dart'; -import 'package:fluffychat/pangea/pages/exchange/add_exchange_to_class.dart'; import 'package:fluffychat/pangea/pages/find_partner/find_partner.dart'; import 'package:fluffychat/pangea/pages/p_user_age/p_user_age.dart'; import 'package:fluffychat/pangea/pages/settings_learning/settings_learning.dart'; @@ -43,8 +42,8 @@ import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import '../pangea/pages/analytics/class_analytics/class_analytics.dart'; -import '../pangea/pages/analytics/class_list/class_list.dart'; +import '../pangea/pages/analytics/space_analytics/space_analytics.dart'; +import '../pangea/pages/analytics/space_list/space_list.dart'; abstract class AppRoutes { static FutureOr loggedInRedirect( @@ -171,79 +170,30 @@ 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', pageBuilder: (context, state) => defaultPageBuilder( context, state, - const AnalyticsClassList(), + const AnalyticsSpaceList(), ), redirect: loggedOutRedirect, routes: [ GoRoute( - path: ':classid', - redirect: loggedOutRedirect, + path: ':spaceid', pageBuilder: (context, state) => defaultPageBuilder( context, state, - const ClassAnalyticsPage(), + const SpaceAnalyticsPage( + selectedView: BarChartViewSelection.messages, + ), ), - routes: [ - GoRoute( - path: 'messages', - pageBuilder: (context, state) => defaultPageBuilder( - context, - state, - ClassAnalyticsPage( - // when going to sub-space from within a parent space's analytics, the - // analytics list tiles do not properly update. Adding a unique key to this page is the best fix - // I can find at the moment - key: UniqueKey(), - selectedView: BarChartViewSelection.messages, - ), - ), - ), - GoRoute( - path: 'errors', - pageBuilder: (context, state) => defaultPageBuilder( - context, - state, - ClassAnalyticsPage( - // when going to sub-space from within a parent space's analytics, the - // analytics list tiles do not properly update. Adding a unique key to this page is the best fix - // I can find at the moment - key: UniqueKey(), - selectedView: BarChartViewSelection.grammar, - ), - ), - ), - ], ), ], ), @@ -319,24 +269,6 @@ abstract class AppRoutes { redirect: loggedOutRedirect, ), // #Pangea - GoRoute( - path: 'newspace/:newexchange', - pageBuilder: (context, state) => defaultPageBuilder( - context, - state, - const NewSpace(), - ), - redirect: loggedOutRedirect, - ), - GoRoute( - path: 'join_exchange/:exchangeid', - pageBuilder: (context, state) => defaultPageBuilder( - context, - state, - const AddExchangeToClass(), - ), - redirect: loggedOutRedirect, - ), GoRoute( path: 'partner', pageBuilder: (context, state) => defaultPageBuilder( diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index b199a1b67..5629d809e 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -16,12 +16,11 @@ 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'; -import 'package:fluffychat/pangea/models/class_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'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/firebase_analytics.dart'; @@ -317,10 +316,10 @@ class ChatController extends State Future.delayed(const Duration(seconds: 1), () async { if (!mounted) return; debugPrint( - "chat.dart l1 ${pangeaController.languageController.activeL1Code(roomID: roomId)}", + "chat.dart l1 ${pangeaController.languageController.userL1?.langCode}", ); debugPrint( - "chat.dart l2 ${pangeaController.languageController.activeL2Code(roomID: roomId)}", + "chat.dart l2 ${pangeaController.languageController.userL2?.langCode}", ); if (mounted) { pangeaController.languageController.showDialogOnEmptyLanguage( @@ -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) { @@ -654,8 +650,6 @@ class ChatController extends State ); return; } - // ensure that analytics room exists / is created for the active langCode - await room.ensureAnalyticsRoomExists(); }, onError: (err, stack) => ErrorHandler.logError(e: err, s: stack), ); diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index fed94554a..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'; @@ -45,7 +45,8 @@ class ChatEventList extends StatelessWidget { // after the chat event list mounts, if the user hasn't yet seen this instruction // card, attach it on top of the first shown message WidgetsBinding.instance.addPostFrameCallback((_) { - controller.pangeaController.instructions.show( + if (events.isEmpty) return; + controller.pangeaController.instructions.showInstructionsPopup( context, InstructionsEnum.clickMessage, events[0].eventId, diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 6bf19a850..2ba6a0957 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -1,9 +1,8 @@ import 'package:animations/animations.dart'; 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'; @@ -55,9 +54,6 @@ class ChatInputRow extends StatelessWidget { return Column( children: [ - ITBar( - choreographer: controller.choreographer, - ), Row( // crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.center, diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index 5ee52c46b..5b4f96606 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -24,6 +24,7 @@ import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; +import '../../pangea/choreographer/widgets/it_bar.dart'; import '../../utils/stream_extension.dart'; import 'chat_emoji_picker.dart'; import 'chat_input_row.dart'; @@ -440,6 +441,9 @@ class ChatView extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ const ConnectionStatusHeader(), + ITBar( + choreographer: controller.choreographer, + ), ReactionsPicker(controller), ReplyDisplay(controller), ChatInputRow(controller), diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index dc129a192..3b2c1b2fb 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -3,6 +3,7 @@ import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pangea/enum/use_type.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/language_model.dart'; +import 'package:fluffychat/pangea/widgets/chat/message_buttons.dart'; import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/string_color.dart'; @@ -469,7 +470,7 @@ class Message extends StatelessWidget { ?.showUseType ?? false) ...[ pangeaMessageEvent! - .useType + .msgUseType .iconView( context, textColor @@ -524,7 +525,14 @@ class Message extends StatelessWidget { Widget container; final showReceiptsRow = event.hasAggregatedEvents(timeline, RelationshipTypes.reaction); - if (showReceiptsRow || displayTime || selected || displayReadMarker) { + // #Pangea + // if (showReceiptsRow || displayTime || selected || displayReadMarker) { + if (showReceiptsRow || + displayTime || + selected || + displayReadMarker || + (pangeaMessageEvent?.showMessageButtons ?? false)) { + // Pangea# container = Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: @@ -561,7 +569,11 @@ class Message extends StatelessWidget { AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, - child: !showReceiptsRow + // #Pangea + child: !showReceiptsRow && + !(pangeaMessageEvent?.showMessageButtons ?? false) + // child: !showReceiptsRow + // Pangea# ? const SizedBox.shrink() : Padding( padding: EdgeInsets.only( @@ -569,7 +581,19 @@ class Message extends StatelessWidget { left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0, right: ownMessage ? 0 : 12.0, ), - child: MessageReactions(event, timeline), + // #Pangea + child: Row( + mainAxisAlignment: ownMessage + ? MainAxisAlignment.end + : MainAxisAlignment.start, + children: [ + if (pangeaMessageEvent?.showMessageButtons ?? false) + MessageButtons(toolbarController: toolbarController), + MessageReactions(event, timeline), + ], + ), + // child: MessageReactions(event, timeline), + // Pangea# ), ), if (displayReadMarker) diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart index ca8cb8b04..4f4e091d0 100644 --- a/lib/pages/chat_details/chat_details_view.dart +++ b/lib/pages/chat_details/chat_details_view.dart @@ -11,10 +11,8 @@ import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/class_nam import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart'; import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart'; import 'package:fluffychat/pangea/utils/lock_room.dart'; -import 'package:fluffychat/pangea/widgets/class/add_class_and_invite.dart'; import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart'; import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_settings.dart'; -import 'package:fluffychat/pangea/widgets/space/class_settings.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -104,380 +102,171 @@ 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 + // 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), + // 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.isSpace && room.isRoomAdmin) ListTile( title: Text( - room.isSpace - ? L10n.of(context)!.archiveSpace - : L10n.of(context)!.archive, + L10n.of(context)!.spaceAnalytics, style: TextStyle( color: Theme.of(context).colorScheme.secondary, @@ -489,199 +278,421 @@ 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}', + ), + ), + // commenting out language settings in spaces for now + // if (room.languageSettings != null && room.isRoomAdmin) + // LanguageSettings( + // 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.isDirectChat && room.isRoomAdmin) + AddToSpaceToggles( + roomId: room.id, + key: controller.addToSpaceKey, + startOpen: false, + ), + 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/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 9d7ff2440..89f31fd68 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:io'; import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:collection/collection.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat_list/chat_list_view.dart'; @@ -213,32 +212,12 @@ class ChatListController extends State } List get filteredRooms => Matrix.of(context) - .client - .rooms - .where( - getRoomFilterByActiveFilter(activeFilter), - ) - // #Pangea - .sorted((roomA, roomB) { - // put rooms with unread messages at the top of the list - if (roomA.membership == Membership.invite && - roomB.membership != Membership.invite) { - return -1; - } - if (roomA.membership != Membership.invite && - roomB.membership == Membership.invite) { - return 1; - } - - final bool aUnread = roomA.notificationCount > 0 || roomA.markedUnread; - final bool bUnread = roomB.notificationCount > 0 || roomB.markedUnread; - if (aUnread && !bUnread) return -1; - if (!aUnread && bUnread) return 1; - - return 0; - }) - // Pangea# - .toList(); + .client + .rooms + .where( + getRoomFilterByActiveFilter(activeFilter), + ) + .toList(); bool isSearchMode = false; Future? publicRoomsResponse; @@ -938,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/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index 56aa568c0..4ad107f6b 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -1,8 +1,9 @@ import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; -import 'package:fluffychat/pangea/utils/class_code.dart'; +import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:fluffychat/pangea/utils/find_conversation_partner_dialog.dart'; import 'package:fluffychat/pangea/utils/logout.dart'; +import 'package:fluffychat/pangea/utils/space_code.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -58,17 +59,19 @@ class ClientChooserButton extends StatelessWidget { room.isSpace && room.ownPowerLevel >= ClassDefaultValues.powerLevelOfAdmin, ), - value: SettingsAction.classAnalytics, + value: SettingsAction.spaceAnalytics, child: Row( children: [ const Icon(Icons.analytics_outlined), const SizedBox(width: 18), - Expanded(child: Text(L10n.of(context)!.classAnalytics)), + Expanded(child: Text(L10n.of(context)!.spaceAnalytics)), ], ), ), PopupMenuItem( - enabled: matrix.client.rooms.isNotEmpty, + enabled: matrix.client.rooms.any( + (room) => !room.isSpace && !room.isArchived && !room.isAnalyticsRoom, + ), value: SettingsAction.myAnalytics, child: Row( children: [ @@ -84,7 +87,7 @@ class ClientChooserButton extends StatelessWidget { children: [ const Icon(Icons.school), const SizedBox(width: 18), - Expanded(child: Text(L10n.of(context)!.createNewClass)), + Expanded(child: Text(L10n.of(context)!.createNewSpace)), ], ), ), @@ -98,16 +101,6 @@ class ClientChooserButton extends StatelessWidget { // ], // ), // ), - PopupMenuItem( - value: SettingsAction.newExchange, - child: Row( - children: [ - const Icon(Icons.connecting_airports), - const SizedBox(width: 18), - Expanded(child: Text(L10n.of(context)!.newExchange)), - ], - ), - ), if (controller.pangeaController.permissionsController.isUser18()) PopupMenuItem( value: SettingsAction.findAConversationPartner, @@ -397,11 +390,8 @@ class ClientChooserButton extends StatelessWidget { case SettingsAction.newClass: context.go('/rooms/newspace'); break; - case SettingsAction.newExchange: - context.go('/rooms/newspace/exchange'); - break; case SettingsAction.joinWithClassCode: - ClassCodeUtil.joinWithClassCodeDialog( + SpaceCodeUtil.joinWithSpaceCodeDialog( context, controller.pangeaController, ); @@ -412,7 +402,7 @@ class ClientChooserButton extends StatelessWidget { controller.pangeaController, ); break; - case SettingsAction.classAnalytics: + case SettingsAction.spaceAnalytics: context.go('/rooms/analytics'); break; case SettingsAction.myAnalytics: @@ -507,11 +497,10 @@ enum SettingsAction { // #Pangea learning, joinWithClassCode, - classAnalytics, + spaceAnalytics, myAnalytics, findAConversationPartner, logout, newClass, - newExchange // Pangea# } 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/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index b3a1703af..7e77efe56 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -174,7 +174,7 @@ class NewGroupController extends State { void initState() { Future.delayed(Duration.zero, () { chatTopic.langCode = - pangeaController.languageController.activeL2Code(roomID: null) ?? + pangeaController.languageController.userL2?.langCode ?? pangeaController.pLanguageStore.targetOptions.first.langCode; setState(() {}); }); diff --git a/lib/pages/new_group/new_group_view.dart b/lib/pages/new_group/new_group_view.dart index 277a7402f..b8b43c3f1 100644 --- a/lib/pages/new_group/new_group_view.dart +++ b/lib/pages/new_group/new_group_view.dart @@ -1,7 +1,6 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/new_group/new_group.dart'; import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart'; -import 'package:fluffychat/pangea/widgets/class/add_class_and_invite.dart'; import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart'; import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_settings.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; @@ -100,7 +99,6 @@ class NewGroupView extends StatelessWidget { key: controller.addToSpaceKey, startOpen: true, activeSpaceId: controller.activeSpaceId, - mode: AddToClassMode.chat, ), // const SizedBox(height: 16), // SwitchListTile.adaptive( diff --git a/lib/pages/new_space/new_space.dart b/lib/pages/new_space/new_space.dart index 59818d3b2..7a7759349 100644 --- a/lib/pages/new_space/new_space.dart +++ b/lib/pages/new_space/new_space.dart @@ -8,16 +8,14 @@ import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_capa import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; import 'package:fluffychat/pangea/utils/class_chat_power_levels.dart'; -import 'package:fluffychat/pangea/utils/class_code.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/firebase_analytics.dart'; +import 'package:fluffychat/pangea/utils/space_code.dart'; import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart'; -import 'package:fluffychat/pangea/widgets/space/class_settings.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:go_router/go_router.dart'; import 'package:matrix/matrix.dart' as sdk; import 'package:matrix/matrix.dart'; @@ -36,8 +34,9 @@ class NewSpaceController extends State { bool publicGroup = true; final GlobalKey rulesEditorKey = GlobalKey(); final GlobalKey addToSpaceKey = GlobalKey(); - final GlobalKey classSettingsKey = - GlobalKey(); + // commenting out language settings in spaces for now + // final GlobalKey languageSettingsKey = + // GlobalKey(); final GlobalKey addCapacityKey = GlobalKey(); @@ -68,8 +67,6 @@ class NewSpaceController extends State { void setPublicGroup(bool b) => setState(() => publicGroup = b); // #Pangea - bool newClassMode = true; - List get initialState { final events = []; @@ -95,11 +92,11 @@ class NewSpaceController extends State { } else { debugger(when: kDebugMode); } - if (classSettingsKey.currentState != null) { - events.add(classSettingsKey.currentState!.classSettings.toStateEvent); - } else { - debugger(when: kDebugMode && newClassMode); - } + // commenting out language settings in spaces for now + // if (languageSettingsKey.currentState != null) { + // events + // .add(languageSettingsKey.currentState!.languageSettings.toStateEvent); + // } return events; } @@ -117,33 +114,30 @@ class NewSpaceController extends State { debugger(when: kDebugMode); return; } - if (classSettingsKey.currentState != null && - classSettingsKey.currentState!.sameLanguages) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.noIdenticalLanguages), - ), - ); - return; - } - if (newClassMode) { - final int? languageLevel = - classSettingsKey.currentState!.classSettings.languageLevel; - if (languageLevel == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.languageLevelWarning)), - ); - return; - } - } + // commenting out language settings in spaces for now + // if (languageSettingsKey.currentState != null && + // languageSettingsKey.currentState!.sameLanguages) { + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // content: Text(L10n.of(context)!.noIdenticalLanguages), + // ), + // ); + // return; + // } + // final int? languageLevel = + // languageSettingsKey.currentState!.languageSettings.languageLevel; + // if (languageLevel == null) { + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar(content: Text(L10n.of(context)!.languageLevelWarning)), + // ); + // return; + // } // Pangea# if (nameController.text.isEmpty) { setState(() { // #Pangea // nameError = L10n.of(context)!.pleaseChoose; - final String warning = newClassMode - ? L10n.of(context)!.emptyClassNameWarning - : L10n.of(context)!.emptyExchangeNameWarning; + final String warning = L10n.of(context)!.emptySpaceNameWarning; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(warning)), ); @@ -168,7 +162,7 @@ class NewSpaceController extends State { // roomAliasName: publicGroup // ? nameController.text.trim().toLowerCase().replaceAll(' ', '_') // : null, - roomAliasName: ClassCodeUtil.generateClassCode(), + roomAliasName: SpaceCodeUtil.generateSpaceCode(), // Pangea# name: nameController.text.trim(), topic: topicController.text.isEmpty ? null : topicController.text, @@ -224,15 +218,10 @@ class NewSpaceController extends State { } room.setSpaceChild(newChatRoomId, suggested: true); - newClassMode - ? GoogleAnalytics.addParent( - newChatRoomId, - room.classCode, - ) - : GoogleAnalytics.addChatToExchange( - newChatRoomId, - room.classCode, - ); + GoogleAnalytics.addParent( + newChatRoomId, + room.classCode, + ); GoogleAnalytics.createClass(room.name, room.classCode); try { @@ -267,8 +256,6 @@ class NewSpaceController extends State { // #Pangea // Widget build(BuildContext context) => NewSpaceView(this); Widget build(BuildContext context) { - newClassMode = - GoRouterState.of(context).pathParameters['newexchange'] != 'exchange'; return NewSpaceView(this); } // Pangea# diff --git a/lib/pages/new_space/new_space_view.dart b/lib/pages/new_space/new_space_view.dart index 09abb7066..f8c7baf4e 100644 --- a/lib/pages/new_space/new_space_view.dart +++ b/lib/pages/new_space/new_space_view.dart @@ -1,17 +1,14 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/extensions/client_extension/client_extension.dart'; -import 'package:fluffychat/pangea/models/class_model.dart'; +import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart'; import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart'; -import 'package:fluffychat/pangea/widgets/class/add_class_and_invite.dart'; import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart'; -import 'package:fluffychat/pangea/widgets/space/class_settings.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:go_router/go_router.dart'; import 'new_space.dart'; @@ -32,29 +29,8 @@ class NewSpaceView extends StatelessWidget { appBar: AppBar( // #Pangea centerTitle: true, - title: Text( - controller.newClassMode - ? L10n.of(context)!.createNewClass - : L10n.of(context)!.newExchange, - ), - actions: [ - IconButton( - icon: const Icon(Icons.class_outlined), - selectedIcon: const Icon(Icons.class_), - color: controller.newClassMode ? activeColor : null, - isSelected: controller.newClassMode, - onPressed: () => context.go('/rooms/newspace'), - ), - IconButton( - icon: const Icon(Icons.connecting_airports), - selectedIcon: const Icon(Icons.connecting_airports), - color: !controller.newClassMode ? activeColor : null, - isSelected: !controller.newClassMode, - onPressed: () => context.go('/rooms/newspace/exchange'), - ), - ], - // title: Text(L10n.of(context)!.createNewSpace), // Pangea# + title: Text(L10n.of(context)!.createNewSpace), ), body: MaxWidthBody( child: Column( @@ -135,42 +111,48 @@ class NewSpaceView extends StatelessWidget { RoomCapacityButton( key: controller.addCapacityKey, ), - if (controller.newClassMode) - ClassSettings( - key: controller.classSettingsKey, - roomId: null, - startOpen: true, - initialSettings: - Matrix.of(context).client.lastUpdatedClassSettings, - ), - if (!controller.newClassMode) - AddToSpaceToggles( - key: controller.addToSpaceKey, - startOpen: true, - mode: !controller.newClassMode - ? AddToClassMode.exchange - : AddToClassMode.chat, - ), - FutureBuilder( - future: Matrix.of(context).client.lastUpdatedRoomRules, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - return RoomRulesEditor( - key: controller.rulesEditorKey, - roomId: null, - startOpen: false, - initialRules: snapshot.data, - ); - } else { - return const Padding( - padding: EdgeInsets.all(16.0), - child: Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2), - ), - ); - } - }, + // commenting out language settings in spaces for now + // LanguageSettings( + // key: controller.languageSettingsKey, + // roomId: null, + // startOpen: true, + // initialSettings: + // Matrix.of(context).client.lastUpdatedLanguageSettings, + // ), + AddToSpaceToggles( + key: controller.addToSpaceKey, + startOpen: true, + spaceMode: true, ), + if (controller.rulesEditorKey.currentState != null) + RoomRulesEditor( + key: controller.rulesEditorKey, + roomId: null, + startOpen: false, + initialRules: controller.rulesEditorKey.currentState!.rules, + ), + if (controller.rulesEditorKey.currentState == null) + FutureBuilder( + future: Matrix.of(context).client.lastUpdatedRoomRules, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + return RoomRulesEditor( + key: controller.rulesEditorKey, + roomId: null, + startOpen: false, + initialRules: snapshot.data, + ); + } else { + return const Padding( + padding: EdgeInsets.all(16.0), + child: Center( + child: + CircularProgressIndicator.adaptive(strokeWidth: 2), + ), + ); + } + }, + ), // SwitchListTile.adaptive( // title: Text(L10n.of(context)!.spaceIsPublic), // value: controller.publicGroup, @@ -194,12 +176,7 @@ class NewSpaceView extends StatelessWidget { children: [ Expanded( child: Text( - // #Pangea - // L10n.of(context)!.createNewSpace, - controller.newClassMode - ? L10n.of(context)!.createClass - : L10n.of(context)!.createExchange, - // Pangea# + L10n.of(context)!.createNewSpace, ), ), Icon(Icons.adaptive.arrow_forward_outlined), diff --git a/lib/pages/settings/settings_view.dart b/lib/pages/settings/settings_view.dart index e537f01af..06e4855ec 100644 --- a/lib/pages/settings/settings_view.dart +++ b/lib/pages/settings/settings_view.dart @@ -209,6 +209,12 @@ class SettingsView extends StatelessWidget { Icons.chevron_right_outlined, ), ), + ListTile( + leading: const Icon(Icons.psychology_outlined), + title: Text(L10n.of(context)!.learningSettings), + onTap: () => context.go('/rooms/settings/learning'), + trailing: const Icon(Icons.chevron_right_outlined), + ), // Pangea# ListTile( leading: const Icon(Icons.shield_outlined), diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 3d84b0e1d..66e11808b 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -5,17 +5,16 @@ 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/pangea_event_types.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/extensions/pangea_room_extension/pangea_room_extension.dart'; -import 'package:fluffychat/pangea/models/class_model.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'; +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'; @@ -25,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'; @@ -95,63 +93,59 @@ 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; - - final PangeaRepresentation originalSent = PangeaRepresentation( - langCode: langCodeOfCurrentText ?? LanguageKeys.unknownLanguage, - text: currentText, - originalSent: true, - originalWritten: originalWritten == null, - ); - final ChoreoRecord? applicableChoreo = - isITandIGCEnabled && igc.igcTextData != null ? choreoRecord : null; - - // 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( - currentText, - pangeaController.languageController.userL2?.langCode, - pangeaController.languageController.userL1?.langCode, - ); - final LanguageDetection? bestDetection = resp.bestDetection(); - if (bestDetection != null) { - originalSent.langCode = bestDetection.langCode; - } - } - - 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(); - } else { + if (!igc.canSendMessage) { igc.showFirstMatch(context); + return; } + + final PangeaRepresentation? originalWritten = + choreoRecord.includedIT && itController.sourceText != null + ? PangeaRepresentation( + langCode: l1LangCode ?? LanguageKeys.unknownLanguage, + text: itController.sourceText!, + originalWritten: true, + originalSent: false, + ) + : null; + + // 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; + + // 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 || + igc.igcTextData?.detectedLanguage == null) { + await igc.getIGCTextData(onlyTokensAndLanguageDetection: true); + } + + final PangeaRepresentation originalSent = PangeaRepresentation( + langCode: + igc.igcTextData?.detectedLanguage ?? LanguageKeys.unknownLanguage, + text: currentText, + originalSent: true, + originalWritten: originalWritten == null, + ); + + final PangeaMessageTokens? tokensSent = igc.igcTextData?.tokens != null + ? PangeaMessageTokens(tokens: igc.igcTextData!.tokens) + : null; + + chatController.send( + // originalWritten: originalWritten, + originalSent: originalSent, + tokensSent: tokensSent, + //TODO - save originalwritten tokens + // choreo: applicableChoreo, + choreo: choreoRecord, + ); + + clear(); } _resetDebounceTimer() { @@ -167,7 +161,7 @@ class Choreographer { } choreoMode = ChoreoMode.it; itController.initializeIT( - ITStartData(_textController.text, igc.detectedLangCode), + ITStartData(_textController.text, igc.igcTextData?.detectedLanguage), ); itMatch.status = PangeaMatchStatus.accepted; @@ -180,6 +174,7 @@ class Choreographer { _textController.setSystemText("", EditType.itStart); } + /// Handles any changes to the text input _onChangeListener() { if (_noChange) { return; @@ -188,21 +183,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(); @@ -212,7 +212,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 @@ -221,10 +223,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 = @@ -239,13 +245,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 { @@ -443,25 +451,15 @@ class Choreographer { } LanguageModel? get l2Lang { - return pangeaController.languageController.activeL2Model( - roomID: roomId, - ); + return pangeaController.languageController.activeL2Model(); } String? get l2LangCode => l2Lang?.langCode; LanguageModel? get l1Lang => - pangeaController.languageController.activeL1Model( - roomID: roomId, - ); - String? get l1LangCode => l1Lang?.langCode; + pangeaController.languageController.activeL1Model(); - String? get classId => roomId != null - ? pangeaController.matrixState.client - .getRoomById(roomId) - ?.firstParentWithState(PangeaEventTypes.classSettings) - ?.id - : null; + String? get l1LangCode => l1Lang?.langCode; String? get userId => pangeaController.userController.userId; @@ -492,14 +490,6 @@ class Choreographer { bool get editTypeIsKeyboard => EditType.keyboard == _textController.editType; - String? get langCodeOfCurrentText { - if (igc.detectedLangCode != null) return igc.detectedLangCode!; - - if (itController.isOpen) return l2LangCode!; - - return null; - } - setState() { if (!stateListener.isClosed) { stateListener.add(0); @@ -533,6 +523,12 @@ class Choreographer { chatController.room, ); + bool get itAutoPlayEnabled => + pangeaController.pStoreService.read( + MatrixProfile.itAutoPlay.title, + ) ?? + false; + bool get definitionsEnabled => pangeaController.permissionsController.isToolEnabled( ToolSetting.definitions, @@ -582,13 +578,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/controllers/igc_controller.dart b/lib/pangea/choreographer/controllers/igc_controller.dart index b882e4087..533b36c83 100644 --- a/lib/pangea/choreographer/controllers/igc_controller.dart +++ b/lib/pangea/choreographer/controllers/igc_controller.dart @@ -3,18 +3,17 @@ 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'; +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/language_detection_model.dart'; import '../../models/span_card_model.dart'; -import '../../repo/tokens_repo.dart'; import '../../utils/error_handler.dart'; import '../../utils/overlay.dart'; @@ -29,59 +28,42 @@ 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 - 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 = []; - } - 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,6 +152,13 @@ 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( @@ -189,7 +178,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, ); } @@ -206,14 +195,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 61c8c2312..3187d4a6a 100644 --- a/lib/pangea/choreographer/controllers/it_controller.dart +++ b/lib/pangea/choreographer/controllers/it_controller.dart @@ -3,7 +3,6 @@ import 'dart:developer'; import 'package:fluffychat/pangea/choreographer/controllers/error_service.dart'; import 'package:fluffychat/pangea/constants/choreo_constants.dart'; -import 'package:fluffychat/pangea/repo/full_text_translation_repo.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -21,6 +20,7 @@ class ITController { Choreographer choreographer; bool _isOpen = false; + bool _willOpen = false; bool _isEditingSourceText = false; bool showChoiceFeedback = false; @@ -36,6 +36,7 @@ class ITController { void clear() { _isOpen = false; + _willOpen = false; showChoiceFeedback = false; _isEditingSourceText = false; @@ -54,6 +55,7 @@ class ITController { } Future initializeIT(ITStartData itStartData) async { + _willOpen = true; Future.delayed(const Duration(microseconds: 100), () { _isOpen = true; }); @@ -61,17 +63,14 @@ 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(); } /// if IGC isn't positive that text is full L1 then translate to L1 Future _setSourceText() async { - // try { if (_itStartData == null || _itStartData!.text.isEmpty) { Sentry.addBreadcrumb( Breadcrumb( @@ -85,32 +84,23 @@ class ITController { throw Exception("null _itStartData or empty text in _setSourceText"); } debugPrint("_setSourceText with detectedLang ${_itStartData!.langCode}"); - if (_itStartData!.langCode == choreographer.l1LangCode) { - sourceText = _itStartData!.text; - return; - } - - final FullTextTranslationResponseModel res = - await FullTextTranslationRepo.translate( - accessToken: await choreographer.accessToken, - request: FullTextTranslationRequestModel( - text: _itStartData!.text, - tgtLang: choreographer.l1LangCode!, - srcLang: choreographer.l2LangCode, - 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; - // } + // if (_itStartData!.langCode == choreographer.l1LangCode) { + sourceText = _itStartData!.text; + return; // } + + // final FullTextTranslationResponseModel res = + // await FullTextTranslationRepo.translate( + // accessToken: await choreographer.accessToken, + // request: FullTextTranslationRequestModel( + // text: _itStartData!.text, + // tgtLang: choreographer.l1LangCode!, + // srcLang: _itStartData!.langCode, + // userL1: choreographer.l1LangCode!, + // userL2: choreographer.l2LangCode!, + // ), + // ); + // sourceText = res.bestTranslation; } // used 1) at very beginning (with custom input = null) @@ -166,7 +156,7 @@ class ITController { if (isTranslationDone) { choreographer.altTranslator.setTranslationFeedback(); - choreographer.getLanguageHelp(true); + choreographer.getLanguageHelp(onlyTokensAndLanguageDetection: true); } else { getNextTranslationData(); } @@ -217,31 +207,17 @@ class ITController { Future onEditSourceTextSubmit(String newSourceText) async { try { - sourceText = newSourceText; + _isOpen = true; _isEditingSourceText = false; - final String currentText = choreographer.currentText; + _itStartData = ITStartData(newSourceText, choreographer.l1LangCode); + completedITSteps = []; + currentITStep = null; + nextITStep = null; + goldRouteTracker = GoldRouteTracker.defaultTracker; + payLoadIds = []; - 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]); + _setSourceText(); + getTranslationData(false); } catch (err, stack) { debugger(when: kDebugMode); if (err is! http.Response) { @@ -252,6 +228,7 @@ class ITController { ); } finally { choreographer.stopLoading(); + choreographer.textController.text = ""; } } @@ -265,7 +242,6 @@ class ITController { targetLangCode: targetLangCode, userId: choreographer.userId!, roomId: choreographer.roomId!, - classId: choreographer.classId, goldTranslation: goldRouteTracker.fullTranslation, goldContinuances: goldRouteTracker.continuances, ), @@ -283,7 +259,6 @@ class ITController { translationId: translationId, targetLangCode: targetLangCode, sourceLangCode: sourceLangCode, - classId: choreographer.classId, ), ); @@ -336,15 +311,14 @@ class ITController { bool get isOpen => _isOpen; + bool get willOpen => _willOpen; + String get targetLangCode => choreographer.l2LangCode!; String get sourceLangCode => choreographer.l1LangCode!; 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/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/choice_array.dart b/lib/pangea/choreographer/widgets/choice_array.dart index 54fd601b9..adf30dcb1 100644 --- a/lib/pangea/choreographer/widgets/choice_array.dart +++ b/lib/pangea/choreographer/widgets/choice_array.dart @@ -3,14 +3,12 @@ import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; import '../../utils/bot_style.dart'; import 'it_shimmer.dart'; -class ChoicesArray extends StatelessWidget { +class ChoicesArray extends StatefulWidget { final bool isLoading; final List? choices; final void Function(int) onPressed; @@ -18,6 +16,10 @@ class ChoicesArray extends StatelessWidget { final int? selectedChoiceIndex; final String originalSpan; final String Function(int) uniqueKeyForLayerLink; + + /// some uses of this widget want to disable the choices + final bool isActive; + const ChoicesArray({ super.key, required this.isLoading, @@ -26,26 +28,55 @@ class ChoicesArray extends StatelessWidget { required this.originalSpan, required this.uniqueKeyForLayerLink, required this.selectedChoiceIndex, + this.isActive = true, 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.isActive ? widget.onLongPress : null, + onPressed: widget.isActive ? widget.onPressed : (_) {}, entry: entry, - isSelected: selectedChoiceIndex == entry.key, + interactionDisabled: interactionDisabled, + enableInteraction: enableInteractions, + disableInteraction: disableInteraction, + isSelected: widget.selectedChoiceIndex == entry.key, ), ) .toList() ?? @@ -74,6 +105,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 +115,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 +131,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, @@ -109,27 +148,29 @@ class ChoiceItem extends StatelessWidget { : null, child: TextButton( style: ButtonStyle( - padding: MaterialStateProperty.all( + padding: WidgetStateProperty.all( const EdgeInsets.symmetric(horizontal: 7), ), //if index is selected, then give the background a slight primary color - backgroundColor: MaterialStateProperty.all( + backgroundColor: WidgetStateProperty.all( entry.value.color != null ? entry.value.color!.withOpacity(0.2) : theme.colorScheme.primary.withOpacity(0.1), ), - textStyle: MaterialStateProperty.all( + textStyle: WidgetStateProperty.all( BotStyle.text(context), ), - shape: MaterialStateProperty.all( + shape: WidgetStateProperty.all( RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), ), - onLongPress: - onLongPress != null ? () => onLongPress!(entry.key) : null, - onPressed: () => onPressed(entry.key), + onLongPress: onLongPress != null && !interactionDisabled + ? () => onLongPress!(entry.key) + : null, + onPressed: + interactionDisabled ? null : () => onPressed(entry.key), child: Text( entry.value.text, style: BotStyle.text(context), @@ -149,11 +190,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 +206,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() { @@ -177,33 +224,45 @@ class ChoiceAnimationWidgetState extends State ); _animation = widget.isGold - ? Tween(begin: 1.0, end: 1.2).animate(_controller) - : TweenSequence([ - TweenSequenceItem( - tween: Tween(begin: 0, end: -8 * pi / 180), - weight: 1.0, - ), - TweenSequenceItem( - tween: Tween(begin: -8 * pi / 180, end: 16 * pi / 180), - weight: 2.0, - ), - TweenSequenceItem( - tween: Tween(begin: 16 * pi / 180, end: 0), - weight: 1.0, - ), - ]).animate(_controller); + ? Tween(begin: 1.0, end: 1.2).animate(_controller) + : TweenSequence([ + TweenSequenceItem( + tween: Tween(begin: 0, end: -8 * pi / 180), + weight: 1.0, + ), + TweenSequenceItem( + tween: Tween(begin: -8 * pi / 180, end: 16 * pi / 180), + weight: 2.0, + ), + TweenSequenceItem( + tween: Tween(begin: 16 * pi / 180, end: 0), + weight: 1.0, + ), + ]).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,38 +270,40 @@ 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; + }); } } @override Widget build(BuildContext context) { return widget.isGold - ? AnimatedBuilder( - key: UniqueKey(), - animation: _animation, - builder: (context, child) { - return Transform.scale( - scale: _animation.value, - child: child, - ); - }, - child: widget.child, - ) - : AnimatedBuilder( - key: UniqueKey(), - animation: _animation, - builder: (context, child) { - return Transform.rotate( - angle: _animation.value, - child: child, - ); - }, - child: widget.child, - ); + ? AnimatedBuilder( + key: UniqueKey(), + animation: _animation, + builder: (context, child) { + return Transform.scale( + scale: _animation.value, + child: child, + ); + }, + child: widget.child, + ) + : AnimatedBuilder( + key: UniqueKey(), + animation: _animation, + builder: (context, child) { + return Transform.rotate( + angle: _animation.value, + child: child, + ); + }, + child: widget.child, + ); } @override diff --git a/lib/pangea/choreographer/widgets/it_bar.dart b/lib/pangea/choreographer/widgets/it_bar.dart index 4e26cba58..2ba630900 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), - ), - ], - ), + ), ), ); } @@ -184,10 +199,23 @@ class OriginalText extends StatelessWidget { ), ), ), - if (!controller.isEditingSourceText && controller.sourceText != null) - IconButton( - onPressed: () => controller.setIsEditingSourceText(true), - icon: const Icon(Icons.edit_outlined), + if ( + !controller.isEditingSourceText + && controller.sourceText != null + ) + 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/choreographer/widgets/it_bar_buttons.dart b/lib/pangea/choreographer/widgets/it_bar_buttons.dart index 815020d17..9fcaa927e 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:fluffychat/pangea/controllers/pangea_controller.dart'; +import 'package:fluffychat/pangea/enum/instructions_enum.dart'; +import 'package:fluffychat/widgets/matrix.dart'; 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 '../../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, @@ -45,8 +45,9 @@ class ITBotButton extends StatelessWidget { ); return IconButton( - icon: const BotFace(width: 40.0, expression: BotExpression.right), - onPressed: () => choreographer.pangeaController.instructions.show( + icon: const BotFace(width: 40.0, expression: BotExpression.idle), + onPressed: () => + choreographer.pangeaController.instructions.showInstructionsPopup( context, InstructionsEnum.itInstructions, choreographer.itBotTransformTargetKey, 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/choreographer/widgets/language_permissions_warning_buttons.dart b/lib/pangea/choreographer/widgets/language_permissions_warning_buttons.dart index 9d3302910..0abe90925 100644 --- a/lib/pangea/choreographer/widgets/language_permissions_warning_buttons.dart +++ b/lib/pangea/choreographer/widgets/language_permissions_warning_buttons.dart @@ -2,7 +2,7 @@ import 'dart:developer'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; -import 'package:fluffychat/pangea/models/class_model.dart'; +import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; diff --git a/lib/pangea/choreographer/widgets/start_igc_button.dart b/lib/pangea/choreographer/widgets/start_igc_button.dart index ceb5af193..e8625da95 100644 --- a/lib/pangea/choreographer/widgets/start_igc_button.dart +++ b/lib/pangea/choreographer/widgets/start_igc_button.dart @@ -1,10 +1,10 @@ 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'; @@ -53,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) { @@ -77,92 +77,67 @@ class StartIGCButtonState extends State 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, + child: InkWell( + customBorder: const CircleBorder(), + onLongPress: () => pLanguageDialog(context, () {}), + child: FloatingActionButton( + tooltip: assistanceState.tooltip( + L10n.of(context)!, + ), + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + disabledElevation: 0, + shape: const CircleBorder(), + onPressed: () { + if (assistanceState != AssistanceState.fetching) { + widget.controller.choreographer + .getLanguageHelp( + onlyTokensAndLanguageDetection: false, + manual: 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, ), - ), - 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/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/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/constants/local.key.dart b/lib/pangea/constants/local.key.dart index 743fe1143..40dd393c5 100644 --- a/lib/pangea/constants/local.key.dart +++ b/lib/pangea/constants/local.key.dart @@ -11,5 +11,6 @@ class PLocalKey { static const String dismissedPaywall = 'dismissedPaywall'; static const String paywallBackoff = 'paywallBackoff'; static const String autoPlayMessages = 'autoPlayMessages'; + static const String itAutoPlay = 'itAutoPlay'; static const String messagesSinceUpdate = 'messagesSinceLastUpdate'; } diff --git a/lib/pangea/constants/model_keys.dart b/lib/pangea/constants/model_keys.dart index 0cd14e5a4..372e72606 100644 --- a/lib/pangea/constants/model_keys.dart +++ b/lib/pangea/constants/model_keys.dart @@ -27,11 +27,8 @@ class ModelKey { static const String clientIsPublic = "isPublic"; static const String clientIsOpenEnrollment = 'isOpenEnrollment'; - static const String clientIsOpenExchange = 'isOpenExchange'; static const String clientIsOneToOneChatClass = 'oneToOneChatClass'; - static const String clientIsOneToOneChatExchange = 'oneToOneChatExchange'; static const String clientIsCreateRooms = 'isCreateRooms'; - static const String clientIsCreateRoomsExchange = 'isCreateRoomsExchange'; static const String clientIsShareVideo = 'isShareVideo'; static const String clientIsSharePhoto = 'isSharePhoto'; static const String clientIsShareFiles = 'isShareFiles'; @@ -39,7 +36,6 @@ class ModelKey { static const String clientIsCreateStories = 'isCreateStories'; static const String clientIsVoiceNotes = 'isVoiceNotes'; static const String clientIsInviteOnlyStudents = 'isInviteOnlyStudents'; - static const String clientIsInviteOnlyExchanges = 'isInviteOnlyExchanges'; static const String userL1 = "user_l1"; static const String userL2 = "user_l2"; @@ -70,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"; @@ -99,17 +94,16 @@ 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 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/constants/pangea_event_types.dart b/lib/pangea/constants/pangea_event_types.dart index a182728dd..9ca975dc0 100644 --- a/lib/pangea/constants/pangea_event_types.dart +++ b/lib/pangea/constants/pangea_event_types.dart @@ -1,6 +1,5 @@ class PangeaEventTypes { - static const classSettings = "pangea.class"; - static const pangeaExchange = "p.exchange"; + static const languageSettings = "pangea.class"; static const transcript = "pangea.transcript"; @@ -26,4 +25,14 @@ class PangeaEventTypes { static const String report = 'm.report'; static const textToSpeechRule = "p.rule.text_to_speech"; + + /// 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/constants/pangea_room_types.dart b/lib/pangea/constants/pangea_room_types.dart index dcceadd36..804d2be86 100644 --- a/lib/pangea/constants/pangea_room_types.dart +++ b/lib/pangea/constants/pangea_room_types.dart @@ -1,4 +1,3 @@ class PangeaRoomTypes { static const analytics = 'p.analytics'; - static const exchange = 'p.exchange'; } diff --git a/lib/pangea/controllers/class_controller.dart b/lib/pangea/controllers/class_controller.dart index 1e2febf21..b4bc18b87 100644 --- a/lib/pangea/controllers/class_controller.dart +++ b/lib/pangea/controllers/class_controller.dart @@ -7,9 +7,9 @@ import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.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/class_model.dart'; -import 'package:fluffychat/pangea/utils/class_code.dart'; +import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:fluffychat/pangea/utils/space_code.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -34,12 +34,11 @@ class ClassController extends BaseController { Future fixClassPowerLevels() async { try { - final List> classFixes = []; - final teacherSpaces = await _pangeaController - .matrixState.client.classesAndExchangesImTeaching; - for (final room in teacherSpaces) { - classFixes.add(room.setClassPowerLevels()); - } + final teacherSpaces = + await _pangeaController.matrixState.client.spacesImTeaching; + final List> classFixes = List.from(teacherSpaces) + .map((adminSpace) => adminSpace.setClassPowerLevels()) + .toList(); await Future.wait(classFixes); } catch (err, stack) { debugger(when: kDebugMode); @@ -65,7 +64,7 @@ class ClassController extends BaseController { classCode, ).onError( (error, stackTrace) => - ClassCodeUtil.messageSnack(context, ErrorCopy(context, error).body), + SpaceCodeUtil.messageSnack(context, ErrorCopy(context, error).body), ); } } @@ -78,8 +77,7 @@ class ClassController extends BaseController { if (!room.isDirectChat) return []; final List existingParentsIds = room.pangeaSpaceParents.map((e) => e.id).toList(); - final List spaces = - _pangeaController.matrixState.client.classesAndExchangesImIn; + final List spaces = _pangeaController.matrixState.client.spacesImIn; //make sure we have the latest participants await Future.wait(spaces.map((e) => e.requestParticipants())); @@ -121,7 +119,7 @@ class ClassController extends BaseController { }); if (classChunk == null) { - ClassCodeUtil.messageSnack( + SpaceCodeUtil.messageSnack( context, L10n.of(context)!.unableToFindClass, ); @@ -131,7 +129,7 @@ class ClassController extends BaseController { if (_pangeaController.matrixState.client.rooms .any((room) => room.id == classChunk.roomId)) { setActiveSpaceIdInChatListController(classChunk.roomId); - ClassCodeUtil.messageSnack(context, L10n.of(context)!.alreadyInClass); + SpaceCodeUtil.messageSnack(context, L10n.of(context)!.alreadyInClass); return; } @@ -170,9 +168,6 @@ class ClassController extends BaseController { final Room? joinedSpace = _pangeaController.matrixState.client.getRoomById(classChunk.roomId); - // ensure that the user has an analytics room for this space's language - await joinedSpace?.ensureAnalyticsRoomExists(); - // when possible, add user's analytics room the to space they joined await joinedSpace?.addAnalyticsRoomsToSpace(); @@ -181,7 +176,7 @@ class ClassController extends BaseController { GoogleAnalytics.joinClass(classCode); return; } catch (err) { - ClassCodeUtil.messageSnack( + SpaceCodeUtil.messageSnack( context, ErrorCopy(context, err).body, ); @@ -199,7 +194,7 @@ class ClassController extends BaseController { final Room? room = _pangeaController.matrixState.client.getRoomById(roomId); if (room == null) return; - if (room.classSettings != null && room.pangeaRoomRules == null) { + if (room.isSpace && room.isRoomAdmin && room.pangeaRoomRules == null) { try { await _pangeaController.matrixState.client.setRoomStateWithKey( roomId, diff --git a/lib/pangea/controllers/language_controller.dart b/lib/pangea/controllers/language_controller.dart index e11053fe2..b1bc02380 100644 --- a/lib/pangea/controllers/language_controller.dart +++ b/lib/pangea/controllers/language_controller.dart @@ -1,14 +1,11 @@ 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/extensions/pangea_room_extension/pangea_room_extension.dart'; -import 'package:fluffychat/pangea/models/class_model.dart'; import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:matrix/matrix.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import '../widgets/user_settings/p_language_dialog.dart'; @@ -63,50 +60,51 @@ class LanguageController { return _userL2Code != null ? PangeaLanguage.byLangCode(_userL2Code!) : null; } - String? activeL1Code({String? roomID}) { - final String? activeL2 = activeL2Code(roomID: roomID); - if (roomID == null || activeL2 != _userL1Code) { - return _userL1Code; - } - final ClassSettingsModel? classContext = _pangeaController - .matrixState.client - .getRoomById(roomID) - ?.firstLanguageSettings; - final String? classL1 = classContext?.dominantLanguage; - if (classL1 == LanguageKeys.mixedLanguage || - classL1 == LanguageKeys.multiLanguage || - classL1 == null) { - if (_userL2Code != _userL1Code) { - return _userL2Code; - } - return LanguageKeys.unknownLanguage; - } - return classL1; + String? activeL1Code() { + return _userL1Code; + // final String? activeL2 = activeL2Code(roomID: roomID); + // if (roomID == null || activeL2 != _userL1Code) { + // return _userL1Code; + // } + // final LanguageSettingsModel? classContext = _pangeaController + // .matrixState.client + // .getRoomById(roomID) + // ?.firstLanguageSettings; + // final String? classL1 = classContext?.dominantLanguage; + // if (classL1 == LanguageKeys.mixedLanguage || + // classL1 == LanguageKeys.multiLanguage || + // classL1 == null) { + // if (_userL2Code != _userL1Code) { + // return _userL2Code; + // } + // return LanguageKeys.unknownLanguage; + // } + // return classL1; } /// Class languages override user languages within a class context - String? activeL2Code({String? roomID}) { - if (roomID == null) { - return _userL2Code; - } - final ClassSettingsModel? classContext = _pangeaController - .matrixState.client - .getRoomById(roomID) - ?.firstLanguageSettings; - return classContext?.targetLanguage ?? _userL2Code; + String? activeL2Code() { + return _userL2Code; + // if (roomID == null) { + // return _userL2Code; + // } + // final LanguageSettingsModel? classContext = _pangeaController + // .matrixState.client + // .getRoomById(roomID) + // ?.firstLanguageSettings; + // return classContext?.targetLanguage ?? _userL2Code; } - LanguageModel? activeL1Model({String? roomID}) { - final activeL1 = activeL1Code(roomID: roomID); - return activeL1 != null ? PangeaLanguage.byLangCode(activeL1) : null; + LanguageModel? activeL1Model() { + return userL1; + // final activeL1 = activeL1Code(roomID: roomID); + // return activeL1 != null ? PangeaLanguage.byLangCode(activeL1) : null; } - LanguageModel? activeL2Model({String? roomID}) { - final activeL2 = activeL2Code(roomID: roomID); - final model = activeL2 != null ? PangeaLanguage.byLangCode(activeL2) : null; - return model; + LanguageModel? activeL2Model() { + return userL2; + // final activeL2 = activeL2Code(roomID: roomID); + // final model = activeL2 != null ? PangeaLanguage.byLangCode(activeL2) : null; + // return model; } - - bool equalActiveL1AndActiveL2({Room? room}) => - activeL1Code() == activeL2Code(roomID: room?.id); } diff --git a/lib/pangea/controllers/language_detection_controller.dart b/lib/pangea/controllers/language_detection_controller.dart index 4ddfabc88..a3e07b0a3 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,21 @@ 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.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; - } + /// 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) + ? highestConfidenceDetection + : unknownLanguageDetection; } class _LanguageDetectionCacheItem { diff --git a/lib/pangea/controllers/language_list_controller.dart b/lib/pangea/controllers/language_list_controller.dart index 345d5b5e7..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 { @@ -27,7 +26,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 +76,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/controllers/local_settings.dart b/lib/pangea/controllers/local_settings.dart index 2dc30cfe7..95b88ae14 100644 --- a/lib/pangea/controllers/local_settings.dart +++ b/lib/pangea/controllers/local_settings.dart @@ -1,5 +1,5 @@ import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; -import 'package:fluffychat/pangea/models/class_model.dart'; +import 'package:fluffychat/pangea/models/space_model.dart'; class LocalSettings { late PangeaController _pangeaController; diff --git a/lib/pangea/controllers/message_analytics_controller.dart b/lib/pangea/controllers/message_analytics_controller.dart index c0c8ecd1a..3739b2596 100644 --- a/lib/pangea/controllers/message_analytics_controller.dart +++ b/lib/pangea/controllers/message_analytics_controller.dart @@ -4,11 +4,13 @@ import 'dart:developer'; import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/constants/match_rule_ids.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; +import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; import 'package:fluffychat/pangea/enum/time_span.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/language_model.dart'; import 'package:fluffychat/pangea/pages/analytics/base_analytics.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; @@ -60,35 +62,65 @@ class AnalyticsController extends BaseController { timeSpan.toString(), local: true, ); + setState(); } + ///////// SPACE ANALYTICS LANGUAGES ////////// + String get _analyticsSpaceLangKey => "ANALYTICS_SPACE_LANG_KEY"; + + LanguageModel get currentAnalyticsLang { + try { + final String? str = _pangeaController.pStoreService.read( + _analyticsSpaceLangKey, + local: true, + ); + return str != null + ? PangeaLanguage.byLangCode(str) + : _pangeaController.languageController.userL2 ?? + _pangeaController.pLanguageStore.targetOptions.first; + } catch (err) { + debugger(when: kDebugMode); + return _pangeaController.pLanguageStore.targetOptions.first; + } + } + + Future setCurrentAnalyticsLang(LanguageModel lang) async { + await _pangeaController.pStoreService.save( + _analyticsSpaceLangKey, + lang.langCode, + local: true, + ); + 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, ); } @@ -96,7 +128,6 @@ class AnalyticsController extends BaseController { Future spaceAnalyticsLastUpdated( String type, Room space, - String langCode, ) async { // check if any students have recently updated their analytics // if any have, then the cache needs to be updated @@ -106,7 +137,7 @@ class AnalyticsController extends BaseController { final List> lastUpdatedFutures = []; for (final student in space.students) { final Room? analyticsRoom = _pangeaController.matrixState.client - .analyticsRoomLocal(langCode, student.id); + .analyticsRoomLocal(currentAnalyticsLang.langCode, student.id); if (analyticsRoom == null) continue; lastUpdatedFutures.add( analyticsRoom.analyticsLastUpdated( @@ -132,35 +163,37 @@ class AnalyticsController extends BaseController { // private chat analytics to determine which children are already visible // in the chat list final Map> _lastFetchedHierarchies = {}; + void setLatestHierarchy(String spaceId, GetSpaceHierarchyResponse resp) { final List roomIds = resp.rooms.map((room) => room.roomId).toList(); _lastFetchedHierarchies[spaceId] = roomIds; } + Future> getLatestSpaceHierarchy(String spaceId) async { + if (!_lastFetchedHierarchies.containsKey(spaceId)) { + final resp = + await _pangeaController.matrixState.client.getSpaceHierarchy(spaceId); + setLatestHierarchy(spaceId, resp); + } + return _lastFetchedHierarchies[spaceId] ?? []; + } + //////////////////////////// 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( @@ -168,9 +201,6 @@ class AnalyticsController extends BaseController { ) async { // gets all the summary analytics events for the students // in a space since the current timespace's cut off date - final langCode = _pangeaController.languageController.activeL2Code( - roomID: space.id, - ); // ensure that all the space's events are loaded (mainly the for langCode) // and that the participants are loaded @@ -181,7 +211,7 @@ class AnalyticsController extends BaseController { final List analyticsEvents = []; for (final student in space.students) { final Room? analyticsRoom = _pangeaController.matrixState.client - .analyticsRoomLocal(langCode, student.id); + .analyticsRoomLocal(currentAnalyticsLang.langCode, student.id); if (analyticsRoom != null) { final List? roomEvents = @@ -225,7 +255,8 @@ class AnalyticsController extends BaseController { (e.defaultSelected.id == defaultSelected.id) && (e.defaultSelected.type == defaultSelected.type) && (e.selected?.id == selected?.id) && - (e.selected?.type == selected?.type), + (e.selected?.type == selected?.type) && + (e.langCode == currentAnalyticsLang.langCode), ); if (index != -1) { @@ -253,6 +284,7 @@ class AnalyticsController extends BaseController { chartAnalyticsModel: chartAnalyticsModel, defaultSelected: defaultSelected, selected: selected, + langCode: currentAnalyticsLang.langCode, ), ); } @@ -267,16 +299,16 @@ class AnalyticsController extends BaseController { return filtered; } - List filterRoomAnalytics( + Future> filterRoomAnalytics( List unfiltered, String? roomID, - ) { + ) async { List filtered = [...unfiltered]; Room? room; if (roomID != null) { room = _pangeaController.matrixState.client.getRoomById(roomID); if (room?.isSpace == true) { - return filterSpaceAnalytics(unfiltered, roomID); + return await filterSpaceAnalytics(unfiltered, roomID); } } @@ -295,16 +327,10 @@ class AnalyticsController extends BaseController { Future> filterPrivateChatAnalytics( List unfiltered, - Room? space, + Room space, ) async { - if (space != null && !_lastFetchedHierarchies.containsKey(space.id)) { - final resp = await _pangeaController.matrixState.client - .getSpaceHierarchy(space.id); - setLatestHierarchy(space.id, resp); - } - - final List privateChatIds = space?.allSpaceChildRoomIds ?? []; - final List lastFetched = _lastFetchedHierarchies[space!.id] ?? []; + final List privateChatIds = space.allSpaceChildRoomIds; + final List lastFetched = await getLatestSpaceHierarchy(space.id); for (final id in lastFetched) { privateChatIds.removeWhere((e) => e == id); } @@ -324,19 +350,11 @@ class AnalyticsController extends BaseController { return filtered; } - List filterSpaceAnalytics( + Future> filterSpaceAnalytics( List unfiltered, String spaceId, - ) { - final selectedSpace = - _pangeaController.matrixState.client.getRoomById(spaceId); - final List chatIds = selectedSpace?.spaceChildren - .map((e) => e.roomId) - .where((e) => e != null) - .cast() - .toList() ?? - []; - + ) async { + final List chatIds = await getLatestSpaceHierarchy(spaceId); List filtered = List.from(unfiltered); @@ -384,12 +402,15 @@ class AnalyticsController extends BaseController { if (defaultSelected.type == AnalyticsEntryType.student) { throw "private chat filtering not available for my analytics"; } + if (space == null) { + throw "space is null in filterAnalytics with selected type privateChats"; + } return await filterPrivateChatAnalytics( unfilteredAnalytics, space, ); case AnalyticsEntryType.space: - return filterSpaceAnalytics(unfilteredAnalytics, selected!.id); + return await filterSpaceAnalytics(unfilteredAnalytics, selected!.id); default: throw Exception("invalid filter type - ${selected?.type}"); } @@ -405,7 +426,6 @@ class AnalyticsController extends BaseController { // if the user is looking at space analytics, then fetch the space Room? space; - String? langCode; if (defaultSelected.type == AnalyticsEntryType.space) { space = _pangeaController.matrixState.client.getRoomById( defaultSelected.id, @@ -423,23 +443,7 @@ class AnalyticsController extends BaseController { timeSpan: currentAnalyticsTimeSpan, ); } - await space.postLoad(); - langCode = _pangeaController.languageController.activeL2Code( - roomID: space.id, - ); - if (langCode == null) { - ErrorHandler.logError( - m: "langCode missing in getAnalytics", - data: { - "space": space, - }, - ); - return ChartAnalyticsModel( - msgs: [], - timeSpan: currentAnalyticsTimeSpan, - ); - } } DateTime? lastUpdated; @@ -456,7 +460,6 @@ class AnalyticsController extends BaseController { lastUpdated = await spaceAnalyticsLastUpdated( PangeaEventTypes.summaryAnalytics, space!, - langCode!, ); } @@ -467,8 +470,10 @@ class AnalyticsController extends BaseController { lastUpdated: lastUpdated, ); if (local != null && !forceUpdate) { + debugPrint("returning local analytics"); return local; } + debugPrint("fetching new analytics"); // get all the relevant summary analytics events for the current timespan final List summaryEvents = @@ -515,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; @@ -548,24 +551,10 @@ class AnalyticsController extends BaseController { ) async { await space.postLoad(); await space.requestParticipants(); - final String? langCode = _pangeaController.languageController.activeL2Code( - roomID: space.id, - ); - - if (langCode == null) { - ErrorHandler.logError( - m: "langCode missing in allSpaceMemberConstructs", - data: { - "space": space, - }, - ); - return []; - } - final List constructEvents = []; for (final student in space.students) { final Room? analyticsRoom = _pangeaController.matrixState.client - .analyticsRoomLocal(langCode, student.id); + .analyticsRoomLocal(currentAnalyticsLang.langCode, student.id); if (analyticsRoom != null) { final List? roomEvents = (await analyticsRoom.getAnalyticsEvents( @@ -614,31 +603,30 @@ class AnalyticsController extends BaseController { return filtered; } - List filterPrivateChatConstructs( + Future> filterPrivateChatConstructs( List unfilteredConstructs, - Room parentSpace, - ) { - final List directChatIds = []; + Room space, + ) async { + final List privateChatIds = space.allSpaceChildRoomIds; + final List lastFetched = await getLatestSpaceHierarchy(space.id); + for (final id in lastFetched) { + privateChatIds.removeWhere((e) => e == id); + } final List filtered = List.from(unfilteredConstructs); for (final construct in filtered) { construct.content.uses.removeWhere( - (use) => !directChatIds.contains(use.chatId), + (use) => !privateChatIds.contains(use.chatId), ); } return filtered; } - List filterSpaceConstructs( + Future> filterSpaceConstructs( List unfilteredConstructs, Room space, - ) { - final List chatIds = space.spaceChildren - .map((e) => e.roomId) - .where((e) => e != null) - .cast() - .toList(); - + ) async { + final List chatIds = await getLatestSpaceHierarchy(space.id); final List filtered = List.from(unfilteredConstructs); @@ -653,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, @@ -665,7 +653,8 @@ class AnalyticsController extends BaseController { e.defaultSelected.id == defaultSelected.id && e.defaultSelected.type == defaultSelected.type && e.selected?.id == selected?.id && - e.selected?.type == selected?.type, + e.selected?.type == selected?.type && + e.langCode == currentAnalyticsLang.langCode, ); if (index > -1) { @@ -680,7 +669,7 @@ class AnalyticsController extends BaseController { } void cacheConstructs({ - required ConstructType constructType, + required ConstructTypeEnum constructType, required List events, required AnalyticsSelected defaultSelected, AnalyticsSelected? selected, @@ -691,13 +680,14 @@ class AnalyticsController extends BaseController { events: List.from(events), defaultSelected: defaultSelected, selected: selected, + langCode: currentAnalyticsLang.langCode, ); _cachedConstructs.add(entry); } Future> getMyConstructs({ required AnalyticsSelected defaultSelected, - required ConstructType constructType, + required ConstructTypeEnum constructType, AnalyticsSelected? selected, }) async { final List unfilteredConstructs = @@ -716,7 +706,7 @@ class AnalyticsController extends BaseController { } Future> getSpaceConstructs({ - required ConstructType constructType, + required ConstructTypeEnum constructType, required Room space, required AnalyticsSelected defaultSelected, AnalyticsSelected? selected, @@ -769,25 +759,25 @@ class AnalyticsController extends BaseController { case AnalyticsEntryType.privateChats: return defaultSelected.type == AnalyticsEntryType.student ? throw "private chat filtering not available for my analytics" - : filterPrivateChatConstructs(unfilteredConstructs, space!); + : await filterPrivateChatConstructs(unfilteredConstructs, space!); case AnalyticsEntryType.space: - return filterSpaceConstructs(unfilteredConstructs, space!); + return await filterSpaceConstructs(unfilteredConstructs, space!); default: throw Exception("invalid filter type - ${selected?.type}"); } } Future?> getConstructs({ - required ConstructType constructType, + required ConstructTypeEnum constructType, required AnalyticsSelected defaultSelected, AnalyticsSelected? selected, bool removeIT = true, bool forceUpdate = false, }) async { + debugPrint("getting constructs"); await _pangeaController.matrixState.client.roomsLoading; Room? space; - String? langCode; if (defaultSelected.type == AnalyticsEntryType.space) { space = _pangeaController.matrixState.client.getRoomById( defaultSelected.id, @@ -803,18 +793,6 @@ class AnalyticsController extends BaseController { return []; } await space.postLoad(); - langCode = _pangeaController.languageController.activeL2Code( - roomID: space.id, - ); - if (langCode == null) { - ErrorHandler.logError( - m: "langCode missing in setConstructs", - data: { - "space": space, - }, - ); - return []; - } } DateTime? lastUpdated; @@ -831,7 +809,6 @@ class AnalyticsController extends BaseController { lastUpdated = await spaceAnalyticsLastUpdated( PangeaEventTypes.construct, space!, - langCode!, ); } @@ -843,8 +820,10 @@ class AnalyticsController extends BaseController { lastUpdated: lastUpdated, ); if (local != null && !forceUpdate) { + debugPrint("returning local constructs"); return local; } + debugPrint("fetching new constructs"); final filteredConstructs = space == null ? await getMyConstructs( @@ -884,6 +863,7 @@ class AnalyticsController extends BaseController { } abstract class CacheEntry { + final String langCode; final TimeSpan timeSpan; final AnalyticsSelected defaultSelected; AnalyticsSelected? selected; @@ -892,6 +872,7 @@ abstract class CacheEntry { CacheEntry({ required this.timeSpan, required this.defaultSelected, + required this.langCode, this.selected, }) { _createdAt = DateTime.now(); @@ -917,24 +898,26 @@ abstract class CacheEntry { } class ConstructCacheEntry extends CacheEntry { - final ConstructType type; + final ConstructTypeEnum type; final List events; ConstructCacheEntry({ required this.type, required this.events, required super.timeSpan, + required super.langCode, required super.defaultSelected, super.selected, }); } class AnalyticsCacheModel extends CacheEntry { - ChartAnalyticsModel chartAnalyticsModel; + final ChartAnalyticsModel chartAnalyticsModel; AnalyticsCacheModel({ required this.chartAnalyticsModel, required super.timeSpan, + required super.langCode, required super.defaultSelected, super.selected, }); diff --git a/lib/pangea/controllers/message_data_controller.dart b/lib/pangea/controllers/message_data_controller.dart index 4a0668880..7b3a3e6d2 100644 --- a/lib/pangea/controllers/message_data_controller.dart +++ b/lib/pangea/controllers/message_data_controller.dart @@ -176,14 +176,20 @@ class MessageDataController extends BaseController { required String target, required Room room, }) async { + if (_pangeaController.languageController.userL2 == null || + _pangeaController.languageController.userL1 == null) { + ErrorHandler.logError( + e: "userL1 or userL2 is null in _getPangeaRepresentation", + s: StackTrace.current, + ); + return null; + } final req = FullTextTranslationRequestModel( text: text, tgtLang: target, srcLang: source, - userL2: - _pangeaController.languageController.activeL2Code(roomID: room.id)!, - userL1: - _pangeaController.languageController.activeL1Code(roomID: room.id)!, + userL2: _pangeaController.languageController.userL2!.langCode, + userL1: _pangeaController.languageController.userL1!.langCode, ); try { diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index 77a644863..535af6b8b 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -3,11 +3,11 @@ import 'dart:developer'; 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/analytics_event.dart'; -import 'package:fluffychat/pangea/models/analytics/analytics_model.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/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:matrix/matrix.dart'; @@ -15,53 +15,72 @@ 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 + 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 - Future addEventsListener() async { - final Client client = _pangeaController.matrixState.client; + /// 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 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(const Duration(days: 1)); - 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 - // 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 + /// 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 @@ -81,8 +100,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") && @@ -157,6 +177,7 @@ class MyAnalyticsController extends BaseController { _updateCompleter = Completer(); try { await _updateAnalytics(); + clearMessagesSinceUpdate(); } catch (err, s) { ErrorHandler.logError( e: err, @@ -169,170 +190,135 @@ class MyAnalyticsController extends BaseController { } } + String? get userL2 => _pangeaController.languageController.activeL2Code(); + + /// 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 { - // 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(); - await setStudentSpaces(); - - // get all the analytics rooms that the user has - // and create any missing analytics rooms (if the user is studying - // in a class but doesn't have an analytics room for that class's L2) - final List analyticsRooms = - _pangeaController.matrixState.client.allMyAnalyticsRooms; - analyticsRooms.addAll(await createMissingAnalyticsRooms()); - - // finally, send an analytics event for each analytics room and - // each type of analytics event - for (final Room analyticsRoom in analyticsRooms) { - for (final String type in AnalyticsEvent.analyticsEventTypes) { - await sendAnalyticsEvent(analyticsRoom, type); - } - } - } - - Future sendAnalyticsEvent( - Room analyticsRoom, - String type, - ) async { - // given an analytics room for a language and a type of analytics event - // gathers all the relevant data and sends it to the analytics room - - // get the language code for the analytics room - final String? langCode = analyticsRoom.madeForLang; - if (langCode == null) { - ErrorHandler.logError( - e: "no lang code found for analytics room: ${analyticsRoom.id}", - s: StackTrace.current, - ); + // if missing important info, don't send analytics + if (userL2 == null || _client.userID == null) { + debugger(when: kDebugMode); return; } - // get the last time an analytics event of this type was sent to this room - final DateTime? lastUpdated = await analyticsRoom.analyticsLastUpdated( - type, - _pangeaController.matrixState.client.userID!, + // analytics room for the user and current target language + final Room analyticsRoom = await _client.getMyAnalyticsRoom(userL2!); + + // get the last time analytics were updated for this room + final DateTime? l2AnalyticsLastUpdated = + await analyticsRoom.analyticsLastUpdated( + PangeaEventTypes.summaryAnalytics, + _client.userID!, ); - // each type of analytics event has a format for storing per-message data - // for SummaryAnalytics events, this is RecentMessageRecord - // for Construct events, this is OneConstructUse - // analyticsContent is a list of these formatted data - final List analyticsContent = []; + // all chats in which user is a student + final List chats = _client.rooms + .where((room) => !room.isSpace && !room.isAnalyticsRoom) + .toList(); - for (final Room chat in _studentChats) { - // for each chat the student studies in, check if the langCode - // matches the langCode of the analytics room - final String? chatLangCode = - _pangeaController.languageController.activeL2Code(roomID: chat.id); - if (chatLangCode != langCode) continue; + // get the recent message events and activity records for each chat + final List>> recentMsgFutures = []; + final List>> recentActivityFutures = []; + for (final Room chat in chats) { + recentMsgFutures.add( + chat.getEventsBySender( + type: EventTypes.Message, + sender: _client.userID!, + since: l2AnalyticsLastUpdated, + ), + ); + recentActivityFutures.add( + chat.getEventsBySender( + type: PangeaEventTypes.activityRecord, + sender: _client.userID!, + since: l2AnalyticsLastUpdated, + ), + ); + } + final List> recentMsgs = + (await Future.wait(recentMsgFutures)).toList(); + final List recentActivityRecords = + (await Future.wait(recentActivityFutures)) + .expand((e) => e) + .map((event) => PracticeActivityRecordEvent(event: event)) + .toList(); - // get messages the logged in user has sent in all chats - // since the last analytics event was sent - List? recentMsgs; - try { - recentMsgs = await chat.myMessageEventsInChat( - since: lastUpdated, - ); - } catch (err) { - debugPrint("failed to fetch messages for chat ${chat.id}"); - continue; - } + // 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); - if (lastUpdated != null) { - recentMsgs.removeWhere( - (msg) => msg.event.originServerTs.isBefore(lastUpdated), - ); - } - - // then format that data into analytics data and add the formatted - // data to the list of analyticsContent - analyticsContent.addAll( - AnalyticsModel.formatAnalyticsContent(recentMsgs, type), + //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(), ); } - // send the analytics data to the analytics room - // if there is no data to send, don't send an event, - // unless no events have been sent yet. In that case, send an event - // with no data to indicate that the the system checked for data - // and found none, so the system doesn't repeatedly check for data - if (analyticsContent.isEmpty && lastUpdated != null) return; - await AnalyticsEvent.sendEvent( - analyticsRoom, - type, - analyticsContent, - ); - } + final List allRecentMessages = + recentPangeaMessageEvents.expand((e) => e).toList(); - // on the off chance that the user is in a class but doesn't have an analytics - // room for the target language of that class, create the analytics room(s) - Future> createMissingAnalyticsRooms() async { - List targetLangs = []; - final String? userL2 = _pangeaController.languageController.activeL2Code(); - if (userL2 != null) targetLangs.add(userL2); - final List spaceL2s = studentSpaces - .map( - (space) => _pangeaController.languageController.activeL2Code( - roomID: space.id, - ), - ) - .toList(); - targetLangs.addAll(spaceL2s.where((l2) => l2 != null).cast()); - targetLangs = targetLangs.toSet().toList(); - for (final String langCode in targetLangs) { - await _pangeaController.matrixState.client.getMyAnalyticsRoom(langCode); + 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, + ); } - return _pangeaController.matrixState.client.allMyAnalyticsRooms; - } - 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 []; + // get constructs for messages + final List recentConstructUses = []; + for (final PangeaMessageEvent message in allRecentMessages) { + recentConstructUses.addAll(message.allConstructUses); } - } - List _studentSpaces = []; + // get constructs for practice activities + final List>> constructFutures = []; + for (final PracticeActivityRecordEvent activity in recentActivityRecords) { + 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; + } + constructFutures.add(activity.uses(timeline)); + } + final List> constructLists = + await Future.wait(constructFutures); - Future setStudentSpaces() async { - _studentSpaces = await _pangeaController - .matrixState.client.classesAndExchangesImStudyingIn; - } + recentConstructUses.addAll(constructLists.expand((e) => e)); - List get studentSpaces { - try { - if (_studentSpaces.isNotEmpty) return _studentSpaces; - setStudentSpaces(); - return _studentSpaces; - } catch (err) { - debugger(when: kDebugMode); - return []; + //TODO - confirm that this is the correct construct content + // debugger( + // when: kDebugMode, + // ); + // ; debugger( + // when: kDebugMode && + // (allRecentMessages.isNotEmpty || recentActivityRecords.isNotEmpty), + // ); + + if (recentConstructUses.isNotEmpty) { + await analyticsRoom.sendConstructsEvent( + recentConstructUses, + ); } } } diff --git a/lib/pangea/controllers/pangea_controller.dart b/lib/pangea/controllers/pangea_controller.dart index 1d1a00c05..7fbf91fd0 100644 --- a/lib/pangea/controllers/pangea_controller.dart +++ b/lib/pangea/controllers/pangea_controller.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:developer'; import 'dart:math'; @@ -12,6 +13,8 @@ import 'package:fluffychat/pangea/controllers/local_settings.dart'; import 'package:fluffychat/pangea/controllers/message_data_controller.dart'; import 'package:fluffychat/pangea/controllers/my_analytics_controller.dart'; import 'package:fluffychat/pangea/controllers/permissions_controller.dart'; +import 'package:fluffychat/pangea/controllers/practice_activity_generation_controller.dart'; +import 'package:fluffychat/pangea/controllers/practice_activity_record_controller.dart'; import 'package:fluffychat/pangea/controllers/speech_to_text_controller.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; import 'package:fluffychat/pangea/controllers/text_to_speech_controller.dart'; @@ -53,6 +56,8 @@ class PangeaController { late TextToSpeechController textToSpeech; late SpeechToTextController speechToText; late LanguageDetectionController languageDetection; + late PracticeActivityRecordController activityRecordController; + late PracticeGenerationController practiceGenerationController; ///store Services late PLocalStore pStoreService; @@ -101,6 +106,8 @@ class PangeaController { textToSpeech = TextToSpeechController(this); speechToText = SpeechToTextController(this); languageDetection = LanguageDetectionController(this); + activityRecordController = PracticeActivityRecordController(this); + practiceGenerationController = PracticeGenerationController(); PAuthGaurd.pController = this; } diff --git a/lib/pangea/controllers/permissions_controller.dart b/lib/pangea/controllers/permissions_controller.dart index f83903473..363accf8e 100644 --- a/lib/pangea/controllers/permissions_controller.dart +++ b/lib/pangea/controllers/permissions_controller.dart @@ -3,7 +3,7 @@ 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/extensions/pangea_room_extension/pangea_room_extension.dart'; -import 'package:fluffychat/pangea/models/class_model.dart'; +import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/models/user_model.dart'; import 'package:fluffychat/pangea/utils/p_extension.dart'; import 'package:matrix/matrix.dart'; @@ -117,27 +117,4 @@ class PermissionsController extends BaseController { return isToolEnabled(ToolSetting.interactiveTranslator, room) && isToolEnabled(ToolSetting.interactiveGrammar, room); } - - // bool get showChatListStartChatFloatingActionButton { - // //for now, I'm turning off chat button when not in the context of a clas - // //it will still be possible to private chat outside of a class - // //need to investigate if private chats can be put in a space. i suppose they can - // //if so, do we want that? - // try { - // if (_pangeaController.classController.activeClass == null) return false; - - // // final isExchange = - // // (_pangeaController.classController.activeClass?.isExchange ?? false); - // const isExchange = false; - // final regular = (canUserPrivateChat() || canUserGroupChat()); - // final inExchange = - // (canUserPrivateChatExchanges() || canUserGroupChatExchanges()); - // final theAnswer = isExchange ? inExchange : regular; - // // debugger(when: kDebugMode && !theAnswer); - // return theAnswer; - // } catch (e, s) { - // ErrorHandler.logError(e: e, s: s); - // return false; - // } - // } } diff --git a/lib/pangea/controllers/practice_activity_generation_controller.dart b/lib/pangea/controllers/practice_activity_generation_controller.dart new file mode 100644 index 000000000..9b7f6b66e --- /dev/null +++ b/lib/pangea/controllers/practice_activity_generation_controller.dart @@ -0,0 +1,102 @@ +import 'dart:async'; + +import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; +import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; +import 'package:fluffychat/pangea/enum/construct_type_enum.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/matrix_event_wrappers/practice_activity_event.dart'; +import 'package:fluffychat/pangea/models/practice_activities.dart/multiple_choice_activity_model.dart'; +import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_model.dart'; +import 'package:matrix/matrix.dart'; + +/// Represents an item in the completion cache. +class _RequestCacheItem { + PracticeActivityRequest req; + + Future practiceActivityEvent; + + _RequestCacheItem({ + required this.req, + required this.practiceActivityEvent, + }); +} + +/// Controller for handling activity completions. +class PracticeGenerationController { + static final Map _cache = {}; + Timer? _cacheClearTimer; + + PracticeGenerationController() { + _initializeCacheClearing(); + } + + void _initializeCacheClearing() { + const duration = Duration(minutes: 2); + _cacheClearTimer = Timer.periodic(duration, (Timer t) => _clearCache()); + } + + void _clearCache() { + _cache.clear(); + } + + void dispose() { + _cacheClearTimer?.cancel(); + } + + Future _sendAndPackageEvent( + PracticeActivityModel model, + PangeaMessageEvent pangeaMessageEvent, + ) async { + final Event? activityEvent = await pangeaMessageEvent.room.sendPangeaEvent( + content: model.toJson(), + parentEventId: pangeaMessageEvent.eventId, + type: PangeaEventTypes.pangeaActivity, + ); + + if (activityEvent == null) { + return null; + } + + return PracticeActivityEvent( + event: activityEvent, + timeline: pangeaMessageEvent.timeline, + ); + } + + Future getPracticeActivity( + PracticeActivityRequest req, + PangeaMessageEvent event, + ) async { + final int cacheKey = req.hashCode; + + if (_cache.containsKey(cacheKey)) { + return _cache[cacheKey]!.practiceActivityEvent; + } else { + //TODO - send request to server/bot, either via API or via event of type pangeaActivityReq + // for now, just make and send the event from the client + final Future eventFuture = + _sendAndPackageEvent(dummyModel(event), event); + + _cache[cacheKey] = + _RequestCacheItem(req: req, practiceActivityEvent: eventFuture); + + return _cache[cacheKey]!.practiceActivityEvent; + } + } + + PracticeActivityModel dummyModel(PangeaMessageEvent event) => + PracticeActivityModel( + tgtConstructs: [ + ConstructIdentifier(lemma: "be", type: ConstructTypeEnum.vocab), + ], + activityType: ActivityTypeEnum.multipleChoice, + langCode: event.messageDisplayLangCode, + msgId: event.eventId, + multipleChoice: MultipleChoice( + question: "What is a synonym for 'happy'?", + choices: ["sad", "angry", "joyful", "tired"], + answer: "joyful", + ), + ); +} diff --git a/lib/pangea/controllers/practice_activity_record_controller.dart b/lib/pangea/controllers/practice_activity_record_controller.dart new file mode 100644 index 000000000..b075fa553 --- /dev/null +++ b/lib/pangea/controllers/practice_activity_record_controller.dart @@ -0,0 +1,94 @@ +import 'dart:async'; +import 'dart:developer'; + +import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; +import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; +import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.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:flutter/foundation.dart'; +import 'package:matrix/matrix.dart'; + +/// Represents an item in the completion cache. +class _RecordCacheItem { + PracticeActivityRecordModel data; + + Future recordEvent; + + _RecordCacheItem({required this.data, required this.recordEvent}); +} + +/// Controller for handling activity completions. +class PracticeActivityRecordController { + static final Map _cache = {}; + late final PangeaController _pangeaController; + Timer? _cacheClearTimer; + + PracticeActivityRecordController(this._pangeaController) { + _initializeCacheClearing(); + } + + void _initializeCacheClearing() { + const duration = Duration(minutes: 2); + _cacheClearTimer = Timer.periodic(duration, (Timer t) => _clearCache()); + } + + void _clearCache() { + _cache.clear(); + } + + void dispose() { + _cacheClearTimer?.cancel(); + } + + /// Sends a practice activity record to the server and returns the corresponding event. + /// + /// The [recordModel] parameter is the model representing the practice activity record. + /// The [practiceActivityEvent] parameter is the event associated with the practice activity. + /// Note that the system will send a new event if the model has changed in any way ie it is + /// a new completion of the practice activity. However, it will cache previous sends to ensure + /// that opening and closing of the widget does not result in multiple sends of the same data. + /// It allows checks the data to make sure that it contains responses to the practice activity + /// and does not represent a blank record with no actual completion to be saved. + /// + /// Returns a [Future] that completes with the corresponding [Event] object. + Future send( + PracticeActivityRecordModel recordModel, + PracticeActivityEvent practiceActivityEvent, + ) async { + final int cacheKey = recordModel.hashCode; + + if (recordModel.responses.isEmpty) { + return null; + } + + if (_cache.containsKey(cacheKey)) { + return _cache[cacheKey]!.recordEvent; + } else { + final Future eventFuture = practiceActivityEvent.event.room + .sendPangeaEvent( + content: recordModel.toJson(), + parentEventId: practiceActivityEvent.event.eventId, + type: PangeaEventTypes.activityRecord, + ) + .catchError((e) { + debugger(when: kDebugMode); + ErrorHandler.logError( + e: e, + s: StackTrace.current, + data: { + 'recordModel': recordModel.toJson(), + 'practiceActivityEvent': practiceActivityEvent.event.toJson(), + }, + ); + return null; + }); + + _cache[cacheKey] = + _RecordCacheItem(data: recordModel, recordEvent: eventFuture); + + return _cache[cacheKey]!.recordEvent; + } + } +} diff --git a/lib/pangea/controllers/space_rules_edit_controller.dart b/lib/pangea/controllers/space_rules_edit_controller.dart index a13fd9219..6142e273f 100644 --- a/lib/pangea/controllers/space_rules_edit_controller.dart +++ b/lib/pangea/controllers/space_rules_edit_controller.dart @@ -2,7 +2,7 @@ import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:matrix/matrix.dart'; import '../extensions/pangea_room_extension/pangea_room_extension.dart'; -import '../models/class_model.dart'; +import '../models/space_model.dart'; class RoomRulesEditController { final Room? room; diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index c7a35b3e8..873397969 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'; @@ -123,6 +123,7 @@ 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); @@ -142,6 +143,7 @@ class UserController extends BaseController { await updateMatrixProfile( dateOfBirth: dob, autoPlayMessages: autoPlay, + itAutoPlay: itAutoPlay, activatedFreeTrial: trial, interactiveTranslator: interactiveTranslator, interactiveGrammar: interactiveGrammar, @@ -223,6 +225,7 @@ class UserController extends BaseController { Future updateMatrixProfile({ String? dateOfBirth, bool? autoPlayMessages, + bool? itAutoPlay, bool? activatedFreeTrial, bool? interactiveTranslator, bool? interactiveGrammar, @@ -251,6 +254,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, 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/enum/activity_type_enum.dart b/lib/pangea/enum/activity_type_enum.dart new file mode 100644 index 000000000..d429aa038 --- /dev/null +++ b/lib/pangea/enum/activity_type_enum.dart @@ -0,0 +1,16 @@ +enum ActivityTypeEnum { multipleChoice, freeResponse, listening, speaking } + +extension ActivityTypeExtension on ActivityTypeEnum { + String get string { + switch (this) { + case ActivityTypeEnum.multipleChoice: + return 'multiple_choice'; + case ActivityTypeEnum.freeResponse: + return 'free_response'; + case ActivityTypeEnum.listening: + return 'listening'; + case ActivityTypeEnum.speaking: + return 'speaking'; + } + } +} 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; + } + } +} 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/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/enum/instructions_enum.dart b/lib/pangea/enum/instructions_enum.dart new file mode 100644 index 000000000..c684d5b14 --- /dev/null +++ b/lib/pangea/enum/instructions_enum.dart @@ -0,0 +1,45 @@ +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; + } + } +} diff --git a/lib/pangea/enum/message_mode_enum.dart b/lib/pangea/enum/message_mode_enum.dart index 25948d23b..58753e5b5 100644 --- a/lib/pangea/enum/message_mode_enum.dart +++ b/lib/pangea/enum/message_mode_enum.dart @@ -1,9 +1,16 @@ +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:matrix/matrix.dart'; -enum MessageMode { translation, definition, speechToText, textToSpeech } +enum MessageMode { + translation, + definition, + speechToText, + textToSpeech, + practiceActivity +} extension MessageModeExtension on MessageMode { IconData get icon { @@ -17,6 +24,8 @@ extension MessageModeExtension on MessageMode { //TODO change icon for audio messages case MessageMode.definition: return Icons.book; + case MessageMode.practiceActivity: + return Symbols.fitness_center; default: return Icons.error; // Icon to indicate an error or unsupported mode } @@ -32,6 +41,8 @@ extension MessageModeExtension on MessageMode { return L10n.of(context)!.speechToTextTooltip; case MessageMode.definition: return L10n.of(context)!.definitions; + case MessageMode.practiceActivity: + return L10n.of(context)!.practice; default: return L10n.of(context)! .oopsSomethingWentWrong; // Title to indicate an error or unsupported mode @@ -48,6 +59,8 @@ extension MessageModeExtension on MessageMode { return L10n.of(context)!.speechToTextTooltip; case MessageMode.definition: return L10n.of(context)!.define; + case MessageMode.practiceActivity: + return L10n.of(context)!.practice; default: return L10n.of(context)! .oopsSomethingWentWrong; // Title to indicate an error or unsupported mode @@ -58,6 +71,7 @@ extension MessageModeExtension on MessageMode { switch (this) { case MessageMode.translation: case MessageMode.textToSpeech: + case MessageMode.practiceActivity: case MessageMode.definition: return event.messageType == MessageTypes.Text; case MessageMode.speechToText: @@ -66,4 +80,29 @@ extension MessageModeExtension on MessageMode { return true; } } + + Color? iconColor( + PangeaMessageEvent event, + MessageMode? currentMode, + BuildContext context, + ) { + final bool isPracticeActivity = this == MessageMode.practiceActivity; + final bool practicing = currentMode == MessageMode.practiceActivity; + final bool practiceEnabled = event.hasUncompletedActivity; + + // if this is the practice activity icon, and there's no practice activities available, + // and the current mode is not practice, return lower opacity color. + if (isPracticeActivity && !practicing && !practiceEnabled) { + return Theme.of(context).iconTheme.color?.withOpacity(0.5); + } + + // if this is not a practice activity icon, and practice activities are available, + // then return lower opacity color if the current mode is practice. + if (!isPracticeActivity && practicing && practiceEnabled) { + return Theme.of(context).iconTheme.color?.withOpacity(0.5); + } + + // if this is the current mode, return primary color. + return currentMode == this ? Theme.of(context).colorScheme.primary : null; + } } diff --git a/lib/pangea/enum/span_data_type.dart b/lib/pangea/enum/span_data_type.dart index 5e4fdf8cb..38315fd50 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 ?? + L10n.of(context)!.targetLanguage, + ); } } } 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/client_extension/classes_and_exchanges_extension.dart b/lib/pangea/extensions/client_extension/classes_and_exchanges_extension.dart deleted file mode 100644 index af1df62a0..000000000 --- a/lib/pangea/extensions/client_extension/classes_and_exchanges_extension.dart +++ /dev/null @@ -1,83 +0,0 @@ -part of "client_extension.dart"; - -extension ClassesAndExchangesClientExtension on Client { - List get _classes => rooms.where((e) => e.isPangeaClass).toList(); - - List get _classesImTeaching => rooms - .where( - (e) => - e.isPangeaClass && - e.ownPowerLevel == ClassDefaultValues.powerLevelOfAdmin, - ) - .toList(); - - Future> get _classesAndExchangesImTeaching async { - final allSpaces = rooms.where((room) => room.isSpace); - for (final Room space in allSpaces) { - if (space.getState(EventTypes.RoomPowerLevels) == null) { - await space.postLoad(); - } - } - - final spaces = rooms - .where( - (e) => - (e.isPangeaClass || e.isExchange) && - e.ownPowerLevel == ClassDefaultValues.powerLevelOfAdmin, - ) - .toList(); - return spaces; - } - - List get _classesImIn => rooms - .where( - (e) => - e.isPangeaClass && - e.ownPowerLevel < ClassDefaultValues.powerLevelOfAdmin, - ) - .toList(); - - Future> get _classesAndExchangesImStudyingIn async { - final List joinedSpaces = rooms - .where( - (room) => room.isSpace && room.membership == Membership.join, - ) - .toList(); - - for (final Room space in joinedSpaces) { - if (space.getState(EventTypes.RoomPowerLevels) == null) { - await space.postLoad(); - } - } - - final spaces = rooms - .where( - (e) => - (e.isPangeaClass || e.isExchange) && - e.ownPowerLevel < ClassDefaultValues.powerLevelOfAdmin, - ) - .toList(); - return spaces; - } - - List get _classesAndExchangesImIn => - rooms.where((e) => e.isPangeaClass || e.isExchange).toList(); - - Future get _lastUpdatedRoomRules async => - (await _classesAndExchangesImTeaching) - .where((space) => space.rulesUpdatedAt != null) - .sorted( - (a, b) => b.rulesUpdatedAt!.compareTo(a.rulesUpdatedAt!), - ) - .firstOrNull - ?.pangeaRoomRules; - - ClassSettingsModel? get _lastUpdatedClassSettings => classesImTeaching - .where((space) => space.classSettingsUpdatedAt != null) - .sorted( - (a, b) => - b.classSettingsUpdatedAt!.compareTo(a.classSettingsUpdatedAt!), - ) - .firstOrNull - ?.classSettings; -} diff --git a/lib/pangea/extensions/client_extension/client_analytics_extension.dart b/lib/pangea/extensions/client_extension/client_analytics_extension.dart index d7c97e38c..fde4d8e54 100644 --- a/lib/pangea/extensions/client_extension/client_analytics_extension.dart +++ b/lib/pangea/extensions/client_extension/client_analytics_extension.dart @@ -123,7 +123,7 @@ extension AnalyticsClientExtension on Client { // Allows teachers to join analytics rooms without being invited Future _joinAnalyticsRoomsInAllSpaces() async { final List joinFutures = []; - for (final Room space in (await _classesAndExchangesImTeaching)) { + for (final Room space in (await _spacesImTeaching)) { joinFutures.add(space.joinAnalyticsRoomsInSpace()); } await Future.wait(joinFutures); @@ -154,4 +154,17 @@ extension AnalyticsClientExtension on Client { await _joinInvitedAnalyticsRooms(); await _joinAnalyticsRoomsInAllSpaces(); } + + Future> _allAnalyticsRoomsLastUpdated() async { + // get the last updated time for each analytics room + final Map lastUpdatedMap = {}; + for (final analyticsRoom in allMyAnalyticsRooms) { + final DateTime? lastUpdated = await analyticsRoom.analyticsLastUpdated( + PangeaEventTypes.summaryAnalytics, + userID!, + ); + lastUpdatedMap[analyticsRoom.id] = lastUpdated; + } + return lastUpdatedMap; + } } diff --git a/lib/pangea/extensions/client_extension/client_extension.dart b/lib/pangea/extensions/client_extension/client_extension.dart index d23caa5de..3dda99237 100644 --- a/lib/pangea/extensions/client_extension/client_extension.dart +++ b/lib/pangea/extensions/client_extension/client_extension.dart @@ -3,17 +3,18 @@ import 'dart:developer'; import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; +import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; -import 'package:fluffychat/pangea/models/class_model.dart'; +import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:matrix/matrix.dart'; -part "classes_and_exchanges_extension.dart"; part "client_analytics_extension.dart"; part "general_info_extension.dart"; +part "space_extension.dart"; extension PangeaClient on Client { // analytics @@ -43,27 +44,22 @@ extension PangeaClient on Client { Future migrateAnalyticsRooms() async => await _migrateAnalyticsRooms(); - // classes_and_exchanges + Future> allAnalyticsRoomsLastUpdated() async => + await _allAnalyticsRoomsLastUpdated(); - List get classes => _classes; + // spaces - List get classesImTeaching => _classesImTeaching; + Future> get spacesImTeaching async => await _spacesImTeaching; - Future> get classesAndExchangesImTeaching async => - await _classesAndExchangesImTeaching; + Future> get chatsImAStudentIn async => await _chatsImAStudentIn; - List get classesImIn => _classesImIn; + Future> get spaceImAStudentIn async => await _spacesImStudyingIn; - Future> get classesAndExchangesImStudyingIn async => - await _classesAndExchangesImStudyingIn; - - List get classesAndExchangesImIn => _classesAndExchangesImIn; + List get spacesImIn => _spacesImIn; Future get lastUpdatedRoomRules async => await _lastUpdatedRoomRules; - ClassSettingsModel? get lastUpdatedClassSettings => _lastUpdatedClassSettings; - // general_info Future> get teacherRoomIds async => await _teacherRoomIds; diff --git a/lib/pangea/extensions/client_extension/general_info_extension.dart b/lib/pangea/extensions/client_extension/general_info_extension.dart index 058b6f695..26b87b533 100644 --- a/lib/pangea/extensions/client_extension/general_info_extension.dart +++ b/lib/pangea/extensions/client_extension/general_info_extension.dart @@ -3,7 +3,7 @@ part of "client_extension.dart"; extension GeneralInfoClientExtension on Client { Future> get _teacherRoomIds async { final List adminRoomIds = []; - for (final Room adminSpace in (await _classesAndExchangesImTeaching)) { + for (final Room adminSpace in (await _spacesImTeaching)) { adminRoomIds.add(adminSpace.id); final List adminSpaceRooms = adminSpace.allSpaceChildRoomIds; adminRoomIds.addAll(adminSpaceRooms); @@ -13,7 +13,7 @@ extension GeneralInfoClientExtension on Client { Future> get _myTeachers async { final List teachers = []; - for (final classRoom in classesAndExchangesImIn) { + for (final classRoom in spacesImIn) { for (final teacher in await classRoom.teachers) { // If person requesting list of teachers is a teacher in another classroom, don't add them to the list if (!teachers.any((e) => e.id == teacher.id) && userID != teacher.id) { diff --git a/lib/pangea/extensions/client_extension/space_extension.dart b/lib/pangea/extensions/client_extension/space_extension.dart new file mode 100644 index 000000000..0adc70469 --- /dev/null +++ b/lib/pangea/extensions/client_extension/space_extension.dart @@ -0,0 +1,76 @@ +part of "client_extension.dart"; + +extension SpaceClientExtension on Client { + Future> get _spacesImTeaching async { + final allSpaces = rooms.where((room) => room.isSpace); + for (final Room space in allSpaces) { + if (space.getState(EventTypes.RoomPowerLevels) == null) { + await space.postLoad(); + } + } + + final spaces = rooms + .where( + (e) => + (e.isSpace) && + e.ownPowerLevel == ClassDefaultValues.powerLevelOfAdmin, + ) + .toList(); + 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( + (room) => room.isSpace && room.membership == Membership.join, + ) + .toList(); + + for (final Room space in joinedSpaces) { + if (space.getState(EventTypes.RoomPowerLevels) == null) { + await space.postLoad(); + } + } + + final spaces = rooms + .where( + (e) => + e.isSpace && + e.ownPowerLevel < ClassDefaultValues.powerLevelOfAdmin, + ) + .toList(); + return spaces; + } + + List get _spacesImIn => rooms.where((e) => e.isSpace).toList(); + + Future get _lastUpdatedRoomRules async => + (await _spacesImTeaching) + .where((space) => space.rulesUpdatedAt != null) + .sorted( + (a, b) => b.rulesUpdatedAt!.compareTo(a.rulesUpdatedAt!), + ) + .firstOrNull + ?.pangeaRoomRules; + + // LanguageSettingsModel? get _lastUpdatedLanguageSettings => rooms + // .where((room) => room.isSpace && room.languageSettingsUpdatedAt != null) + // .sorted( + // (a, b) => b.languageSettingsUpdatedAt! + // .compareTo(a.languageSettingsUpdatedAt!), + // ) + // .firstOrNull + // ?.languageSettings; +} diff --git a/lib/pangea/extensions/pangea_event_extension.dart b/lib/pangea/extensions/pangea_event_extension.dart index f62f27925..f18ee23b7 100644 --- a/lib/pangea/extensions/pangea_event_extension.dart +++ b/lib/pangea/extensions/pangea_event_extension.dart @@ -2,6 +2,8 @@ import 'dart:developer'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/models/choreo_record.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/models/representation_content_model.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; import 'package:flutter/foundation.dart'; @@ -26,7 +28,12 @@ extension PangeaEvent on Event { return PangeaRepresentation.fromJson(json) as V; case PangeaEventTypes.choreoRecord: return ChoreoRecord.fromJson(json) as V; + case PangeaEventTypes.pangeaActivity: + return PracticeActivityModel.fromJson(json) as V; + case PangeaEventTypes.activityRecord: + return PracticeActivityRecordModel.fromJson(json) as V; default: + debugger(when: kDebugMode); throw Exception("$type events do not have pangea content"); } } diff --git a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart index 24dad6c41..2dc3f6f59 100644 --- a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart @@ -60,7 +60,7 @@ extension ChildrenAndParentsRoomExtension on Room { //resolve somehow if multiple rooms have the state? //check logic Room? _firstParentWithState(String stateType) { - if (![PangeaEventTypes.classSettings, PangeaEventTypes.rules] + if (![PangeaEventTypes.languageSettings, PangeaEventTypes.rules] .contains(stateType)) { return null; } @@ -77,13 +77,6 @@ extension ChildrenAndParentsRoomExtension on Room { return null; } - /// find any parents and return the rooms - List get _immediateClassParents => pangeaSpaceParents - .where( - (element) => element.isPangeaClass, - ) - .toList(); - List get _pangeaSpaceParents => client.rooms .where( (r) => r.isSpace, @@ -98,16 +91,16 @@ extension ChildrenAndParentsRoomExtension on Room { String _nameIncludingParents(BuildContext context) { String nameSoFar = getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)); Room currentRoom = this; - if (currentRoom.immediateClassParents.isEmpty) { + if (currentRoom.pangeaSpaceParents.isEmpty) { return nameSoFar; } - currentRoom = currentRoom.immediateClassParents.first; + currentRoom = currentRoom.pangeaSpaceParents.first; var nameToAdd = currentRoom.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)); nameToAdd = nameToAdd.length <= 10 ? nameToAdd : "${nameToAdd.substring(0, 10)}..."; nameSoFar = '$nameToAdd > $nameSoFar'; - if (currentRoom.immediateClassParents.isEmpty) { + if (currentRoom.pangeaSpaceParents.isEmpty) { return nameSoFar; } return "... > $nameSoFar"; @@ -130,11 +123,19 @@ extension ChildrenAndParentsRoomExtension on Room { // Checks if has permissions to add child chat // Or whether potential child space is ancestor of this - bool _canAddAsParentOf(Room? child) { - if (child == null || !child.isSpace) { - return _canIAddSpaceChild(child); - } - if (id == child.id) return false; - return !child._allSpaceChildRoomIds.contains(id); + bool _canAddAsParentOf(Room? child, {bool spaceMode = false}) { + // don't add a room to itself + if (id == child?.id) return false; + spaceMode = child?.isSpace ?? spaceMode; + + // get the bool for adding chats to spaces + final bool canAddChild = _canIAddSpaceChild(child, spaceMode: spaceMode); + if (!spaceMode) return canAddChild; + + // if adding space to a space, check if the child is an ancestor + // to prevent cycles + final bool isCycle = + child != null ? child._allSpaceChildRoomIds.contains(id) : false; + return canAddChild && !isCycle; } } diff --git a/lib/pangea/extensions/pangea_room_extension/events_extension.dart b/lib/pangea/extensions/pangea_room_extension/events_extension.dart index 2d67db5b2..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, ), ); @@ -426,26 +424,6 @@ 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, - ); - }).toList(); - } - // 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/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index 570cbebba..21f5abac5 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -4,15 +4,19 @@ 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_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'; 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'; -import 'package:fluffychat/pangea/models/class_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'; import 'package:fluffychat/pangea/utils/error_handler.dart'; @@ -30,17 +34,16 @@ 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'; part "children_and_parents_extension.dart"; -part "class_and_exchange_settings_extension.dart"; part "events_extension.dart"; part "room_analytics_extension.dart"; part "room_information_extension.dart"; part "room_settings_extension.dart"; +part "space_settings_extension.dart"; part "user_permissions_extension.dart"; extension PangeaRoom on Room { @@ -49,9 +52,6 @@ extension PangeaRoom on Room { Future joinAnalyticsRoomsInSpace() async => await _joinAnalyticsRoomsInSpace(); - Future ensureAnalyticsRoomExists() async => - await _ensureAnalyticsRoomExists(); - Future addAnalyticsRoomToSpace(Room analyticsRoom) async => await _addAnalyticsRoomToSpace(analyticsRoom); @@ -105,8 +105,6 @@ extension PangeaRoom on Room { Room? firstParentWithState(String stateType) => _firstParentWithState(stateType); - List get immediateClassParents => _immediateClassParents; - List get pangeaSpaceParents => _pangeaSpaceParents; String nameIncludingParents(BuildContext context) => @@ -114,7 +112,9 @@ extension PangeaRoom on Room { List get allSpaceChildRoomIds => _allSpaceChildRoomIds; - bool canAddAsParentOf(Room? child) => _canAddAsParentOf(child); + bool canAddAsParentOf(Room? child, {bool spaceMode = false}) { + return _canAddAsParentOf(child, spaceMode: spaceMode); + } // class_and_exchange_settings @@ -130,15 +130,10 @@ extension PangeaRoom on Room { Future setClassPowerLevels() async => await _setClassPowerLevels(); - DateTime? get classSettingsUpdatedAt => _classSettingsUpdatedAt; - - ClassSettingsModel? get classSettings => _classSettings; - - Event? get languageSettingsStateEvent => _languageSettingsStateEvent; - Event? get pangeaRoomRulesStateEvent => _pangeaRoomRulesStateEvent; - ClassSettingsModel? get firstLanguageSettings => _firstLanguageSettings; + Future> targetLanguages() async => + await _targetLanguages(); // events @@ -185,7 +180,6 @@ extension PangeaRoom on Room { PangeaMessageTokens? tokensSent, PangeaMessageTokens? tokensWritten, ChoreoRecord? choreo, - UseType? useType, }) => _pangeaSendTextEvent( message, @@ -202,7 +196,6 @@ extension PangeaRoom on Room { tokensSent: tokensSent, tokensWritten: tokensWritten, choreo: choreo, - useType: useType, ); Future updateStateEvent(Event stateEvent) => @@ -222,8 +215,6 @@ extension PangeaRoom on Room { bool isFirstOrSecondChild(String roomId) => _isFirstOrSecondChild(roomId); - bool get isExchange => _isExchange; - bool get isDirectChatWithoutMe => _isDirectChatWithoutMe; // bool isMadeForLang(String langCode) => _isMadeForLang(langCode); @@ -234,8 +225,6 @@ extension PangeaRoom on Room { bool get isLocked => _isLocked; - bool get isPangeaClass => _isPangeaClass; - bool isAnalyticsRoomOfUser(String userId) => _isAnalyticsRoomOfUser(userId); bool get isAnalyticsRoom => _isAnalyticsRoom; @@ -283,7 +272,9 @@ extension PangeaRoom on Room { bool get canDelete => _canDelete; - bool canIAddSpaceChild(Room? room) => _canIAddSpaceChild(room); + bool canIAddSpaceChild(Room? room, {bool spaceMode = false}) { + return _canIAddSpaceChild(room, spaceMode: spaceMode); + } bool get canIAddSpaceParents => _canIAddSpaceParents; 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 756f83adf..a27526a2b 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_analytics_extension.dart @@ -55,14 +55,6 @@ extension AnalyticsRoomExtension on Room { } } - // check if analytics room exists for a given language code - // and if not, create it - Future _ensureAnalyticsRoomExists() async { - await postLoad(); - if (firstLanguageSettings?.targetLanguage == null) return; - await client.getMyAnalyticsRoom(firstLanguageSettings!.targetLanguage); - } - // add 1 analytics room to 1 space Future _addAnalyticsRoomToSpace(Room analyticsRoom) async { if (!isSpace) { @@ -107,7 +99,7 @@ extension AnalyticsRoomExtension on Room { return; } - for (final Room space in (await client.classesAndExchangesImStudyingIn)) { + for (final Room space in (await client.spaceImAStudentIn)) { if (space.spaceChildren.any((sc) => sc.roomId == id)) continue; await space.addAnalyticsRoomToSpace(this); } @@ -183,7 +175,7 @@ extension AnalyticsRoomExtension on Room { return; } - for (final Room space in (await client.classesAndExchangesImStudyingIn)) { + for (final Room space in (await client.spaceImAStudentIn)) { await space.inviteSpaceTeachersToAnalyticsRoom(this); } } @@ -202,7 +194,7 @@ extension AnalyticsRoomExtension on Room { final List events = await getEventsBySender( type: type, sender: userId, - count: 1, + count: 10, ); if (events.isEmpty) return null; final Event event = events.first; @@ -257,4 +249,31 @@ extension AnalyticsRoomExtension on Room { return creationContent?.tryGet(ModelKey.langCode) == langCode || creationContent?.tryGet(ModelKey.oldLangCode) == langCode; } + + Future sendSummaryAnalyticsEvent( + List records, + ) async { + final SummaryAnalyticsModel analyticsModel = SummaryAnalyticsModel( + messages: records, + ); + final String? eventId = await sendEvent( + analyticsModel.toJson(), + type: PangeaEventTypes.summaryAnalytics, + ); + return eventId; + } + + Future sendConstructsEvent( + List uses, + ) async { + final ConstructAnalyticsModel constructsModel = ConstructAnalyticsModel( + uses: uses, + ); + + final String? eventId = await sendEvent( + constructsModel.toJson(), + type: PangeaEventTypes.construct, + ); + return eventId; + } } diff --git a/lib/pangea/extensions/pangea_room_extension/room_information_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_information_extension.dart index a6c5af180..857ac26e0 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_information_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_information_extension.dart @@ -40,11 +40,6 @@ extension RoomInformationRoomExtension on Room { )); } - bool get _isExchange => - isSpace && - languageSettingsStateEvent == null && - pangeaRoomRulesStateEvent != null; - bool get _isDirectChatWithoutMe => isDirectChat && !getParticipants().any((e) => e.id == client.userID); @@ -83,8 +78,6 @@ extension RoomInformationRoomExtension on Room { ClassDefaultValues.powerLevelOfAdmin; } - bool get _isPangeaClass => isSpace && languageSettingsStateEvent != null; - bool _isAnalyticsRoomOfUser(String userId) => isAnalyticsRoom && isMadeByUser(userId); diff --git a/lib/pangea/extensions/pangea_room_extension/room_settings_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_settings_extension.dart index 0abeab942..399382f1c 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_settings_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_settings_extension.dart @@ -40,8 +40,7 @@ extension RoomSettingsRoomExtension on Room { IconData? get _roomTypeIcon { if (membership == Membership.invite) return Icons.add; - if (isPangeaClass) return Icons.school; - if (isExchange) return Icons.connecting_airports; + if (isSpace) return Icons.school; if (isAnalyticsRoom) return Icons.analytics; if (isDirectChat) return Icons.forum; return Icons.group; diff --git a/lib/pangea/extensions/pangea_room_extension/class_and_exchange_settings_extension.dart b/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart similarity index 54% rename from lib/pangea/extensions/pangea_room_extension/class_and_exchange_settings_extension.dart rename to lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart index 44423d90f..5799631b1 100644 --- a/lib/pangea/extensions/pangea_room_extension/class_and_exchange_settings_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart @@ -1,6 +1,6 @@ part of "pangea_room_extension.dart"; -extension ClassAndExchangeSettingsRoomExtension on Room { +extension SpaceRoomExtension on Room { DateTime? get _rulesUpdatedAt { if (!isSpace) return null; return pangeaRoomRulesStateEvent?.originServerTs ?? creationTime; @@ -9,7 +9,7 @@ extension ClassAndExchangeSettingsRoomExtension on Room { String get _classCode { if (!isSpace) { for (final Room potentialClassRoom in pangeaSpaceParents) { - if (potentialClassRoom.isPangeaClass) { + if (potentialClassRoom.isSpace) { return potentialClassRoom.classCode; } } @@ -84,46 +84,6 @@ extension ClassAndExchangeSettingsRoomExtension on Room { } } - DateTime? get _classSettingsUpdatedAt { - if (!isSpace) return null; - return languageSettingsStateEvent?.originServerTs ?? creationTime; - } - - /// the pangeaClass event is listed an importantStateEvent so, if event exists, - /// it's already local. If it's an old class and doesn't, then the class_controller - /// should automatically migrate during this same session, when the space is first loaded - ClassSettingsModel? get _classSettings { - try { - if (!isSpace) { - return null; - } - final Map? content = languageSettingsStateEvent?.content; - if (content != null) { - final ClassSettingsModel classSettings = - ClassSettingsModel.fromJson(content); - return classSettings; - } - return null; - } catch (err, s) { - Sentry.addBreadcrumb( - Breadcrumb( - message: "Error in classSettings", - data: {"room": toJson()}, - ), - ); - ErrorHandler.logError(e: err, s: s); - return null; - } - } - - Event? get _languageSettingsStateEvent { - final dynamic classSettings = getState(PangeaEventTypes.classSettings); - if (classSettings is Event) { - return classSettings; - } - return null; - } - Event? get _pangeaRoomRulesStateEvent { final dynamic roomRules = getState(PangeaEventTypes.rules); if (roomRules is Event) { @@ -132,7 +92,76 @@ extension ClassAndExchangeSettingsRoomExtension on Room { return null; } - ClassSettingsModel? get _firstLanguageSettings => - classSettings ?? - firstParentWithState(PangeaEventTypes.classSettings)?.classSettings; + 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; + // } + + /// the pangeaClass event is listed an importantStateEvent so, if event exists, + /// it's already local. If it's an old class and doesn't, then the class_controller + /// should automatically migrate during this same session, when the space is first loaded + // LanguageSettingsModel? get _languageSettings { + // try { + // if (!isSpace) { + // return null; + // } + // final Map? content = languageSettingsStateEvent?.content; + // if (content != null) { + // final LanguageSettingsModel languageSettings = + // LanguageSettingsModel.fromJson(content); + // return languageSettings; + // } + // return null; + // } catch (err, s) { + // Sentry.addBreadcrumb( + // Breadcrumb( + // message: "Error in languageSettings", + // data: {"room": toJson()}, + // ), + // ); + // ErrorHandler.logError(e: err, s: s); + // return null; + // } + // } + + // Event? get _languageSettingsStateEvent { + // final dynamic languageSettings = + // getState(PangeaEventTypes.languageSettings); + // if (languageSettings is Event) { + // return languageSettings; + // } + // return null; + // } + + // LanguageSettingsModel? get _firstLanguageSettings => + // languageSettings ?? + // firstParentWithState(PangeaEventTypes.languageSettings)?.languageSettings; } diff --git a/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart b/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart index eef684f0d..b94db5c57 100644 --- a/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/user_permissions_extension.dart @@ -78,39 +78,30 @@ extension UserPermissionsRoomExtension on Room { bool get _canDelete => isSpaceAdmin; - bool _canIAddSpaceChild(Room? room) { + bool _canIAddSpaceChild(Room? room, {bool spaceMode = false}) { if (!isSpace) { ErrorHandler.logError( - m: "should not call canIAddSpaceChildren on non-space room", + m: "should not call canIAddSpaceChildren on non-space room. Room id: $id", data: toJson(), s: StackTrace.current, ); return false; } - if (room != null && !room._isRoomAdmin) { - return false; - } - if (!pangeaCanSendEvent(EventTypes.SpaceChild) && !_isRoomAdmin) { - return false; - } - if (room == null) { - return isRoomAdmin || (pangeaRoomRules?.isCreateRooms ?? false); - } - if (room.isExchange) { - return isRoomAdmin; - } - if (!room.isSpace) { - return pangeaRoomRules?.isCreateRooms ?? false; - } - if (room.isPangeaClass) { - ErrorHandler.logError( - m: "should not call canIAddSpaceChild with class", - data: room.toJson(), - s: StackTrace.current, - ); - return false; - } - return false; + + final isSpaceAdmin = isRoomAdmin; + final isChildRoomAdmin = room?.isRoomAdmin ?? true; + + // if user is not admin of child room, return false + if (!isChildRoomAdmin) return false; + + // if the child room is a space, or will be a space, + // then the user must be an admin of the parent space + if (room?.isSpace ?? spaceMode) return isSpaceAdmin; + + // otherwise, the user can add the child room to the parent + // if they're the admin of the parent or if the parent creation + // of group chats + return isSpaceAdmin || (pangeaRoomRules?.isCreateRooms ?? false); } bool get _canIAddSpaceParents => diff --git a/lib/pangea/matrix_event_wrappers/pangea_audio_events.dart b/lib/pangea/matrix_event_wrappers/pangea_audio_events.dart deleted file mode 100644 index 3583d021e..000000000 --- a/lib/pangea/matrix_event_wrappers/pangea_audio_events.dart +++ /dev/null @@ -1,9 +0,0 @@ -// relates to a pangea representation event -// the matrix even fits the form of a regular matrix audio event -// but with something to distinguish it as a pangea audio event - -import 'package:matrix/matrix.dart'; - -class PangeaAudioEvent { - Event? _event; -} diff --git a/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart b/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart index 47a6b688f..a6a79fd4f 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:fluffychat/pangea/extensions/pangea_event_extension.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; @@ -23,7 +25,7 @@ class ChoreoEvent { _content ??= event.getPangeaContent(); return _content; } catch (err, s) { - if (kDebugMode) rethrow; + debugger(when: kDebugMode); ErrorHandler.logError(e: err, s: s); return null; } diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index ff8696989..334c0fa78 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -1,25 +1,34 @@ 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/class_model.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'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; import 'package:fluffychat/pangea/widgets/chat/message_audio_card.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; 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'; @@ -28,7 +37,6 @@ class PangeaMessageEvent { late Event _event; final Timeline timeline; final bool ownMessage; - bool _isValidPangeaMessageEvent = true; PangeaMessageEvent({ required Event event, @@ -36,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", ); @@ -539,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 && @@ -549,12 +568,32 @@ class PangeaMessageEvent { _event.messageType != PangeaEventTypes.report && _event.messageType == MessageTypes.Text; + // this is just showActivityIcon now but will include + // logic for showing + bool get showMessageButtons => hasUncompletedActivity; + + /// Returns a boolean value indicating whether to show an activity icon for this message event. + /// + /// The [hasUncompletedActivity] getter checks if the [l2Code] is null, and if so, returns false. + /// Otherwise, it retrieves a list of [PracticeActivityEvent] objects using the [practiceActivities] function + /// with the [l2Code] as an argument. + /// If the list is empty, it returns false. + /// Otherwise, it checks if every activity in the list is complete using the [isComplete] property. + /// 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 (practiceActivities.isEmpty) return false; + return practiceActivities.any((activity) => !(activity.isComplete)); + } + + String? get l2Code => + MatrixState.pangeaController.languageController.activeL2Code(); + String get messageDisplayLangCode { final bool immersionMode = MatrixState .pangeaController.permissionsController .isToolEnabled(ToolSetting.immersionMode, room); - final String? l2Code = MatrixState.pangeaController.languageController - .activeL2Code(roomID: room.id); + final String? originalLangCode = (originalWritten ?? originalSent)?.langCode; @@ -578,14 +617,219 @@ class PangeaMessageEvent { return steps; } - // 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 + /// 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(); + } - // replication of logic from message_content.dart - // bool get isHtml => - // AppConfig.renderHtml && !_event.redacted && _event.isRichMessage; + /// 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 { + return practiceActivities.isNotEmpty; + } catch (e, s) { + ErrorHandler.logError(e: e, s: s); + return false; + } + } + + /// Returns a list of [PracticeActivityEvent] objects for the given [langCode]. + List practiceActivitiesByLangCode( + String langCode, { + bool debug = false, + }) { + try { + debugger(when: debug); + final List activities = []; + for (final event in _practiceActivityEvents) { + if (event.practiceActivity.langCode == langCode) { + activities.add(event); + } + } + return activities; + } catch (e, s) { + debugger(when: kDebugMode); + ErrorHandler.logError(e: e, s: s, data: event.toJson()); + return []; + } + } + + /// Returns a list of [PracticeActivityEvent] for the user's active l2. + List get practiceActivities => + l2Code == null ? [] : practiceActivitiesByLangCode(l2Code!); + + /// all construct uses for the message, including vocab and grammar + List get allConstructUses => + [..._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 + /// 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 = []; + 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; + } + + /// 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. + /// 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) { + 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; + + 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/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/matrix_event_wrappers/pangea_tokens_event.dart b/lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart index 0c138c637..f617b8dae 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart @@ -1,6 +1,9 @@ +import 'dart:developer'; + import 'package:fluffychat/pangea/extensions/pangea_event_extension.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_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'; @@ -22,6 +25,7 @@ class TokensEvent { _content ??= event.getPangeaContent(); return _content!; } catch (err, s) { + debugger(when: kDebugMode); ErrorHandler.logError(e: err, s: s); return null; } diff --git a/lib/pangea/matrix_event_wrappers/practice_activity_event.dart b/lib/pangea/matrix_event_wrappers/practice_activity_event.dart new file mode 100644 index 000000000..3d1185d05 --- /dev/null +++ b/lib/pangea/matrix_event_wrappers/practice_activity_event.dart @@ -0,0 +1,79 @@ +import 'dart:developer'; + +import 'package:fluffychat/pangea/extensions/pangea_event_extension.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'; + +import '../constants/pangea_event_types.dart'; + +class PracticeActivityEvent { + Event event; + Timeline? timeline; + PracticeActivityModel? _content; + + PracticeActivityEvent({ + required this.event, + required this.timeline, + content, + }) { + if (content != null) { + if (!kDebugMode) { + throw Exception( + "content should not be set on product, just a dev placeholder", + ); + } else { + _content = content; + } + } + if (event.type != PangeaEventTypes.pangeaActivity) { + throw Exception( + "${event.type} should not be used to make a PracticeActivityEvent", + ); + } + } + + PracticeActivityModel get practiceActivity { + _content ??= event.getPangeaContent(); + return _content!; + } + + /// All completion records assosiated with this activity + List get allRecords { + if (timeline == null) { + debugger(when: kDebugMode); + return []; + } + final List records = event + .aggregatedEvents(timeline!, PangeaEventTypes.activityRecord) + .toList(); + + return records + .map((event) => PracticeActivityRecordEvent(event: event)) + .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; + } + + 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 => userRecord != null; +} 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_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/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_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/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/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/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/bot_options_model.dart b/lib/pangea/models/bot_options_model.dart index 00eaddc1b..179461a34 100644 --- a/lib/pangea/models/bot_options_model.dart +++ b/lib/pangea/models/bot_options_model.dart @@ -13,44 +13,66 @@ class BotOptionsModel { List keywords; bool safetyModeration; String mode; - String? custom; String? discussionTopic; String? discussionKeywords; - bool? discussionTriggerScheduleEnabled; - int? discussionTriggerScheduleHourInterval; 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], + json[ModelKey.discussionTriggerReactionEnabled] ?? true, + discussionTriggerReactionKey: + json[ModelKey.discussionTriggerReactionKey] ?? "⏩", + + ////////////////////////////////////////////////////////////////////////// + // Custom Mode Options + ////////////////////////////////////////////////////////////////////////// + customSystemPrompt: json[ModelKey.customSystemPrompt], + customTriggerReactionEnabled: + json[ModelKey.customTriggerReactionEnabled] ?? true, + customTriggerReactionKey: json[ModelKey.customTriggerReactionKey] ?? "⏩", ); } @@ -61,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.discussionTriggerScheduleEnabled] = - discussionTriggerScheduleEnabled; - data[ModelKey.discussionTriggerScheduleHourInterval] = - discussionTriggerScheduleHourInterval; data[ModelKey.discussionTriggerReactionEnabled] = - discussionTriggerReactionEnabled; + discussionTriggerReactionEnabled ?? true; data[ModelKey.discussionTriggerReactionKey] = - discussionTriggerReactionKey; + discussionTriggerReactionKey ?? "⏩"; + data[ModelKey.customSystemPrompt] = customSystemPrompt; + data[ModelKey.customTriggerReactionEnabled] = + customTriggerReactionEnabled ?? true; + data[ModelKey.customTriggerReactionKey] = customTriggerReactionKey ?? "⏩"; return data; } catch (e, s) { debugger(when: kDebugMode); @@ -92,27 +113,27 @@ class BotOptionsModel { case ModelKey.mode: mode = value; break; - case ModelKey.custom: - custom = value; - break; case ModelKey.discussionTopic: discussionTopic = value; break; 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/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/custom_input_translation_model.dart b/lib/pangea/models/custom_input_translation_model.dart index 37d6c7a88..ff0c339dc 100644 --- a/lib/pangea/models/custom_input_translation_model.dart +++ b/lib/pangea/models/custom_input_translation_model.dart @@ -8,7 +8,6 @@ class CustomInputRequestModel { String targetLangCode; String userId; String roomId; - String? classId; String? goldTranslation; List? goldContinuances; @@ -20,7 +19,6 @@ class CustomInputRequestModel { required this.targetLangCode, required this.userId, required this.roomId, - required this.classId, required this.goldTranslation, required this.goldContinuances, }); @@ -32,7 +30,6 @@ class CustomInputRequestModel { targetLangCode: json[ModelKey.tgtLang], userId: json['user_id'], roomId: json['room_id'], - classId: json['class_id'], goldTranslation: json['gold_translation'], goldContinuances: json['gold_continuances'] != null ? List.from(json['gold_continuances']) @@ -48,7 +45,6 @@ class CustomInputRequestModel { ModelKey.tgtLang: targetLangCode, 'user_id': userId, 'room_id': roomId, - 'class_id': classId, 'gold_translation': goldTranslation, 'gold_continuances': goldContinuances != null ? List.from(goldContinuances!.map((e) => e.toJson())) diff --git a/lib/pangea/models/exchange_model.dart b/lib/pangea/models/exchange_model.dart deleted file mode 100644 index 42ce2a175..000000000 --- a/lib/pangea/models/exchange_model.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'dart:developer'; - -import 'package:flutter/foundation.dart'; - -import 'package:fluffychat/pangea/constants/model_keys.dart'; -import 'package:fluffychat/pangea/utils/error_handler.dart'; -import 'class_model.dart'; - -class ExchangeModel { - PangeaRoomRules permissions; - - ExchangeModel({ - required this.permissions, - }); - - factory ExchangeModel.fromJson(Map json) { - return ExchangeModel( - permissions: PangeaRoomRules.fromJson(json[ModelKey.permissions]), - ); - } - - Map toJson() { - final data = {}; - try { - data[ModelKey.permissions] = permissions.toJson(); - return data; - } catch (e, s) { - debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s); - return data; - } - } - - updateEditableClassField(String key, dynamic value) { - switch (key) { - default: - throw Exception('Invalid key for setting permissions - $key'); - } - } -} 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/igc_text_data_model.dart b/lib/pangea/models/igc_text_data_model.dart index 6a3eec96e..442bf4a60 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,18 @@ 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 +71,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 +86,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 +97,18 @@ class IGCTextData { "enable_igc": enableIGC, }; + /// 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 //if existing matches overlap with the accepted one, remove them?? diff --git a/lib/pangea/models/language_model.dart b/lib/pangea/models/language_model.dart index 2505d1d2c..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'; @@ -79,8 +79,8 @@ class LanguageModel { static LanguageModel multiLingual([BuildContext? context]) => LanguageModel( displayName: context != null - ? L10n.of(context)!.multiLingualClass - : "Multilingual Class", + ? L10n.of(context)!.multiLingualSpace + : "Multilingual Space", l2: false, l1: false, langCode: LanguageKeys.multiLanguage, diff --git a/lib/pangea/models/lemma.dart b/lib/pangea/models/lemma.dart index 2ad0b2950..d07ac8ff0 100644 --- a/lib/pangea/models/lemma.dart +++ b/lib/pangea/models/lemma.dart @@ -1,24 +1,50 @@ +/// 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}); + /// [pos] ex "v" - part of speech of the lemma + /// https://universaldependencies.org/u/pos/ + final String pos; + + /// [morph] ex {} - morphological features of the lemma + /// https://universaldependencies.org/u/feat/ + final Map morph; + + Lemma( + {required this.text, + required this.saveVocab, + required this.form, + this.pos = '', + this.morph = const {}}); factory Lemma.fromJson(Map json) { return Lemma( text: json['text'], saveVocab: json['save_vocab'] ?? json['saveVocab'] ?? false, form: json["form"] ?? json['text'], + pos: json['pos'] ?? '', + morph: json['morph'] ?? {}, ); } toJson() { - return {'text': text, 'save_vocab': saveVocab, 'form': form}; + return { + 'text': text, + 'save_vocab': saveVocab, + 'form': form, + 'pos': pos, + 'morph': morph + }; } - static Lemma get empty => Lemma(text: '', saveVocab: true, form: ''); - static Lemma create(String form) => Lemma(text: '', saveVocab: true, form: form); } diff --git a/lib/pangea/models/pangea_token_model.dart b/lib/pangea/models/pangea_token_model.dart index a671256ab..9dddd149b 100644 --- a/lib/pangea/models/pangea_token_model.dart +++ b/lib/pangea/models/pangea_token_model.dart @@ -9,12 +9,10 @@ import 'lemma.dart'; class PangeaToken { PangeaTokenText text; - bool hasInfo; List lemmas; PangeaToken({ required this.text, - required this.hasInfo, required this.lemmas, }); @@ -37,7 +35,6 @@ class PangeaToken { PangeaTokenText.fromJson(json[_textKey] as Map); return PangeaToken( text: text, - hasInfo: json[_hasInfoKey] ?? text.length > 2, lemmas: getLemmas(text.content, json[_lemmaKey]), ); } catch (err, s) { @@ -56,12 +53,10 @@ class PangeaToken { } static const String _textKey = "text"; - static const String _hasInfoKey = "has_info"; static const String _lemmaKey = ModelKey.lemma; Map toJson() => { _textKey: text.toJson(), - _hasInfoKey: hasInfo, _lemmaKey: lemmas.map((e) => e.toJson()).toList(), }; 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 new file mode 100644 index 000000000..68376d410 --- /dev/null +++ b/lib/pangea/models/practice_activities.dart/multiple_choice_activity_model.dart @@ -0,0 +1,41 @@ +import 'package:fluffychat/config/app_config.dart'; +import 'package:flutter/material.dart'; + +class MultipleChoice { + final String question; + final List choices; + final String answer; + + MultipleChoice({ + required this.question, + required this.choices, + required this.answer, + }); + + bool isCorrect(int index) => index == correctAnswerIndex; + + bool get isValidQuestion => choices.contains(answer); + + int get correctAnswerIndex => choices.indexOf(answer); + + int choiceIndex(String choice) => choices.indexOf(choice); + + Color choiceColor(int index) => + index == correctAnswerIndex ? AppConfig.success : AppConfig.warning; + + factory MultipleChoice.fromJson(Map json) { + return MultipleChoice( + question: json['question'] as String, + choices: (json['choices'] as List).map((e) => e as String).toList(), + answer: json['answer'] ?? json['correct_answer'] as String, + ); + } + + Map toJson() { + return { + 'question': question, + 'choices': choices, + 'answer': answer, + }; + } +} diff --git a/lib/pangea/models/practice_activities.dart/practice_activity_model.dart b/lib/pangea/models/practice_activities.dart/practice_activity_model.dart new file mode 100644 index 000000000..fa3e25acf --- /dev/null +++ b/lib/pangea/models/practice_activities.dart/practice_activity_model.dart @@ -0,0 +1,282 @@ +import 'dart:developer'; + +import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; +import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; +import 'package:fluffychat/pangea/models/practice_activities.dart/multiple_choice_activity_model.dart'; +import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:flutter/foundation.dart'; + +class ConstructIdentifier { + final String lemma; + final ConstructTypeEnum type; + + ConstructIdentifier({required this.lemma, required this.type}); + + factory ConstructIdentifier.fromJson(Map json) { + try { + return ConstructIdentifier( + lemma: json['lemma'] as String, + type: ConstructTypeEnum.values.firstWhere( + (e) => e.string == json['type'], + ), + ); + } catch (e, s) { + debugger(when: kDebugMode); + ErrorHandler.logError(e: e, s: s, data: json); + rethrow; + } + } + + Map toJson() { + return { + 'lemma': lemma, + 'type': type.string, + }; + } +} + +class CandidateMessage { + final String msgId; + final String roomId; + final String text; + + CandidateMessage({ + required this.msgId, + required this.roomId, + required this.text, + }); + + factory CandidateMessage.fromJson(Map json) { + return CandidateMessage( + msgId: json['msg_id'] as String, + roomId: json['room_id'] as String, + text: json['text'] as String, + ); + } + + Map toJson() { + return { + 'msg_id': msgId, + 'room_id': roomId, + 'text': text, + }; + } +} + +enum PracticeActivityMode { focus, srs } + +extension on PracticeActivityMode { + String get value { + switch (this) { + case PracticeActivityMode.focus: + return 'focus'; + case PracticeActivityMode.srs: + return 'srs'; + } + } +} + +class PracticeActivityRequest { + final PracticeActivityMode? mode; + final List? targetConstructs; + final List? candidateMessages; + final List? userIds; + final ActivityTypeEnum? activityType; + final int? numActivities; + + PracticeActivityRequest({ + this.mode, + this.targetConstructs, + this.candidateMessages, + this.userIds, + this.activityType, + this.numActivities, + }); + + factory PracticeActivityRequest.fromJson(Map json) { + return PracticeActivityRequest( + mode: PracticeActivityMode.values.firstWhere( + (e) => e.value == json['mode'], + ), + targetConstructs: (json['target_constructs'] as List?) + ?.map((e) => ConstructIdentifier.fromJson(e as Map)) + .toList(), + candidateMessages: (json['candidate_msgs'] as List) + .map((e) => CandidateMessage.fromJson(e as Map)) + .toList(), + userIds: (json['user_ids'] as List?)?.map((e) => e as String).toList(), + activityType: ActivityTypeEnum.values.firstWhere( + (e) => e.toString().split('.').last == json['activity_type'], + ), + numActivities: json['num_activities'] as int, + ); + } + + Map toJson() { + return { + 'mode': mode?.value, + 'target_constructs': targetConstructs?.map((e) => e.toJson()).toList(), + 'candidate_msgs': candidateMessages?.map((e) => e.toJson()).toList(), + 'user_ids': userIds, + 'activity_type': activityType?.toString().split('.').last, + 'num_activities': numActivities, + }; + } + + // override operator == and hashCode + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is PracticeActivityRequest && + other.mode == mode && + other.targetConstructs == targetConstructs && + other.candidateMessages == candidateMessages && + other.userIds == userIds && + other.activityType == activityType && + other.numActivities == numActivities; + } + + @override + int get hashCode { + return mode.hashCode ^ + targetConstructs.hashCode ^ + candidateMessages.hashCode ^ + userIds.hashCode ^ + activityType.hashCode ^ + numActivities.hashCode; + } +} + +class FreeResponse { + final String question; + final String correctAnswer; + final String gradingGuide; + + FreeResponse({ + required this.question, + required this.correctAnswer, + required this.gradingGuide, + }); + + factory FreeResponse.fromJson(Map json) { + return FreeResponse( + question: json['question'] as String, + correctAnswer: json['correct_answer'] as String, + gradingGuide: json['grading_guide'] as String, + ); + } + + Map toJson() { + return { + 'question': question, + 'correct_answer': correctAnswer, + 'grading_guide': gradingGuide, + }; + } +} + +class Listening { + final String audioUrl; + final String text; + + Listening({required this.audioUrl, required this.text}); + + factory Listening.fromJson(Map json) { + return Listening( + audioUrl: json['audio_url'] as String, + text: json['text'] as String, + ); + } + + Map toJson() { + return { + 'audio_url': audioUrl, + 'text': text, + }; + } +} + +class Speaking { + final String text; + + Speaking({required this.text}); + + factory Speaking.fromJson(Map json) { + return Speaking( + text: json['text'] as String, + ); + } + + Map toJson() { + return { + 'text': text, + }; + } +} + +class PracticeActivityModel { + final List tgtConstructs; + final String langCode; + final String msgId; + final ActivityTypeEnum activityType; + final MultipleChoice? multipleChoice; + final Listening? listening; + final Speaking? speaking; + final FreeResponse? freeResponse; + + PracticeActivityModel({ + required this.tgtConstructs, + required this.langCode, + required this.msgId, + required this.activityType, + this.multipleChoice, + this.listening, + this.speaking, + this.freeResponse, + }); + + factory PracticeActivityModel.fromJson(Map json) { + return PracticeActivityModel( + tgtConstructs: (json['tgt_constructs'] as List) + .map((e) => ConstructIdentifier.fromJson(e as Map)) + .toList(), + langCode: json['lang_code'] as String, + msgId: json['msg_id'] as String, + 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, + ) + : null, + listening: json['listening'] != null + ? Listening.fromJson(json['listening'] as Map) + : null, + speaking: json['speaking'] != null + ? Speaking.fromJson(json['speaking'] as Map) + : null, + freeResponse: json['free_response'] != null + ? FreeResponse.fromJson( + json['free_response'] as Map, + ) + : null, + ); + } + + Map toJson() { + return { + 'tgt_constructs': tgtConstructs.map((e) => e.toJson()).toList(), + 'lang_code': langCode, + 'msg_id': msgId, + 'activity_type': activityType.toString().split('.').last, + 'multiple_choice': multipleChoice?.toJson(), + 'listening': listening?.toJson(), + 'speaking': speaking?.toJson(), + 'free_response': freeResponse?.toJson(), + }; + } +} 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 new file mode 100644 index 000000000..0c4ea52bf --- /dev/null +++ b/lib/pangea/models/practice_activities.dart/practice_activity_record_model.dart @@ -0,0 +1,156 @@ +// record the options that the user selected +// note that this is not the same as the correct answer +// the user might have selected multiple options before +// finding the answer +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; + + PracticeActivityRecordModel({ + required this.question, + List? responses, + }) { + if (responses == null) { + this.responses = List.empty(growable: true); + } else { + this.responses = responses; + } + } + + factory PracticeActivityRecordModel.fromJson( + Map json, + ) { + return PracticeActivityRecordModel( + question: json['question'] as String, + responses: (json['responses'] as List) + .map( + (e) => ActivityRecordResponse.fromJson(e as Map), + ) + .toList(), + ); + } + + Map toJson() { + return { + 'question': question, + 'responses': responses.map((e) => e.toJson()).toList(), + }; + } + + /// get the latest response index according to the response timeStamp + /// sort the responses by timestamp and get the index of the last response + ActivityRecordResponse? get latestResponse { + if (responses.isEmpty) { + return null; + } + responses.sort((a, b) => a.timestamp.compareTo(b.timestamp)); + 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( + ActivityRecordResponse( + text: text, + audioBytes: audioBytes, + imageBytes: imageBytes, + timestamp: DateTime.now(), + score: score, + ), + ); + } catch (e) { + debugger(); + } + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is PracticeActivityRecordModel && + other.question == question && + other.responses.length == responses.length && + List.generate( + responses.length, + (index) => responses[index] == other.responses[index], + ).every((element) => element); + } + + @override + int get hashCode => question.hashCode ^ responses.hashCode; +} + +class ActivityRecordResponse { + // the user's response + // has nullable string, nullable audio bytes, nullable image bytes, and timestamp + final String? text; + 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, + }); + + factory ActivityRecordResponse.fromJson(Map json) { + return ActivityRecordResponse( + text: json['text'] as String?, + 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, + ); + } + + Map toJson() { + return { + 'text': text, + 'audio': audioBytes, + 'image': imageBytes, + 'timestamp': timestamp.toIso8601String(), + 'score': score, + }; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is ActivityRecordResponse && + other.text == text && + other.audioBytes == audioBytes && + other.imageBytes == imageBytes && + other.timestamp == timestamp; + } + + @override + int get hashCode => + text.hashCode ^ + audioBytes.hashCode ^ + imageBytes.hashCode ^ + timestamp.hashCode; +} diff --git a/lib/pangea/models/class_model.dart b/lib/pangea/models/space_model.dart similarity index 87% rename from lib/pangea/models/class_model.dart rename to lib/pangea/models/space_model.dart index 7e95c9d26..946da6dc7 100644 --- a/lib/pangea/models/class_model.dart +++ b/lib/pangea/models/space_model.dart @@ -1,6 +1,5 @@ import 'dart:developer'; -import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -8,11 +7,11 @@ 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'; -class ClassSettingsModel { +class LanguageSettingsModel { String? city; String? country; String? schoolName; @@ -20,7 +19,7 @@ class ClassSettingsModel { String dominantLanguage; String targetLanguage; - ClassSettingsModel({ + LanguageSettingsModel({ this.dominantLanguage = ClassDefaultValues.defaultDominantLanguage, this.targetLanguage = ClassDefaultValues.defaultTargetLanguage, this.languageLevel, @@ -29,17 +28,8 @@ class ClassSettingsModel { this.schoolName, }); - static ClassSettingsModel get newClass => ClassSettingsModel( - city: null, - country: null, - dominantLanguage: ClassDefaultValues.defaultDominantLanguage, - languageLevel: null, - schoolName: null, - targetLanguage: ClassDefaultValues.defaultTargetLanguage, - ); - - factory ClassSettingsModel.fromJson(Map json) { - return ClassSettingsModel( + factory LanguageSettingsModel.fromJson(Map json) { + return LanguageSettingsModel( city: json['city'], country: json['country'], dominantLanguage: LanguageModel.codeFromNameOrCode( @@ -72,35 +62,9 @@ class ClassSettingsModel { } } - //TODO: define enum with all possible values - updateEditableClassField(String key, dynamic value) { - switch (key) { - case ModelKey.clientClassCity: - city = value; - break; - case ModelKey.clientClassCountry: - country = value; - break; - case ModelKey.clientClassDominantLanguage: - dominantLanguage = value; - break; - case ModelKey.clientClassTargetLanguage: - targetLanguage = value; - break; - case ModelKey.clientLanguageLevel: - languageLevel = value; - break; - case ModelKey.clientSchool: - schoolName = value; - break; - default: - throw Exception('Invalid key for setting permissions - $key'); - } - } - StateEvent get toStateEvent => StateEvent( content: toJson(), - type: PangeaEventTypes.classSettings, + type: PangeaEventTypes.languageSettings, ); } diff --git a/lib/pangea/models/user_model.dart b/lib/pangea/models/user_model.dart index a6ae5730f..3e3a508cd 100644 --- a/lib/pangea/models/user_model.dart +++ b/lib/pangea/models/user_model.dart @@ -4,12 +4,12 @@ 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/models/class_model.dart'; -import 'package:fluffychat/pangea/utils/instructions.dart'; +import 'package:fluffychat/pangea/enum/instructions_enum.dart'; +import 'package:fluffychat/pangea/models/space_model.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) => @@ -54,6 +54,7 @@ class PUserModel { enum MatrixProfile { dateOfBirth, autoPlayMessages, + itAutoPlay, activatedFreeTrial, interactiveTranslator, interactiveGrammar, @@ -79,6 +80,8 @@ 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: diff --git a/lib/pangea/pages/analytics/analytics_language_button.dart b/lib/pangea/pages/analytics/analytics_language_button.dart new file mode 100644 index 000000000..08b3220b0 --- /dev/null +++ b/lib/pangea/pages/analytics/analytics_language_button.dart @@ -0,0 +1,50 @@ +import 'package:fluffychat/pangea/models/language_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +class AnalyticsLanguageButton extends StatelessWidget { + final List languages; + final LanguageModel value; + final void Function(LanguageModel) onChange; + const AnalyticsLanguageButton({ + super.key, + required this.value, + required this.onChange, + required this.languages, + }); + + @override + Widget build(BuildContext context) { + return PopupMenuButton( + tooltip: L10n.of(context)!.changeAnalyticsLanguage, + initialValue: value, + onSelected: (LanguageModel? lang) { + if (lang == null) { + debugPrint("when is lang null?"); + return; + } + onChange(lang); + }, + itemBuilder: (BuildContext context) => + languages.map((LanguageModel lang) { + return PopupMenuItem( + value: lang, + child: Text(lang.getDisplayName(context) ?? lang.langCode), + ); + }).toList(), + child: TextButton.icon( + label: Text( + 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/analytics_list_tile.dart b/lib/pangea/pages/analytics/analytics_list_tile.dart index 53bd72922..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'; @@ -26,8 +25,6 @@ class AnalyticsListTile extends StatefulWidget { required this.onTap, required this.pangeaController, this.controller, - // this.isEnabled = true, - // this.showSpaceAnalytics = true, this.refreshStream, }); @@ -40,8 +37,6 @@ class AnalyticsListTile extends StatefulWidget { final bool allowNavigateOnSelect; final bool isSelected; - // final bool isEnabled; - // final bool showSpaceAnalytics; final PangeaController pangeaController; final BaseAnalyticsController? controller; @@ -64,6 +59,14 @@ class AnalyticsListTileState extends State { }); } + @override + void didUpdateWidget(covariant AnalyticsListTile oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.selected != widget.selected) { + setTileData(); + } + } + @override void dispose() { refreshSubscription?.cancel(); @@ -87,73 +90,66 @@ class AnalyticsListTileState extends State { color: widget.isSelected ? Theme.of(context).colorScheme.secondaryContainer : Colors.transparent, - child: Tooltip( - message: widget.selected.type == AnalyticsEntryType.room - ? L10n.of(context)!.joinToView - : L10n.of(context)!.studentAnalyticsNotAvailable, - child: ListTile( - leading: widget.selected.type == AnalyticsEntryType.privateChats - ? CircleAvatar( - backgroundColor: Theme.of(context).primaryColor, - foregroundColor: Colors.white, - radius: Avatar.defaultSize / 2, - child: const Icon(Icons.forum), - ) - : Avatar( - mxContent: widget.avatar, - name: widget.selected.displayName, - littleIcon: room?.roomTypeIcon, - ), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Text( - widget.selected.displayName, - maxLines: 1, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.bold, - color: Theme.of(context).textTheme.bodyLarge!.color, - ), + child: ListTile( + leading: widget.selected.type == AnalyticsEntryType.privateChats + ? CircleAvatar( + backgroundColor: Theme.of(context).primaryColor, + foregroundColor: Colors.white, + radius: Avatar.defaultSize / 2, + child: const Icon(Icons.forum), + ) + : Avatar( + mxContent: widget.avatar, + name: widget.selected.displayName, + littleIcon: room?.roomTypeIcon, + ), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + widget.selected.displayName, + maxLines: 1, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).textTheme.bodyLarge!.color, ), ), - Tooltip( - message: L10n.of(context)!.timeOfLastMessage, - child: Text( - tileData?.lastMessageTime?.localizedTimeShort(context) ?? "", - style: TextStyle( - fontSize: 13, - color: Theme.of(context).textTheme.bodyMedium!.color, - ), + ), + Tooltip( + message: L10n.of(context)!.timeOfLastMessage, + child: Text( + tileData?.lastMessageTime?.localizedTimeShort(context) ?? "", + style: TextStyle( + fontSize: 13, + color: Theme.of(context).textTheme.bodyMedium!.color, ), ), - ], - ), - subtitle: ListSummaryAnalytics( - chartAnalytics: tileData, - ), - selected: widget.isSelected, - onTap: () { - if (widget.controller?.widget.selectedView == null) { - widget.onTap(widget.selected); - return; - } - if ((room?.isSpace ?? false) && widget.allowNavigateOnSelect) { - final String selectedView = - widget.controller!.widget.selectedView!.route; - context.go('/rooms/analytics/${room!.id}/$selectedView'); - return; - } - widget.onTap(widget.selected); - }, - trailing: (room?.isSpace ?? false) && - widget.selected.type != AnalyticsEntryType.privateChats && - widget.allowNavigateOnSelect - ? const Icon(Icons.chevron_right) - : null, + ), + ], ), + subtitle: ListSummaryAnalytics( + chartAnalytics: tileData, + ), + selected: widget.isSelected, + onTap: () { + if (widget.controller?.widget.selectedView == null) { + widget.onTap(widget.selected); + return; + } + if ((room?.isSpace ?? false) && widget.allowNavigateOnSelect) { + context.go('/rooms/analytics/${room!.id}'); + return; + } + widget.onTap(widget.selected); + }, + trailing: (room?.isSpace ?? false) && + widget.selected.type != AnalyticsEntryType.privateChats && + widget.allowNavigateOnSelect + ? const Icon(Icons.chevron_right) + : null, ), ); } 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 2b548226b..cd41d2312 100644 --- a/lib/pangea/pages/analytics/base_analytics.dart +++ b/lib/pangea/pages/analytics/base_analytics.dart @@ -4,6 +4,7 @@ import 'package:fluffychat/pangea/constants/pangea_event_types.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/analytics/analytics_event.dart'; +import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/pages/analytics/base_analytics_view.dart'; import 'package:fluffychat/pangea/pages/analytics/student_analytics/student_analytics.dart'; import 'package:flutter/material.dart'; @@ -19,21 +20,25 @@ 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; final StudentAnalyticsController? myAnalyticsController; + final List targetLanguages; - const BaseAnalyticsPage({ + BaseAnalyticsPage({ super.key, required this.pageTitle, required this.tabs, required this.alwaysSelected, required this.defaultSelected, - this.selectedView, + required this.selectedView, this.myAnalyticsController, - }); + targetLanguages, + }) : targetLanguages = (targetLanguages?.isNotEmpty ?? false) + ? targetLanguages + : MatrixState.pangeaController.pLanguageStore.targetOptions; @override State createState() => BaseAnalyticsController(); @@ -45,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; @@ -58,6 +64,7 @@ class BaseAnalyticsController extends State { @override void initState() { super.initState(); + currentView = widget.selectedView; if (widget.defaultSelected.type == AnalyticsEntryType.student) { runFirstRefresh(); } @@ -157,6 +164,18 @@ class BaseAnalyticsController extends State { refreshStream.add(false); } + Future toggleSpaceLang(LanguageModel lang) async { + await pangeaController.analytics.setCurrentAnalyticsLang(lang); + await setChartData(); + 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 09805ef71..13e49aa38 100644 --- a/lib/pangea/pages/analytics/base_analytics_view.dart +++ b/lib/pangea/pages/analytics/base_analytics_view.dart @@ -3,7 +3,9 @@ import 'dart:math'; import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart'; 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'; @@ -23,18 +25,14 @@ 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, ); case BarChartViewSelection.grammar: return ConstructList( - constructType: ConstructType.grammar, + constructType: ConstructTypeEnum.grammar, defaultSelected: controller.widget.defaultSelected, selected: controller.selected, controller: controller, @@ -74,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, @@ -103,214 +87,156 @@ class BaseAnalyticsView extends StatelessWidget { ), body: MaxWidthBody( withScrolling: false, - child: controller.widget.selectedView != null - ? Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - if (controller.widget.defaultSelected.type == - AnalyticsEntryType.student) - IconButton( - icon: const Icon(Icons.refresh), - onPressed: controller.onRefresh, - tooltip: L10n.of(context)!.refresh, + 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, + ), + ), ), - TimeSpanMenuButton( - value: controller.currentTimeSpan, - onChange: (TimeSpan value) => - controller.toggleTimeSpan(context, value), - ), - ], - ), - 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/class_list/class_list.dart b/lib/pangea/pages/analytics/class_list/class_list.dart deleted file mode 100644 index 45aa6bb88..000000000 --- a/lib/pangea/pages/analytics/class_list/class_list.dart +++ /dev/null @@ -1,79 +0,0 @@ -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/pages/analytics/base_analytics.dart'; -import 'package:fluffychat/pangea/pages/analytics/class_list/class_list_view.dart'; -import 'package:flutter/material.dart'; -import 'package:matrix/matrix.dart'; - -import '../../../../widgets/matrix.dart'; -import '../../../controllers/pangea_controller.dart'; -import '../../../models/analytics/chart_analytics_model.dart'; -import '../../../utils/sync_status_util_v2.dart'; -import '../../../widgets/common/list_placeholder.dart'; - -class AnalyticsClassList extends StatefulWidget { - const AnalyticsClassList({super.key}); - - @override - State createState() => AnalyticsClassListController(); -} - -class AnalyticsClassListController extends State { - PangeaController pangeaController = MatrixState.pangeaController; - List models = []; - List spaces = []; - - @override - void initState() { - super.initState(); - Matrix.of(context).client.classesAndExchangesImTeaching.then((spaceList) { - spaceList = spaceList - .where( - (space) => !spaceList.any( - (parentSpace) => parentSpace.spaceChildren - .any((child) => child.roomId == space.id), - ), - ) - .toList(); - spaces = spaceList; - setState(() {}); - }); - } - - @override - Widget build(BuildContext context) { - return PLoadingStatusV2( - shimmerChild: const ListPlaceholder(), - child: AnalyticsClassListView(this), - onFinish: () { - // getAllClassAnalytics(context); - }, - ); - } - - Future updateClassAnalytics( - Room? space, - ) async { - if (space == null) { - return null; - } - - final data = await pangeaController.analytics.getAnalytics( - defaultSelected: AnalyticsSelected( - space.id, - AnalyticsEntryType.space, - space.name, - ), - forceUpdate: true, - ); - setState(() {}); - return data; - } - - void toggleTimeSpan(BuildContext context, TimeSpan timeSpan) { - pangeaController.analytics.setCurrentAnalyticsTimeSpan(timeSpan); - setState(() {}); - } -} diff --git a/lib/pangea/pages/analytics/construct_list.dart b/lib/pangea/pages/analytics/construct_list.dart index e169922ca..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 = []; @@ -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, ), ), ), diff --git a/lib/pangea/pages/analytics/class_analytics/class_analytics.dart b/lib/pangea/pages/analytics/space_analytics/space_analytics.dart similarity index 61% rename from lib/pangea/pages/analytics/class_analytics/class_analytics.dart rename to lib/pangea/pages/analytics/space_analytics/space_analytics.dart index 9bf5ac7a3..2db1acb4c 100644 --- a/lib/pangea/pages/analytics/class_analytics/class_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'; @@ -14,75 +15,74 @@ import 'package:matrix/matrix.dart'; import '../../../../widgets/matrix.dart'; import '../../../utils/sync_status_util_v2.dart'; -import 'class_analytics_view.dart'; +import 'space_analytics_view.dart'; -enum AnalyticsPageType { classList, student, classDetails } - -class ClassAnalyticsPage extends StatefulWidget { - final BarChartViewSelection? selectedView; - const ClassAnalyticsPage({super.key, this.selectedView}); +class SpaceAnalyticsPage extends StatefulWidget { + final BarChartViewSelection selectedView; + const SpaceAnalyticsPage({super.key, required this.selectedView}); @override - State createState() => ClassAnalyticsV2Controller(); + State createState() => SpaceAnalyticsV2Controller(); } -class ClassAnalyticsV2Controller extends State { +class SpaceAnalyticsV2Controller extends State { bool _initialized = false; // StreamSubscription? stateSub; // Timer? refreshTimer; List chats = []; List students = []; - String? get classId => GoRouterState.of(context).pathParameters['classid']; - Room? _classRoom; - - Room? get classRoom { - if (_classRoom == null || _classRoom!.id != classId) { - debugPrint("updating _classRoom"); - _classRoom = classId != null - ? Matrix.of(context).client.getRoomById(classId!) - : null; - if (_classRoom == null) { - context.go('/rooms/analytics'); - } - getChatAndStudents(); - } - return _classRoom; - } + String? get spaceId => GoRouterState.of(context).pathParameters['spaceid']; + Room? _spaceRoom; + List targetLanguages = []; @override void initState() { super.initState(); - debugPrint("init class analytics"); Future.delayed(Duration.zero, () async { - if (classRoom == null || (!(classRoom?.isSpace ?? false))) { + if (spaceRoom == null || (!(spaceRoom?.isSpace ?? false))) { context.go('/rooms'); } getChatAndStudents(); }); } + Room? get spaceRoom { + if (_spaceRoom == null || _spaceRoom!.id != spaceId) { + debugPrint("updating _spaceRoom"); + _spaceRoom = spaceId != null + ? Matrix.of(context).client.getRoomById(spaceId!) + : null; + if (_spaceRoom == null) { + context.go('/rooms/analytics'); + return null; + } + getChatAndStudents().then((_) => setTargetLanguages()); + } + return _spaceRoom; + } + Future getChatAndStudents() async { try { - await classRoom?.postLoad(); - await classRoom?.requestParticipants(); + await spaceRoom?.postLoad(); + await spaceRoom?.requestParticipants(); - if (classRoom != null) { + if (spaceRoom != null) { final response = await Matrix.of(context).client.getSpaceHierarchy( - classRoom!.id, + spaceRoom!.id, ); // set the latest fetched full hierarchy in message analytics controller // we want to avoid calling this endpoint again and again, so whenever the // data is made available, set it in the controller MatrixState.pangeaController.analytics - .setLatestHierarchy(_classRoom!.id, response); + .setLatestHierarchy(_spaceRoom!.id, response); - students = classRoom!.students; + students = spaceRoom!.students; chats = response.rooms .where( (room) => - room.roomId != classRoom!.id && + room.roomId != spaceRoom!.id && room.roomType != PangeaRoomTypes.analytics, ) .toList(); @@ -98,12 +98,12 @@ class ClassAnalyticsV2Controller 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) { @@ -116,7 +116,7 @@ class ClassAnalyticsV2Controller extends State { // onFinish: () { // getChatAndStudentAnalytics(context); // }, - child: ClassAnalyticsView(this), + child: SpaceAnalyticsView(this), ); } } diff --git a/lib/pangea/pages/analytics/class_analytics/class_analytics_view.dart b/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart similarity index 72% rename from lib/pangea/pages/analytics/class_analytics/class_analytics_view.dart rename to lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart index 5f609437b..c72ec3c26 100644 --- a/lib/pangea/pages/analytics/class_analytics/class_analytics_view.dart +++ b/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart @@ -3,17 +3,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import '../base_analytics.dart'; -import 'class_analytics.dart'; +import 'space_analytics.dart'; -class ClassAnalyticsView extends StatelessWidget { - final ClassAnalyticsV2Controller controller; - const ClassAnalyticsView(this.controller, {super.key}); +class SpaceAnalyticsView extends StatelessWidget { + final SpaceAnalyticsV2Controller controller; + const SpaceAnalyticsView(this.controller, {super.key}); @override Widget build(BuildContext context) { - // final String pageTitle = - // "${L10n.of(context)!.classAnalytics}: ${controller.className(context)}"; - final String pageTitle = L10n.of(context)!.classAnalytics; + final String pageTitle = L10n.of(context)!.spaceAnalytics; final TabData tab1 = TabData( type: AnalyticsEntryType.room, icon: Icons.chat_bubble_outline, @@ -46,21 +44,22 @@ class ClassAnalyticsView extends StatelessWidget { .toList(), ); - return controller.classId != null + return controller.spaceId != null ? BaseAnalyticsPage( selectedView: controller.widget.selectedView, pageTitle: pageTitle, tabs: [tab1, tab2], alwaysSelected: AnalyticsSelected( - controller.classId!, + controller.spaceId!, AnalyticsEntryType.space, - controller.classRoom?.name ?? "", + controller.spaceRoom?.name ?? "", ), defaultSelected: AnalyticsSelected( - controller.classId!, + controller.spaceId!, AnalyticsEntryType.space, - controller.classRoom?.name ?? "", + 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 new file mode 100644 index 000000000..e65bb6152 --- /dev/null +++ b/lib/pangea/pages/analytics/space_list/space_list.dart @@ -0,0 +1,100 @@ +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'; +import 'package:matrix/matrix.dart'; + +import '../../../../widgets/matrix.dart'; +import '../../../controllers/pangea_controller.dart'; +import '../../../utils/sync_status_util_v2.dart'; +import '../../../widgets/common/list_placeholder.dart'; + +class AnalyticsSpaceList extends StatefulWidget { + const AnalyticsSpaceList({super.key}); + + @override + State createState() => AnalyticsSpaceListController(); +} + +class AnalyticsSpaceListController extends State { + PangeaController pangeaController = MatrixState.pangeaController; + List spaces = []; + StreamSubscription? stateSub; + List targetLanguages = []; + + @override + void initState() { + super.initState(); + setSpaceList().then((_) => setTargetLanguages()); + + // 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(); + + 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); + setState(() {}); + } + + Future toggleSpaceLang(LanguageModel lang) async { + await pangeaController.analytics.setCurrentAnalyticsLang(lang); + refreshStream.add(false); + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return PLoadingStatusV2( + shimmerChild: const ListPlaceholder(), + child: AnalyticsSpaceListView(this), + onFinish: () { + // getAllClassAnalytics(context); + }, + ); + } +} diff --git a/lib/pangea/pages/analytics/class_list/class_list_view.dart b/lib/pangea/pages/analytics/space_list/space_list_view.dart similarity index 60% rename from lib/pangea/pages/analytics/class_list/class_list_view.dart rename to lib/pangea/pages/analytics/space_list/space_list_view.dart index fe63d7675..7ef5fb45e 100644 --- a/lib/pangea/pages/analytics/class_list/class_list_view.dart +++ b/lib/pangea/pages/analytics/space_list/space_list_view.dart @@ -1,16 +1,17 @@ +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'; 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 'class_list.dart'; +import 'space_list.dart'; -class AnalyticsClassListView extends StatelessWidget { - final AnalyticsClassListController controller; - const AnalyticsClassListView(this.controller, {super.key}); +class AnalyticsSpaceListView extends StatelessWidget { + final AnalyticsSpaceListController controller; + const AnalyticsSpaceListView(this.controller, {super.key}); @override Widget build(BuildContext context) { @@ -18,7 +19,7 @@ class AnalyticsClassListView extends StatelessWidget { appBar: AppBar( centerTitle: true, title: Text( - L10n.of(context)!.classAnalytics, + L10n.of(context)!.spaceAnalytics, style: TextStyle( color: Theme.of(context).textTheme.bodyLarge!.color, fontSize: 18, @@ -31,17 +32,29 @@ class AnalyticsClassListView 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), - ), - ], ), 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.currentAnalyticsLang, + onChange: (lang) => controller.toggleSpaceLang(lang), + languages: + controller.pangeaController.pLanguageStore.targetOptions, + ), + ], + ), Flexible( child: ListView.builder( itemCount: controller.spaces.length, @@ -49,7 +62,7 @@ class AnalyticsClassListView extends StatelessWidget { defaultSelected: AnalyticsSelected( controller.spaces[i].id, AnalyticsEntryType.space, - "", + controller.spaces[i].name, ), avatar: controller.spaces[i].avatar, selected: AnalyticsSelected( @@ -65,6 +78,7 @@ class AnalyticsClassListView extends StatelessWidget { allowNavigateOnSelect: true, isSelected: false, pangeaController: controller.pangeaController, + refreshStream: controller.refreshStream, ), ), ), diff --git a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart index 65bd533e8..e06c6d0ba 100644 --- a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart +++ b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart @@ -1,7 +1,11 @@ -import 'dart:async'; import 'dart:developer'; +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'; +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'; @@ -14,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(); @@ -24,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 { @@ -75,6 +65,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(); } diff --git a/lib/pangea/pages/analytics/time_span_menu_button.dart b/lib/pangea/pages/analytics/time_span_menu_button.dart index 97a2ede4b..32f6668bc 100644 --- a/lib/pangea/pages/analytics/time_span_menu_button.dart +++ b/lib/pangea/pages/analytics/time_span_menu_button.dart @@ -15,8 +15,6 @@ class TimeSpanMenuButton extends StatelessWidget { @override Widget build(BuildContext context) { return PopupMenuButton( - offset: const Offset(0, 100), - icon: const Icon(Icons.calendar_month_outlined), tooltip: L10n.of(context)!.changeDateRange, initialValue: value, onSelected: (TimeSpan? timeSpan) { @@ -33,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, + ), ); } } diff --git a/lib/pangea/pages/class_analytics/measure_able.dart b/lib/pangea/pages/class_analytics/measure_able.dart index 444997995..a569893fa 100644 --- a/lib/pangea/pages/class_analytics/measure_able.dart +++ b/lib/pangea/pages/class_analytics/measure_able.dart @@ -3,11 +3,13 @@ import 'package:flutter/scheduler.dart'; class MeasurableWidget extends StatefulWidget { final Widget child; - - Function? triggerMeasure; final Function(Size? size, Offset? position) onChange; - MeasurableWidget({super.key, required this.onChange, required this.child}); + const MeasurableWidget({ + super.key, + required this.onChange, + required this.child, + }); @override _WidgetSizeState createState() => _WidgetSizeState(); @@ -26,20 +28,22 @@ class _WidgetSizeState extends State { final context = widgetKey.currentContext; if (context == null) return; - final newSize = context.size; - final RenderBox? box = widgetKey.currentContext?.findRenderObject() as RenderBox?; - final Offset? position = box?.localToGlobal(Offset.zero); - if (oldPosition != null) { - if (oldPosition!.dx == position!.dx && oldPosition!.dy == position.dy) { - return; + if (box != null && box.hasSize) { + final Offset position = box.localToGlobal(Offset.zero); + + if (oldPosition != null) { + if (oldPosition!.dx == position.dx && oldPosition!.dy == position.dy) { + return; + } } - } - oldPosition = position; + oldPosition = position; - widget.onChange(newSize, position); + final newSize = context.size; + widget.onChange(newSize, position); + } } @override diff --git a/lib/pangea/pages/class_settings/p_class_widgets/class_analytics_button.dart b/lib/pangea/pages/class_settings/p_class_widgets/class_analytics_button.dart deleted file mode 100644 index 1ac293494..000000000 --- a/lib/pangea/pages/class_settings/p_class_widgets/class_analytics_button.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:go_router/go_router.dart'; - -class ClassAnalyticsButton extends StatelessWidget { - const ClassAnalyticsButton({super.key}); - - @override - Widget build(BuildContext context) { - final roomId = GoRouterState.of(context).pathParameters['roomid']; - final iconColor = Theme.of(context).textTheme.bodyLarge!.color; - - return Column( - children: [ - ListTile( - title: Text( - L10n.of(context)!.classAnalytics, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), - subtitle: Text(L10n.of(context)!.classAnalyticsDesc), - leading: CircleAvatar( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon(Icons.analytics_outlined), - ), - onTap: () => context.go('/rooms/analytics/$roomId'), - ), - ], - ); - } -} 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..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( @@ -26,14 +27,27 @@ 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: Scrollbar( + controller: scrollController, + interactive: true, + child: SingleChildScrollView( + controller: scrollController, + primary: false, + 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 diff --git a/lib/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart b/lib/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart index ebef184fc..c6b011315 100644 --- a/lib/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart +++ b/lib/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart @@ -1,4 +1,4 @@ -import 'package:fluffychat/pangea/models/class_model.dart'; +import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart'; diff --git a/lib/pangea/pages/exchange/add_exchange_to_class.dart b/lib/pangea/pages/exchange/add_exchange_to_class.dart deleted file mode 100644 index 25b448214..000000000 --- a/lib/pangea/pages/exchange/add_exchange_to_class.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:fluffychat/pangea/widgets/class/add_class_and_invite.dart'; -import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:go_router/go_router.dart'; - -class AddExchangeToClass extends StatefulWidget { - const AddExchangeToClass({super.key}); - - @override - AddExchangeToClassState createState() => AddExchangeToClassState(); -} - -class AddExchangeToClassState extends State { - final GlobalKey addToSpaceKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - final String? spaceId = - GoRouterState.of(context).pathParameters['exchangeid']; - if (spaceId == null) { - return const SizedBox(); - } - - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(L10n.of(context)!.addToClassTitle), - ), - body: FutureBuilder( - future: - Matrix.of(context).client.waitForRoomInSync(spaceId, join: true), - builder: (context, snapshot) { - if (snapshot.hasData) { - return ListView( - children: [ - const SizedBox(height: 40), - AddToSpaceToggles( - roomId: - GoRouterState.of(context).pathParameters['exchangeid'], - key: addToSpaceKey, - startOpen: true, - mode: AddToClassMode.exchange, - ), - ], - ); - } else { - return const Center(child: CircularProgressIndicator()); - } - }, - ), - floatingActionButton: FloatingActionButton( - onPressed: () => context.go("/rooms"), - child: const Icon(Icons.arrow_forward_outlined), - ), - ); - } -} diff --git a/lib/pangea/pages/find_partner/find_partner_view.dart b/lib/pangea/pages/find_partner/find_partner_view.dart index afef95885..db6afa2d1 100644 --- a/lib/pangea/pages/find_partner/find_partner_view.dart +++ b/lib/pangea/pages/find_partner/find_partner_view.dart @@ -1,4 +1,5 @@ import 'package:country_picker/country_picker.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pangea/models/user_model.dart'; import 'package:fluffychat/pangea/widgets/common/list_placeholder.dart'; @@ -272,9 +273,16 @@ class UserProfileEntry extends StatelessWidget { ), title: Row( children: [ - Text( - //PTODO - get matrix u and show displayName - matrixProfile?.displayName ?? pangeaProfile.pangeaUserId, + Flexible( + child: Text( + //PTODO - get matrix u and show displayName + matrixProfile?.displayName ?? + pangeaProfile.pangeaUserId.replaceAll( + ":${AppConfig.defaultHomeserver.replaceAll("matrix.", "")}", + "", + ), + overflow: TextOverflow.ellipsis, + ), ), const SizedBox(width: 20), RichText( diff --git a/lib/pangea/pages/settings_learning/settings_learning_view.dart b/lib/pangea/pages/settings_learning/settings_learning_view.dart index b9ec704c6..191bd76db 100644 --- a/lib/pangea/pages/settings_learning/settings_learning_view.dart +++ b/lib/pangea/pages/settings_learning/settings_learning_view.dart @@ -1,5 +1,5 @@ import 'package:fluffychat/pangea/constants/local.key.dart'; -import 'package:fluffychat/pangea/models/class_model.dart'; +import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/pages/settings_learning/settings_learning.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/widgets/user_settings/country_picker_tile.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/repo/class_analytics_repo.dart b/lib/pangea/repo/class_analytics_repo.dart deleted file mode 100644 index fae8fe3b5..000000000 --- a/lib/pangea/repo/class_analytics_repo.dart +++ /dev/null @@ -1,76 +0,0 @@ -// import 'dart:convert'; -// import 'dart:developer'; - -// import 'package:fluffychat/pangea/network/requests.dart'; -// import 'package:fluffychat/pangea/utils/analytics_util.dart'; -// import 'package:flutter/foundation.dart'; -// import 'package:http/http.dart'; - -// import '../../config/environment.dart'; -// import '../models/analytics_model_oldest.dart'; -// import '../network/urls.dart'; - -class PClassAnalyticsRepo { - /// deprecated in favor of new analytics - static Future repoGetAnalyticsByIds( - String accessToken, - String timeSpan, { - List? classIds, - List? userIds, - List? chatIds, - }) async { - // if (!AnalyticsUtil.isValidSpan(timeSpan)) throw "Invalid span"; - - // final Requests req = Requests( - // accessToken: accessToken, choreoApiKey: Environment.choreoApiKey); - - // final body = {}; - // body["timespan"] = timeSpan; - // if (classIds != null) body["class_ids"] = classIds; - // if (chatIds != null) body["chat_ids"] = chatIds; - // if (userIds != null) body["user_ids"] = userIds; - - // final Response res = - // await req.post(url: PApiUrls.classAnalytics, body: body); - // final json = jsonDecode(res.body); - - // final Iterable? classJson = json["class_analytics"]; - // final Iterable? chatJson = json["chat_analytics"]; - // final Iterable? userJson = json["user_analytics"]; - - // final classInfo = classJson != null - // ? (classJson) - // .map((e) { - // e["timespan"] = timeSpan; - // return chartAnalytics(e); - // }) - // .toList() - // .cast() - // : []; - // final chatInfo = chatJson != null - // ? (chatJson) - // .map((e) { - // e["timespan"] = timeSpan; - // return chartAnalytics(e); - // }) - // .toList() - // .cast() - // : []; - // final userInfo = userJson != null - // ? (userJson) - // .map((e) { - // e["timespan"] = timeSpan; - // return chartAnalytics(e); - // }) - // .toList() - // .cast() - // : []; - - // final List allAnalytics = [ - // ...classInfo, - // ...chatInfo, - // ...userInfo - // ]; - // return allAnalytics; - } -} diff --git a/lib/pangea/repo/exchange_repo.dart b/lib/pangea/repo/exchange_repo.dart deleted file mode 100644 index a4b78112c..000000000 --- a/lib/pangea/repo/exchange_repo.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -class PExchangeRepo { - static fetchExchangeClassInfo(String exchangePangeaId) async {} - - static saveExchangeRecord( - String requestFromClass, - String requestToClass, - String requestTeacher, - String requestToClassAuthor, - String exchangePangeaId, - ) async {} - - static exchangeRejectRequest(String roomId, String teacherName) async {} - - static validateExchange({ - required String requestFromClass, - required String requestToClass, - required BuildContext context, - }) async {} - - static createExchangeRequest({ - required String roomId, - required String teacherID, - required String toClass, - required BuildContext context, - }) async {} - - static isExchange( - BuildContext context, - String accessToken, - String exchangeId, - ) async {} -} diff --git a/lib/pangea/repo/igc_repo.dart b/lib/pangea/repo/igc_repo.dart index 9517515d0..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), @@ -89,7 +93,6 @@ class IGCRequestBody { String fullText; String userL1; String userL2; - bool tokensOnly; bool enableIT; bool enableIGC; @@ -99,7 +102,6 @@ class IGCRequestBody { required this.userL2, required this.enableIGC, required this.enableIT, - this.tokensOnly = false, }); Map toJson() => { @@ -108,6 +110,5 @@ class IGCRequestBody { ModelKey.userL2: userL2, "enable_it": enableIT, "enable_igc": enableIGC, - "tokens_only": tokensOnly, }; } 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/chat_list_handle_space_tap.dart b/lib/pangea/utils/chat_list_handle_space_tap.dart index 4930f7ecc..9b950e15b 100644 --- a/lib/pangea/utils/chat_list_handle_space_tap.dart +++ b/lib/pangea/utils/chat_list_handle_space_tap.dart @@ -56,7 +56,7 @@ void chatListHandleSpaceTap( title: L10n.of(context)!.youreInvited, message: space.isSpace ? L10n.of(context)! - .invitedToClassOrExchange(space.name, space.creatorId ?? "???") + .invitedToSpace(space.name, space.creatorId ?? "???") : L10n.of(context)! .invitedToChat(space.name, space.creatorId ?? "???"), okLabel: L10n.of(context)!.accept, diff --git a/lib/pangea/utils/download_chat.dart b/lib/pangea/utils/download_chat.dart index a73cfa129..ab0fee8a2 100644 --- a/lib/pangea/utils/download_chat.dart +++ b/lib/pangea/utils/download_chat.dart @@ -1,10 +1,11 @@ import 'dart:async'; import 'dart:io'; +import 'package:csv/csv.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; +import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:csv/csv.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:intl/intl.dart'; import 'package:matrix/matrix.dart'; @@ -15,16 +16,12 @@ import 'package:permission_handler/permission_handler.dart'; import 'package:syncfusion_flutter_xlsio/xlsio.dart'; import 'package:universal_html/html.dart' as webFile; -import 'package:fluffychat/pangea/models/class_model.dart'; -import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; -import 'package:fluffychat/pangea/utils/error_handler.dart'; import '../models/choreo_record.dart'; enum DownloadType { txt, csv, xlsx } Future downloadChat( Room room, - ClassSettingsModel classSettings, DownloadType type, Client client, BuildContext context, @@ -43,7 +40,6 @@ Future downloadChat( allEvents, timeline, room, - classSettings.targetLanguage, ); } catch (err) { ErrorHandler.logError( @@ -123,7 +119,6 @@ List getPangeaMessageEvents( List events, Timeline timeline, Room room, - String? targetLang, ) { final List allPangeaMessages = events .where( diff --git a/lib/pangea/utils/error_handler.dart b/lib/pangea/utils/error_handler.dart index d66c29186..2144e9f87 100644 --- a/lib/pangea/utils/error_handler.dart +++ b/lib/pangea/utils/error_handler.dart @@ -8,6 +8,11 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:http/http.dart' as http; import 'package:sentry_flutter/sentry_flutter.dart'; +class PangeaWarningError implements Exception { + final String message; + PangeaWarningError(message) : message = "Pangea Warning Error: $message"; +} + class ErrorHandler { ErrorHandler(); diff --git a/lib/pangea/utils/firebase_analytics.dart b/lib/pangea/utils/firebase_analytics.dart index 374242d7b..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 @@ -68,13 +67,6 @@ class GoogleAnalytics { ); } - static createExchange(String exchangeName, String classCode) { - logEvent( - 'create_exchange', - parameters: {'name': exchangeName, 'group_id': classCode}, - ); - } - static createChat(String newChatRoomId) { logEvent('create_chat', parameters: {"chat_id": newChatRoomId}); } @@ -93,38 +85,16 @@ class GoogleAnalytics { ); } - static addChatToExchange(String chatRoomId, String classCode) { - logEvent( - 'add_chat_to_exchange', - parameters: {"chat_id": chatRoomId, 'group_id': classCode}, - ); - } - - static inviteClassToExchange(String classId, String exchangeId) { - logEvent( - 'invite_class_to_exchange', - parameters: {'group_id': classId, 'exchange_id': exchangeId}, - ); - } - - static kickClassFromExchange(String classId, String exchangeId) { - logEvent( - 'kick_class_from_exchange', - parameters: {'group_id': classId, 'exchange_id': exchangeId}, - ); - } - static joinClass(String classCode) { 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/utils/get_chat_list_item_subtitle.dart b/lib/pangea/utils/get_chat_list_item_subtitle.dart index 9d1e45005..bd8d064f5 100644 --- a/lib/pangea/utils/get_chat_list_item_subtitle.dart +++ b/lib/pangea/utils/get_chat_list_item_subtitle.dart @@ -1,9 +1,9 @@ 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'; -import 'package:fluffychat/pangea/models/class_model.dart'; +import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; @@ -69,9 +69,7 @@ class GetChatListItemSubtitle { timeline: timeline, ownMessage: false, ); - final l2Code = pangeaController.languageController - .activeL2Code(roomID: event.roomId); - + final l2Code = pangeaController.languageController.activeL2Code(); if (l2Code == null || l2Code == LanguageKeys.unknownLanguage) { return event.body; } 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, + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pangea/utils/instructions.dart b/lib/pangea/utils/instructions.dart index 43350f518..382268082 100644 --- a/lib/pangea/utils/instructions.dart +++ b/lib/pangea/utils/instructions.dart @@ -1,4 +1,5 @@ -import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/pangea/enum/instructions_enum.dart'; +import 'package:fluffychat/pangea/utils/inline_tooltip.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -14,17 +15,29 @@ 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 = {}; + + /// Instruction popup has already been shown this session final Map _instructionsShown = {}; + /// Returns true if the user requested this popup not be shown again + bool? toggledOff(InstructionsEnum key) => + _pangeaController.pStoreService.read(key.toString()); + InstructionsController(PangeaController pangeaController) { _pangeaController = pangeaController; } + /// Returns true if the instructions were closed + /// or 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; + + void turnOffInstruction(InstructionsEnum key) => + _instructionsClosed[key] = true; Future updateEnableInstructions( InstructionsEnum key, @@ -35,12 +48,19 @@ class InstructionsController { value, ); - Future show( + /// Instruction Card gives users tips on + /// how to use Pangea Chat's features + Future showInstructionsPopup( BuildContext context, InstructionsEnum key, String transformTargetKey, [ bool showToggle = true, ]) async { + if (_instructionsShown[key] ?? false) { + return; + } + _instructionsShown[key] = true; + if (wereInstructionsTurnedOff(key)) { return; } @@ -51,9 +71,6 @@ class InstructionsController { ); return; } - if (_instructionsShown[key] ?? false) { - return; - } final bool userLangsSet = await _pangeaController.userController.areUserLanguagesSet; @@ -61,8 +78,6 @@ class InstructionsController { return; } - _instructionsShown[key] = true; - final botStyle = BotStyle.text(context); Future.delayed( const Duration(seconds: 1), @@ -74,7 +89,7 @@ class InstructionsController { children: [ CardHeader( text: key.title(context), - botExpression: BotExpression.surprised, + botExpression: BotExpression.idle, onClose: () => {_instructionsClosed[key] = true}, ), const SizedBox(height: 10.0), @@ -94,48 +109,39 @@ class InstructionsController { ), cardSize: const Size(300.0, 300.0), transformTargetId: transformTargetKey, + closePrevOverlay: false, ), ); } + + /// Returns a widget that will be added to existing widget + /// which displays hint text defined in the enum extension + Widget getInstructionInlineTooltip( + BuildContext context, + InstructionsEnum key, + VoidCallback onClose, + ) { + 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(); + } + + return InlineTooltip( + body: InstructionsEnum.speechToText.body(context), + onClose: onClose, + ); + } } -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; - } - } - - 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; - } - } -} - +/// User can toggle on to prevent Instruction Card +/// from appearing in future sessions class InstructionsToggle extends StatefulWidget { const InstructionsToggle({ super.key, 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/utils/overlay.dart b/lib/pangea/utils/overlay.dart index 07eab5133..ce8c63d99 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,14 +76,19 @@ class OverlayUtil { required String transformTargetId, backDropToDismiss = true, Color? borderColor, + bool closePrevOverlay = true, }) { try { final LayerLinkAndKey layerLinkAndKey = MatrixState.pAnyState.layerLinkAndKey(transformTargetId); + if (layerLinkAndKey.key.currentContext == null) { + debugPrint("layerLinkAndKey.key.currentContext is null"); + return; + } final Offset cardOffset = _calculateCardOffset( cardSize: cardSize, - transformTargetKey: layerLinkAndKey.key, + transformTargetContext: layerLinkAndKey.key.currentContext!, ); final Widget child = Material( @@ -101,6 +110,7 @@ class OverlayUtil { offset: cardOffset, backDropToDismiss: backDropToDismiss, borderColor: borderColor, + closePrevOverlay: closePrevOverlay, ); } catch (err, stack) { debugger(when: kDebugMode); @@ -112,16 +122,16 @@ class OverlayUtil { /// identified by [transformTargetKey] static Offset _calculateCardOffset({ required Size cardSize, - required LabeledGlobalKey transformTargetKey, + required BuildContext transformTargetContext, final double minPadding = 10.0, }) { // debugger(when: kDebugMode); //Note: assumes overlay in chatview final OverlayConstraints constraints = - ChatViewConstraints(transformTargetKey.currentContext!); + ChatViewConstraints(transformTargetContext); final RenderObject? targetRenderBox = - transformTargetKey.currentContext!.findRenderObject(); + transformTargetContext.findRenderObject(); if (targetRenderBox == null) return Offset.zero; final Offset transformTargetOffset = (targetRenderBox as RenderBox).localToGlobal(Offset.zero); @@ -176,7 +186,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/utils/report_message.dart b/lib/pangea/utils/report_message.dart index e1dc2d553..2fd218ea9 100644 --- a/lib/pangea/utils/report_message.dart +++ b/lib/pangea/utils/report_message.dart @@ -101,7 +101,7 @@ Future> getReportTeachers( final List otherSpaces = Matrix.of(context) .client - .classesAndExchangesImIn + .spacesImIn .where((space) => !reportRoomParentSpaces.contains(space)) .toList(); diff --git a/lib/pangea/utils/class_code.dart b/lib/pangea/utils/space_code.dart similarity index 81% rename from lib/pangea/utils/class_code.dart rename to lib/pangea/utils/space_code.dart index ca783f755..9b1a44525 100644 --- a/lib/pangea/utils/class_code.dart +++ b/lib/pangea/utils/space_code.dart @@ -6,25 +6,25 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import '../controllers/pangea_controller.dart'; -class ClassCodeUtil { +class SpaceCodeUtil { static const codeLength = 6; - static bool isValidCode(String? classcode) { - return classcode == null || classcode.length > 4; + static bool isValidCode(String? spacecode) { + return spacecode == null || spacecode.length > 4; } - static String generateClassCode() { + static String generateSpaceCode() { final r = Random(); const chars = 'AaBbCcDdEeFfGgHhiJjKkLMmNnoPpQqRrSsTtUuVvWwXxYyZz1234567890'; return List.generate(codeLength, (index) => chars[r.nextInt(chars.length)]) .join(); } - static Future joinWithClassCodeDialog( + static Future joinWithSpaceCodeDialog( BuildContext context, PangeaController pangeaController, ) async { - final List? classCode = await showTextInputDialog( + final List? spaceCode = await showTextInputDialog( context: context, title: L10n.of(context)!.joinWithClassCode, okLabel: L10n.of(context)!.ok, @@ -33,10 +33,10 @@ class ClassCodeUtil { DialogTextField(hintText: L10n.of(context)!.joinWithClassCodeHint), ], ); - if (classCode == null || classCode.single.isEmpty) return; + if (spaceCode == null || spaceCode.single.isEmpty) return; await pangeaController.classController.joinClasswithCode( context, - classCode.first, + spaceCode.first, ); } diff --git a/lib/pangea/widgets/chat/message_buttons.dart b/lib/pangea/widgets/chat/message_buttons.dart new file mode 100644 index 000000000..f7748675f --- /dev/null +++ b/lib/pangea/widgets/chat/message_buttons.dart @@ -0,0 +1,96 @@ +import 'package:fluffychat/pangea/enum/message_mode_enum.dart'; +import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; +import 'package:flutter/material.dart'; + +class MessageButtons extends StatelessWidget { + final ToolbarDisplayController? toolbarController; + + const MessageButtons({ + super.key, + this.toolbarController, + }); + + void showActivity(BuildContext context) { + toolbarController?.showToolbar( + context, + mode: MessageMode.practiceActivity, + ); + } + + @override + Widget build(BuildContext context) { + if (toolbarController == null) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Row( + children: [ + HoverIconButton( + icon: MessageMode.practiceActivity.icon, + onTap: () => showActivity(context), + primaryColor: Theme.of(context).colorScheme.primary, + tooltip: MessageMode.practiceActivity.tooltip(context), + ), + + // Additional buttons can be added here in the future + ], + ), + ); + } +} + +class HoverIconButton extends StatefulWidget { + final IconData icon; + final VoidCallback onTap; + final Color primaryColor; + final String tooltip; + + const HoverIconButton({ + super.key, + required this.icon, + required this.onTap, + required this.primaryColor, + required this.tooltip, + }); + + @override + _HoverIconButtonState createState() => _HoverIconButtonState(); +} + +class _HoverIconButtonState extends State { + bool _isHovered = false; + + @override + Widget build(BuildContext context) { + return Tooltip( + message: widget.tooltip, + child: InkWell( + onTap: widget.onTap, + onHover: (hovering) { + setState(() => _isHovered = hovering); + }, + borderRadius: BorderRadius.circular(100), + child: Container( + decoration: BoxDecoration( + color: _isHovered ? widget.primaryColor : null, + borderRadius: BorderRadius.circular(100), + border: Border.all( + width: 1, + color: widget.primaryColor, + ), + ), + padding: const EdgeInsets.all(2), + child: Icon( + widget.icon, + size: 18, + // when hovered, use themeData to get background color, otherwise use primary + color: _isHovered + ? Theme.of(context).scaffoldBackgroundColor + : widget.primaryColor, + ), + ), + ), + ); + } +} 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 663e39ffe..a26a36658 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'; @@ -35,13 +35,9 @@ class MessageSpeechToTextCardState extends State { STTToken? selectedToken; String? get l1Code => - MatrixState.pangeaController.languageController.activeL1Code( - roomID: widget.messageEvent.room.id, - ); + MatrixState.pangeaController.languageController.activeL1Code(); String? get l2Code => - MatrixState.pangeaController.languageController.activeL2Code( - roomID: widget.messageEvent.room.id, - ); + MatrixState.pangeaController.languageController.activeL2Code(); // look for transcription in message event // if not found, call API to transcribe audio @@ -69,6 +65,13 @@ class MessageSpeechToTextCardState extends State { } } + void closeHint() { + MatrixState.pangeaController.instructions.turnOffInstruction( + InstructionsEnum.speechToText, + ); + setState(() {}); + } + TextSpan _buildTranscriptText(BuildContext context) { final Transcript transcript = speechToTextResponse!.transcript; final List spans = []; @@ -176,7 +179,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, @@ -188,7 +192,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, @@ -197,6 +202,11 @@ class MessageSpeechToTextCardState extends State { ), ], ), + MatrixState.pangeaController.instructions.getInstructionInlineTooltip( + context, + InstructionsEnum.speechToText, + closeHint, + ), ], ); } diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index ba508906b..8d2d66b7d 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -16,6 +16,7 @@ import 'package:fluffychat/pangea/widgets/chat/message_translation_card.dart'; import 'package:fluffychat/pangea/widgets/chat/message_unsubscribed_card.dart'; import 'package:fluffychat/pangea/widgets/chat/overlay_message.dart'; import 'package:fluffychat/pangea/widgets/igc/word_data_card.dart'; +import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_card.dart'; import 'package:fluffychat/pangea/widgets/user_settings/p_language_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/foundation.dart'; @@ -93,65 +94,73 @@ 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.overlay != null) { - overlayId = MatrixState.pAnyState.overlay.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), + closePrevOverlay: + MatrixState.pangeaController.subscriptionController.isSubscribed, + ); - 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 { 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; } } @@ -202,6 +211,12 @@ class MessageToolbarState extends State { return; } + // if there is an uncompleted activity, then show that + // we don't want the user to user the tools to get the answer :P + if (widget.pangeaMessageEvent.hasUncompletedActivity) { + newMode = MessageMode.practiceActivity; + } + if (mounted) { setState(() { currentMode = newMode; @@ -229,6 +244,9 @@ class MessageToolbarState extends State { case MessageMode.definition: showDefinition(); break; + case MessageMode.practiceActivity: + showPracticeActivity(); + break; default: ErrorHandler.logError( e: "Invalid toolbar mode", @@ -286,6 +304,12 @@ class MessageToolbarState extends State { ); } + void showPracticeActivity() { + toolbarContent = PracticeActivityCard( + pangeaMessageEvent: widget.pangeaMessageEvent, + ); + } + void showImage() {} void spellCheck() {} @@ -403,9 +427,11 @@ class MessageToolbarState extends State { message: mode.tooltip(context), child: IconButton( icon: Icon(mode.icon), - color: currentMode == mode - ? Theme.of(context).colorScheme.primary - : null, + color: mode.iconColor( + widget.pangeaMessageEvent, + currentMode, + context, + ), onPressed: () => updateMode(mode), ), ); diff --git a/lib/pangea/widgets/chat/message_translation_card.dart b/lib/pangea/widgets/chat/message_translation_card.dart index b1bae20e5..094f481ec 100644 --- a/lib/pangea/widgets/chat/message_translation_card.dart +++ b/lib/pangea/widgets/chat/message_translation_card.dart @@ -35,9 +35,11 @@ class MessageTranslationCardState extends State { String? translationLangCode() { if (widget.immersionMode) return l1Code; - final String? originalWrittenCode = - widget.messageEvent.originalWritten?.content.langCode; - return l1Code == originalWrittenCode ? l2Code : l1Code; + final String? originalSentCode = + widget.messageEvent.originalSent?.content.langCode; + return (l1Code == originalSentCode || originalSentCode == null) + ? l2Code + : l1Code; } Future fetchRepresentation(BuildContext context) async { @@ -107,12 +109,8 @@ class MessageTranslationCardState extends State { @override void initState() { super.initState(); - l1Code = MatrixState.pangeaController.languageController.activeL1Code( - roomID: widget.messageEvent.room.id, - ); - l2Code = MatrixState.pangeaController.languageController.activeL2Code( - roomID: widget.messageEvent.room.id, - ); + l1Code = MatrixState.pangeaController.languageController.activeL1Code(); + l2Code = MatrixState.pangeaController.languageController.activeL2Code(); if (mounted) { setState(() {}); } 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/class/add_class_and_invite.dart b/lib/pangea/widgets/class/add_class_and_invite.dart deleted file mode 100644 index 45c84c506..000000000 --- a/lib/pangea/widgets/class/add_class_and_invite.dart +++ /dev/null @@ -1,298 +0,0 @@ -import 'dart:developer'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; -import 'package:flutter/foundation.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:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - -import '../../../widgets/matrix.dart'; -import '../../utils/error_handler.dart'; -import '../../utils/firebase_analytics.dart'; - -enum AddToClassMode { exchange, chat } - -class AddToClassAndInviteToggles extends StatefulWidget { - final String? roomId; - final bool startOpen; - final Function? setParentState; - final AddToClassMode mode; - - const AddToClassAndInviteToggles({ - super.key, - this.roomId, - this.startOpen = false, - this.setParentState, - required this.mode, - }); - - @override - AddToClassAndInviteState createState() => AddToClassAndInviteState(); -} - -class AddToClassAndInviteState extends State { - late Room? room; - late List parents; - late List possibleParents; - late bool isOpen; - - AddToClassAndInviteState({Key? key}); - - @override - void initState() { - room = widget.roomId != null - ? Matrix.of(context).client.getRoomById(widget.roomId!) - : null; - - if (room != null && room!.isPangeaClass) { - debugger(when: kDebugMode); - ErrorHandler.logError( - m: "should not be able to add class to space, not yet at least", - ); - context.go('/rooms'); - } - - possibleParents = Matrix.of(context) - .client - .rooms - .where( - widget.mode == AddToClassMode.exchange - ? (Room r) => r.isPangeaClass && widget.roomId != r.id - : (Room r) => - (r.isPangeaClass || r.isExchange) && widget.roomId != r.id, - ) - .toList(); - - parents = widget.roomId != null - ? possibleParents - .where( - (r) => - r.spaceChildren.any((room) => room.roomId == widget.roomId), - ) - .toList() - : []; - - isOpen = widget.startOpen; - - super.initState(); - } - - Future addParents(String roomToAddId) async { - final List> addFutures = []; - for (final Room newParent in parents) { - addFutures.add(_addSingleParent(roomToAddId, newParent)); - } - await addFutures.wait; - } - - Future _addSingleParent(String roomToAddId, Room newParent) async { - GoogleAnalytics.addParent(roomToAddId, newParent.classCode); - final List> existingMembers = await Future.wait([ - room?.requestParticipants() ?? Future.value([]), - newParent.requestParticipants(), - ]); - final List roomMembers = existingMembers[0]; - final List spaceMembers = existingMembers[1]; - - final List> inviteFutures = [ - newParent.setSpaceChild(roomToAddId, suggested: true), - ]; - for (final spaceMember - in spaceMembers.where((element) => element.id != room?.client.userID)) { - if (!roomMembers.any( - (m) => m.id == spaceMember.id && m.membership == Membership.join, - )) { - inviteFutures.add(_inviteSpaceMember(spaceMember)); - } else { - debugPrint('User ${spaceMember.id} is already in the room'); - } - } - await Future.wait(inviteFutures); - return; - } - - //function for kicking single student and haandling error - Future _kickSpaceMember(User spaceMember) async { - try { - await room?.kick(spaceMember.id); - debugPrint('Kicked ${spaceMember.id}'); - } catch (e) { - debugger(when: kDebugMode); - ErrorHandler.logError(e: e); - } - } - - //function for adding single student and haandling error - Future _inviteSpaceMember(User spaceMember) async { - try { - await room?.invite(spaceMember.id); - debugPrint('added ${spaceMember.id}'); - } catch (e) { - debugger(when: kDebugMode); - ErrorHandler.logError(e: e); - } - } - - //remove single class - Future _removeSingleSpaceFromParents( - String roomToRemoveId, - Room spaceToRemove, - ) async { - GoogleAnalytics.removeChatFromClass( - roomToRemoveId, - spaceToRemove.classCode, - ); - - if (room == null) { - ErrorHandler.logError(m: 'Room is null in kickSpaceMembers'); - debugger(when: kDebugMode); - return; - } - final List> roomsMembers = await Future.wait([ - room?.requestParticipants() ?? Future.value([]), - spaceToRemove.requestParticipants(), - ]); - - final List toKick = roomsMembers[1] - .where( - (element) => - element.id != room?.client.userID && - roomsMembers[0].any((m) => m.id == element.id), - ) - .toList(); - - final List> kickFutures = [ - spaceToRemove.removeSpaceChild(roomToRemoveId), - ]; - for (final spaceMember in toKick) { - kickFutures.add(_kickSpaceMember(spaceMember)); - } - await Future.wait(kickFutures); - - // if (widget.setParentState != null) { - // widget.setParentState!(); - // } - await room?.requestParticipants(); - - if (room != null) { - GoogleAnalytics.kickClassFromExchange(room!.id, spaceToRemove.id); - } - return; - } - - // ignore: curly_braces_in_flow_control_structures - Future _handleAdd(bool add, Room possibleParent) async { - //in this case, the room has already been made so we handle adding as it happens - if (room != null) { - await showFutureLoadingDialog( - context: context, - future: () async { - await (add - ? _addSingleParent(room!.id, possibleParent) - : _removeSingleSpaceFromParents(room!.id, possibleParent)); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - add - ? L10n.of(context)!.youAddedToSpace( - room!.name, - possibleParent.name, - ) - : L10n.of(context)!.youRemovedFromSpace( - room!.name, - possibleParent.name, - ), - ), - ), - ); - }, - ); - } - setState( - () => add - ? parents.add(possibleParent) - : parents.removeWhere((r) => r.id == possibleParent.id), - ); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - if (!widget.startOpen) - ListTile( - enableFeedback: !widget.startOpen, - title: Text( - widget.mode == AddToClassMode.exchange - ? L10n.of(context)!.addToClass - : L10n.of(context)!.addToClassOrExchange, - 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.workspaces_outline, - ), - ), - trailing: !widget.startOpen - ? Icon( - isOpen - ? Icons.keyboard_arrow_down_outlined - : Icons.keyboard_arrow_right_outlined, - ) - : null, - onTap: () => setState(() => isOpen = !isOpen), - ), - if (isOpen) - Padding( - padding: const EdgeInsets.fromLTRB(16.0, 0, 16.0, 0), - child: Column( - children: [ - if (possibleParents.isEmpty) - ListTile( - title: Text(L10n.of(context)!.noEligibleSpaces), - ), - ListView.builder( - shrinkWrap: true, - itemCount: possibleParents.length, - itemBuilder: (BuildContext context, int i) { - final bool canIAddSpaceChildren = - possibleParents[i].canIAddSpaceChild(room) && - (room?.canIAddSpaceParents ?? true); - return Column( - children: [ - Opacity( - opacity: canIAddSpaceChildren ? 1 : 0.5, - child: SwitchListTile.adaptive( - title: possibleParents[i].nameAndRoomTypeIcon(), - activeColor: AppConfig.activeToggleColor, - value: parents - .any((r) => r.id == possibleParents[i].id), - onChanged: (bool add) => canIAddSpaceChildren - ? _handleAdd(add, possibleParents[i]) - : ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: - Text(L10n.of(context)!.noPermission), - ), - ), - ), - ), - ], - ); - }, - ), - ], - ), - ), - ], - ); - } -} diff --git a/lib/pangea/widgets/class/add_space_toggles.dart b/lib/pangea/widgets/class/add_space_toggles.dart index c2ed32efe..abbef7746 100644 --- a/lib/pangea/widgets/class/add_space_toggles.dart +++ b/lib/pangea/widgets/class/add_space_toggles.dart @@ -10,21 +10,20 @@ import 'package:matrix/matrix.dart'; import '../../../widgets/matrix.dart'; import '../../utils/firebase_analytics.dart'; -import 'add_class_and_invite.dart'; //PTODO - auto invite students when you add a space and delete the add_class_and_invite.dart file class AddToSpaceToggles extends StatefulWidget { final String? roomId; final bool startOpen; final String? activeSpaceId; - final AddToClassMode mode; + final bool spaceMode; const AddToSpaceToggles({ super.key, this.roomId, this.startOpen = false, this.activeSpaceId, - required this.mode, + this.spaceMode = false, }); @override @@ -42,6 +41,19 @@ class AddToSpaceState extends State { @override void initState() { + initialize(); + super.initState(); + } + + @override + void didUpdateWidget(AddToSpaceToggles oldWidget) { + if (oldWidget.roomId != widget.roomId) { + initialize(); + } + super.didUpdateWidget(oldWidget); + } + + void initialize() { //if roomId is null, it means this widget is being used in the creation flow room = widget.roomId != null ? Matrix.of(context).client.getRoomById(widget.roomId!) @@ -54,10 +66,7 @@ class AddToSpaceState extends State { .client .rooms .where( - widget.mode == AddToClassMode.exchange - ? (Room r) => r.isPangeaClass && widget.roomId != r.id - : (Room r) => - (r.isPangeaClass || r.isExchange) && widget.roomId != r.id, + (Room r) => r.isSpace && widget.roomId != r.id, ) .toList(); @@ -96,7 +105,6 @@ class AddToSpaceState extends State { }); isOpen = widget.startOpen; - super.initState(); } Future _addSingleSpace(String roomToAddId, Room newParent) async { @@ -144,13 +152,10 @@ class AddToSpaceState extends State { Widget getAddToSpaceToggleItem(int index) { final Room possibleParent = possibleParents[index]; - final bool canAdd = (room?.isSpace ?? false) - // Room is space - ? possibleParent.isRoomAdmin && - room!.isRoomAdmin && - possibleParent.canAddAsParentOf(room) - // Room is null or chat - : possibleParent.canAddAsParentOf(room); + final bool canAdd = possibleParent.canAddAsParentOf( + room, + spaceMode: widget.spaceMode, + ); return Opacity( opacity: canAdd ? 1 : 0.5, @@ -189,24 +194,21 @@ class AddToSpaceState extends State { @override Widget build(BuildContext context) { - final String title = widget.mode == AddToClassMode.exchange - ? L10n.of(context)!.addToClass - : L10n.of(context)!.addToClassOrExchange; - final String subtitle = widget.mode == AddToClassMode.exchange - ? L10n.of(context)!.addToClassDesc - : L10n.of(context)!.addToClassOrExchangeDesc; - return Column( children: [ ListTile( title: Text( - title, + L10n.of(context)!.addToSpace, style: TextStyle( color: Theme.of(context).colorScheme.secondary, fontWeight: FontWeight.bold, ), ), - subtitle: Text(subtitle), + subtitle: Text( + widget.spaceMode || (room?.isSpace ?? false) + ? L10n.of(context)!.addSpaceToSpaceDesc + : L10n.of(context)!.addChatToSpaceDesc, + ), leading: CircleAvatar( backgroundColor: Theme.of(context).scaffoldBackgroundColor, foregroundColor: Theme.of(context).textTheme.bodyLarge!.color, @@ -227,13 +229,21 @@ class AddToSpaceState extends State { ? Column( children: [ SwitchListTile.adaptive( - title: Text(L10n.of(context)!.suggestToChat), + title: Text( + widget.spaceMode || (room?.isSpace ?? false) + ? L10n.of(context)!.suggestToSpace + : L10n.of(context)!.suggestToChat, + ), secondary: Icon( isSuggested ? Icons.visibility_outlined : Icons.visibility_off_outlined, ), - subtitle: Text(L10n.of(context)!.suggestToChatDesc), + subtitle: Text( + widget.spaceMode || (room?.isSpace ?? false) + ? L10n.of(context)!.suggestToSpaceDesc + : L10n.of(context)!.suggestToChatDesc, + ), activeColor: AppConfig.activeToggleColor, value: isSuggested, onChanged: (bool add) => setSuggested(add), diff --git a/lib/pangea/widgets/class/invite_students_from_class.dart b/lib/pangea/widgets/class/invite_students_from_class.dart deleted file mode 100644 index 70bafeb7d..000000000 --- a/lib/pangea/widgets/class/invite_students_from_class.dart +++ /dev/null @@ -1,342 +0,0 @@ -// import 'dart:developer'; - -// import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; -// import 'package:flutter/foundation.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'; - -// import '../../../utils/matrix_sdk_extensions/matrix_locals.dart'; -// import '../../../widgets/avatar.dart'; -// import '../../../widgets/matrix.dart'; -// import '../../utils/error_handler.dart'; -// import '../../utils/firebase_analytics.dart'; - -// class InviteStudentsFromClass extends StatefulWidget { -// final String? roomId; -// final bool startOpen; -// final Function setParentState; - -// const InviteStudentsFromClass({ -// Key? key, -// this.roomId, -// this.startOpen = false, -// required this.setParentState, -// }) : super(key: key); - -// @override -// InviteStudentsFromClassState createState() => InviteStudentsFromClassState(); -// } - -// class InviteStudentsFromClassState extends State { -// late Room? room; -// late List otherSpaces; -// late bool isOpen; -// final List invitedSpaces = []; -// final List kickedSpaces = []; - -// InviteStudentsFromClassState({Key? key, cont}); - -// @override -// void initState() { -// room = widget.roomId != null -// ? Matrix.of(context).client.getRoomById(widget.roomId!) -// : null; - -// otherSpaces = Matrix.of(context) -// .client -// .rooms -// .where((r) => r.isPangeaClass && r.id != widget.roomId) -// .toList(); - -// isOpen = widget.startOpen; - -// super.initState(); -// } - -// Future inviteSpaceMembers(BuildContext context, Room spaceToInvite) => -// showFutureLoadingDialog( -// context: context, -// future: () async { -// if (room == null) { -// ErrorHandler.logError(m: 'Room is null in inviteSpaceMembers'); -// debugger(when: kDebugMode); -// return; -// } -// final List> existingMembers = await Future.wait([ -// room!.requestParticipants(), -// spaceToInvite.requestParticipants(), -// ]); -// final List roomMembers = existingMembers[0]; -// final List spaceMembers = existingMembers[1]; -// final List> inviteFutures = []; -// for (final spaceMember in spaceMembers -// .where((element) => element.id != room!.client.userID)) { -// if (!roomMembers.any((m) => -// m.id == spaceMember.id && m.membership == Membership.join)) { -// inviteFutures.add(inviteSpaceMember(spaceMember)); -// //add to invitedSpaces -// invitedSpaces.add(spaceToInvite.id); -// //if in kickedSpaces, remove -// kickedSpaces.remove(spaceToInvite.id); -// } else { -// debugPrint('User ${spaceMember.id} is already in the room'); -// } -// } -// await Future.wait(inviteFutures); -// debugPrint('Invited ${spaceMembers.length} members'); -// GoogleAnalytics.inviteClassToExchange(room!.id, spaceToInvite.id); -// // setState(() { -// // widget.setParentState(); -// // }); -// }, -// onError: handleError, -// ); - -// //function for kicking single student and haandling error -// Future kickSpaceMember(User spaceMember) async { -// try { -// await room!.kick(spaceMember.id); -// debugPrint('Kicked ${spaceMember.id}'); -// } catch (e) { -// debugger(when: kDebugMode); -// ErrorHandler.logError(e: e); -// } -// } - -// //function for adding single student and haandling error -// Future inviteSpaceMember(User spaceMember) async { -// try { -// await room!.invite(spaceMember.id); -// debugPrint('added ${spaceMember.id}'); -// } catch (e) { -// debugger(when: kDebugMode); -// ErrorHandler.logError(e: e); -// } -// } - -// Future kickSpaceMembers(BuildContext context, Room spaceToKick) => -// showFutureLoadingDialog( -// context: context, -// future: () async { -// if (room == null) { -// ErrorHandler.logError(m: 'Room is null in kickSpaceMembers'); -// debugger(when: kDebugMode); -// return; -// } -// final List> existingMembers = await Future.wait([ -// room!.requestParticipants(), -// spaceToKick.requestParticipants(), -// ]); -// final List roomMembers = existingMembers[0]; -// final List spaceMembers = existingMembers[1]; -// final List toKick = spaceMembers -// .where((element) => -// element.id != room!.client.userID && -// roomMembers.any((m) => m.id == element.id)) -// .toList(); -// //add to kickedSpaces -// kickedSpaces.add(spaceToKick.id); -// //if in invitedSpaces, remove from invitedSpaces -// invitedSpaces.remove(spaceToKick.id); -// final List> kickFutures = []; - -// for (final spaceMember in toKick) { -// kickFutures.add(kickSpaceMember(spaceMember)); -// } -// await Future.wait(kickFutures); -// GoogleAnalytics.kickClassFromExchange(room!.id, spaceToKick.id); -// setState(() { -// widget.setParentState(); -// }); -// return; -// }, -// onError: handleError, -// ); - -// String handleError(dynamic exception) { -// ErrorHandler.logError( -// e: exception, m: 'Error inviting or kicking students'); -// ScaffoldMessenger.of(context).showSnackBar( -// SnackBar( -// content: Text(exception.toString()), -// ), -// ); -// return exception.toString(); -// } - -// @override -// Widget build(BuildContext context) { -// if (room == null) return Container(); -// return Column( -// children: [ -// ListTile( -// title: Text( -// L10n.of(context)!.inviteStudentsFromOtherClasses, -// style: TextStyle( -// color: Theme.of(context).colorScheme.secondary, -// fontWeight: FontWeight.bold, -// ), -// ), -// leading: CircleAvatar( -// backgroundColor: Theme.of(context).primaryColor, -// foregroundColor: Colors.white, -// radius: Avatar.defaultSize / 2, -// child: const Icon(Icons.workspaces_outlined), -// ), -// trailing: Icon( -// isOpen -// ? Icons.keyboard_arrow_down_outlined -// : Icons.keyboard_arrow_right_outlined, -// ), -// onTap: () => setState(() => isOpen = !isOpen), -// ), -// if (isOpen) -// Padding( -// padding: const EdgeInsets.fromLTRB(16.0, 0, 16.0, 0), -// child: Column( -// children: [ -// if (otherSpaces.isEmpty) -// ListTile(title: Text(L10n.of(context)!.noEligibleSpaces)), -// ListView.builder( -// shrinkWrap: true, -// itemCount: otherSpaces.length, -// itemBuilder: (BuildContext context, int i) { -// final bool canIAddSpaceChildren = -// otherSpaces[i].canIAddSpaceChild(room); -// return Column( -// children: [ -// Opacity( -// opacity: canIAddSpaceChildren ? 1 : 0.5, -// child: InviteKickClass( -// room: otherSpaces[i], -// inviteCallback: (Room room) => -// inviteSpaceMembers(context, otherSpaces[i]), -// kickCallback: (Room room) => -// kickSpaceMembers(context, otherSpaces[i]), -// controller: this, -// ), -// ), -// ], -// ); -// }, -// ), -// ], -// ), -// ), -// // END: ed8c6549bwf9 -// ], -// ); -// } -// } - -// //listTile with two buttons - one to invite all students in the class and the other to kick them all out -// // parameters -// // 1. Room -// // 2. invite callback -// // 3. kick callback -// // when the user clicks either button, a dialog pops up asking for confirmation -// // after the dialog is confirmed, the callback is executed -// class InviteKickClass extends StatelessWidget { -// final Room room; -// final Function inviteCallback; -// final Function kickCallback; -// final InviteStudentsFromClassState controller; - -// const InviteKickClass({ -// Key? key, -// required this.room, -// required this.inviteCallback, -// required this.kickCallback, -// required this.controller, -// }) : super(key: key); - -// @override -// Widget build(BuildContext context) { -// return ListTile( -// title: Text( -// room.getLocalizedDisplayname( -// MatrixLocals(L10n.of(context)!), -// ), -// ), -// leading: const SizedBox( -// height: Avatar.defaultSize, -// width: Avatar.defaultSize, -// ), -// trailing: Row( -// mainAxisSize: MainAxisSize.min, -// children: [ -// IconButton( -// icon: const Icon(Icons.add), -// isSelected: controller.invitedSpaces.contains(room.id), -// onPressed: () async { -// final bool? result = await showDialog( -// context: context, -// builder: (BuildContext context) => AlertDialog( -// title: Text( -// L10n.of(context)!.inviteAllStudents, -// style: TextStyle( -// color: Theme.of(context).colorScheme.secondary, -// fontWeight: FontWeight.bold, -// ), -// ), -// content: Text( -// L10n.of(context)!.inviteAllStudentsConfirmation, -// ), -// actions: [ -// TextButton( -// onPressed: () => Navigator.of(context).pop(false), -// child: Text(L10n.of(context)!.cancel), -// ), -// TextButton( -// onPressed: () => Navigator.of(context).pop(true), -// child: Text(L10n.of(context)!.ok), -// ), -// ], -// ), -// ); -// if (result != null && result) { -// inviteCallback(room); -// } -// }, -// ), -// IconButton( -// icon: const Icon(Icons.remove), -// isSelected: controller.kickedSpaces.contains(room.id), -// onPressed: () async { -// final bool? result = await showDialog( -// context: context, -// builder: (BuildContext context) => AlertDialog( -// title: Text( -// L10n.of(context)!.kickAllStudents, -// style: TextStyle( -// color: Theme.of(context).colorScheme.secondary, -// fontWeight: FontWeight.bold, -// ), -// ), -// content: Text( -// L10n.of(context)!.kickAllStudentsConfirmation, -// ), -// actions: [ -// TextButton( -// onPressed: () => Navigator.of(context).pop(false), -// child: Text(L10n.of(context)!.cancel), -// ), -// TextButton( -// onPressed: () => Navigator.of(context).pop(true), -// child: Text(L10n.of(context)!.ok), -// ), -// ], -// ), -// ); -// if (result != null && result) { -// kickCallback(room); -// } -// }, -// ), -// ], -// ), -// ); -// } -// } diff --git a/lib/pangea/widgets/common/bot_face_svg.dart b/lib/pangea/widgets/common/bot_face_svg.dart index 718f10c90..f387b4bc3 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 } +enum BotExpression { gold, nonGold, addled, idle, surprised } + +class BotFace extends StatefulWidget { + final double width; + final Color? forceColor; + final BotExpression expression; -class BotFace extends StatelessWidget { const BotFace({ super.key, required this.width, @@ -10,23 +15,80 @@ 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; + StateMachineController? _controller; + + @override + void initState() { + super.initState(); + _loadRiveFile(); + } + + double mapExpressionToInput(BotExpression expression) { + switch (expression) { + case BotExpression.gold: + return 1.0; + case BotExpression.nonGold: + return 2.0; + case BotExpression.surprised: + 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; + _controller = StateMachineController + .fromArtboard(artboard, 'BotIconStateMachine'); + + if (_controller != null) { + artboard.addController(_controller!); + _controller!.setInputValue( + _controller!.stateMachine.inputs[0].id, + 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(), ); } + + @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_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..553de7182 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,75 @@ +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( + print(initialBotOptions.toJson()); + 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 ?? true, + onChanged: (value) { + initialBotOptions.customTriggerReactionEnabled = value ?? true; + 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_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_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..1c78fd030 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'; @@ -20,14 +21,12 @@ class ConversationBotSettings extends StatefulWidget { final Room? room; final bool startOpen; final String? activeSpaceId; - // final ClassSettingsModel? initialSettings; const ConversationBotSettings({ super.key, this.room, this.startOpen = false, this.activeSpaceId, - // this.initialSettings, }); @override @@ -46,7 +45,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; @@ -55,9 +56,6 @@ class ConversationBotSettingsState extends State { parentSpace = widget.activeSpaceId != null ? Matrix.of(context).client.getRoomById(widget.activeSpaceId!) : null; - if (parentSpace != null && botOptions.languageLevel == null) { - botOptions.languageLevel = parentSpace?.classSettings?.languageLevel; - } } Future updateBotOption(void Function() makeLocalChange) async { @@ -141,7 +139,7 @@ class ConversationBotSettingsState extends State { Theme.of(context).textTheme.bodyLarge!.color, child: const BotFace( width: 30.0, - expression: BotExpression.right, + expression: BotExpression.idle, ), ), trailing: ElevatedButton( @@ -226,28 +224,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/lib/pangea/widgets/igc/pangea_rich_text.dart b/lib/pangea/widgets/igc/pangea_rich_text.dart index cee67cafd..abf583b3b 100644 --- a/lib/pangea/widgets/igc/pangea_rich_text.dart +++ b/lib/pangea/widgets/igc/pangea_rich_text.dart @@ -2,12 +2,11 @@ import 'dart:developer'; import 'dart:ui'; import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pangea/constants/language_keys.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'; @@ -58,20 +57,28 @@ class PangeaRichTextState extends State { } void _setTextSpan(String newTextSpan) { - widget.toolbarController?.toolbar?.textSelection.setMessageText( - newTextSpan, - ); - if (mounted) { + try { + if (!mounted) return; // Early exit if the widget is no longer in the tree + + widget.toolbarController?.toolbar?.textSelection.setMessageText( + newTextSpan, + ); setState(() { textSpan = newTextSpan; }); + } catch (error, stackTrace) { + ErrorHandler.logError( + e: PangeaWarningError(error), + s: stackTrace, + m: "Error setting text span in PangeaRichText", + ); } } void setTextSpan() { - if (_fetchingRepresentation == true) { + if (_fetchingRepresentation) { _setTextSpan( - textSpan = widget.pangeaMessageEvent.event + widget.pangeaMessageEvent.event .getDisplayEvent(widget.pangeaMessageEvent.timeline) .body, ); @@ -92,13 +99,17 @@ class PangeaRichTextState extends State { setState(() => _fetchingRepresentation = true); widget.pangeaMessageEvent .representationByLanguageGlobal( - langCode: widget.pangeaMessageEvent.messageDisplayLangCode, - ) - .onError( - (error, stackTrace) => - ErrorHandler.logError(e: error, s: stackTrace), - ) - .then((event) { + langCode: widget.pangeaMessageEvent.messageDisplayLangCode, + ) + .onError((error, stackTrace) { + ErrorHandler.logError( + e: PangeaWarningError(error), + s: stackTrace, + m: "Error fetching representation", + ); + return null; + }).then((event) { + if (!mounted) return; repEvent = event; _setTextSpan(repEvent?.text ?? widget.pangeaMessageEvent.body); }).whenComplete(() { @@ -116,7 +127,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, @@ -191,19 +202,6 @@ class PangeaRichTextState extends State { : richText; } - bool get areLanguagesSet => - userL2LangCode != null && userL2LangCode != LanguageKeys.unknownLanguage; - - String? get userL2LangCode => - pangeaController.languageController.activeL2Code( - roomID: widget.pangeaMessageEvent.room.id, - ); - - String? get userL1LangCode => - pangeaController.languageController.activeL1Code( - roomID: widget.pangeaMessageEvent.room.id, - ); - Future onIgnore() async { debugPrint("PTODO implement onIgnore"); } diff --git a/lib/pangea/widgets/igc/pangea_text_controller.dart b/lib/pangea/widgets/igc/pangea_text_controller.dart index a40e2cc15..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( @@ -100,7 +110,7 @@ class PangeaTextController extends TextEditingController { context: context, cardSize: matchIndex != -1 && choreographer.igc.igcTextData!.matches[matchIndex].isITStart - ? const Size(350, 220) + ? 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 6fa4e17b3..2960d229c 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'; @@ -49,6 +50,8 @@ class SpanCardState extends State { bool fetchingData = false; int? selectedChoiceIndex; + BotExpression currentExpression = BotExpression.nonGold; + //on initState, get SpanDetails @override void initState() { @@ -150,7 +153,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.surprised + ), + ); // if (controller.widget.scm.pangeaMatch.match.choices![index].type == // SpanChoiceType.distractor) { // await controller.getSpanDetails(); @@ -192,10 +211,11 @@ 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 - ? BotExpression.right + ? controller.currentExpression : BotExpression.addled, ), Expanded( @@ -321,6 +341,10 @@ class WordMatchContent extends StatelessWidget { ), ], ), + if (controller.widget.scm.pangeaMatch!.isITStart) + DontShowSwitchListTile( + controller: pangeaController, + ), ], ); } on Exception catch (e) { @@ -459,3 +483,40 @@ class StartITButton extends StatelessWidget { ); } } + +class DontShowSwitchListTile extends StatefulWidget { + final PangeaController controller; + + const DontShowSwitchListTile({ + super.key, + required this.controller, + }); + + @override + DontShowSwitchListTileState createState() => DontShowSwitchListTileState(); +} + +class DontShowSwitchListTileState extends State { + bool switchValue = false; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return SwitchListTile.adaptive( + activeColor: AppConfig.activeToggleColor, + title: Text(L10n.of(context)!.interactiveTranslatorAutoPlaySliderHeader), + value: switchValue, + onChanged: (value) => { + widget.controller.pStoreService.save( + PLocalKey.itAutoPlay.toString(), + value, + ), + setState(() => switchValue = value), + }, + ); + } +} diff --git a/lib/pangea/widgets/igc/word_data_card.dart b/lib/pangea/widgets/igc/word_data_card.dart index 4b8445417..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'; @@ -61,10 +61,8 @@ class WordDataCardController extends State { @override void initState() { if (!mounted) return; - activeL1 = - controller.languageController.activeL1Model(roomID: widget.room.id)!; - activeL2 = - controller.languageController.activeL2Model(roomID: widget.room.id)!; + activeL1 = controller.languageController.activeL1Model()!; + activeL2 = controller.languageController.activeL2Model()!; if (activeL1 == null || activeL2 == null) { wordNetError = noLanguages; definitionError = noLanguages; diff --git a/lib/pangea/widgets/new_group/vocab_list.dart b/lib/pangea/widgets/new_group/vocab_list.dart index e6c2675e4..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)); }, @@ -271,7 +270,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 { @@ -466,7 +465,7 @@ class PromptsFieldState extends State { ElevatedButton.icon( icon: const BotFace( width: 50.0, - expression: BotExpression.right, + expression: BotExpression.idle, ), label: Text(L10n.of(context)!.generatePrompts), onPressed: () async { diff --git a/lib/pangea/widgets/practice_activity/generate_practice_activity.dart b/lib/pangea/widgets/practice_activity/generate_practice_activity.dart new file mode 100644 index 000000000..1eae97d63 --- /dev/null +++ b/lib/pangea/widgets/practice_activity/generate_practice_activity.dart @@ -0,0 +1,61 @@ +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_model.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +class GeneratePracticeActivityButton extends StatelessWidget { + final PangeaMessageEvent pangeaMessageEvent; + final Function(PracticeActivityEvent?) onActivityGenerated; + + const GeneratePracticeActivityButton({ + super.key, + required this.pangeaMessageEvent, + required this.onActivityGenerated, + }); + + //TODO - probably disable the generation of activities for specific messages + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: () async { + final String? l2Code = MatrixState.pangeaController.languageController + .activeL1Model() + ?.langCode; + + if (l2Code == null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.noLanguagesSet), + ), + ); + return; + } + + final PracticeActivityEvent? practiceActivityEvent = await MatrixState + .pangeaController.practiceGenerationController + .getPracticeActivity( + PracticeActivityRequest( + candidateMessages: [ + CandidateMessage( + msgId: pangeaMessageEvent.eventId, + roomId: pangeaMessageEvent.room.id, + text: + pangeaMessageEvent.representationByLanguage(l2Code)?.text ?? + pangeaMessageEvent.body, + ), + ], + userIds: pangeaMessageEvent.room.client.userID != null + ? [pangeaMessageEvent.room.client.userID!] + : null, + ), + pangeaMessageEvent, + ); + + onActivityGenerated(practiceActivityEvent); + }, + child: Text(L10n.of(context)!.practice), + ); + } +} diff --git a/lib/pangea/widgets/practice_activity/multiple_choice_activity.dart b/lib/pangea/widgets/practice_activity/multiple_choice_activity.dart new file mode 100644 index 000000000..54ff5586c --- /dev/null +++ b/lib/pangea/widgets/practice_activity/multiple_choice_activity.dart @@ -0,0 +1,128 @@ +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/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'; + +/// The multiple choice activity view +class MultipleChoiceActivity extends StatefulWidget { + final MessagePracticeActivityCardState controller; + final PracticeActivityEvent? currentActivity; + + const MultipleChoiceActivity({ + super.key, + required this.controller, + required this.currentActivity, + }); + + @override + MultipleChoiceActivityState createState() => MultipleChoiceActivityState(); +} + +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!.text!); + } + setState(() {}); + } + + void updateChoice(int index) { + currentRecordModel?.addResponse( + text: widget.controller.currentActivity!.practiceActivity.multipleChoice! + .choices[index], + score: widget.controller.currentActivity!.practiceActivity.multipleChoice! + .isCorrect(index) + ? 1 + : 0, + ); + setState(() => selectedChoiceIndex = index); + } + + @override + Widget build(BuildContext context) { + final PracticeActivityModel? practiceActivity = + widget.currentActivity?.practiceActivity; + + if (practiceActivity == null) { + return const SizedBox(); + } + + return Container( + padding: const EdgeInsets.all(8), + child: Column( + children: [ + Text( + practiceActivity.multipleChoice!.question, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 8), + ChoicesArray( + isLoading: false, + uniqueKeyForLayerLink: (index) => "multiple_choice_$index", + originalSpan: "placeholder", + onPressed: updateChoice, + selectedChoiceIndex: selectedChoiceIndex, + choices: practiceActivity.multipleChoice!.choices + .mapIndexed( + (index, value) => Choice( + text: value, + color: selectedChoiceIndex == index + ? practiceActivity.multipleChoice!.choiceColor(index) + : null, + isGold: practiceActivity.multipleChoice!.isCorrect(index), + ), + ) + .toList(), + isActive: !isSubmitted, + ), + ], + ), + ); + } +} diff --git a/lib/pangea/widgets/practice_activity/practice_activity_card.dart b/lib/pangea/widgets/practice_activity/practice_activity_card.dart new file mode 100644 index 000000000..5d0b81662 --- /dev/null +++ b/lib/pangea/widgets/practice_activity/practice_activity_card.dart @@ -0,0 +1,172 @@ +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_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/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'; +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; + + const PracticeActivityCard({ + super.key, + required this.pangeaMessageEvent, + }); + + @override + MessagePracticeActivityCardState createState() => + MessagePracticeActivityCardState(); +} + +class MessagePracticeActivityCardState extends State { + PracticeActivityEvent? currentActivity; + PracticeActivityRecordModel? currentRecordModel; + bool sending = false; + + List get practiceActivities => + widget.pangeaMessageEvent.practiceActivities; + + int get practiceEventIndex => practiceActivities.indexWhere( + (activity) => activity.event.eventId == currentActivity?.event.eventId, + ); + + bool get isPrevEnabled => + practiceEventIndex > 0 && + practiceActivities.length > (practiceEventIndex - 1); + + bool get isNextEnabled => + practiceEventIndex >= 0 && + practiceEventIndex < practiceActivities.length - 1; + + @override + void initState() { + super.initState(); + setCurrentActivity(); + } + + /// 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; + final List incompleteActivities = + practiceActivities.where((element) => !element.isComplete).toList(); + currentActivity ??= incompleteActivities.isNotEmpty + ? incompleteActivities.first + : practiceActivities.first; + setState(() {}); + } + + 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); + if (enableNavigation) { + 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 (currentRecordModel == null || currentActivity == null) return; + setState(() => sending = true); + MatrixState.pangeaController.activityRecordController + .send(currentRecordModel!, currentActivity!) + .catchError((error) { + ErrorHandler.logError( + e: error, + s: StackTrace.current, + data: { + 'recordModel': currentRecordModel?.toJson(), + 'practiceEvent': currentActivity?.event.toJson(), + }, + ); + return null; + }).whenComplete(() => setState(() => sending = false)); + } + + @override + Widget build(BuildContext context) { + final Widget navigationButtons = Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Opacity( + opacity: isPrevEnabled ? 1.0 : 0, + child: IconButton( + onPressed: + isPrevEnabled ? () => navigateActivities(Direction.b) : null, + icon: const Icon(Icons.keyboard_arrow_left_outlined), + tooltip: L10n.of(context)!.previous, + ), + ), + Expanded( + child: Opacity( + opacity: currentActivity?.userRecord == null ? 1.0 : 0.5, + child: sending + ? const CircularProgressIndicator.adaptive() + : TextButton( + onPressed: + currentActivity?.userRecord == 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.f) : null, + icon: const Icon(Icons.keyboard_arrow_right_outlined), + tooltip: L10n.of(context)!.next, + ), + ), + ], + ); + + if (currentActivity == null || practiceActivities.isEmpty) { + return Text( + L10n.of(context)!.noActivitiesFound, + style: BotStyle.text(context), + ); + // return GeneratePracticeActivityButton( + // pangeaMessageEvent: widget.pangeaMessageEvent, + // onActivityGenerated: updatePracticeActivity, + // ); + } + return Column( + children: [ + PracticeActivity( + practiceEvent: currentActivity!, + 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 new file mode 100644 index 000000000..6de31829c --- /dev/null +++ b/lib/pangea/widgets/practice_activity/practice_activity_content.dart @@ -0,0 +1,44 @@ +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.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 MessagePracticeActivityCardState controller; + + const PracticeActivity({ + super.key, + required this.practiceEvent, + required this.controller, + }); + + @override + PracticeActivityContentState createState() => PracticeActivityContentState(); +} + +class PracticeActivityContentState extends State { + Widget get activityWidget { + switch (widget.practiceEvent.practiceActivity.activityType) { + case ActivityTypeEnum.multipleChoice: + return MultipleChoiceActivity( + controller: widget.controller, + currentActivity: widget.practiceEvent, + ); + default: + return const SizedBox.shrink(); + } + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + activityWidget, + const SizedBox(height: 8), + ], + ); + } +} diff --git a/lib/pangea/widgets/space/class_settings.dart b/lib/pangea/widgets/space/class_settings.dart deleted file mode 100644 index c9743befd..000000000 --- a/lib/pangea/widgets/space/class_settings.dart +++ /dev/null @@ -1,183 +0,0 @@ -import 'dart:developer'; - -import 'package:fluffychat/pangea/models/class_model.dart'; -import 'package:fluffychat/pangea/widgets/space/language_level_dropdown.dart'; -import 'package:flutter/foundation.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'; - -import '../../../widgets/matrix.dart'; -import '../../constants/language_keys.dart'; -import '../../constants/pangea_event_types.dart'; -import '../../controllers/language_list_controller.dart'; -import '../../controllers/pangea_controller.dart'; -import '../../extensions/pangea_room_extension/pangea_room_extension.dart'; -import '../../models/language_model.dart'; -import '../../utils/error_handler.dart'; -import '../user_settings/p_language_dropdown.dart'; -import '../user_settings/p_question_container.dart'; - -class ClassSettings extends StatefulWidget { - final String? roomId; - final bool startOpen; - final ClassSettingsModel? initialSettings; - - const ClassSettings({ - super.key, - this.roomId, - this.startOpen = false, - this.initialSettings, - }); - - @override - ClassSettingsState createState() => ClassSettingsState(); -} - -class ClassSettingsState extends State { - Room? room; - late ClassSettingsModel classSettings; - late bool isOpen; - final PangeaController pangeaController = MatrixState.pangeaController; - - final cityController = TextEditingController(); - final countryController = TextEditingController(); - final schoolController = TextEditingController(); - - ClassSettingsState({Key? key}); - - @override - void initState() { - room = widget.roomId != null - ? Matrix.of(context).client.getRoomById(widget.roomId!) - : null; - - classSettings = - room?.classSettings ?? widget.initialSettings ?? ClassSettingsModel(); - - isOpen = widget.startOpen; - - super.initState(); - } - - bool get sameLanguages => - classSettings.targetLanguage == classSettings.dominantLanguage; - - LanguageModel getLanguage({required bool isBase, required String? langCode}) { - final LanguageModel backup = isBase - ? pangeaController.pLanguageStore.baseOptions.first - : pangeaController.pLanguageStore.targetOptions.first; - if (langCode == null) return backup; - final LanguageModel byCode = PangeaLanguage.byLangCode(langCode); - return byCode.langCode != LanguageKeys.unknownLanguage ? byCode : backup; - } - - Future updatePermission(void Function() makeLocalRuleChange) async { - makeLocalRuleChange(); - if (room != null) { - await showFutureLoadingDialog( - context: context, - future: () => setClassSettings(room!.id), - ); - } - setState(() {}); - } - - void setTextControllerValues() { - classSettings.city = cityController.text; - classSettings.country = countryController.text; - classSettings.schoolName = schoolController.text; - } - - Future setClassSettings(String roomId) async { - try { - setTextControllerValues(); - - await Matrix.of(context).client.setRoomStateWithKey( - roomId, - PangeaEventTypes.classSettings, - '', - classSettings.toJson(), - ); - } catch (err, stack) { - debugger(when: kDebugMode); - ErrorHandler.logError(e: err, s: stack); - } - } - - @override - Widget build(BuildContext context) => Column( - children: [ - ListTile( - title: Text( - L10n.of(context)!.classSettings, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), - subtitle: Text(L10n.of(context)!.classSettingsDesc), - leading: CircleAvatar( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - foregroundColor: Theme.of(context).textTheme.bodyLarge!.color, - child: const Icon(Icons.language), - ), - trailing: Icon( - isOpen - ? Icons.keyboard_arrow_down_outlined - : Icons.keyboard_arrow_right_outlined, - ), - onTap: () => setState(() => isOpen = !isOpen), - ), - if (isOpen) - AnimatedContainer( - duration: const Duration(milliseconds: 300), - height: isOpen ? null : 0, - child: Padding( - padding: const EdgeInsets.fromLTRB(16.0, 0, 16.0, 8.0), - child: Column( - children: [ - PQuestionContainer( - title: L10n.of(context)!.selectClassRoomDominantLanguage, - ), - PLanguageDropdown( - onChange: (p0) => updatePermission(() { - classSettings.dominantLanguage = p0.langCode; - }), - initialLanguage: getLanguage( - isBase: true, - langCode: classSettings.dominantLanguage, - ), - languages: pangeaController.pLanguageStore.baseOptions, - showMultilingual: true, - ), - PQuestionContainer( - title: L10n.of(context)!.selectTargetLanguage, - ), - PLanguageDropdown( - onChange: (p0) => updatePermission(() { - classSettings.targetLanguage = p0.langCode; - }), - initialLanguage: getLanguage( - isBase: false, - langCode: classSettings.targetLanguage, - ), - languages: pangeaController.pLanguageStore.targetOptions, - ), - PQuestionContainer( - title: L10n.of(context)!.whatIsYourClassLanguageLevel, - ), - LanguageLevelDropdown( - initialLevel: classSettings.languageLevel, - onChanged: (int? newValue) => updatePermission(() { - classSettings.languageLevel = newValue!; - }), - ), - ], - ), - ), - ), - ], - ); -} 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/space/language_settings.dart b/lib/pangea/widgets/space/language_settings.dart new file mode 100644 index 000000000..97af7b34d --- /dev/null +++ b/lib/pangea/widgets/space/language_settings.dart @@ -0,0 +1,184 @@ +// import 'dart:developer'; + +// import 'package:fluffychat/pangea/models/space_model.dart'; +// import 'package:fluffychat/pangea/widgets/space/language_level_dropdown.dart'; +// import 'package:flutter/foundation.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'; + +// import '../../../widgets/matrix.dart'; +// import '../../constants/language_keys.dart'; +// import '../../constants/pangea_event_types.dart'; +// import '../../controllers/language_list_controller.dart'; +// import '../../controllers/pangea_controller.dart'; +// import '../../extensions/pangea_room_extension/pangea_room_extension.dart'; +// import '../../models/language_model.dart'; +// import '../../utils/error_handler.dart'; +// import '../user_settings/p_language_dropdown.dart'; +// import '../user_settings/p_question_container.dart'; + +// class LanguageSettings extends StatefulWidget { +// final String? roomId; +// final bool startOpen; +// final LanguageSettingsModel? initialSettings; + +// const LanguageSettings({ +// super.key, +// this.roomId, +// this.startOpen = false, +// this.initialSettings, +// }); + +// @override +// LanguageSettingsState createState() => LanguageSettingsState(); +// } + +// class LanguageSettingsState extends State { +// Room? room; +// late LanguageSettingsModel languageSettings; +// late bool isOpen; +// final PangeaController pangeaController = MatrixState.pangeaController; + +// final cityController = TextEditingController(); +// final countryController = TextEditingController(); +// final schoolController = TextEditingController(); + +// LanguageSettingsState({Key? key}); + +// @override +// void initState() { +// room = widget.roomId != null +// ? Matrix.of(context).client.getRoomById(widget.roomId!) +// : null; + +// languageSettings = room?.languageSettings ?? +// widget.initialSettings ?? +// LanguageSettingsModel(); + +// isOpen = widget.startOpen; + +// super.initState(); +// } + +// bool get sameLanguages => +// languageSettings.targetLanguage == languageSettings.dominantLanguage; + +// LanguageModel getLanguage({required bool isBase, required String? langCode}) { +// final LanguageModel backup = isBase +// ? pangeaController.pLanguageStore.baseOptions.first +// : pangeaController.pLanguageStore.targetOptions.first; +// if (langCode == null) return backup; +// final LanguageModel byCode = PangeaLanguage.byLangCode(langCode); +// return byCode.langCode != LanguageKeys.unknownLanguage ? byCode : backup; +// } + +// Future updatePermission(void Function() makeLocalRuleChange) async { +// makeLocalRuleChange(); +// if (room != null) { +// await showFutureLoadingDialog( +// context: context, +// future: () => setLanguageSettings(room!.id), +// ); +// } +// setState(() {}); +// } + +// void setTextControllerValues() { +// languageSettings.city = cityController.text; +// languageSettings.country = countryController.text; +// languageSettings.schoolName = schoolController.text; +// } + +// Future setLanguageSettings(String roomId) async { +// try { +// setTextControllerValues(); + +// await Matrix.of(context).client.setRoomStateWithKey( +// roomId, +// PangeaEventTypes.languageSettings, +// '', +// languageSettings.toJson(), +// ); +// } catch (err, stack) { +// debugger(when: kDebugMode); +// ErrorHandler.logError(e: err, s: stack); +// } +// } + +// @override +// Widget build(BuildContext context) => Column( +// children: [ +// ListTile( +// title: Text( +// L10n.of(context)!.languageSettings, +// style: TextStyle( +// color: Theme.of(context).colorScheme.secondary, +// fontWeight: FontWeight.bold, +// ), +// ), +// subtitle: Text(L10n.of(context)!.languageSettingsDesc), +// leading: CircleAvatar( +// backgroundColor: Theme.of(context).scaffoldBackgroundColor, +// foregroundColor: Theme.of(context).textTheme.bodyLarge!.color, +// child: const Icon(Icons.language), +// ), +// trailing: Icon( +// isOpen +// ? Icons.keyboard_arrow_down_outlined +// : Icons.keyboard_arrow_right_outlined, +// ), +// onTap: () => setState(() => isOpen = !isOpen), +// ), +// if (isOpen) +// AnimatedContainer( +// duration: const Duration(milliseconds: 300), +// height: isOpen ? null : 0, +// child: Padding( +// padding: const EdgeInsets.fromLTRB(16.0, 0, 16.0, 8.0), +// child: Column( +// children: [ +// PQuestionContainer( +// title: L10n.of(context)!.selectSpaceDominantLanguage, +// ), +// PLanguageDropdown( +// onChange: (p0) => updatePermission(() { +// languageSettings.dominantLanguage = p0.langCode; +// }), +// initialLanguage: getLanguage( +// isBase: true, +// langCode: languageSettings.dominantLanguage, +// ), +// languages: pangeaController.pLanguageStore.baseOptions, +// showMultilingual: true, +// ), +// PQuestionContainer( +// title: L10n.of(context)!.selectSpaceTargetLanguage, +// ), +// PLanguageDropdown( +// onChange: (p0) => updatePermission(() { +// languageSettings.targetLanguage = p0.langCode; +// }), +// initialLanguage: getLanguage( +// isBase: false, +// langCode: languageSettings.targetLanguage, +// ), +// languages: pangeaController.pLanguageStore.targetOptions, +// ), +// PQuestionContainer( +// title: L10n.of(context)!.whatIsYourSpaceLanguageLevel, +// ), +// LanguageLevelDropdown( +// initialLevel: languageSettings.languageLevel, +// onChanged: (int? newValue) => updatePermission(() { +// languageSettings.languageLevel = newValue!; +// }), +// ), +// ], +// ), +// ), +// ), +// ], +// ); +// } 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), ), diff --git a/lib/pangea/widgets/user_settings/p_language_dialog.dart b/lib/pangea/widgets/user_settings/p_language_dialog.dart index 4d09b506e..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'; @@ -98,7 +98,6 @@ pLanguageDialog(BuildContext parentContext, Function callback) async { Navigator.pop(context); } catch (err, s) { debugger(when: kDebugMode); - //PTODO-Lala add standard error message ErrorHandler.logError(e: err, s: s); rethrow; } finally { 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'; diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 1422c0dc1..1d5e1fe66 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -111,7 +111,7 @@ abstract class ClientManager { // To make room emotes work 'im.ponies.room_emotes', // #Pangea - PangeaEventTypes.classSettings, + PangeaEventTypes.languageSettings, PangeaEventTypes.rules, PangeaEventTypes.botOptions, EventTypes.RoomTopic, diff --git a/lib/widgets/chat_settings_popup_menu.dart b/lib/widgets/chat_settings_popup_menu.dart index e9bcf6bd8..bd4cf0a66 100644 --- a/lib/widgets/chat_settings_popup_menu.dart +++ b/lib/widgets/chat_settings_popup_menu.dart @@ -1,9 +1,7 @@ import 'dart:async'; import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; -import 'package:fluffychat/pangea/models/class_model.dart'; import 'package:fluffychat/pangea/utils/download_chat.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -49,13 +47,6 @@ class ChatSettingsPopupMenuState extends State { @override Widget build(BuildContext context) { - // #Pangea - final PangeaController pangeaController = MatrixState.pangeaController; - final ClassSettingsModel? classSettings = pangeaController - .matrixState.client - .getRoomById(widget.room.id) - ?.firstLanguageSettings; - // Pangea# notificationChangeSub ??= Matrix.of(context) .client .onSync @@ -151,7 +142,6 @@ class ChatSettingsPopupMenuState extends State { context: context, future: () => downloadChat( widget.room, - classSettings!, DownloadType.txt, Matrix.of(context).client, context, @@ -163,7 +153,6 @@ class ChatSettingsPopupMenuState extends State { context: context, future: () => downloadChat( widget.room, - classSettings!, DownloadType.csv, Matrix.of(context).client, context, @@ -175,7 +164,6 @@ class ChatSettingsPopupMenuState extends State { context: context, future: () => downloadChat( widget.room, - classSettings!, DownloadType.xlsx, Matrix.of(context).client, context, @@ -189,6 +177,17 @@ class ChatSettingsPopupMenuState extends State { } }, itemBuilder: (BuildContext context) => [ + if (widget.displayChatDetails) + PopupMenuItem( + value: ChatPopupMenuActions.details, + child: Row( + children: [ + const Icon(Icons.info_outline_rounded), + const SizedBox(width: 12), + Text(L10n.of(context)!.chatDetails), + ], + ), + ), // #Pangea PopupMenuItem( value: ChatPopupMenuActions.learningSettings, @@ -201,17 +200,6 @@ class ChatSettingsPopupMenuState extends State { ), ), // Pangea# - if (widget.displayChatDetails) - PopupMenuItem( - value: ChatPopupMenuActions.details, - child: Row( - children: [ - const Icon(Icons.info_outline_rounded), - const SizedBox(width: 12), - Text(L10n.of(context)!.chatDetails), - ], - ), - ), if (widget.room.pushRuleState == PushRuleState.notify) PopupMenuItem( value: ChatPopupMenuActions.mute, @@ -270,39 +258,36 @@ class ChatSettingsPopupMenuState extends State { ], ), ), - if (classSettings != null) - PopupMenuItem( - value: ChatPopupMenuActions.downloadTxt, - child: Row( - children: [ - const Icon(Icons.download_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.downloadTxtFile), - ], - ), + PopupMenuItem( + value: ChatPopupMenuActions.downloadTxt, + child: Row( + children: [ + const Icon(Icons.download_outlined), + const SizedBox(width: 12), + Text(L10n.of(context)!.downloadTxtFile), + ], ), - if (classSettings != null) - PopupMenuItem( - value: ChatPopupMenuActions.downloadCsv, - child: Row( - children: [ - const Icon(Icons.download_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.downloadCSVFile), - ], - ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.downloadCsv, + child: Row( + children: [ + const Icon(Icons.download_outlined), + const SizedBox(width: 12), + Text(L10n.of(context)!.downloadCSVFile), + ], ), - if (classSettings != null) - PopupMenuItem( - value: ChatPopupMenuActions.downloadXlsx, - child: Row( - children: [ - const Icon(Icons.download_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.downloadXLSXFile), - ], - ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.downloadXlsx, + child: Row( + children: [ + const Icon(Icons.download_outlined), + const SizedBox(width: 12), + Text(L10n.of(context)!.downloadXLSXFile), + ], ), + ), // Pangea# ], ), diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 09c588b29..47b695fb9 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -29,6 +29,7 @@ import pasteboard import path_provider_foundation import purchases_flutter import record_darwin +import rive_common import sentry_flutter import share_plus import shared_preferences_foundation @@ -65,6 +66,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PurchasesFlutterPlugin.register(with: registry.registrar(forPlugin: "PurchasesFlutterPlugin")) RecordPlugin.register(with: registry.registrar(forPlugin: "RecordPlugin")) + RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin")) SentryFlutterPlugin.register(with: registry.registrar(forPlugin: "SentryFlutterPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) diff --git a/needed-translations.txt b/needed-translations.txt deleted file mode 100644 index b0ada0925..000000000 --- a/needed-translations.txt +++ /dev/null @@ -1,54821 +0,0 @@ -{ - "ar": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "ca": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "cs": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "de": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "es": [ - "appLockDescription", - "swipeRightToLeftToReply", - "globalChatId", - "accessAndVisibility", - "accessAndVisibilityDescription", - "calls", - "customEmojisAndStickers", - "customEmojisAndStickersBody", - "hideRedactedMessages", - "hideRedactedMessagesBody", - "hideInvalidOrUnknownMessageFormats", - "hideMemberChangesInPublicChats", - "hideMemberChangesInPublicChatsBody", - "overview", - "notifyMeFor", - "passwordRecoverySettings", - "usersMustKnock", - "userWouldLikeToChangeTheChat", - "noPublicLinkHasBeenCreatedYet", - "knock", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "publicChatAddresses", - "createNewAddress", - "userRole", - "minimumPowerLevel", - "searchIn", - "searchMore", - "gallery", - "files", - "addConversationBotDialogTitleInvite", - "addConversationBotButtonInvite", - "addConversationBotDialogInviteConfirmation", - "addConversationBotButtonTitleRemove", - "addConversationBotButtonRemove", - "addConversationBotDialogRemoveConfirmation", - "addSpaceToSpaceDescription", - "noDatabaseEncryption", - "thereAreCountUsersBlocked", - "restricted", - "knockRestricted", - "nonexistentSelection", - "cantAddSpaceChild", - "roomAddedToSpace" - ], - - "et": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "eu": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "fa": [ - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "fi": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "fil": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "fr": [ - "exportEmotePack", - "replace", - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "gl": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "hr": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "hu": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "id": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "it": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "ja": [ - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "supposedMxid", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_cuddle", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "ka": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "badServerVersionsException", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "ko": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "lt": [ - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "commandHint_googly", - "commandHint_cuddle", - "commandHint_hug", - "googlyEyesContent", - "cuddleContent", - "hugContent", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "lv": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "nl": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "pl": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "pt_BR": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "ro": [ - "notAnImage", - "importNow", - "importEmojis", - "importFromZipFile", - "exportEmotePack", - "replace", - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "sendTypingNotifications", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "ru": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_clearcache", - "commandHint_create", - "commandHint_discardsession", - "commandHint_dm", - "commandHint_myroomavatar", - "commandInvalid", - "commandMissing", - "createGroup", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "sv": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "tr": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "uk": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "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", - "classes", - "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", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "yourGlobalUserIdIs", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "zh": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "swipeRightToLeftToReply", - "classes", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ], - - "zh_Hant": [ - "accountInformation", - "addGroupDescription", - "addNewFriend", - "alreadyHaveAnAccount", - "appLockDescription", - "swipeRightToLeftToReply", - "classes", - "commandHint_markasdm", - "commandHint_markasgroup", - "commandHint_html", - "commandHint_me", - "commandHint_op", - "commandHint_plain", - "commandHint_react", - "commandHint_send", - "createGroup", - "createNewSpace", - "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", - "multiLingualClass", - "classAnalytics", - "allClasses", - "myLearning", - "allChatsAndClasses", - "timeOfLastMessage", - "totalMessages", - "waTooltip", - "changeDateRange", - "numberOfStudents", - "classDescription", - "classDescriptionDesc", - "requestToEnroll", - "requestAnExchange", - "findLanguageExchange", - "classAnalyticsDesc", - "addStudents", - "copyClassLink", - "copyClassLinkDesc", - "copyClassCode", - "inviteStudentByUserName", - "classSettings", - "classSettingsDesc", - "selectClassRoomDominantLanguage", - "selectTargetLanguage", - "whatIsYourClassLanguageLevel", - "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", - "classExchanges", - "createNewClass", - "newExchange", - "kickAllStudents", - "kickAllStudentsConfirmation", - "inviteAllStudents", - "inviteAllStudentsConfirmation", - "inviteStudentsFromOtherClasses", - "inviteUsersFromPangea", - "allExchanges", - "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", - "addToClass", - "addToClassDesc", - "addToClassOrExchange", - "addToClassOrExchangeDesc", - "invitedToClassOrExchange", - "declinedInvitation", - "acceptedInvitation", - "youreInvited", - "studentPermissionsDesc", - "noEligibleSpaces", - "youAddedToSpace", - "youRemovedFromSpace", - "invitedToChat", - "monthlySubscription", - "yearlySubscription", - "defaultSubscription", - "freeTrial", - "grammarAnalytics", - "total", - "noDataFound", - "promoSubscriptionExpirationDesc", - "emptyChatNameWarning", - "emptyClassNameWarning", - "emptyExchangeNameWarning", - "blurMeansTranslateTitle", - "blurMeansTranslateBody", - "someErrorTitle", - "someErrorBody", - "bestCorrectionFeedback", - "distractorFeedback", - "bestAnswerFeedback", - "definitionDefaultPrompt", - "practiceDefaultPrompt", - "correctionDefaultPrompt", - "itStartDefaultPrompt", - "languageLevelWarning", - "lockedChatWarning", - "lockSpace", - "lockChat", - "archiveSpace", - "suggestToChat", - "suggestToChatDesc", - "acceptSelection", - "acceptSelectionAnyway", - "makingActivity", - "why", - "definition", - "exampleSentence", - "addToClassTitle", - "reportToTeacher", - "reportMessageTitle", - "reportMessageBody", - "noTeachersFound", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", - "removeDevicesDescription", - "banUserDescription", - "unbanUserDescription", - "kickUserDescription", - "makeAdminDescription", - "pushNotificationsNotAvailable", - "learnMore", - "yourGlobalUserIdIs", - "noUsersFoundWithQuery", - "knocking", - "chatCanBeDiscoveredViaSearchOnServer", - "searchChatsRooms", - "createClass", - "createExchange", - "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", - "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", - "versionNotFound", - "fetchingVersion", - "versionFetchError", - "versionText" - ] -} 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 7cb52b3f8..f1facd835 100644 Binary files a/pangea_packages/fcm_shared_isolate/android/.gradle/6.7.1/fileHashes/fileHashes.lock and b/pangea_packages/fcm_shared_isolate/android/.gradle/6.7.1/fileHashes/fileHashes.lock differ 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 487a88833..ea7da199a 100644 Binary files a/pangea_packages/fcm_shared_isolate/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/pangea_packages/fcm_shared_isolate/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ 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 b99989c33..a148f5b0e 100644 Binary files a/pangea_packages/fcm_shared_isolate/android/.gradle/checksums/checksums.lock and b/pangea_packages/fcm_shared_isolate/android/.gradle/checksums/checksums.lock differ diff --git a/pangea_packages/fcm_shared_isolate/pubspec.lock b/pangea_packages/fcm_shared_isolate/pubspec.lock index e18c1dba1..7f3457dbe 100644 --- a/pangea_packages/fcm_shared_isolate/pubspec.lock +++ b/pangea_packages/fcm_shared_isolate/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "3ff770dfff04a67b0863dff205a0936784de1b87a5e99b11c693fc10e66a9ce3" + sha256: "0816f12bbbd9e21f72ea8592b11bce4a628d4e5cb7a81ff9f1eee4f3dc23206e" url: "https://pub.dev" source: hosted - version: "1.0.12" + version: "1.3.37" async: dependency: transitive description: @@ -61,50 +61,50 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: c129209ba55f3d4272c89fb4a4994c15bea77fb6de63a82d45fb6bc5c94e4355 + sha256: fae4ab4317c2a7afb13d44ef1e3f9f28a630e10016bc5cfe761e8e6a0ed7816a url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "3.1.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: "5fab93f5b354648efa62e7cc829c90efb68c8796eecf87e0888cae2d5f3accd4" + sha256: "1003a5a03a61fc9a22ef49f37cbcb9e46c86313a7b2e7029b9390cf8c6fc32cb" url: "https://pub.dev" source: hosted - version: "4.5.2" + version: "5.1.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "18b35ce111b0a4266abf723c825bcf9d4e2519d13638cc7f06f2a8dd960c75bc" + sha256: "6643fe3dbd021e6ccfb751f7882b39df355708afbdeb4130fc50f9305a9d1a3d" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.17.2" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: dc010a6436333029fba858415fe65887c3fe44d8f6e6ea162bb8d3dd764fbcb6 + sha256: "2d0ea2234ce46030eda2e6922611115ce603adc614ebd8c00e7db06a8929efbb" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "15.0.1" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: abda2d766486096eb1c568c7b20aef46180596c8b0708190b929133ff03e0a8d + sha256: c38c27f58cb6a88b8c145018d0567802376549c32a60098a13f3bdf3ddea326f url: "https://pub.dev" source: hosted - version: "4.2.10" + version: "4.5.39" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "7a0ce957bd2210e8636325152234728874dad039f1c7271ba1be5c752fdc5888" + sha256: "8502849c2f232f7db338c052e045442207a0db82bd03ff14be3c80897dd8c26c" url: "https://pub.dev" source: hosted - version: "3.2.11" + version: "3.8.9" flutter: dependency: "direct main" description: flutter @@ -120,46 +120,70 @@ packages: description: flutter source: sdk version: "0.0.0" - js: + leak_tracker: dependency: transitive description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" matcher: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" + version: "1.12.0" path: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" + version: "1.9.0" pedantic: dependency: "direct dev" description: @@ -225,10 +249,12 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" + version: "0.7.0" vector_math: dependency: transitive description: @@ -237,14 +263,24 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + url: "https://pub.dev" + source: hosted + version: "14.2.1" web: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.5.1" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" - flutter: ">=1.20.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/pangea_packages/fcm_shared_isolate/pubspec.yaml b/pangea_packages/fcm_shared_isolate/pubspec.yaml index d43abe16c..eda937d30 100644 --- a/pangea_packages/fcm_shared_isolate/pubspec.yaml +++ b/pangea_packages/fcm_shared_isolate/pubspec.yaml @@ -10,8 +10,8 @@ environment: flutter: ">=1.20.0" dependencies: - firebase_core: ^2.4.1 - firebase_messaging: ^14.2.1 + firebase_core: ^3.1.0 + firebase_messaging: ^15.0.1 flutter: sdk: flutter diff --git a/pubspec.lock b/pubspec.lock index f64f9e0fa..7a4059d66 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "3dee3db3468c5f4640a4e8aa9c1e22561c298976d8c39ed2fdd456a9a3db26e1" + sha256: "0816f12bbbd9e21f72ea8592b11bce4a628d4e5cb7a81ff9f1eee4f3dc23206e" url: "https://pub.dev" source: hosted - version: "1.3.32" + version: "1.3.37" adaptive_dialog: dependency: "direct main" description: @@ -460,74 +460,74 @@ packages: dependency: "direct main" description: name: firebase_analytics - sha256: c56bcc7abc6caacc33e8495bc604a5861d25ce371f1b06476ae226e7cbb21d4c + sha256: "3363045ecc3141673262493eea4bd888c2c627c5e986b8766fa5f4bfafdbcdd8" url: "https://pub.dev" source: hosted - version: "10.10.4" + version: "11.0.1" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: e8cdb845820eaa5f1d29de31a72aab8addbbffc6483f1e5123a9d0b611735285 + sha256: "5a2c14e18bf6c4423a6462113d85d3dee534a8bdd620391729e9570632d2aec4" url: "https://pub.dev" source: hosted - version: "3.10.5" + version: "4.0.1" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: e2fabebdf16bb99506a1e7e84f5effd6313c90678e6ea1876d301f057483a198 + sha256: db4bdb166aae9e5a0ce7791672401db139cd342369a92f7eaf020dbff9df2998 url: "https://pub.dev" source: hosted - version: "0.5.7+4" + version: "0.5.7+9" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "4aef2a23d0f3265545807d68fbc2f76a6b994ca3c778d88453b99325abd63284" + sha256: fae4ab4317c2a7afb13d44ef1e3f9f28a630e10016bc5cfe761e8e6a0ed7816a url: "https://pub.dev" source: hosted - version: "2.30.1" + version: "3.1.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63 + sha256: "1003a5a03a61fc9a22ef49f37cbcb9e46c86313a7b2e7029b9390cf8c6fc32cb" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.1.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "67f2fcc600fc78c2f731c370a3a5e6c87ee862e3a2fba6f951eca6d5dafe5c29" + sha256: "6643fe3dbd021e6ccfb751f7882b39df355708afbdeb4130fc50f9305a9d1a3d" url: "https://pub.dev" source: hosted - version: "2.16.0" + version: "2.17.2" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: "73a43445a7f8c6e6327f0ec3922b1c99a9f4a0e4896197bfe10a88259f775aad" + sha256: "2d0ea2234ce46030eda2e6922611115ce603adc614ebd8c00e7db06a8929efbb" url: "https://pub.dev" source: hosted - version: "14.9.1" + version: "15.0.1" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "675527aadccb679c9dfd43a4558690427123ac1e99f03eef5bbce9dc216edc91" + sha256: c38c27f58cb6a88b8c145018d0567802376549c32a60098a13f3bdf3ddea326f url: "https://pub.dev" source: hosted - version: "4.5.34" + version: "4.5.39" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "66deff69307f54fc7a20732b4278af327ae378b86607d5ac877d8f2201fe881e" + sha256: "8502849c2f232f7db338c052e045442207a0db82bd03ff14be3c80897dd8c26c" url: "https://pub.dev" source: hosted - version: "3.8.4" + version: "3.8.9" fixnum: dependency: transitive description: @@ -999,6 +999,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" highlighter: dependency: transitive description: @@ -1925,6 +1933,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + rive: + dependency: "direct main" + description: + name: rive + sha256: "166019487e8bfa6525d4537bfd494deb4f306e32f97a7f50ff452b44ab6b72ea" + url: "https://pub.dev" + source: hosted + version: "0.11.11" + rive_common: + dependency: transitive + description: + name: rive_common + sha256: "83af8b500ad4d23930397229c7ed520e266eb851690a8621afa6cbd782aeac87" + url: "https://pub.dev" + source: hosted + version: "0.2.3" rxdart: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 398a2f15b..a24dfdff3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -103,9 +103,9 @@ dependencies: country_picker: ^2.0.25 csv: ^6.0.0 fl_chart: ^0.67.0 - firebase_analytics: ^10.10.2 - firebase_core: ^2.30.0 - firebase_messaging: ^14.8.2 + firebase_analytics: ^11.0.1 + firebase_core: ^3.1.0 + firebase_messaging: ^15.0.1 flutter_dotenv: ^5.1.0 fcm_shared_isolate: path: pangea_packages/fcm_shared_isolate @@ -120,6 +120,7 @@ dependencies: sentry_flutter: ^8.2.0 shimmer: ^3.0.0 syncfusion_flutter_xlsio: ^25.1.40 + rive: 0.11.11 # Pangea# dev_dependencies: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 4798ca389..8fbbffa18 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); RecordWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); + RivePluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RivePlugin")); SentryFlutterPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("SentryFlutterPlugin")); SharePlusWindowsPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index bf885c6b1..315ce5112 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -12,6 +12,7 @@ list(APPEND FLUTTER_PLUGIN_LIST pasteboard permission_handler_windows record_windows + rive_common sentry_flutter share_plus sqlcipher_flutter_libs