diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index e793832fc..21874cc9e 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -2431,9 +2431,6 @@ "seconds": {} } }, - "pleaseEnterANumber": "Please enter a number greater than 0", - "archiveRoomDescription": "The chat will be moved to the archive. Other users will be able to see that you have left the chat.", - "roomUpgradeDescription": "The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/", "allCorrect": "That's how I would say it! Nice!", "newWayAllGood": "That's not how I would have said it but it looks good!", "othersAreBetter": "Hm, there might be a better way to say that.", @@ -2584,15 +2581,7 @@ "placeholders": {} }, "copyClassLink": "Copy invite link", - "@copyClassLink": { - "type": "text", - "placeholders": {} - }, "copyClassLinkDesc": "Clicking this link will take students to the app, direct them to make an account and they will automatically join this space.", - "@copyClassLink": { - "type": "text", - "placeholders": {} - }, "copyClassCode": "Copy invite code", "inviteStudentByUserName": "Invite student by username", "@inviteStudentByUserName": { @@ -2764,11 +2753,6 @@ "type": "text", "placeholders": {} }, - "errorPleaseRefresh": "We're looking into it! Please reload and try again.", - "@errorPleaseRefresh": { - "type": "text", - "placeholders": {} - }, "joinWithClassCode": "Join class or exchange", "@joinWithClassCode": { "type": "text", @@ -2989,26 +2973,6 @@ "type": "text", "placeholders": {} }, - "error502504Title": "Wow, there are a lot of students online!", - "@error502504Title": { - "type": "text", - "placeholders": {} - }, - "error502504Desc": "Translation and grammar tools may be slow or unavailable while the Pangea bots catch up.", - "@error502504Desc": { - "type": "text", - "placeholders": {} - }, - "error404Title": "Translation error!", - "@error404Title": { - "type": "text", - "placeholders": {} - }, - "error404Desc": "Pangea Bot isn't sure how to translate that...", - "@error404Desc": { - "type": "text", - "placeholders": {} - }, "errorDisableIT": "Translation assistance is turned off.", "errorDisableIGC": "Grammar assistance is turned off.", "errorDisableLanguageAssistance": "Translation assistance and grammar assistance are turned off.", @@ -3111,11 +3075,6 @@ "type": "text", "placeholders": {} }, - "classDescription": "Space Description", - "@classDescription": { - "type": "text", - "placeholders": {} - }, "inviteStudentByUserNameDesc": "If your student already has an account, you can search for them.", "@inviteStudentByUserNameDesc": { "type": "text", @@ -3132,7 +3091,6 @@ "clickMessageTitle": "Need help?", "clickMessageBody": "Click messages to access definitions, translations, and audio!", "understandingMessagesTitle": "Definitions and translations!", - "addToClass": "Add this chat to ", "understandingMessagesBody": "Click underlined words for definitions. Translate with message options (upper right).", "allDone": "All done!", "vocab": "Vocabulary", @@ -3665,7 +3623,6 @@ "user": {} } }, - "decline": "Decline", "declinedInvitation": "Declined invitation", "acceptedInvitation": "Accepted invitation", "youreInvited": "📩 You're invited!", @@ -3744,7 +3701,6 @@ }, "acceptSelection": "Accept Correction", "acceptSelectionAnyway": "Use this anyway", - "replace": "Make correction", "makingActivity": "Making activity", "why": "Why?", "definition": "Definition", @@ -3767,12 +3723,6 @@ } }, "noTeachersFound": "No teachers found to report to", - "pushNotificationsNotAvailable": "Push notifications not available", - "learnMore": "Learn more", - "banUserDescription": "The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.", - "unbanUserDescription": "The user will be able to enter the chat again if they try.", - "kickUserDescription": "The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.", - "makeAdminDescription": "Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.", "pleaseEnterANumber": "Please enter a number greater than 0", "archiveRoomDescription": "The chat will be moved to the archive. Other users will be able to see that you have left the chat.", "roomUpgradeDescription": "The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/", @@ -3792,10 +3742,6 @@ } }, "searchChatsRooms": "Search for #chats, @users...", - "groupName": "Group name", - "createGroupAndInviteUsers": "Create a group and invite users", - "groupCanBeFoundViaSearch": "Group can be found via search", - "inNoSpaces": "You are not a member of any classes or exchanges", "createClass": "Create class", "createExchange": "Create exchange", "viewArchive": "View Archive", @@ -3902,7 +3848,6 @@ "enableModerationDesc": "Enable automatic moderation to review messages before they are sent", "conversationLanguageLevel": "What is the language level of this conversation?", "showDefinition": "Show Definition", - "acceptedKeyVerification": "{sender} accepted key verification", "sendReadReceipts": "Send read receipts", "sendTypingNotificationsDescription": "Other participants in a chat can see when you are typing a new message.", "sendReadReceiptsDescription": "Other participants in a chat can see when you have read a message.", @@ -3967,6 +3912,7 @@ "more": "More", "translationTooltip": "Translate", "audioTooltip": "Play Audio", + "speechToTextTooltip": "Transcript", "certifyAge": "I certify that I am over {age} years of age", "@certifyAge": { "type": "text", @@ -3994,5 +3940,9 @@ } }, "messageAnalytics": "Message Analytics", + "words": "Words", + "score": "Score", + "accuracy": "Accuracy", + "points": "Points", "noPaymentInfo": "No payment info necessary!" } \ No newline at end of file diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb index 4a2825a2d..f9f596f16 100644 --- a/assets/l10n/intl_es.arb +++ b/assets/l10n/intl_es.arb @@ -4572,6 +4572,7 @@ "more": "Más", "translationTooltip": "Traducir", "audioTooltip": "Reproducir audio", + "speechToTextTooltip": "Transcripción", "yourBirthdayPleaseShort": "Seleccione su grupo de edad", "certifyAge": "Certifico que soy mayor de {age} años", "@certifyAge": { @@ -4587,4 +4588,4 @@ "joinToView": "Únete a esta sala para ver los detalles", "autoPlayTitle": "Reproducción automática de mensajes", "autoPlayDesc": "Cuando está activado, el audio de texto a voz de los mensajes se reproducirá automáticamente cuando se seleccione." -} +} \ No newline at end of file diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 9176e3e6b..40701e742 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -18,11 +18,12 @@ 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.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/message_data_models.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.dart'; +import 'package:fluffychat/pangea/models/representation_content_model.dart'; import 'package:fluffychat/pangea/models/student_analytics_summary_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'; import 'package:fluffychat/pangea/utils/report_message.dart'; diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 568fe0997..373689043 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -1,8 +1,8 @@ import 'package:fluffychat/config/themes.dart'; 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/models/pangea_message_event.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'; @@ -168,7 +168,8 @@ class Message extends StatelessWidget { ToolbarDisplayController? toolbarController; if (event.type == EventTypes.Message && event.messageType == MessageTypes.Text || - event.messageType == MessageTypes.Notice) { + event.messageType == MessageTypes.Notice || + event.messageType == MessageTypes.Audio) { toolbarController = controller.getToolbarDisplayController( event.eventId, nextEvent: nextEvent, diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index 935ba0b69..9866ddb2d 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -1,7 +1,8 @@ import 'dart:math'; import 'package:fluffychat/pages/chat/events/video_player.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.dart'; +import 'package:fluffychat/pangea/enum/message_mode_enum.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/widgets/chat/message_context_menu.dart'; import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; import 'package:fluffychat/pangea/widgets/igc/pangea_rich_text.dart'; @@ -372,7 +373,7 @@ class MessageContent extends StatelessWidget { ), onListen: () => toolbarController?.showToolbar( context, - mode: MessageMode.play, + mode: MessageMode.textToSpeech, ), ), enableInteractiveSelection: diff --git a/lib/pages/chat/recording_dialog.dart b/lib/pages/chat/recording_dialog.dart index 2fdc1e07b..b3bff4187 100644 --- a/lib/pages/chat/recording_dialog.dart +++ b/lib/pages/chat/recording_dialog.dart @@ -12,7 +12,7 @@ import 'package:wakelock_plus/wakelock_plus.dart'; import 'events/audio_player.dart'; class RecordingDialog extends StatefulWidget { - static const String recordingFileType = 'm4a'; + static const String recordingFileType = 'wav'; const RecordingDialog({ super.key, }); @@ -49,6 +49,8 @@ class RecordingDialogState extends State { path: _recordedPath, bitRate: bitRate, samplingRate: samplingRate, + encoder: AudioEncoder.wav, + numChannels: 1, ); setState(() => _duration = Duration.zero); _recorderSubscription?.cancel(); diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index 556eaaff8..156f36cc8 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -13,7 +13,8 @@ import 'package:fluffychat/pangea/enum/edit_type.dart'; import 'package:fluffychat/pangea/extensions/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/message_data_models.dart'; +import 'package:fluffychat/pangea/models/representation_content_model.dart'; +import 'package:fluffychat/pangea/models/tokens_event_content_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'; diff --git a/lib/pangea/constants/pangea_event_types.dart b/lib/pangea/constants/pangea_event_types.dart index 6494843c9..cfdb7f0d7 100644 --- a/lib/pangea/constants/pangea_event_types.dart +++ b/lib/pangea/constants/pangea_event_types.dart @@ -2,6 +2,8 @@ class PangeaEventTypes { static const classSettings = "pangea.class"; static const pangeaExchange = "p.exchange"; + static const transcript = "pangea.transcript"; + static const rules = "p.rules"; static const studentAnalyticsSummary = "pangea.usranalytics"; @@ -18,5 +20,7 @@ class PangeaEventTypes { static const botOptions = "pangea.bot_options"; static const userAge = "pangea.user_age"; + + static const String report = 'm.report'; static const textToSpeechRule = "p.rule.text_to_speech"; } diff --git a/lib/pangea/constants/pangea_message_types.dart b/lib/pangea/constants/pangea_message_types.dart deleted file mode 100644 index 23ee52abd..000000000 --- a/lib/pangea/constants/pangea_message_types.dart +++ /dev/null @@ -1,3 +0,0 @@ -class PangeaMessageTypes { - static String report = 'm.report'; -} diff --git a/lib/pangea/controllers/message_analytics_controller.dart b/lib/pangea/controllers/message_analytics_controller.dart index c71af9a92..f3e2b4674 100644 --- a/lib/pangea/controllers/message_analytics_controller.dart +++ b/lib/pangea/controllers/message_analytics_controller.dart @@ -13,8 +13,8 @@ import 'package:matrix/matrix.dart'; import '../constants/class_default_values.dart'; import '../extensions/client_extension.dart'; import '../extensions/pangea_room_extension.dart'; +import '../matrix_event_wrappers/construct_analytics_event.dart'; import '../models/chart_analytics_model.dart'; -import '../models/construct_analytics_event.dart'; import '../models/student_analytics_event.dart'; import 'base_controller.dart'; import 'pangea_controller.dart'; diff --git a/lib/pangea/controllers/message_data_controller.dart b/lib/pangea/controllers/message_data_controller.dart index e22791969..1e878f19b 100644 --- a/lib/pangea/controllers/message_data_controller.dart +++ b/lib/pangea/controllers/message_data_controller.dart @@ -2,7 +2,8 @@ import 'package:collection/collection.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.dart'; -import 'package:fluffychat/pangea/models/message_data_models.dart'; +import 'package:fluffychat/pangea/models/representation_content_model.dart'; +import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; import 'package:fluffychat/pangea/repo/tokens_repo.dart'; import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; diff --git a/lib/pangea/controllers/pangea_controller.dart b/lib/pangea/controllers/pangea_controller.dart index c1fe9333b..e2ddc6714 100644 --- a/lib/pangea/controllers/pangea_controller.dart +++ b/lib/pangea/controllers/pangea_controller.dart @@ -11,6 +11,7 @@ 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/speech_to_text_controller.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; import 'package:fluffychat/pangea/controllers/text_to_speech_controller.dart'; import 'package:fluffychat/pangea/controllers/user_controller.dart'; @@ -48,6 +49,7 @@ class PangeaController { late InstructionsController instructions; late SubscriptionController subscriptionController; late TextToSpeechController textToSpeech; + late SpeechToTextController speechToText; ///store Services late PLocalStore pStoreService; @@ -94,6 +96,7 @@ class PangeaController { subscriptionController = SubscriptionController(this); itFeedback = ITFeedbackController(this); textToSpeech = TextToSpeechController(this); + speechToText = SpeechToTextController(this); PAuthGaurd.pController = this; } diff --git a/lib/pangea/controllers/speech_to_text_controller.dart b/lib/pangea/controllers/speech_to_text_controller.dart new file mode 100644 index 000000000..6b302b101 --- /dev/null +++ b/lib/pangea/controllers/speech_to_text_controller.dart @@ -0,0 +1,122 @@ +import 'dart:async'; +import 'dart:convert'; + +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.dart'; +import 'package:fluffychat/pangea/models/representation_content_model.dart'; +import 'package:fluffychat/pangea/models/speech_to_text_models.dart'; +import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:flutter/foundation.dart'; +import 'package:http/http.dart'; + +import '../config/environment.dart'; +import '../network/requests.dart'; +import '../network/urls.dart'; + +// Assuming SpeechToTextRequestModel, SpeechToTextModel and related models are already defined as in your provided code. + +class _SpeechToTextCacheItem { + Future data; + + _SpeechToTextCacheItem({required this.data}); +} + +class SpeechToTextController { + static final Map _cache = {}; + late final PangeaController _pangeaController; + Timer? _cacheClearTimer; + + SpeechToTextController(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(); + } + + Future get( + SpeechToTextRequestModel requestModel, + ) async { + final int cacheKey = requestModel.hashCode; + + if (_cache.containsKey(cacheKey)) { + return _cache[cacheKey]!.data; + } else { + final Future response = _fetchResponse( + accessToken: await _pangeaController.userController.accessToken, + requestModel: requestModel, + ); + _cache[cacheKey] = _SpeechToTextCacheItem(data: response); + + return response; + } + } + + Future saveSpeechToTextAsRepresentationEvent( + SpeechToTextModel response, + SpeechToTextRequestModel requestModel, + ) { + if (requestModel.audioEvent == null) { + debugPrint( + 'Audio event is null, case of giving speech to text before message sent, currently not implemented', + ); + return Future.value(null); + } + debugPrint('Saving transcript as matrix event'); + + requestModel.audioEvent?.room.sendPangeaEvent( + content: PangeaRepresentation( + langCode: response.langCode, + text: response.transcript.text, + originalSent: false, + originalWritten: false, + speechToText: response, + ).toJson(), + parentEventId: requestModel.audioEvent!.eventId, + type: PangeaEventTypes.representation, + ); + debugPrint('Transcript saved as matrix event'); + + return Future.value(null); + } + + Future _fetchResponse({ + required String accessToken, + required SpeechToTextRequestModel requestModel, + }) async { + final Requests request = Requests( + choreoApiKey: Environment.choreoApiKey, + accessToken: accessToken, + ); + + final Response res = await request.post( + url: PApiUrls.speechToText, + body: requestModel.toJson(), + ); + + if (res.statusCode == 200) { + final Map json = jsonDecode(utf8.decode(res.bodyBytes)); + + final response = SpeechToTextModel.fromJson(json); + + saveSpeechToTextAsRepresentationEvent(response, requestModel).onError( + (error, stackTrace) => ErrorHandler.logError(e: error, s: stackTrace), + ); + + return response; + } else { + debugPrint('Error converting speech to text: ${res.body}'); + throw Exception('Failed to convert speech to text'); + } + } +} diff --git a/lib/pangea/controllers/text_to_speech_controller.dart b/lib/pangea/controllers/text_to_speech_controller.dart index b7007ad1a..b34092618 100644 --- a/lib/pangea/controllers/text_to_speech_controller.dart +++ b/lib/pangea/controllers/text_to_speech_controller.dart @@ -126,25 +126,6 @@ class TextToSpeechController { return TextToSpeechResponse.fromJson(json); } - // if (json["wave_form"] == null) { - // json["wave_form"] = getWaveForm(); - // } - - // return TextToSpeechResponse( - // audioContent: String.fromCharCodes(base64Decode(json["audio_content"])), - // mediaType: json["media_type"], - // durationMillis: durationMillis(json["duration_millis"]), - // waveform: getWaveForm(json["audio_content"]), - // ); - // } - - // static List getWaveForm(audioContent) { - // return []; - // } - - // static int durationMillis(audioContent) { - // return 0; - // } static bool isOggFile(Uint8List bytes) { // Check if the file has enough bytes for the header diff --git a/lib/pangea/enum/audio_encoding_enum.dart b/lib/pangea/enum/audio_encoding_enum.dart new file mode 100644 index 000000000..812648327 --- /dev/null +++ b/lib/pangea/enum/audio_encoding_enum.dart @@ -0,0 +1,60 @@ +AudioEncodingEnum mimeTypeToAudioEncoding(String mimeType) { + switch (mimeType) { + case 'audio/mpeg': + return AudioEncodingEnum.mp3; + case 'audio/mp4': + return AudioEncodingEnum.mp4; + case 'audio/ogg': + return AudioEncodingEnum.oggOpus; + case 'audio/x-flac': + return AudioEncodingEnum.flac; + case 'audio/x-wav': + return AudioEncodingEnum.linear16; + default: + return AudioEncodingEnum.encodingUnspecified; + } +} + +enum AudioEncodingEnum { + encodingUnspecified, + linear16, + flac, + mulaw, + amr, + amrWb, + oggOpus, + speexWithHeaderByte, + mp3, + mp4, + webmOpus, +} + +// Utility extension to map enum values to their corresponding string value as used by the API +extension AudioEncodingExtension on AudioEncodingEnum { + String get value { + switch (this) { + case AudioEncodingEnum.linear16: + return 'LINEAR16'; + case AudioEncodingEnum.flac: + return 'FLAC'; + case AudioEncodingEnum.mulaw: + return 'MULAW'; + case AudioEncodingEnum.amr: + return 'AMR'; + case AudioEncodingEnum.amrWb: + return 'AMR_WB'; + case AudioEncodingEnum.oggOpus: + return 'OGG_OPUS'; + case AudioEncodingEnum.speexWithHeaderByte: + return 'SPEEX_WITH_HEADER_BYTE'; + case AudioEncodingEnum.mp3: + return 'MP3'; + case AudioEncodingEnum.mp4: + return 'MP4'; + case AudioEncodingEnum.webmOpus: + return 'WEBM_OPUS'; + default: + return 'ENCODING_UNSPECIFIED'; + } + } +} diff --git a/lib/pangea/enum/message_mode_enum.dart b/lib/pangea/enum/message_mode_enum.dart new file mode 100644 index 000000000..c64861dc0 --- /dev/null +++ b/lib/pangea/enum/message_mode_enum.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:material_symbols_icons/symbols.dart'; + +enum MessageMode { translation, definition, speechToText, textToSpeech } + +extension MessageModeExtension on MessageMode { + IconData get icon { + switch (this) { + case MessageMode.translation: + return Icons.g_translate; + case MessageMode.textToSpeech: + return Symbols.text_to_speech; + case MessageMode.speechToText: + return Symbols.speech_to_text; + //TODO change icon for audio messages + case MessageMode.definition: + return Icons.book; + default: + return Icons.error; // Icon to indicate an error or unsupported mode + } + } + + String title(BuildContext context) { + switch (this) { + case MessageMode.translation: + return L10n.of(context)!.translations; + case MessageMode.textToSpeech: + return L10n.of(context)!.messageAudio; + case MessageMode.speechToText: + return L10n.of(context)!.speechToTextTooltip; + case MessageMode.definition: + return L10n.of(context)!.definitions; + default: + return L10n.of(context)! + .oopsSomethingWentWrong; // Title to indicate an error or unsupported mode + } + } + + String tooltip(BuildContext context) { + switch (this) { + case MessageMode.translation: + return L10n.of(context)!.translationTooltip; + case MessageMode.textToSpeech: + return L10n.of(context)!.audioTooltip; + case MessageMode.speechToText: + return L10n.of(context)!.speechToTextTooltip; + case MessageMode.definition: + return L10n.of(context)!.define; + default: + return L10n.of(context)! + .oopsSomethingWentWrong; // Title to indicate an error or unsupported mode + } + } +} diff --git a/lib/pangea/extensions/pangea_event_extension.dart b/lib/pangea/extensions/pangea_event_extension.dart index 9d4556721..f62f27925 100644 --- a/lib/pangea/extensions/pangea_event_extension.dart +++ b/lib/pangea/extensions/pangea_event_extension.dart @@ -1,12 +1,11 @@ import 'dart:developer'; -import 'package:flutter/foundation.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/models/choreo_record.dart'; -import 'package:fluffychat/pangea/models/message_data_models.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'; +import 'package:matrix/matrix.dart'; extension PangeaEvent on Event { V getPangeaContent() { diff --git a/lib/pangea/extensions/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension.dart index 93d5d33ac..4e4f773db 100644 --- a/lib/pangea/extensions/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension.dart @@ -4,9 +4,10 @@ import 'dart:developer'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/bot_options_model.dart'; import 'package:fluffychat/pangea/models/class_model.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.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'; import 'package:flutter/foundation.dart'; @@ -22,10 +23,10 @@ import '../../config/app_config.dart'; import '../constants/pangea_event_types.dart'; import '../enum/construct_type_enum.dart'; import '../enum/use_type.dart'; +import '../matrix_event_wrappers/construct_analytics_event.dart'; import '../models/choreo_record.dart'; -import '../models/construct_analytics_event.dart'; import '../models/constructs_analytics_model.dart'; -import '../models/message_data_models.dart'; +import '../models/representation_content_model.dart'; import '../models/student_analytics_event.dart'; import '../models/student_analytics_summary_model.dart'; import '../utils/p_store.dart'; diff --git a/lib/pangea/models/construct_analytics_event.dart b/lib/pangea/matrix_event_wrappers/construct_analytics_event.dart similarity index 100% rename from lib/pangea/models/construct_analytics_event.dart rename to lib/pangea/matrix_event_wrappers/construct_analytics_event.dart diff --git a/lib/pangea/models/pangea_audio_events.dart b/lib/pangea/matrix_event_wrappers/pangea_audio_events.dart similarity index 100% rename from lib/pangea/models/pangea_audio_events.dart rename to lib/pangea/matrix_event_wrappers/pangea_audio_events.dart diff --git a/lib/pangea/models/pangea_choreo_event.dart b/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart similarity index 97% rename from lib/pangea/models/pangea_choreo_event.dart rename to lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart index f28f04b04..47a6b688f 100644 --- a/lib/pangea/models/pangea_choreo_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_choreo_event.dart @@ -1,11 +1,10 @@ -import 'package:flutter/foundation.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/pangea/extensions/pangea_event_extension.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'; -import 'choreo_record.dart'; +import '../models/choreo_record.dart'; class ChoreoEvent { Event event; diff --git a/lib/pangea/models/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart similarity index 82% rename from lib/pangea/models/pangea_message_event.dart rename to lib/pangea/matrix_event_wrappers/pangea_message_event.dart index 8dab042ab..3f2f23616 100644 --- a/lib/pangea/models/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -3,12 +3,15 @@ import 'dart:convert'; import 'package:collection/collection.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/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_representation_event.dart'; import 'package:fluffychat/pangea/models/choreo_record.dart'; import 'package:fluffychat/pangea/models/class_model.dart'; -import 'package:fluffychat/pangea/models/message_data_models.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart'; -import 'package:fluffychat/pangea/models/pangea_representation_event.dart'; +import 'package:fluffychat/pangea/models/representation_content_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/material.dart'; @@ -56,6 +59,8 @@ class PangeaMessageEvent { Room get room => _event.room; + bool get isAudioMessage => _event.messageType == MessageTypes.Audio; + Event? _latestEditCache; Event get _latestEdit => _latestEditCache ??= _event .aggregatedEvents( @@ -153,7 +158,7 @@ class PangeaMessageEvent { }, ); - debugPrint("eventId in getAudioGlobal $eventId"); + debugPrint("eventId in getTextToSpeechGlobal $eventId"); final Event? audioEvent = eventId != null ? await room.getEventById(eventId) : null; @@ -167,10 +172,10 @@ class PangeaMessageEvent { //get audio for text and language //if no audio exists, create it //if audio exists, return it - Future getAudioGlobal(String langCode) async { + Future getTextToSpeechGlobal(String langCode) async { final String text = representationByLanguage(langCode)?.text ?? body; - final local = getAudioLocal(langCode, text); + final local = getTextToSpeechLocal(langCode, text); if (local != null) return Future.value(local); @@ -228,16 +233,16 @@ class PangeaMessageEvent { // .timeout( // Durations.long4, // onTimeout: () { - // debugPrint("timeout in getAudioGlobal"); + // debugPrint("timeout in getTextToSpeechGlobal"); // return null; // }, // ); - debugPrint("eventId in getAudioGlobal $eventId"); + debugPrint("eventId in getTextToSpeechGlobal $eventId"); return eventId != null ? room.getEventById(eventId) : null; } - Event? getAudioLocal(String langCode, String text) { + Event? getTextToSpeechLocal(String langCode, String text) { return allAudio.firstWhereOrNull( (element) { // Safely access the transcription map @@ -272,6 +277,78 @@ class PangeaMessageEvent { null; }).toSet(); + Future getSpeechToText( + String l1Code, + String l2Code, + ) async { + if (!isAudioMessage) { + ErrorHandler.logError( + e: 'Calling getSpeechToText on non-audio message', + s: StackTrace.current, + data: { + "content": _event.content, + "eventId": _event.eventId, + "roomId": _event.roomId, + "userId": _event.room.client.userID, + "account_data": _event.room.client.accountData, + }, + ); + return null; + } + + final SpeechToTextModel? speechToTextLocal = representations + .firstWhereOrNull( + (element) => element.content.speechToText != null, + ) + ?.content + .speechToText; + + if (speechToTextLocal != null) return speechToTextLocal; + + final matrixFile = await _event.downloadAndDecryptAttachment(); + // Pangea# + // File? file; + + // TODO: Test on mobile and see if we need this case, doeesn't seem so + // if (!kIsWeb) { + // final tempDir = await getTemporaryDirectory(); + // final fileName = Uri.encodeComponent( + // // #Pangea + // // widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last, + // widget.messageEvent.event + // .attachmentOrThumbnailMxcUrl()! + // .pathSegments + // .last, + // // Pangea# + // ); + // file = File('${tempDir.path}/${fileName}_${matrixFile.name}'); + // await file.writeAsBytes(matrixFile.bytes); + // } + + // audioFile = file; + + debugPrint("mimeType ${matrixFile.mimeType}"); + debugPrint("encoding ${mimeTypeToAudioEncoding(matrixFile.mimeType)}"); + + final SpeechToTextModel response = + await MatrixState.pangeaController.speechToText.get( + SpeechToTextRequestModel( + audioContent: matrixFile.bytes, + audioEvent: _event, + config: SpeechToTextAudioConfigModel( + encoding: mimeTypeToAudioEncoding(matrixFile.mimeType), + //this is the default in the RecordConfig in record package + //TODO: check if this is the correct value and make it a constant somewhere + sampleRateHertz: 22050, + userL1: l1Code, + userL2: l2Code, + ), + ), + ); + + return response; + } + List? _representations; List get representations { if (_representations != null) return _representations!; @@ -444,6 +521,8 @@ class PangeaMessageEvent { ), ); }, + ).onError( + (error, stackTrace) => ErrorHandler.logError(e: error, s: stackTrace), ); return pangeaRep; @@ -469,6 +548,7 @@ class PangeaMessageEvent { _event.room.isSpaceAdmin && _event.senderId != BotName.byEnvironment && !room.isUserSpaceAdmin(_event.senderId) && + _event.messageType != PangeaEventTypes.report && _event.messageType == MessageTypes.Text; String get messageDisplayLangCode { diff --git a/lib/pangea/models/pangea_representation_event.dart b/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart similarity index 86% rename from lib/pangea/models/pangea_representation_event.dart rename to lib/pangea/matrix_event_wrappers/pangea_representation_event.dart index c581f9390..0796f7f5d 100644 --- a/lib/pangea/models/pangea_representation_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_representation_event.dart @@ -1,8 +1,10 @@ import 'dart:developer'; import 'package:fluffychat/pangea/extensions/pangea_event_extension.dart'; -import 'package:fluffychat/pangea/models/pangea_choreo_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_choreo_event.dart'; import 'package:fluffychat/pangea/models/pangea_token_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/repo/tokens_repo.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -13,9 +15,9 @@ import 'package:sentry_flutter/sentry_flutter.dart'; import '../../widgets/matrix.dart'; import '../constants/language_keys.dart'; import '../constants/pangea_event_types.dart'; +import '../models/choreo_record.dart'; +import '../models/representation_content_model.dart'; import '../utils/error_handler.dart'; -import 'choreo_record.dart'; -import 'message_data_models.dart'; import 'pangea_tokens_event.dart'; class RepresentationEvent { @@ -25,12 +27,15 @@ class RepresentationEvent { ChoreoRecord? _choreo; Timeline timeline; + SpeechToTextModel? _speechToTextResponse; + RepresentationEvent({ required this.timeline, Event? event, PangeaRepresentation? content, PangeaMessageTokens? tokens, ChoreoRecord? choreo, + SpeechToTextModel? speechToTextResponse, }) { if (event != null && event.type != PangeaEventTypes.representation) { throw Exception( @@ -41,10 +46,14 @@ class RepresentationEvent { _content = content; _tokens = tokens; _choreo = choreo; + _speechToTextResponse = speechToTextResponse; } Event? get event => _event; + // Note: in the case where the event is the originalSent or originalWritten event, + // the content will be set on initialization by the PangeaMessageEvent + // Otherwise, the content will be fetched from the event where it is stored in content[type] PangeaRepresentation get content { if (_content != null) return _content!; _content = _event?.getPangeaContent(); diff --git a/lib/pangea/models/pangea_tokens_event.dart b/lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart similarity index 91% rename from lib/pangea/models/pangea_tokens_event.dart rename to lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart index 244455766..0c138c637 100644 --- a/lib/pangea/models/pangea_tokens_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_tokens_event.dart @@ -1,9 +1,9 @@ +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:matrix/matrix.dart'; -import 'package:fluffychat/pangea/extensions/pangea_event_extension.dart'; -import 'package:fluffychat/pangea/utils/error_handler.dart'; import '../constants/pangea_event_types.dart'; -import 'message_data_models.dart'; class TokensEvent { Event event; diff --git a/lib/pangea/models/message_data_models.dart b/lib/pangea/models/representation_content_model.dart similarity index 66% rename from lib/pangea/models/message_data_models.dart rename to lib/pangea/models/representation_content_model.dart index 1ed2f36ce..dc81f191e 100644 --- a/lib/pangea/models/message_data_models.dart +++ b/lib/pangea/models/representation_content_model.dart @@ -1,9 +1,8 @@ -import 'dart:convert'; - +import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/models/speech_to_text_models.dart'; +import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/pangea/models/pangea_token_model.dart'; - /// this class is contained within a [RepresentationEvent] /// this event is the child of a [EventTypes.Message] /// the event has two potential children events - @@ -22,6 +21,9 @@ class PangeaRepresentation { bool originalSent; bool originalWritten; + // a representation can be create via speech to text on the original message + SpeechToTextModel? speechToText; + // how do we know which representation was sent by author? // RepresentationEvent.text == PangeaMessageEvent.event.body // use: to know whether directUse @@ -49,20 +51,33 @@ class PangeaRepresentation { required this.text, required this.originalSent, required this.originalWritten, + this.speechToText, }); - factory PangeaRepresentation.fromJson(Map json) => - PangeaRepresentation( - langCode: json[_langCodeKey], - text: json[_textKey], - originalSent: json[_originalSentKey] ?? false, - originalWritten: json[_originalWrittenKey] ?? false, + factory PangeaRepresentation.fromJson(Map json) { + if (json[_langCodeKey] == LanguageKeys.unknownLanguage) { + ErrorHandler.logError( + e: Exception("Language code cannot be 'unk'"), + s: StackTrace.current, + data: {"rep_content": json}, ); + } + return PangeaRepresentation( + langCode: json[_langCodeKey], + text: json[_textKey], + originalSent: json[_originalSentKey] ?? false, + originalWritten: json[_originalWrittenKey] ?? false, + speechToText: json[_speechToTextKey] == null + ? null + : SpeechToTextModel.fromJson(json[_speechToTextKey]), + ); + } static const _textKey = "txt"; static const _langCodeKey = "lang"; static const _originalSentKey = "snt"; static const _originalWrittenKey = "wrttn"; + static const _speechToTextKey = "stt"; Map toJson() { final data = {}; @@ -70,35 +85,9 @@ class PangeaRepresentation { data[_langCodeKey] = langCode; if (originalSent) data[_originalSentKey] = originalSent; if (originalWritten) data[_originalWrittenKey] = originalWritten; - return data; - } -} - -/// this class lives within a [PangeaTokensEvent] -/// it always has a [RepresentationEvent] parent -/// These live as separate event so that anyone can add and edit tokens to -/// representation -class PangeaMessageTokens { - List tokens; - - PangeaMessageTokens({ - required this.tokens, - }); - - factory PangeaMessageTokens.fromJson(Map json) { - return PangeaMessageTokens( - tokens: (jsonDecode(json[_tokensKey] ?? "[]") as Iterable) - .map((e) => PangeaToken.fromJson(e)) - .toList() - .cast(), - ); - } - - static const _tokensKey = "tkns"; - - Map toJson() { - final data = {}; - data[_tokensKey] = jsonEncode(tokens.map((e) => e.toJson()).toList()); + if (speechToText != null) { + data[_speechToTextKey] = speechToText!.toJson(); + } return data; } } diff --git a/lib/pangea/models/speech_to_text_models.dart b/lib/pangea/models/speech_to_text_models.dart new file mode 100644 index 000000000..05ab6ccbe --- /dev/null +++ b/lib/pangea/models/speech_to_text_models.dart @@ -0,0 +1,218 @@ +import 'dart:convert'; + +import 'package:fluffychat/pangea/enum/audio_encoding_enum.dart'; +import 'package:fluffychat/pangea/models/pangea_token_model.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class SpeechToTextAudioConfigModel { + final AudioEncodingEnum encoding; + final int sampleRateHertz; + final bool enableWordConfidence; + final bool enableAutomaticPunctuation; + final String userL1; + final String userL2; + + SpeechToTextAudioConfigModel({ + required this.encoding, + required this.userL1, + required this.userL2, + this.sampleRateHertz = 16000, + this.enableWordConfidence = true, + this.enableAutomaticPunctuation = true, + }); + + Map toJson() => { + "encoding": encoding.value, + "sample_rate_hertz": sampleRateHertz, + "user_l1": userL1, + "user_l2": userL2, + "enable_word_confidence": enableWordConfidence, + "enable_automatic_punctuation": enableAutomaticPunctuation, + }; +} + +class SpeechToTextRequestModel { + final Uint8List audioContent; + final SpeechToTextAudioConfigModel config; + final Event? audioEvent; + + SpeechToTextRequestModel({ + required this.audioContent, + required this.config, + this.audioEvent, + }); + + Map toJson() => { + "audio_content": base64Encode(audioContent), + "config": config.toJson(), + }; + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + if (other is! SpeechToTextRequestModel) return false; + + return listEquals(audioContent, other.audioContent) && + config == other.config; + } + + @override + int get hashCode { + final bytesSample = + audioContent.length > 10 ? audioContent.sublist(0, 10) : audioContent; + return Object.hashAll([ + Object.hashAll(bytesSample), + config.hashCode, + ]); + } +} + +class STTToken { + final PangeaToken token; + final Duration? startTime; + final Duration? endTime; + final int? confidence; + + STTToken({ + required this.token, + this.startTime, + this.endTime, + this.confidence, + }); + + int get offset => token.text.offset; + + int get length => token.text.length; + + Color color(BuildContext context) { + if (confidence == null) { + return Theme.of(context).textTheme.bodyMedium?.color ?? + (Theme.of(context).brightness == Brightness.dark + ? Colors.white + : Colors.black); + } + if (confidence! > 80) { + return const Color.fromARGB(255, 0, 152, 0); + } + if (confidence! > 50) { + return const Color.fromARGB(255, 184, 142, 43); + } + return Colors.red; + } + + factory STTToken.fromJson(Map json) { + // debugPrint('STTToken.fromJson: $json'); + return STTToken( + token: PangeaToken.fromJson(json['token']), + startTime: json['start_time'] != null + ? Duration(milliseconds: json['start_time'] * 1000.toInt()) + : null, + endTime: json['end_time'] != null + ? Duration(milliseconds: json['end_time'] * 1000.toInt()) + : null, + confidence: json['confidence'], + ); + } + + Map toJson() => { + "token": token, + "start_time": startTime?.inMilliseconds, + "end_time": endTime?.inMilliseconds, + "confidence": confidence, + }; + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + if (other is! STTToken) return false; + + return token == other.token && + startTime == other.startTime && + endTime == other.endTime && + confidence == other.confidence; + } + + @override + int get hashCode { + return Object.hashAll([ + token.hashCode, + startTime.hashCode, + endTime.hashCode, + confidence.hashCode, + ]); + } +} + +class Transcript { + final String text; + final int confidence; + final List sttTokens; + final String langCode; + + Transcript({ + required this.text, + required this.confidence, + required this.sttTokens, + required this.langCode, + }); + + factory Transcript.fromJson(Map json) => Transcript( + text: json['transcript'], + confidence: json['confidence'] <= 100 + ? json['confidence'] + : json['confidence'] / 100, + sttTokens: (json['stt_tokens'] as List) + .map((e) => STTToken.fromJson(e)) + .toList(), + langCode: json['lang_code'], + ); + + Map toJson() => { + "transcript": text, + "confidence": confidence, + "stt_tokens": sttTokens.map((e) => e.toJson()).toList(), + "lang_code": langCode, + }; +} + +class SpeechToTextResult { + final List transcripts; + + SpeechToTextResult({required this.transcripts}); + + factory SpeechToTextResult.fromJson(Map json) => + SpeechToTextResult( + transcripts: (json['transcripts'] as List) + .map((e) => Transcript.fromJson(e)) + .toList(), + ); + + Map toJson() => { + "transcripts": transcripts.map((e) => e.toJson()).toList(), + }; +} + +class SpeechToTextModel { + final List results; + + SpeechToTextModel({ + required this.results, + }); + + Transcript get transcript => results.first.transcripts.first; + + String get langCode => results.first.transcripts.first.langCode; + + factory SpeechToTextModel.fromJson(Map json) => + SpeechToTextModel( + results: (json['results'] as List) + .map((e) => SpeechToTextResult.fromJson(e)) + .toList(), + ); + + Map toJson() => { + "results": results.map((e) => e.toJson()).toList(), + }; +} diff --git a/lib/pangea/models/tokens_event_content_model.dart b/lib/pangea/models/tokens_event_content_model.dart new file mode 100644 index 000000000..f2a7db7a6 --- /dev/null +++ b/lib/pangea/models/tokens_event_content_model.dart @@ -0,0 +1,32 @@ +import 'dart:convert'; + +import 'package:fluffychat/pangea/models/pangea_token_model.dart'; + +/// this class lives within a [PangeaTokensEvent] +/// it always has a [RepresentationEvent] parent +/// These live as separate event so that anyone can add and edit tokens to +/// representation +class PangeaMessageTokens { + List tokens; + + PangeaMessageTokens({ + required this.tokens, + }); + + factory PangeaMessageTokens.fromJson(Map json) { + return PangeaMessageTokens( + tokens: (jsonDecode(json[_tokensKey] ?? "[]") as Iterable) + .map((e) => PangeaToken.fromJson(e)) + .toList() + .cast(), + ); + } + + static const _tokensKey = "tkns"; + + Map toJson() { + final data = {}; + data[_tokensKey] = jsonEncode(tokens.map((e) => e.toJson()).toList()); + return data; + } +} diff --git a/lib/pangea/network/urls.dart b/lib/pangea/network/urls.dart index d559065ee..16d8bcd23 100644 --- a/lib/pangea/network/urls.dart +++ b/lib/pangea/network/urls.dart @@ -51,6 +51,7 @@ class PApiUrls { static String subseqStep = "/it_step"; static String textToSpeech = "${Environment.choreoApi}/text_to_speech"; + static String speechToText = "${Environment.choreoApi}/speech_to_text"; ///-------------------------------- revenue cat -------------------------- static String rcApiV1 = "https://api.revenuecat.com/v1"; diff --git a/lib/pangea/pages/analytics/construct_list.dart b/lib/pangea/pages/analytics/construct_list.dart index d81fe2b38..dd6c26618 100644 --- a/lib/pangea/pages/analytics/construct_list.dart +++ b/lib/pangea/pages/analytics/construct_list.dart @@ -5,11 +5,11 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; -import 'package:fluffychat/pangea/models/construct_analytics_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/construct_analytics_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_representation_event.dart'; import 'package:fluffychat/pangea/models/constructs_analytics_model.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.dart'; -import 'package:fluffychat/pangea/models/pangea_representation_event.dart'; import 'package:fluffychat/pangea/pages/analytics/base_analytics.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/string_color.dart'; diff --git a/lib/pangea/repo/text_to_speech_repo.dart b/lib/pangea/repo/text_to_speech_repo.dart deleted file mode 100644 index aafd299bd..000000000 --- a/lib/pangea/repo/text_to_speech_repo.dart +++ /dev/null @@ -1,66 +0,0 @@ -// import 'dart:async'; -// import 'dart:convert'; - -// import 'package:fluffychat/pangea/config/environment.dart'; -// import 'package:fluffychat/pangea/constants/model_keys.dart'; -// import 'package:fluffychat/pangea/network/urls.dart'; -// import 'package:http/http.dart'; - -// import '../network/requests.dart'; - -// class TextToSpeechRequest { -// String text; -// String langCode; - -// TextToSpeechRequest({required this.text, required this.langCode}); - -// Map toJson() => { -// ModelKey.text: text, -// ModelKey.langCode: langCode, -// }; -// } - -// class TextToSpeechResponse { -// String audioContent; -// String mediaType; -// int durationMillis; -// List waveform; - -// TextToSpeechResponse({ -// required this.audioContent, -// required this.mediaType, -// required this.durationMillis, -// required this.waveform, -// }); - -// factory TextToSpeechResponse.fromJson( -// Map json, -// ) => -// TextToSpeechResponse( -// audioContent: json["audio_content"], -// mediaType: json["media_type"], -// durationMillis: json["duration_millis"], -// waveform: List.from(json["wave_form"]), -// ); -// } - -// class TextToSpeechService { -// static Future get({ -// required String accessToken, -// required TextToSpeechRequest params, -// }) async { -// final Requests request = Requests( -// choreoApiKey: Environment.choreoApiKey, -// accessToken: accessToken, -// ); - -// final Response res = await request.post( -// url: PApiUrls.textToSpeech, -// body: params.toJson(), -// ); - -// final Map json = jsonDecode(res.body); - -// return TextToSpeechResponse.fromJson(json); -// } -// } diff --git a/lib/pangea/utils/bot_style.dart b/lib/pangea/utils/bot_style.dart index 8c971b307..3791c205e 100644 --- a/lib/pangea/utils/bot_style.dart +++ b/lib/pangea/utils/bot_style.dart @@ -1,7 +1,6 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:flutter/material.dart'; class BotStyle { static TextStyle text( @@ -25,6 +24,7 @@ class BotStyle { ? AppConfig.primaryColorLight : AppConfig.primaryColor : null, + inherit: true, ); return existingStyle?.merge(botStyle) ?? botStyle; diff --git a/lib/pangea/utils/download_chat.dart b/lib/pangea/utils/download_chat.dart index 9e3d4d423..a73cfa129 100644 --- a/lib/pangea/utils/download_chat.dart +++ b/lib/pangea/utils/download_chat.dart @@ -16,7 +16,7 @@ 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/models/pangea_message_event.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'; diff --git a/lib/pangea/utils/get_chat_list_item_subtitle.dart b/lib/pangea/utils/get_chat_list_item_subtitle.dart index f9616cc7c..d7fd3c331 100644 --- a/lib/pangea/utils/get_chat_list_item_subtitle.dart +++ b/lib/pangea/utils/get_chat_list_item_subtitle.dart @@ -1,8 +1,8 @@ import 'package:fluffychat/pangea/constants/language_keys.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/pangea_message_event.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; diff --git a/lib/pangea/utils/report_message.dart b/lib/pangea/utils/report_message.dart index a7b3f1c28..5b6ceb0ba 100644 --- a/lib/pangea/utils/report_message.dart +++ b/lib/pangea/utils/report_message.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/pangea/constants/pangea_message_types.dart'; +import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/extensions/client_extension.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.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'; Future reportMessage( BuildContext context, @@ -66,7 +64,7 @@ Future reportMessage( final String message = "$messageTitle\n\n$messageBody"; for (final Room reportDM in reportDMs) { final event = { - 'msgtype': PangeaMessageTypes.report, + 'msgtype': PangeaEventTypes.report, 'body': message, }; await reportDM.sendEvent(event); diff --git a/lib/pangea/widgets/chat/message_audio_card.dart b/lib/pangea/widgets/chat/message_audio_card.dart index ddd8caf61..5c1f8e67b 100644 --- a/lib/pangea/widgets/chat/message_audio_card.dart +++ b/lib/pangea/widgets/chat/message_audio_card.dart @@ -1,6 +1,7 @@ import 'package:fluffychat/pages/chat/events/audio_player.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:fluffychat/pangea/widgets/chat/toolbar_content_loading_indicator.dart'; import 'package:fluffychat/pangea/widgets/igc/card_error_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -33,7 +34,7 @@ class MessageAudioCardState extends State { widget.messageEvent.representationByLanguage(langCode)?.text; if (text != null) { final Event? localEvent = - widget.messageEvent.getAudioLocal(langCode, text); + widget.messageEvent.getTextToSpeechLocal(langCode, text); if (localEvent != null) { localAudioEvent = localEvent; if (mounted) setState(() => _isLoading = false); @@ -74,17 +75,9 @@ class MessageAudioCardState extends State { @override Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(8), + return Container( child: _isLoading - ? SizedBox( - height: 14, - width: 14, - child: CircularProgressIndicator( - strokeWidth: 2.0, - color: Theme.of(context).colorScheme.primary, - ), - ) + ? const ToolbarContentLoadingIndicator() : localAudioEvent != null || audioFile != null ? Container( constraints: const BoxConstraints( diff --git a/lib/pangea/widgets/chat/message_speech_to_text_card.dart b/lib/pangea/widgets/chat/message_speech_to_text_card.dart new file mode 100644 index 000000000..c516d4447 --- /dev/null +++ b/lib/pangea/widgets/chat/message_speech_to_text_card.dart @@ -0,0 +1,182 @@ +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/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'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:material_symbols_icons/symbols.dart'; + +import '../../utils/bot_style.dart'; + +class MessageSpeechToTextCard extends StatefulWidget { + final PangeaMessageEvent messageEvent; + + const MessageSpeechToTextCard({ + super.key, + required this.messageEvent, + }); + + @override + MessageSpeechToTextCardState createState() => MessageSpeechToTextCardState(); +} + +class MessageSpeechToTextCardState extends State { + SpeechToTextModel? speechToTextResponse; + bool _fetchingTranscription = true; + Object? error; + STTToken? selectedToken; + + String? get l1Code => + MatrixState.pangeaController.languageController.activeL1Code( + roomID: widget.messageEvent.room.id, + ); + String? get l2Code => + MatrixState.pangeaController.languageController.activeL2Code( + roomID: widget.messageEvent.room.id, + ); + + // look for transcription in message event + // if not found, call API to transcribe audio + Future getSpeechToText() async { + // try { + if (l1Code == null || l2Code == null) { + throw Exception('Language selection not found'); + } + speechToTextResponse ??= + await widget.messageEvent.getSpeechToText(l1Code!, l2Code!); + + debugPrint( + 'Speech to text transcript: ${speechToTextResponse?.transcript.text}', + ); + // } catch (e, s) { + // debugger(when: kDebugMode); + // error = e; + // ErrorHandler.logError( + // e: e, + // s: s, + // data: widget.messageEvent.event.content, + // ); + // } finally { + setState(() => _fetchingTranscription = false); + // } + } + + TextSpan _buildTranscriptText(BuildContext context) { + final Transcript transcript = speechToTextResponse!.transcript; + final List spans = []; + final String fullText = transcript.text; + int lastEnd = 0; + + for (final token in transcript.sttTokens) { + // debugPrint('Token confidence: ${token.confidence}'); + // debugPrint('color: ${token.color(context)}'); + if (token.offset > lastEnd) { + // Add any plain text before the token + spans.add( + TextSpan( + text: fullText.substring(lastEnd, token.offset), + ), + ); + // debugPrint('Pre: ${fullText.substring(lastEnd, token.offset)}'); + } + + spans.add( + TextSpan( + text: fullText.substring(token.offset, token.offset + token.length), + style: BotStyle.text( + context, + existingStyle: TextStyle(color: token.color(context)), + setColor: false, + ), + // gesturRecognizer that sets selectedToken on click + recognizer: TapGestureRecognizer() + ..onTap = () { + debugPrint('Token tapped'); + debugPrint(token.toJson().toString()); + setState(() { + if (selectedToken == token) { + selectedToken = null; + } else { + selectedToken = token; + } + }); + }, + ), + ); + + // debugPrint( + // 'Main: ${fullText.substring(token.offset, token.offset + token.length)}', + // ); + + lastEnd = token.offset + token.length; + } + + if (lastEnd < fullText.length) { + // Add any remaining text after the last token + spans.add( + TextSpan( + text: fullText.substring(lastEnd), + ), + ); + // debugPrint('Post: ${fullText.substring(lastEnd)}'); + } + + return TextSpan(children: spans); + } + + @override + void initState() { + super.initState(); + getSpeechToText(); + } + + @override + Widget build(BuildContext context) { + if (_fetchingTranscription) { + return const ToolbarContentLoadingIndicator(); + } + + //done fetchig but not results means some kind of error + if (speechToTextResponse == null) { + return CardErrorWidget(error: error); + } + + final int words = speechToTextResponse!.transcript.sttTokens.length; + final int accuracy = speechToTextResponse!.transcript.confidence; + final int total = words * accuracy; + + //TODO: find better icons + return Column( + children: [ + RichText( + text: _buildTranscriptText(context), + ), + const SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + IconNumberWidget( + icon: Icons.abc, + number: (selectedToken == null ? words : 1).toString(), + toolTip: L10n.of(context)!.words, + ), + IconNumberWidget( + icon: Symbols.target, + number: + "${selectedToken?.confidence ?? speechToTextResponse!.transcript.confidence}%", + toolTip: L10n.of(context)!.accuracy, + ), + IconNumberWidget( + icon: Icons.speed, + number: (selectedToken?.confidence ?? total).toString(), + toolTip: L10n.of(context)!.points, + ), + ], + ), + ], + ); + } +} diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index bb42bd667..5c2f083d5 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -1,25 +1,27 @@ import 'dart:async'; +import 'dart:developer'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pangea/constants/local.key.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.dart'; +import 'package:fluffychat/pangea/enum/message_mode_enum.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.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'; import 'package:fluffychat/pangea/widgets/chat/message_audio_card.dart'; +import 'package:fluffychat/pangea/widgets/chat/message_speech_to_text_card.dart'; import 'package:fluffychat/pangea/widgets/chat/message_text_selection.dart'; 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/widgets/matrix.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -enum MessageMode { translation, play, definition } - class ToolbarDisplayController { final PangeaMessageEvent pangeaMessageEvent; final String targetId; @@ -96,6 +98,7 @@ class ToolbarDisplayController { ], ); } catch (err) { + debugger(when: kDebugMode); ErrorHandler.logError(e: err, s: StackTrace.current); return; } @@ -153,53 +156,12 @@ class MessageToolbar extends StatefulWidget { } class MessageToolbarState extends State { - Widget? child; + Widget? toolbarContent; MessageMode? currentMode; bool updatingMode = false; late StreamSubscription selectionStream; late StreamSubscription toolbarModeStream; - IconData getIconData(MessageMode mode) { - switch (mode) { - case MessageMode.translation: - return Icons.g_translate; - case MessageMode.play: - return Icons.play_arrow; - case MessageMode.definition: - return Icons.book; - default: - return Icons.error; // Icon to indicate an error or unsupported mode - } - } - - String getModeTitle(MessageMode mode) { - switch (mode) { - case MessageMode.translation: - return L10n.of(context)!.translations; - case MessageMode.play: - return L10n.of(context)!.messageAudio; - case MessageMode.definition: - return L10n.of(context)!.definitions; - default: - return L10n.of(context)! - .oopsSomethingWentWrong; // Title to indicate an error or unsupported mode - } - } - - String getModeTooltip(MessageMode mode) { - switch (mode) { - case MessageMode.translation: - return L10n.of(context)!.translationTooltip; - case MessageMode.play: - return L10n.of(context)!.audioTooltip; - case MessageMode.definition: - return L10n.of(context)!.define; - default: - return L10n.of(context)! - .oopsSomethingWentWrong; // Title to indicate an error or unsupported mode - } - } - void updateMode(MessageMode newMode) { if (updatingMode) return; debugPrint("updating toolbar mode"); @@ -210,8 +172,8 @@ class MessageToolbarState extends State { updatingMode = true; }); if (!subscribed) { - child = MessageUnsubscribedCard( - languageTool: getModeTitle(newMode), + toolbarContent = MessageUnsubscribedCard( + languageTool: newMode.title(context), mode: newMode, toolbarModeStream: widget.toolbarModeStream, ); @@ -220,13 +182,21 @@ class MessageToolbarState extends State { case MessageMode.translation: showTranslation(); break; - case MessageMode.play: - playAudio(); + case MessageMode.textToSpeech: + showTextToSpeech(); + break; + case MessageMode.speechToText: + showSpeechToText(); break; case MessageMode.definition: showDefinition(); break; default: + ErrorHandler.logError( + e: "Invalid toolbar mode", + s: StackTrace.current, + data: {"newMode": newMode}, + ); break; } } @@ -237,28 +207,36 @@ class MessageToolbarState extends State { void showTranslation() { debugPrint("show translation"); - child = MessageTranslationCard( + toolbarContent = MessageTranslationCard( messageEvent: widget.pangeaMessageEvent, immersionMode: widget.immersionMode, selection: widget.textSelection, ); } - void playAudio() { - debugPrint("play audio"); - child = MessageAudioCard( + void showTextToSpeech() { + debugPrint("show text to speech"); + toolbarContent = MessageAudioCard( + messageEvent: widget.pangeaMessageEvent, + ); + } + + void showSpeechToText() { + debugPrint("show speech to text"); + toolbarContent = MessageSpeechToTextCard( messageEvent: widget.pangeaMessageEvent, ); } void showDefinition() { + debugPrint("show definition"); if (widget.textSelection.selectedText == null || widget.textSelection.selectedText!.isEmpty) { - child = const SelectToDefine(); + toolbarContent = const SelectToDefine(); return; } - child = WordDataCard( + toolbarContent = WordDataCard( word: widget.textSelection.selectedText!, wordLang: widget.pangeaMessageEvent.messageDisplayLangCode, fullText: widget.textSelection.messageText, @@ -292,7 +270,11 @@ class MessageToolbarState extends State { ) ?? true; autoplay - ? updateMode(MessageMode.play) + ? updateMode( + widget.pangeaMessageEvent.isAudioMessage + ? MessageMode.speechToText + : MessageMode.textToSpeech, + ) : updateMode(MessageMode.translation); }); @@ -350,8 +332,11 @@ class MessageToolbarState extends State { duration: FluffyThemes.animationDuration, child: Column( children: [ - child ?? const SizedBox(), - SizedBox(height: child == null ? 0 : 20), + Padding( + padding: const EdgeInsets.all(8.0), + child: toolbarContent ?? const SizedBox(), + ), + SizedBox(height: toolbarContent == null ? 0 : 20), ], ), ), @@ -360,10 +345,19 @@ class MessageToolbarState extends State { Row( mainAxisSize: MainAxisSize.min, children: MessageMode.values.map((mode) { + if ([MessageMode.definition, MessageMode.textToSpeech, MessageMode.translation] + .contains(mode) && + widget.pangeaMessageEvent.isAudioMessage) { + return const SizedBox.shrink(); + } + if (mode == MessageMode.speechToText && + !widget.pangeaMessageEvent.isAudioMessage) { + return const SizedBox.shrink(); + } return Tooltip( - message: getModeTooltip(mode), + message: mode.tooltip(context), child: IconButton( - icon: Icon(getIconData(mode)), + icon: Icon(mode.icon), color: currentMode == mode ? Theme.of(context).colorScheme.primary : null, diff --git a/lib/pangea/widgets/chat/message_translation_card.dart b/lib/pangea/widgets/chat/message_translation_card.dart index ae1a26c4c..f797cc3b4 100644 --- a/lib/pangea/widgets/chat/message_translation_card.dart +++ b/lib/pangea/widgets/chat/message_translation_card.dart @@ -1,9 +1,10 @@ -import 'package:fluffychat/pangea/models/message_data_models.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.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/repo/full_text_translation_repo.dart'; import 'package:fluffychat/pangea/utils/bot_style.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/widgets/chat/message_text_selection.dart'; +import 'package:fluffychat/pangea/widgets/chat/toolbar_content_loading_indicator.dart'; import 'package:fluffychat/pangea/widgets/igc/card_error_widget.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; @@ -138,17 +139,9 @@ class MessageTranslationCardState extends State { return const CardErrorWidget(); } - return Padding( - padding: const EdgeInsets.all(8), + return Container( child: _fetchingRepresentation - ? SizedBox( - height: 14, - width: 14, - child: CircularProgressIndicator( - strokeWidth: 2.0, - color: Theme.of(context).colorScheme.primary, - ), - ) + ? const ToolbarContentLoadingIndicator() : selectionTranslation != null ? Text( selectionTranslation!, diff --git a/lib/pangea/widgets/chat/message_unsubscribed_card.dart b/lib/pangea/widgets/chat/message_unsubscribed_card.dart index 8219e2355..720b25748 100644 --- a/lib/pangea/widgets/chat/message_unsubscribed_card.dart +++ b/lib/pangea/widgets/chat/message_unsubscribed_card.dart @@ -2,11 +2,12 @@ import 'dart:async'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/utils/bot_style.dart'; -import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import '../../enum/message_mode_enum.dart'; + class MessageUnsubscribedCard extends StatelessWidget { final String languageTool; final MessageMode mode; @@ -35,34 +36,31 @@ class MessageUnsubscribedCard extends StatelessWidget { } } - return Padding( - padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), - child: Column( - children: [ - Text( - style: BotStyle.text(context), - "${L10n.of(context)!.subscribedToUnlockTools} $languageTool", - textAlign: TextAlign.center, - ), - const SizedBox(height: 10), - SizedBox( - width: double.infinity, - child: TextButton( - onPressed: onButtonPress, - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - (AppConfig.primaryColor).withOpacity(0.1), - ), - ), - child: Text( - inTrialWindow - ? L10n.of(context)!.activateTrial - : L10n.of(context)!.getAccess, + return Column( + children: [ + Text( + style: BotStyle.text(context), + "${L10n.of(context)!.subscribedToUnlockTools} $languageTool", + textAlign: TextAlign.center, + ), + const SizedBox(height: 10), + SizedBox( + width: double.infinity, + child: TextButton( + onPressed: onButtonPress, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + (AppConfig.primaryColor).withOpacity(0.1), ), ), + child: Text( + inTrialWindow + ? L10n.of(context)!.activateTrial + : L10n.of(context)!.getAccess, + ), ), - ], - ), + ), + ], ); } } diff --git a/lib/pangea/widgets/chat/overlay_message.dart b/lib/pangea/widgets/chat/overlay_message.dart index 630addc17..5c7ccdef0 100644 --- a/lib/pangea/widgets/chat/overlay_message.dart +++ b/lib/pangea/widgets/chat/overlay_message.dart @@ -1,7 +1,7 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat/events/message_content.dart'; import 'package:fluffychat/pangea/enum/use_type.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:flutter/material.dart'; diff --git a/lib/pangea/widgets/chat/speech_to_text_text.dart b/lib/pangea/widgets/chat/speech_to_text_text.dart new file mode 100644 index 000000000..56b436ee6 --- /dev/null +++ b/lib/pangea/widgets/chat/speech_to_text_text.dart @@ -0,0 +1,65 @@ +import 'package:fluffychat/pangea/models/speech_to_text_models.dart'; +import 'package:fluffychat/pangea/utils/bot_style.dart'; +import 'package:flutter/material.dart'; + +class SpeechToTextText extends StatelessWidget { + final Transcript transcript; + + const SpeechToTextText({super.key, required this.transcript}); + + @override + Widget build(BuildContext context) { + return RichText( + text: _buildTranscriptText(context, transcript), + ); + } + + TextSpan _buildTranscriptText(BuildContext context, Transcript transcript) { + final List spans = []; + final String fullText = transcript.text; + int lastEnd = 0; + + for (final token in transcript.sttTokens) { + // debugPrint('Token confidence: ${token.confidence}'); + // debugPrint('color: ${token.color(context)}'); + if (token.offset > lastEnd) { + // Add any plain text before the token + spans.add( + TextSpan( + text: fullText.substring(lastEnd, token.offset), + ), + ); + // debugPrint('Pre: ${fullText.substring(lastEnd, token.offset)}'); + } + + spans.add( + TextSpan( + text: fullText.substring(token.offset, token.offset + token.length), + style: BotStyle.text( + context, + existingStyle: TextStyle(color: token.color(context)), + setColor: false, + ), + ), + ); + + // debugPrint( + // 'Main: ${fullText.substring(token.offset, token.offset + token.length)}', + // ); + + lastEnd = token.offset + token.length; + } + + if (lastEnd < fullText.length) { + // Add any remaining text after the last token + spans.add( + TextSpan( + text: fullText.substring(lastEnd), + ), + ); + // debugPrint('Post: ${fullText.substring(lastEnd)}'); + } + + return TextSpan(children: spans); + } +} diff --git a/lib/pangea/widgets/chat/text_to_speech_button.dart b/lib/pangea/widgets/chat/text_to_speech_button.dart index ec3dbd0db..6e9e8e443 100644 --- a/lib/pangea/widgets/chat/text_to_speech_button.dart +++ b/lib/pangea/widgets/chat/text_to_speech_button.dart @@ -3,7 +3,7 @@ import 'dart:developer'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pages/chat/events/audio_player.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.dart'; +import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/foundation.dart'; @@ -50,7 +50,7 @@ class _TextToSpeechButtonState extends State { Event? get localAudioEvent => langCode != null && text != null && text!.isNotEmpty - ? _pangeaMessageEvent.getAudioLocal(langCode!, text!) + ? _pangeaMessageEvent.getTextToSpeechLocal(langCode!, text!) : null; String? get langCode => @@ -69,7 +69,7 @@ class _TextToSpeechButtonState extends State { if (langCode == null || langCode!.isEmpty) return; setState(() => _isLoading = true); - await _pangeaMessageEvent.getAudioGlobal(langCode!); + await _pangeaMessageEvent.getTextToSpeechGlobal(langCode!); setState(() => _isLoading = false); } catch (e) { setState(() => _isLoading = false); diff --git a/lib/pangea/widgets/chat/toolbar_content_loading_indicator.dart b/lib/pangea/widgets/chat/toolbar_content_loading_indicator.dart new file mode 100644 index 000000000..021f4ee44 --- /dev/null +++ b/lib/pangea/widgets/chat/toolbar_content_loading_indicator.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class ToolbarContentLoadingIndicator extends StatelessWidget { + const ToolbarContentLoadingIndicator({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 14, + width: 14, + child: CircularProgressIndicator( + strokeWidth: 2.0, + color: Theme.of(context).colorScheme.primary, + ), + ); + } +} \ No newline at end of file diff --git a/lib/pangea/widgets/common/icon_number_widget.dart b/lib/pangea/widgets/common/icon_number_widget.dart new file mode 100644 index 000000000..b42777f91 --- /dev/null +++ b/lib/pangea/widgets/common/icon_number_widget.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +class IconNumberWidget extends StatelessWidget { + final IconData icon; + final String number; + final Color? iconColor; + final double? iconSize; + final String? toolTip; + + const IconNumberWidget({ + super.key, + required this.icon, + required this.number, + this.toolTip, + this.iconColor, + this.iconSize, + }); + + Widget _content(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + icon, + color: iconColor ?? Theme.of(context).iconTheme.color, + size: iconSize ?? Theme.of(context).iconTheme.size, + ), + const SizedBox(width: 8), + Text( + number.toString(), + style: TextStyle( + fontSize: + iconSize ?? Theme.of(context).textTheme.bodyMedium?.fontSize, + color: iconColor ?? Theme.of(context).textTheme.bodyMedium?.color, + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return toolTip != null + ? Tooltip(message: toolTip!, child: _content(context)) + : _content(context); + } +} diff --git a/lib/pangea/widgets/igc/pangea_rich_text.dart b/lib/pangea/widgets/igc/pangea_rich_text.dart index 3ae2597d4..779955f82 100644 --- a/lib/pangea/widgets/igc/pangea_rich_text.dart +++ b/lib/pangea/widgets/igc/pangea_rich_text.dart @@ -4,8 +4,8 @@ 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/models/message_data_models.dart'; -import 'package:fluffychat/pangea/models/pangea_message_event.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'; @@ -14,6 +14,7 @@ import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import '../../enum/message_mode_enum.dart'; import '../../models/pangea_match_model.dart'; class PangeaRichText extends StatefulWidget { @@ -88,7 +89,10 @@ class PangeaRichTextState extends State { .representationByLanguageGlobal( langCode: widget.pangeaMessageEvent.messageDisplayLangCode, ) - .onError((error, stackTrace) => ErrorHandler.logError()) + .onError( + (error, stackTrace) => + ErrorHandler.logError(e: error, s: stackTrace), + ) .then((event) { repEvent = event; widget.toolbarController?.toolbar?.textSelection.setMessageText( @@ -159,7 +163,7 @@ class PangeaRichTextState extends State { ), onListen: () => widget.toolbarController?.showToolbar( context, - mode: MessageMode.play, + mode: MessageMode.textToSpeech, ), ), TextSpan( diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 221a21755..4c892509b 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -3,7 +3,10 @@ PODS: - FlutterMacOS - audio_session (0.0.1): - FlutterMacOS - - desktop_drop (0.0.1): + - connectivity_plus (0.0.1): + - FlutterMacOS + - ReachabilitySwift + - desktop_lifecycle (0.0.1): - FlutterMacOS - device_info_plus (0.0.1): - FlutterMacOS @@ -13,6 +16,66 @@ PODS: - FlutterMacOS - file_selector_macos (0.0.1): - FlutterMacOS + - Firebase/Analytics (10.18.0): + - Firebase/Core + - Firebase/Core (10.18.0): + - Firebase/CoreOnly + - FirebaseAnalytics (~> 10.18.0) + - Firebase/CoreOnly (10.18.0): + - FirebaseCore (= 10.18.0) + - Firebase/Messaging (10.18.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 10.18.0) + - firebase_analytics (10.8.0): + - Firebase/Analytics (= 10.18.0) + - firebase_core + - FlutterMacOS + - firebase_core (2.24.2): + - Firebase/CoreOnly (~> 10.18.0) + - FlutterMacOS + - firebase_messaging (14.7.10): + - Firebase/CoreOnly (~> 10.18.0) + - Firebase/Messaging (~> 10.18.0) + - firebase_core + - FlutterMacOS + - FirebaseAnalytics (10.18.0): + - FirebaseAnalytics/AdIdSupport (= 10.18.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.18.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseCore (10.18.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.12) + - GoogleUtilities/Logger (~> 7.12) + - FirebaseCoreInternal (10.21.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.21.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FirebaseMessaging (10.18.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Reachability (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - nanopb (< 2.30910.0, >= 2.30908.0) - flutter_app_badger (1.3.0): - FlutterMacOS - flutter_local_notifications (0.0.1): @@ -32,12 +95,63 @@ PODS: - FMDB/standard (2.7.5) - geolocator_apple (1.2.0): - FlutterMacOS + - GoogleAppMeasurement (10.18.0): + - GoogleAppMeasurement/AdIdSupport (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.18.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.18.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleDataTransport (9.3.0): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/AppDelegateSwizzler (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.12.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (7.12.0): + - GoogleUtilities/Logger + - GoogleUtilities/Network (7.12.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.12.0)" + - GoogleUtilities/Reachability (7.12.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.12.0): + - GoogleUtilities/Logger + - in_app_purchase_storekit (0.0.1): + - Flutter + - FlutterMacOS - just_audio (0.0.1): - FlutterMacOS - macos_ui (0.1.0): - FlutterMacOS - macos_window_utils (1.0.0): - FlutterMacOS + - nanopb (2.30909.1): + - nanopb/decode (= 2.30909.1) + - nanopb/encode (= 2.30909.1) + - nanopb/decode (2.30909.1) + - nanopb/encode (2.30909.1) - package_info_plus (0.0.1): - FlutterMacOS - pasteboard (0.0.1): @@ -45,8 +159,24 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - record_macos (0.2.0): + - PromisesObjC (2.3.1) + - purchases_flutter (5.8.0): - FlutterMacOS + - PurchasesHybridCommon (= 6.3.0) + - PurchasesHybridCommon (6.3.0): + - RevenueCat (= 4.26.1) + - ReachabilitySwift (5.0.0) + - record_darwin (1.0.0): + - Flutter + - FlutterMacOS + - RevenueCat (4.26.1) + - Sentry/HybridSDK (8.17.2): + - SentryPrivate (= 8.17.2) + - sentry_flutter (0.0.1): + - Flutter + - FlutterMacOS + - Sentry/HybridSDK (= 8.17.2) + - SentryPrivate (8.17.2) - share_plus (0.0.1): - FlutterMacOS - shared_preferences_foundation (0.0.1): @@ -80,11 +210,15 @@ PODS: DEPENDENCIES: - appkit_ui_element_colors (from `Flutter/ephemeral/.symlinks/plugins/appkit_ui_element_colors/macos`) - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) + - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`) + - desktop_lifecycle (from `Flutter/ephemeral/.symlinks/plugins/desktop_lifecycle/macos`) - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`) - emoji_picker_flutter (from `Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos`) - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - firebase_analytics (from `Flutter/ephemeral/.symlinks/plugins/firebase_analytics/macos`) + - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) + - firebase_messaging (from `Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos`) - flutter_app_badger (from `Flutter/ephemeral/.symlinks/plugins/flutter_app_badger/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) @@ -92,13 +226,16 @@ DEPENDENCIES: - flutter_webrtc (from `Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos`) + - in_app_purchase_storekit (from `Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/darwin`) - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`) - macos_ui (from `Flutter/ephemeral/.symlinks/plugins/macos_ui/macos`) - macos_window_utils (from `Flutter/ephemeral/.symlinks/plugins/macos_window_utils/macos`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - pasteboard (from `Flutter/ephemeral/.symlinks/plugins/pasteboard/macos`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - - record_macos (from `Flutter/ephemeral/.symlinks/plugins/record_macos/macos`) + - purchases_flutter (from `Flutter/ephemeral/.symlinks/plugins/purchases_flutter/macos`) + - record_darwin (from `Flutter/ephemeral/.symlinks/plugins/record_darwin/macos`) + - sentry_flutter (from `Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos`) - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) @@ -111,7 +248,23 @@ DEPENDENCIES: SPEC REPOS: trunk: + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging - FMDB + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleUtilities + - nanopb + - PromisesObjC + - PurchasesHybridCommon + - ReachabilitySwift + - RevenueCat + - Sentry + - SentryPrivate - SQLCipher - WebRTC-SDK @@ -120,8 +273,10 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/appkit_ui_element_colors/macos audio_session: :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos - desktop_drop: - :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos + connectivity_plus: + :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos + desktop_lifecycle: + :path: Flutter/ephemeral/.symlinks/plugins/desktop_lifecycle/macos device_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos dynamic_color: @@ -130,6 +285,12 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos file_selector_macos: :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + firebase_analytics: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_analytics/macos + firebase_core: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos + firebase_messaging: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos flutter_app_badger: :path: Flutter/ephemeral/.symlinks/plugins/flutter_app_badger/macos flutter_local_notifications: @@ -144,6 +305,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral geolocator_apple: :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos + in_app_purchase_storekit: + :path: Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/darwin just_audio: :path: Flutter/ephemeral/.symlinks/plugins/just_audio/macos macos_ui: @@ -156,8 +319,12 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/pasteboard/macos path_provider_foundation: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin - record_macos: - :path: Flutter/ephemeral/.symlinks/plugins/record_macos/macos + purchases_flutter: + :path: Flutter/ephemeral/.symlinks/plugins/purchases_flutter/macos + record_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/record_darwin/macos + sentry_flutter: + :path: Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos share_plus: :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos shared_preferences_foundation: @@ -180,11 +347,21 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: appkit_ui_element_colors: 39bb2d80be3f19b152ccf4c70d5bbe6cba43d74a audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 - desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 + connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747 + desktop_lifecycle: a600c10e12fe033c7be9078f2e929b8241f2c1e3 device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f dynamic_color: 2eaa27267de1ca20d879fbd6e01259773fb1670f emoji_picker_flutter: 533634326b1c5de9a181ba14b9758e6dfe967a20 file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9 + Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 + firebase_analytics: 687a47ef9af9c5a8a9fc612c100987f843d0a281 + firebase_core: a74ee8b3ab5f91ae6b73f4913eaca996c24458b6 + firebase_messaging: 1298099739b30786ab5be9fdbfe00b2019065745 + FirebaseAnalytics: 4d310b35c48eaa4a058ddc04bdca6bdb5dc0fe80 + FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f + FirebaseCoreInternal: 43c1788eaeee9d1b97caaa751af567ce11010d00 + FirebaseInstallations: 390ea1d10a4d02b20c965cbfd527ee9b3b412acb + FirebaseMessaging: 9bc34a98d2e0237e1b121915120d4d48ddcf301e flutter_app_badger: 55a64b179f8438e89d574320c77b306e327a1730 flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea @@ -193,25 +370,38 @@ SPEC CHECKSUMS: FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a geolocator_apple: 821be05bbdb1b49500e029ebcbf2d6acf2dfb966 + GoogleAppMeasurement: 70ce9aa438cff1cfb31ea3e660bcc67734cb716e + GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe + GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + in_app_purchase_storekit: 9e9931234f0adcf71ae323f8c83785b96030edf1 just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489 macos_ui: 6229a8922cd97bafb7d9636c8eb8dfb0744183ca macos_window_utils: 933f91f64805e2eb91a5bd057cf97cd097276663 + nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce pasteboard: 9b69dba6fedbb04866be632205d532fe2f6b1d99 - path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - record_macos: 937889e0f2a7a12b6fc14e97a3678e5a18943de6 + path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 + purchases_flutter: 36a8c669148173e56f19dfc20df724bc734ab475 + PurchasesHybridCommon: 5ee5e13fe009876850a03f52bb0349b6fa91d976 + ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 + record_darwin: 1f6619f2abac4d1ca91d3eeab038c980d76f1517 + RevenueCat: 4e8899a69fd57180ef166237d1eb670023be05de + Sentry: 64a9f9c3637af913adcf53deced05bbe452d1410 + sentry_flutter: 57912cf425e09398bdf47f38842a1fcb9836f1be + SentryPrivate: 024c6fed507ac39ae98e6d087034160f942920d5 share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 - shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea sqflite_sqlcipher: d1ac7c60596e4d624d9757e3ec96e9cfafb734d6 SQLCipher: 905b145f65f349f26da9e60a19901ad24adcd381 url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 video_compress: c896234f100791b5fef7f049afa38f6d2ef7b42f - video_player_avfoundation: e9e6f9cae7d7a6d9b43519b0aab382bca60fcfd1 + video_player_avfoundation: 02011213dab73ae3687df27ce441fbbcc82b5579 wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 WebRTC-SDK: c24d2a6c9f571f2ed42297cb8ffba9557093142b window_to_front: 4cdc24ddd8461ad1a55fa06286d6a79d8b29e8d8 PODFILE CHECKSUM: d0975b16fbdecb73b109d8fbc88aa77ffe4c7a8d -COCOAPODS: 1.14.3 +COCOAPODS: 1.15.2 diff --git a/needed-translations.txt b/needed-translations.txt index cbe3b2bfc..c93f52d05 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -14,6 +14,7 @@ "ignoreListDescription", "ignoreUsername", "optionalGroupName", + "writeAMessageFlag", "requests", "allCorrect", "newWayAllGood", @@ -105,7 +106,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -154,10 +154,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -176,6 +172,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -195,7 +196,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -705,6 +705,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -758,13 +759,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -802,6 +803,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -812,7 +814,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "be": [ @@ -1251,6 +1259,7 @@ "wipeChatBackup", "withTheseAddressesRecoveryDescription", "writeAMessage", + "writeAMessageFlag", "yes", "you", "youAreNoLongerParticipatingInThisChat", @@ -1367,9 +1376,6 @@ "invitePrivateChat", "invalidInput", "wrongPinEntered", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", "allCorrect", "newWayAllGood", "othersAreBetter", @@ -1460,7 +1466,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -1509,10 +1514,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -1531,6 +1532,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -1550,7 +1556,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -2060,11 +2065,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -2114,31 +2119,34 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "pushNotificationsNotAvailable", - "learnMore", + "pleaseEnterANumber", + "archiveRoomDescription", + "roomUpgradeDescription", + "removeDevicesDescription", "banUserDescription", "unbanUserDescription", "kickUserDescription", "makeAdminDescription", - "removeDevicesDescription", + "pushNotificationsNotAvailable", + "learnMore", "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -2157,6 +2165,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -2183,7 +2192,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -2193,6 +2201,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -2211,6 +2220,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -2223,7 +2233,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "bn": [ @@ -2247,6 +2263,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -2340,7 +2357,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -2389,10 +2405,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -2411,6 +2423,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -2430,7 +2447,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -2940,11 +2956,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -2997,21 +3013,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -3030,6 +3046,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -3056,7 +3073,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -3066,6 +3082,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -3084,6 +3101,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -3096,7 +3114,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "bo": [ @@ -3120,6 +3144,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -3213,7 +3238,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -3262,10 +3286,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -3284,6 +3304,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -3303,7 +3328,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -3813,11 +3837,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -3870,21 +3894,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -3903,6 +3927,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -3929,7 +3954,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -3939,6 +3963,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -3957,6 +3982,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -3969,7 +3995,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "ca": [ @@ -3993,6 +4025,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -4086,7 +4119,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -4135,10 +4167,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -4157,6 +4185,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -4176,7 +4209,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -4686,11 +4718,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -4743,21 +4775,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -4776,6 +4808,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -4802,7 +4835,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -4812,6 +4844,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -4830,6 +4863,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -4842,7 +4876,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "cs": [ @@ -4866,6 +4906,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -4959,7 +5000,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -5008,10 +5048,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -5030,6 +5066,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -5049,7 +5090,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -5559,11 +5599,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -5616,21 +5656,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -5649,6 +5689,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -5675,7 +5716,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -5685,6 +5725,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -5703,6 +5744,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -5715,7 +5757,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "de": [ @@ -5735,6 +5783,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "hidePresences", "requests", "allCorrect", @@ -5827,7 +5876,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -5876,10 +5924,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -5898,6 +5942,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -5917,7 +5966,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -6427,6 +6475,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -6480,13 +6529,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -6524,6 +6573,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -6535,7 +6585,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "el": [ @@ -6559,6 +6615,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -6652,7 +6709,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -6701,10 +6757,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -6723,6 +6775,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -6742,7 +6799,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -7252,11 +7308,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -7309,21 +7365,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -7342,6 +7398,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -7368,7 +7425,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -7378,6 +7434,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -7396,6 +7453,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -7408,7 +7466,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "eo": [ @@ -7432,6 +7496,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -7525,7 +7590,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -7574,10 +7638,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -7596,6 +7656,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -7615,7 +7680,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -8125,11 +8189,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -8182,21 +8246,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -8215,6 +8279,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -8241,7 +8306,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -8251,6 +8315,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -8269,6 +8334,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -8281,12 +8347,19 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "es": [ "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "sendReadReceipts", @@ -8303,7 +8376,13 @@ "stickers", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "et": [ @@ -8321,6 +8400,7 @@ "ignoreListDescription", "ignoreUsername", "optionalGroupName", + "writeAMessageFlag", "requests", "allCorrect", "newWayAllGood", @@ -8412,7 +8492,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -8461,10 +8540,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -8483,6 +8558,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -8502,7 +8582,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -9012,6 +9091,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -9065,13 +9145,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -9109,6 +9189,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -9119,7 +9200,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "eu": [ @@ -9137,6 +9224,7 @@ "ignoreListDescription", "ignoreUsername", "optionalGroupName", + "writeAMessageFlag", "requests", "allCorrect", "newWayAllGood", @@ -9228,7 +9316,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -9277,10 +9364,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -9299,6 +9382,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -9318,7 +9406,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -9828,6 +9915,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -9881,13 +9969,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -9925,6 +10013,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -9935,7 +10024,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "fa": [ @@ -9959,6 +10054,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -10052,7 +10148,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -10101,10 +10196,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -10123,6 +10214,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -10142,7 +10238,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -10652,11 +10747,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -10709,21 +10804,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -10742,6 +10837,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -10768,7 +10864,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -10778,6 +10873,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -10796,6 +10892,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -10808,7 +10905,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "fi": [ @@ -10832,6 +10935,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -10925,7 +11029,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -10974,10 +11077,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -10996,6 +11095,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -11015,7 +11119,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -11525,11 +11628,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -11582,21 +11685,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -11615,6 +11718,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -11641,7 +11745,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -11651,6 +11754,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -11669,6 +11773,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -11681,7 +11786,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "fr": [ @@ -11705,6 +11816,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -11798,7 +11910,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -11847,10 +11958,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -11869,6 +11976,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -11888,7 +12000,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -12398,11 +12509,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -12455,21 +12566,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -12488,6 +12599,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -12514,7 +12626,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -12524,6 +12635,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -12542,6 +12654,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -12554,7 +12667,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "ga": [ @@ -12578,6 +12697,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -12671,7 +12791,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -12720,10 +12839,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -12742,6 +12857,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -12761,7 +12881,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -13271,11 +13390,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -13328,21 +13447,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -13361,6 +13480,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -13387,7 +13507,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -13397,6 +13516,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -13415,6 +13535,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -13427,7 +13548,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "gl": [ @@ -13445,6 +13572,7 @@ "ignoreListDescription", "ignoreUsername", "optionalGroupName", + "writeAMessageFlag", "requests", "allCorrect", "newWayAllGood", @@ -13536,7 +13664,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -13585,10 +13712,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -13607,6 +13730,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -13626,7 +13754,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -14136,6 +14263,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -14189,13 +14317,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -14233,6 +14361,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -14243,7 +14372,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "he": [ @@ -14267,6 +14402,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -14360,7 +14496,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -14409,10 +14544,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -14431,6 +14562,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -14450,7 +14586,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -14960,11 +15095,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -15017,21 +15152,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -15050,6 +15185,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -15076,7 +15212,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -15086,6 +15221,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -15104,6 +15240,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -15116,7 +15253,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "hi": [ @@ -15140,6 +15283,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -15233,7 +15377,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -15282,10 +15425,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -15304,6 +15443,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -15323,7 +15467,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -15833,11 +15976,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -15890,21 +16033,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -15923,6 +16066,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -15949,7 +16093,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -15959,6 +16102,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -15977,6 +16121,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -15989,7 +16134,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "hr": [ @@ -16010,6 +16161,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -16103,7 +16255,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -16152,10 +16303,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -16174,6 +16321,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -16193,7 +16345,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -16703,11 +16854,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -16758,13 +16909,13 @@ "reportMessageBody", "noTeachersFound", "noUsersFoundWithQuery", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -16783,6 +16934,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -16809,7 +16961,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -16819,6 +16970,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -16837,6 +16989,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -16849,7 +17002,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "hu": [ @@ -16873,6 +17032,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -16966,7 +17126,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -17015,10 +17174,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -17037,6 +17192,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -17056,7 +17216,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -17566,11 +17725,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -17623,21 +17782,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -17656,6 +17815,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -17682,7 +17842,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -17692,6 +17851,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -17710,6 +17870,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -17722,7 +17883,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "ia": [ @@ -18147,6 +18314,7 @@ "wipeChatBackup", "withTheseAddressesRecoveryDescription", "writeAMessage", + "writeAMessageFlag", "yes", "you", "youAreNoLongerParticipatingInThisChat", @@ -18263,9 +18431,6 @@ "invitePrivateChat", "invalidInput", "wrongPinEntered", - "pleaseEnterANumber", - "archiveRoomDescription", - "roomUpgradeDescription", "allCorrect", "newWayAllGood", "othersAreBetter", @@ -18356,7 +18521,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -18405,10 +18569,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -18427,6 +18587,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -18446,7 +18611,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -18956,11 +19120,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -19010,31 +19174,34 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "pushNotificationsNotAvailable", - "learnMore", + "pleaseEnterANumber", + "archiveRoomDescription", + "roomUpgradeDescription", + "removeDevicesDescription", "banUserDescription", "unbanUserDescription", "kickUserDescription", "makeAdminDescription", - "removeDevicesDescription", + "pushNotificationsNotAvailable", + "learnMore", "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -19053,6 +19220,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -19079,7 +19247,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -19089,6 +19256,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -19107,6 +19275,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -19119,7 +19288,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "id": [ @@ -19143,6 +19318,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -19236,7 +19412,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -19285,10 +19460,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -19307,6 +19478,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -19326,7 +19502,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -19836,11 +20011,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -19893,21 +20068,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -19926,6 +20101,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -19952,7 +20128,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -19962,6 +20137,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -19980,6 +20156,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -19992,7 +20169,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "ie": [ @@ -20016,6 +20199,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -20109,7 +20293,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -20158,10 +20341,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -20180,6 +20359,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -20199,7 +20383,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -20709,11 +20892,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -20766,21 +20949,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -20799,6 +20982,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -20825,7 +21009,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -20835,6 +21018,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -20853,6 +21037,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -20865,7 +21050,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "it": [ @@ -20885,6 +21076,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -20978,7 +21170,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -21027,10 +21218,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -21049,6 +21236,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -21068,7 +21260,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -21578,11 +21769,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -21632,13 +21823,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -21657,6 +21848,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -21683,7 +21875,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -21693,6 +21884,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -21711,6 +21903,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -21723,7 +21916,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "ja": [ @@ -21747,6 +21946,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -21840,7 +22040,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -21889,10 +22088,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -21911,6 +22106,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -21930,7 +22130,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -22440,11 +22639,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -22497,21 +22696,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -22530,6 +22729,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -22556,7 +22756,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -22566,6 +22765,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -22584,6 +22784,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -22596,7 +22797,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "ko": [ @@ -22620,6 +22827,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -22713,7 +22921,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -22762,10 +22969,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -22784,6 +22987,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -22803,7 +23011,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -23313,11 +23520,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -23370,21 +23577,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -23403,6 +23610,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -23429,7 +23637,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -23439,6 +23646,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -23457,6 +23665,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -23469,7 +23678,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "lt": [ @@ -23493,6 +23708,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -23586,7 +23802,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -23635,10 +23850,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -23657,6 +23868,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -23676,7 +23892,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -24186,11 +24401,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -24243,21 +24458,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -24276,6 +24491,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -24302,7 +24518,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -24312,6 +24527,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -24330,6 +24546,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -24342,7 +24559,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "lv": [ @@ -24366,6 +24589,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -24459,7 +24683,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -24508,10 +24731,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -24530,6 +24749,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -24549,7 +24773,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -25059,11 +25282,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -25116,21 +25339,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -25149,6 +25372,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -25175,7 +25399,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -25185,6 +25408,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -25203,6 +25427,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -25215,7 +25440,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "nb": [ @@ -25239,6 +25470,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -25332,7 +25564,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -25381,10 +25612,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -25403,6 +25630,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -25422,7 +25654,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -25932,11 +26163,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -25989,21 +26220,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -26022,6 +26253,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -26048,7 +26280,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -26058,6 +26289,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -26076,6 +26308,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -26088,7 +26321,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "nl": [ @@ -26112,6 +26351,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -26205,7 +26445,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -26254,10 +26493,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -26276,6 +26511,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -26295,7 +26535,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -26805,11 +27044,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -26862,21 +27101,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -26895,6 +27134,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -26921,7 +27161,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -26931,6 +27170,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -26949,6 +27189,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -26961,7 +27202,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "pl": [ @@ -26985,6 +27232,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -27078,7 +27326,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -27127,10 +27374,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -27149,6 +27392,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -27168,7 +27416,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -27678,11 +27925,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -27735,21 +27982,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -27768,6 +28015,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -27794,7 +28042,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -27804,6 +28051,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -27822,6 +28070,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -27834,7 +28083,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "pt": [ @@ -27858,6 +28113,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -27951,7 +28207,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -28000,10 +28255,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -28022,6 +28273,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -28041,7 +28297,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -28551,11 +28806,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -28608,21 +28863,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -28641,6 +28896,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -28667,7 +28923,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -28677,6 +28932,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -28695,6 +28951,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -28707,7 +28964,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "pt_BR": [ @@ -28727,6 +28990,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -28820,7 +29084,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -28869,10 +29132,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -28891,6 +29150,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -28910,7 +29174,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -29420,6 +29683,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -29473,13 +29737,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -29509,7 +29773,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -29519,6 +29782,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -29537,6 +29801,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -29549,7 +29814,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "pt_PT": [ @@ -29573,6 +29844,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -29666,7 +29938,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -29715,10 +29986,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -29737,6 +30004,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -29756,7 +30028,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -30266,11 +30537,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -30323,21 +30594,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -30356,6 +30627,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -30382,7 +30654,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -30392,6 +30663,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -30410,6 +30682,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -30422,7 +30695,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "ro": [ @@ -30446,6 +30725,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -30539,7 +30819,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -30588,10 +30867,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -30610,6 +30885,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -30629,7 +30909,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -31139,11 +31418,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -31196,21 +31475,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -31229,6 +31508,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -31255,7 +31535,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -31265,6 +31544,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -31283,6 +31563,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -31295,7 +31576,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "ru": [ @@ -31313,6 +31600,7 @@ "ignoreListDescription", "ignoreUsername", "optionalGroupName", + "writeAMessageFlag", "requests", "allCorrect", "newWayAllGood", @@ -31404,7 +31692,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -31453,10 +31740,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -31475,6 +31758,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -31494,7 +31782,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -32004,6 +32291,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -32057,13 +32345,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -32101,6 +32389,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -32111,7 +32400,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "sk": [ @@ -32135,6 +32430,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -32228,7 +32524,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -32277,10 +32572,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -32299,6 +32590,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -32318,7 +32614,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -32828,11 +33123,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -32885,21 +33180,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -32918,6 +33213,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -32944,7 +33240,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -32954,6 +33249,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -32972,6 +33268,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -32984,7 +33281,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "sl": [ @@ -33008,6 +33311,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -33101,7 +33405,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -33150,10 +33453,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -33172,6 +33471,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -33191,7 +33495,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -33701,11 +34004,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -33758,21 +34061,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -33791,6 +34094,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -33817,7 +34121,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -33827,6 +34130,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -33845,6 +34149,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -33857,7 +34162,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "sr": [ @@ -33881,6 +34192,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -33974,7 +34286,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -34023,10 +34334,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -34045,6 +34352,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -34064,7 +34376,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -34574,11 +34885,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -34631,21 +34942,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -34664,6 +34975,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -34690,7 +35002,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -34700,6 +35011,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -34718,6 +35030,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -34730,7 +35043,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "sv": [ @@ -34750,6 +35069,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -34843,7 +35163,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -34892,10 +35211,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -34914,6 +35229,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -34933,7 +35253,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -35443,6 +35762,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -35496,13 +35816,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -35528,7 +35848,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -35538,6 +35857,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -35556,6 +35876,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -35568,7 +35889,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "ta": [ @@ -35592,6 +35919,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -35685,7 +36013,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -35734,10 +36061,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -35756,6 +36079,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -35775,7 +36103,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -36285,11 +36612,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -36342,21 +36669,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -36375,6 +36702,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -36401,7 +36729,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -36411,6 +36738,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -36429,6 +36757,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -36441,7 +36770,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "th": [ @@ -36465,6 +36800,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -36558,7 +36894,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -36607,10 +36942,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -36629,6 +36960,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -36648,7 +36984,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -37158,11 +37493,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -37215,21 +37550,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -37248,6 +37583,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -37274,7 +37610,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -37284,6 +37619,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -37302,6 +37638,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -37314,7 +37651,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "tr": [ @@ -37334,6 +37677,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -37427,7 +37771,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -37476,10 +37819,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -37498,6 +37837,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -37517,7 +37861,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -38027,11 +38370,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -38081,13 +38424,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -38106,6 +38449,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -38132,7 +38476,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -38142,6 +38485,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -38160,6 +38504,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -38172,7 +38517,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "uk": [ @@ -38190,6 +38541,7 @@ "ignoreListDescription", "ignoreUsername", "optionalGroupName", + "writeAMessageFlag", "requests", "allCorrect", "newWayAllGood", @@ -38281,7 +38633,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -38330,10 +38681,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -38352,6 +38699,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -38371,7 +38723,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -38881,6 +39232,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -38934,13 +39286,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -38978,6 +39330,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -38988,7 +39341,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "vi": [ @@ -39012,6 +39371,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -39105,7 +39465,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -39154,10 +39513,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -39176,6 +39531,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -39195,7 +39555,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -39705,11 +40064,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -39762,21 +40121,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -39795,6 +40154,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -39821,7 +40181,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -39831,6 +40190,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -39849,6 +40209,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -39861,7 +40222,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "zh": [ @@ -39879,6 +40246,7 @@ "ignoreListDescription", "ignoreUsername", "optionalGroupName", + "writeAMessageFlag", "requests", "allCorrect", "newWayAllGood", @@ -39970,7 +40338,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -40019,10 +40386,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -40041,6 +40404,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -40060,7 +40428,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -40570,6 +40937,7 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", @@ -40623,13 +40991,13 @@ "reportMessageTitle", "reportMessageBody", "noTeachersFound", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", @@ -40667,6 +41035,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -40677,7 +41046,13 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ], "zh_Hant": [ @@ -40701,6 +41076,7 @@ "optionalGroupName", "presenceStyle", "presencesToggle", + "writeAMessageFlag", "youInvitedToBy", "hidePresences", "requests", @@ -40794,7 +41170,6 @@ "getStarted", "mustBe13", "yourBirthdayPleaseShort", - "errorPleaseRefresh", "joinWithClassCode", "joinWithClassCodeDesc", "joinWithClassCodeHint", @@ -40843,10 +41218,6 @@ "saveChanges", "publicProfileTitle", "publicProfileDesc", - "error502504Title", - "error502504Desc", - "error404Title", - "error404Desc", "errorDisableIT", "errorDisableIGC", "errorDisableLanguageAssistance", @@ -40865,6 +41236,11 @@ "iAgreeToThe", "termsAndConditions", "andCertifyIAmAtLeast13YearsOfAge", + "error502504Title", + "error502504Desc", + "error404Title", + "error404Desc", + "errorPleaseRefresh", "findAClass", "toggleIT", "toggleIGC", @@ -40884,7 +41260,6 @@ "clickMessageTitle", "clickMessageBody", "understandingMessagesTitle", - "addToClass", "understandingMessagesBody", "allDone", "vocab", @@ -41394,11 +41769,11 @@ "allPrivateChats", "unknownPrivateChat", "copyClassCodeDesc", + "addToClass", "addToClassDesc", "addToClassOrExchange", "addToClassOrExchangeDesc", "invitedToClassOrExchange", - "decline", "declinedInvitation", "acceptedInvitation", "youreInvited", @@ -41451,21 +41826,21 @@ "yourGlobalUserIdIs", "noUsersFoundWithQuery", "searchChatsRooms", - "groupName", - "createGroupAndInviteUsers", - "groupCanBeFoundViaSearch", - "inNoSpaces", "createClass", "createExchange", "viewArchive", "trialExpiration", "freeTrialDesc", "activateTrial", + "inNoSpaces", "successfullySubscribed", "clickToManageSubscription", "emptyInviteWarning", "errorGettingAudio", "nothingFound", + "groupName", + "createGroupAndInviteUsers", + "groupCanBeFoundViaSearch", "wrongRecoveryKey", "startConversation", "commandHint_sendraw", @@ -41484,6 +41859,7 @@ "publicSpaces", "addChatOrSubSpace", "subspace", + "decline", "thisDevice", "initAppError", "databaseBuildErrorBody", @@ -41510,7 +41886,6 @@ "enableModerationDesc", "conversationLanguageLevel", "showDefinition", - "acceptedKeyVerification", "sendReadReceipts", "sendTypingNotificationsDescription", "sendReadReceiptsDescription", @@ -41520,6 +41895,7 @@ "verifyOtherUserDescription", "verifyOtherDevice", "verifyOtherDeviceDescription", + "acceptedKeyVerification", "canceledKeyVerification", "completedKeyVerification", "isReadyForKeyVerification", @@ -41538,6 +41914,7 @@ "more", "translationTooltip", "audioTooltip", + "speechToTextTooltip", "certifyAge", "kickBotWarning", "joinToView", @@ -41550,6 +41927,12 @@ "discover", "commandHint_ignore", "commandHint_unignore", - "unreadChatsInApp" + "unreadChatsInApp", + "messageAnalytics", + "words", + "score", + "accuracy", + "points", + "noPaymentInfo" ] } diff --git a/pubspec.lock b/pubspec.lock index 366feffad..54e1ac6a7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: f5628cd9c92ed11083f425fd1f8f1bc60ecdda458c81d73b143aeda036c35fe7 + sha256: "3dee3db3468c5f4640a4e8aa9c1e22561c298976d8c39ed2fdd456a9a3db26e1" url: "https://pub.dev" source: hosted - version: "1.3.16" + version: "1.3.32" adaptive_dialog: dependency: "direct main" description: @@ -181,10 +181,10 @@ packages: dependency: "direct main" description: name: chewie - sha256: "3427e469d7cc99536ac4fbaa069b3352c21760263e65ffb4f0e1c054af43a73e" + sha256: e53da939709efb9aad0f3d72a69a8d05f889168b7a138af60ce78bab5c94b135 url: "https://pub.dev" source: hosted - version: "1.7.4" + version: "1.8.1" cli_util: dependency: transitive description: @@ -217,22 +217,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" - connectivity_plus: - dependency: "direct main" - description: - name: connectivity_plus - sha256: b74247fad72c171381dbe700ca17da24deac637ab6d43c343b42867acb95c991 - url: "https://pub.dev" - source: hosted - version: "3.0.6" - connectivity_plus_platform_interface: - dependency: transitive - description: - name: connectivity_plus_platform_interface - sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a - url: "https://pub.dev" - source: hosted - version: "1.2.4" console: dependency: transitive description: @@ -253,18 +237,26 @@ packages: dependency: "direct main" description: name: country_picker - sha256: c578292d7d3ec3132c6634f9c7aab96528f74d61fd363073d5f5a8562bede732 + sha256: "98a7cddb9413293d9aea13829120686c0a37c8854ba20088dc9f66ad28b503eb" url: "https://pub.dev" source: hosted - version: "2.0.23" + version: "2.0.25" + coverage: + dependency: transitive + description: + name: coverage + sha256: "8acabb8306b57a409bf4c83522065672ee13179297a6bb0cb9ead73948df7c76" + url: "https://pub.dev" + source: hosted + version: "1.7.2" cross_file: dependency: transitive description: name: cross_file - sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e + sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" url: "https://pub.dev" source: hosted - version: "0.3.3+8" + version: "0.3.4+1" crypto: dependency: transitive description: @@ -285,10 +277,10 @@ packages: dependency: "direct main" description: name: csv - sha256: "63ed2871dd6471193dffc52c0e6c76fb86269c00244d244297abbb355c84a86e" + sha256: c6aa2679b2a18cb57652920f674488d89712efaf4d3fdf2e537215b35fc19d6c url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.0.0" cupertino_icons: dependency: "direct main" description: @@ -301,10 +293,10 @@ packages: dependency: transitive description: name: dart_webrtc - sha256: "5897a3bdd6c7fded07e80e250260ca4c9cd61f9080911aa308b516e1206745a9" + sha256: b3a4f109c551a10170ece8fc79b5ca1b98223f24bcebc0f971d7fe35daad7a3b url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.4.4" dbus: dependency: transitive description: @@ -321,14 +313,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.3" - desktop_lifecycle: - dependency: "direct main" - description: - name: desktop_lifecycle - sha256: "221c0d1fd6582bbc28bd03f186983682d998459f3e8efde0105324a8ab350040" - url: "https://pub.dev" - source: hosted - version: "0.1.1" desktop_notifications: dependency: "direct main" description: @@ -341,10 +325,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: "0042cb3b2a76413ea5f8a2b40cec2a33e01d0c937e91f0f7c211fde4f7739ba6" + sha256: eead12d1a1ed83d8283ab4c2f3fca23ac4082f29f25f29dff0f758f57d06ec91 url: "https://pub.dev" source: hosted - version: "9.1.1" + version: "10.1.0" device_info_plus_platform_interface: dependency: transitive description: @@ -357,18 +341,18 @@ packages: dependency: "direct main" description: name: dynamic_color - sha256: a866f1f8947bfdaf674d7928e769eac7230388a2e7a2542824fad4bb5b87be3b + sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d url: "https://pub.dev" source: hosted - version: "1.6.9" + version: "1.7.0" emoji_picker_flutter: dependency: "direct main" description: name: emoji_picker_flutter - sha256: "8506341d62efd116d6fb1481450bffdbac659d3d90d46d9cc610bfae5f33cc54" + sha256: "839200a2bd1af9a65d71133a5a246dbf5b24f7e4f6f4c5390130c2e0ed5f85af" url: "https://pub.dev" source: hosted - version: "1.6.4" + version: "2.2.0" emoji_proposal: dependency: "direct main" description: @@ -420,10 +404,10 @@ packages: dependency: transitive description: name: ffi - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" file: dependency: transitive description: @@ -476,34 +460,34 @@ packages: dependency: "direct main" description: name: firebase_analytics - sha256: "0240076090d77045d757aecb090616066d23b343840d4c21074094d6fe40a184" + sha256: c56bcc7abc6caacc33e8495bc604a5861d25ce371f1b06476ae226e7cbb21d4c url: "https://pub.dev" source: hosted - version: "10.8.0" + version: "10.10.4" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: "6d9baa077d16b47ef5f19d982c4fc475597991aa53b0c601216faa3e1cdab45f" + sha256: e8cdb845820eaa5f1d29de31a72aab8addbbffc6483f1e5123a9d0b611735285 url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.10.5" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: "89a740249bce9d52a99db4e501be6087ca6749c73c47cff2b174802be10abd81" + sha256: e2fabebdf16bb99506a1e7e84f5effd6313c90678e6ea1876d301f057483a198 url: "https://pub.dev" source: hosted - version: "0.5.5+12" + version: "0.5.7+4" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "96607c0e829a581c2a483c658f04e8b159964c3bae2730f73297070bc85d40bb" + sha256: "4aef2a23d0f3265545807d68fbc2f76a6b994ca3c778d88453b99325abd63284" url: "https://pub.dev" source: hosted - version: "2.24.2" + version: "2.30.1" firebase_core_platform_interface: dependency: transitive description: @@ -516,42 +500,42 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: d585bdf3c656c3f7821ba1bd44da5f13365d22fcecaf5eb75c4295246aaa83c0 + sha256: "67f2fcc600fc78c2f731c370a3a5e6c87ee862e3a2fba6f951eca6d5dafe5c29" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.16.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: "980259425fa5e2afc03e533f33723335731d21a56fd255611083bceebf4373a8" + sha256: "73a43445a7f8c6e6327f0ec3922b1c99a9f4a0e4896197bfe10a88259f775aad" url: "https://pub.dev" source: hosted - version: "14.7.10" + version: "14.9.1" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "54e283a0e41d81d854636ad0dad73066adc53407a60a7c3189c9656e2f1b6107" + sha256: "675527aadccb679c9dfd43a4558690427123ac1e99f03eef5bbce9dc216edc91" url: "https://pub.dev" source: hosted - version: "4.5.18" + version: "4.5.34" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "90dc7ed885e90a24bb0e56d661d4d2b5f84429697fd2cbb9e5890a0ca370e6f4" + sha256: "66deff69307f54fc7a20732b4278af327ae378b86607d5ac877d8f2201fe881e" url: "https://pub.dev" source: hosted - version: "3.5.18" + version: "3.8.4" fl_chart: dependency: "direct main" description: name: fl_chart - sha256: e97c5b850ad056e9b3a85d3afeb44c239a83aa994a90723940dac82234f2efaf + sha256: "2b7c1f5d867da9a054661641c8f499c55c47c39acccb97b3bc673f5fa9a39e74" url: "https://pub.dev" source: hosted - version: "0.61.0" + version: "0.67.0" flutter: dependency: "direct main" description: flutter @@ -565,14 +549,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" - flutter_app_lock: - dependency: "direct main" - description: - name: flutter_app_lock - sha256: "98890a2a2bc507b2f85165515189750e134921f8f4022ec10bd223033633a3ba" - url: "https://pub.dev" - source: hosted - version: "3.0.0" flutter_cache_manager: dependency: "direct main" description: @@ -606,10 +582,10 @@ packages: dependency: "direct main" description: name: flutter_foreground_task - sha256: e48d2d810a2d643362e64de41146ed8e95d4dd282bae6abbb32309d9f0bf5d67 + sha256: d40a1ddd5f275450d2e32055e7f884796c028a02ac26c751c20916576f79e132 url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.2.0" flutter_highlighter: dependency: "direct main" description: @@ -710,10 +686,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: c18f1de98fe0bb9dd5ba91e1330d4febc8b6a7de6aae3ffe475ef423723e72f3 + sha256: "40e6fbd2da7dcc7ed78432c5cdab1559674b4af035fddbfb2f9a8f9c2112fcef" url: "https://pub.dev" source: hosted - version: "16.3.2" + version: "17.1.2" flutter_local_notifications_linux: dependency: transitive description: @@ -726,10 +702,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" + sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7" url: "https://pub.dev" source: hosted - version: "7.0.0+1" + version: "7.1.0" flutter_localizations: dependency: "direct main" description: flutter @@ -739,10 +715,10 @@ packages: dependency: "direct main" description: name: flutter_map - sha256: "52c65a977daae42f9aae6748418dd1535eaf27186e9bac9bf431843082bc75a3" + sha256: cda8d72135b697f519287258b5294a57ce2f2a5ebf234f0e406aad4dc14c9399 url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "6.1.0" flutter_math_fork: dependency: "direct main" description: @@ -852,10 +828,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c + sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.0.10+1" flutter_test: dependency: "direct dev" description: flutter @@ -894,10 +870,10 @@ packages: dependency: "direct main" description: name: flutter_webrtc - sha256: "577216727181cb13776a65d3e7cb33e783e740c5496335011aed4a038b28c3fe" + sha256: "63295f3aaba6e0e2520064a928fd0b79bf3636695af9c89cb219241994a45bf6" url: "https://pub.dev" source: hosted - version: "0.9.47" + version: "0.10.4" freezed_annotation: dependency: transitive description: @@ -906,6 +882,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" fuchsia_remote_debug_protocol: dependency: transitive description: flutter @@ -995,10 +979,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "07ee2436909f749d606f53521dc1725dd738dc5196e5ff815bc254253c594075" + sha256: b465e99ce64ba75e61c8c0ce3d87b66d8ac07f0b35d0a7e0263fcfc10f99e836 url: "https://pub.dev" source: hosted - version: "13.1.0" + version: "13.2.5" gradient_borders: dependency: transitive description: @@ -1051,10 +1035,18 @@ packages: dependency: "direct main" description: name: http - sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" url: "https://pub.dev" source: hosted - version: "0.13.6" + version: "1.2.1" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" http_parser: dependency: transitive description: @@ -1232,10 +1224,10 @@ packages: dependency: "direct main" description: name: just_audio - sha256: b607cd1a43bac03d85c3aaee00448ff4a589ef2a77104e3d409889ff079bf823 + sha256: b7cb6bbf3750caa924d03f432ba401ec300fd90936b3f73a9b33d58b1e96286b url: "https://pub.dev" source: hosted - version: "0.9.36" + version: "0.9.37" just_audio_platform_interface: dependency: transitive description: @@ -1273,18 +1265,18 @@ packages: dependency: "direct main" description: name: language_tool - sha256: "90ceb6f0a0b57fb3a5b88be82ffd676c90639cd06d622d25f76add30d5a2acd6" + sha256: a27c4ccff2b90647c5fa0f702d7c0c172c3d11d1a7b6c4ffc3c51ba8e7fc5a84 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" latlong2: dependency: "direct main" description: name: latlong2 - sha256: "08ef7282ba9f76e8495e49e2dc4d653015ac929dce5f92b375a415d30b407ea0" + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.9.1" leak_tracker: dependency: transitive description: @@ -1349,6 +1341,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + logger: + dependency: transitive + description: + name: logger + sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04" + url: "https://pub.dev" + source: hosted + version: "2.2.0" logging: dependency: transitive description: @@ -1397,6 +1397,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.8.0" + material_symbols_icons: + dependency: "direct main" + description: + name: material_symbols_icons + sha256: "36d4e5dd72f2fd282aca127cc4c4c29786d702cb506231ea73a5497fc324bf46" + url: "https://pub.dev" + source: hosted + version: "4.2741.0" matrix: dependency: "direct main" description: @@ -1413,14 +1421,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.7.3" - matrix_homeserver_recommendations: - dependency: "direct main" - description: - name: matrix_homeserver_recommendations - sha256: d372a7357676106897134dac67beb3ac2bb8753922fd0d808f18cf7e0574001a - url: "https://pub.dev" - source: hosted - version: "0.3.0" meta: dependency: transitive description: @@ -1469,14 +1469,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" - nm: + node_preamble: dependency: transitive description: - name: nm - sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "2.0.2" olm: dependency: transitive description: @@ -1505,10 +1505,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79" + sha256: cb44f49b6e690fa766f023d5b22cac6b9affe741dd792b6ac7ad4fabe0d7b097 url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "6.0.0" package_info_plus_platform_interface: dependency: transitive description: @@ -1521,10 +1521,10 @@ packages: dependency: transitive description: name: pana - sha256: "098eecfb7f80aecfff2395f9de1f19e31e7dc9a190708b75a1e708e6c2993c36" + sha256: "3fc3fe8e7a9fd4827fa4d625a423eec95d305b2bc3538a3adf7fd6c49217af97" url: "https://pub.dev" source: hosted - version: "0.21.32" + version: "0.21.45" pasteboard: dependency: "direct main" description: @@ -1705,10 +1705,10 @@ packages: dependency: transitive description: name: pointer_interceptor_web - sha256: "9386e064097fd16419e935c23f08f35b58e6aaec155dd39bd6a003b88f9c14b4" + sha256: a6237528b46c411d8d55cdfad8fcb3269fc4cbb26060b14bff94879165887d1e url: "https://pub.dev" source: hosted - version: "0.10.1+2" + version: "0.10.2" pointycastle: dependency: transitive description: @@ -1725,6 +1725,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" pretty_qr_code: dependency: "direct main" description: @@ -1753,10 +1761,10 @@ packages: dependency: "direct main" description: name: provider - sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.1.2" pub_semver: dependency: transitive description: @@ -1785,10 +1793,10 @@ packages: dependency: "direct main" description: name: purchases_flutter - sha256: "3e1444a87a11b82322ec2bd0f1af3eb0d3431717f1a93cbd4f823e192b5c891f" + sha256: "4ff3a62a685cd964590d2c8126be62c3ede3657a5421adf558fd95f01699643a" url: "https://pub.dev" source: hosted - version: "5.8.0" + version: "6.29.0" qr: dependency: transitive description: @@ -1833,58 +1841,50 @@ packages: dependency: "direct main" description: name: record - sha256: "5c8e12c692a4800b33f5f8b6c821ea083b12bfdbd031b36ba9322c40a4eeecc9" + sha256: f703397f5a60d9b2b655b3acc94ba079b2d9a67dc0725bdb90ef2fee2441ebf7 url: "https://pub.dev" source: hosted - version: "5.0.4" - record_android: - dependency: transitive - description: - name: record_android - sha256: "805ecaa232a671aff2ee9ec4730ef6addb97c548d2db6b1fbd5197f1d4f47a5a" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - record_darwin: - dependency: transitive - description: - name: record_darwin - sha256: ee8cb1bb1712d7ce38140ecabe70e5c286c02f05296d66043bee865ace7eb1b9 - url: "https://pub.dev" - source: hosted - version: "1.0.1" + version: "4.4.4" record_linux: dependency: transitive description: name: record_linux - sha256: "7d0e70cd51635128fe9d37d89bafd6011d7cbba9af8dc323079ae60f23546aef" + sha256: "348db92c4ec1b67b1b85d791381c8c99d7c6908de141e7c9edc20dad399b15ce" url: "https://pub.dev" source: hosted - version: "0.7.1" + version: "0.4.1" + record_macos: + dependency: transitive + description: + name: record_macos + sha256: d1d0199d1395f05e218207e8cacd03eb9dc9e256ddfe2cfcbbb90e8edea06057 + url: "https://pub.dev" + source: hosted + version: "0.2.2" record_platform_interface: dependency: transitive description: name: record_platform_interface - sha256: "3a4b56e94ecd2a0b2b43eb1fa6f94c5b8484334f5d38ef43959c4bf97fb374cf" + sha256: "7a2d4ce7ac3752505157e416e4e0d666a54b1d5d8601701b7e7e5e30bec181b4" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "0.5.0" record_web: dependency: transitive description: name: record_web - sha256: "24847cdbcf999f7a5762170792f622ac844858766becd0f2370ec8ae22f7526e" + sha256: "219ffb4ca59b4338117857db56d3ffadbde3169bcaf1136f5f4d4656f4a2372d" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "0.5.0" record_windows: dependency: transitive description: name: record_windows - sha256: "39998b3ea7d8d28b04159d82220e6e5e32a7c357c6fb2794f5736beea272f6c3" + sha256: "42d545155a26b20d74f5107648dbb3382dbbc84dc3f1adc767040359e57a1345" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "0.7.1" remove_emoji: dependency: transitive description: @@ -1945,34 +1945,34 @@ packages: dependency: transitive description: name: sentry - sha256: "89e426587b0879e53c46a0aae0eb312696d9d2d803ba14b252a65cc24b1416a2" + sha256: e572d33a3ff1d69549f33ee828a8ff514047d43ca8eea4ab093d72461205aa3e url: "https://pub.dev" source: hosted - version: "7.14.0" + version: "7.20.1" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: fd089ee4e75a927be037c56815a0a54af5a519f52b803a5ffecb589bb36e2401 + sha256: ac8cf6bb849f3560353ae33672e17b2713809a4e8de0d3cf372e9e9c42013757 url: "https://pub.dev" source: hosted - version: "7.14.0" + version: "7.20.1" share_plus: dependency: "direct main" description: name: share_plus - sha256: f74fc3f1cbd99f39760182e176802f693fa0ec9625c045561cfad54681ea93dd + sha256: fb5319f3aab4c5dda5ebb92dca978179ba21f8c783ee4380910ef4c1c6824f51 url: "https://pub.dev" source: hosted - version: "7.2.1" + version: "8.0.3" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 + sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.0" shared_preferences: dependency: "direct main" description: @@ -2017,10 +2017,10 @@ packages: dependency: transitive description: name: shared_preferences_web - sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.0" shared_preferences_windows: dependency: transitive description: @@ -2029,6 +2029,38 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + url: "https://pub.dev" + source: hosted + version: "1.1.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" shimmer: dependency: "direct main" description: @@ -2050,6 +2082,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" source_span: dependency: transitive description: @@ -2070,18 +2118,18 @@ packages: dependency: transitive description: name: sqflite_common - sha256: "76db4d324c8cbb16ca5b60ad2f3d25cec953107c93ae65aafa480d3e6fb69f14" + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.dev" source: hosted - version: "2.5.2-1" + version: "2.5.4" sqflite_common_ffi: dependency: "direct main" description: name: sqflite_common_ffi - sha256: "35d2fce1e971707c227cc4775cc017d5eafe06c2654c3435ebd5c3ad6c170f5f" + sha256: "4d6137c29e930d6e4a8ff373989dd9de7bac12e3bc87bce950f6e844e8ad3bb5" url: "https://pub.dev" source: hosted - version: "2.3.0+4" + version: "2.3.3" sqlcipher_flutter_libs: dependency: "direct main" description: @@ -2150,34 +2198,26 @@ packages: dependency: transitive description: name: syncfusion_flutter_core - sha256: a2427697bfad5b611db78ea4c4daef82d3350b83c729a8dc37959662a31547f9 + sha256: fc61878342caee6da7979ca0ca9bb178f1eb5ca9b836dada34b83caa39e4bfed url: "https://pub.dev" source: hosted - version: "23.2.7" - syncfusion_flutter_datepicker: - dependency: "direct main" - description: - name: syncfusion_flutter_datepicker - sha256: b3340a7786f674d18bd22c226358648985e7631734dfc4aae09fdcfb71c09156 - url: "https://pub.dev" - source: hosted - version: "23.2.7" + version: "25.1.42" syncfusion_flutter_xlsio: dependency: "direct main" description: name: syncfusion_flutter_xlsio - sha256: "84c771ce3684820e930d27604e801991efaa0e7a72ee1df4ba4c843258f16285" + sha256: "92e37c48fcbf20d87d5f7355d9434b004772bd9d9813c2243a48bce3b6a9e8a9" url: "https://pub.dev" source: hosted - version: "23.2.7" + version: "25.1.42" syncfusion_officecore: dependency: transitive description: name: syncfusion_officecore - sha256: a037c8a72748332ba28723eaed2fd1656b9acdaf03c23c6a08e87f7c31dbed18 + sha256: b9115cebc37a452f97ab80de17fdafb7b0cedc4b38e90e588871c47d4fb9e91d url: "https://pub.dev" source: hosted - version: "23.2.7" + version: "25.1.42" synchronized: dependency: transitive description: @@ -2190,10 +2230,10 @@ packages: dependency: transitive description: name: tar - sha256: "85ffd53e277f2bac8afa2885e6b195e26937e9c402424c3d88d92fd920b56de9" + sha256: aca91e93ff9ff2dba4462c6eea6bc260b72f0d7010e748e3397c32190529bd6e url: "https://pub.dev" source: hosted - version: "0.5.6" + version: "1.0.4" term_glyph: dependency: transitive description: @@ -2202,6 +2242,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" + test: + dependency: transitive + description: + name: test + sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f + url: "https://pub.dev" + source: hosted + version: "1.24.9" test_api: dependency: transitive description: @@ -2210,6 +2258,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.1" + test_core: + dependency: transitive + description: + name: test_core + sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a + url: "https://pub.dev" + source: hosted + version: "0.5.9" timezone: dependency: transitive description: @@ -2342,10 +2398,10 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: d25bb0ca00432a5e1ee40e69c36c85863addf7cc45e433769d61bed3fe81fd96 + sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" url: "https://pub.dev" source: hosted - version: "6.2.3" + version: "6.2.6" url_launcher_android: dependency: transitive description: @@ -2390,10 +2446,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b + sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.1" url_launcher_windows: dependency: transitive description: @@ -2414,26 +2470,26 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "18f6690295af52d081f6808f2f7c69f0eed6d7e23a71539d75f4aeb8f0062172" + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" url: "https://pub.dev" source: hosted - version: "1.1.9+2" + version: "1.1.11+1" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "531d20465c10dfac7f5cd90b60bbe4dd9921f1ec4ca54c83ebb176dbacb7bb2d" + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da url: "https://pub.dev" source: hosted - version: "1.1.9+2" + version: "1.1.11+1" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "03012b0a33775c5530576b70240308080e1d5050f0faf000118c20e6463bc0ad" + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" url: "https://pub.dev" source: hosted - version: "1.1.9+2" + version: "1.1.11+1" vector_math: dependency: transitive description: @@ -2442,14 +2498,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - vibration: - dependency: "direct main" - description: - name: vibration - sha256: "778ace40e84852e6cf6017cdbaf6790a837d73ff3dd50b27da9ac232a19de8fc" - url: "https://pub.dev" - source: hosted - version: "1.8.4" video_compress: dependency: "direct main" description: @@ -2462,10 +2510,10 @@ packages: dependency: "direct main" description: name: video_player - sha256: fbf28ce8bcfe709ad91b5789166c832cb7a684d14f571a81891858fefb5bb1c2 + sha256: db6a72d8f4fd155d0189845678f55ad2fd54b02c10dcafd11c068dbb631286c0 url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.8.6" video_player_android: dependency: transitive description: @@ -2514,39 +2562,22 @@ packages: url: "https://pub.dev" source: hosted version: "13.0.0" - wakelock_platform_interface: - dependency: transitive - description: - name: wakelock_platform_interface - sha256: "1f4aeb81fb592b863da83d2d0f7b8196067451e4df91046c26b54a403f9de621" - url: "https://pub.dev" - source: hosted - version: "0.3.0" wakelock_plus: dependency: "direct main" description: name: wakelock_plus - sha256: f268ca2116db22e57577fb99d52515a24bdc1d570f12ac18bb762361d43b043d + sha256: "14758533319a462ffb5aa3b7ddb198e59b29ac3b02da14173a1715d65d4e6e68" url: "https://pub.dev" source: hosted - version: "1.1.4" + version: "1.2.5" wakelock_plus_platform_interface: dependency: transitive description: name: wakelock_plus_platform_interface - sha256: "40fabed5da06caff0796dc638e1f07ee395fb18801fbff3255a2372db2d80385" + sha256: "422d1cdbb448079a8a62a5a770b69baa489f8f7ca21aef47800c726d404f9d16" url: "https://pub.dev" source: hosted - version: "1.1.0" - wakelock_windows: - dependency: "direct overridden" - description: - path: wakelock_windows - ref: main - resolved-ref: f3610d6c246098fee74463de09434ed81fc2a7c8 - url: "https://github.com/chandrabezzo/wakelock.git" - source: git - version: "0.2.2" + version: "1.2.1" watcher: dependency: transitive description: @@ -2559,10 +2590,18 @@ packages: dependency: transitive description: name: web - sha256: edc8a9573dd8c5a83a183dae1af2b6fd4131377404706ca4e5420474784906fa + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" url: "https://pub.dev" source: hosted - version: "0.4.0" + version: "0.5.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + url: "https://pub.dev" + source: hosted + version: "2.4.5" webdriver: dependency: transitive description: @@ -2571,22 +2610,30 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" webrtc_interface: dependency: "direct main" description: name: webrtc_interface - sha256: "2efbd3e4e5ebeb2914253bcc51dafd3053c4b87b43f3076c74835a9deecbae3a" + sha256: abec3ab7956bd5ac539cf34a42fa0c82ea26675847c0966bb85160400eea9388 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.0" win32: dependency: transitive description: name: win32 - sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "5.5.0" win32_registry: dependency: transitive description: @@ -2636,5 +2683,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.19.3" diff --git a/pubspec.yaml b/pubspec.yaml index 54cf24972..fbb9c0d7b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -56,7 +56,7 @@ dependencies: git: https://github.com/krille-chan/flutter_shortcuts.git flutter_typeahead: ^5.2.0 flutter_web_auth_2: ^3.1.1 - flutter_webrtc: ^0.9.46 + flutter_webrtc: ^0.10.3 future_loading_dialog: ^0.3.0 geolocator: ^7.6.2 go_router: ^13.2.2 @@ -82,7 +82,7 @@ dependencies: provider: ^6.0.2 punycode: ^1.0.0 qr_code_scanner: ^1.0.1 - receive_sharing_intent: ^1.4.5 + receive_sharing_intent: 1.4.5 # Update needs more work record: 4.4.4 # Upgrade to 5 currently breaks playing on iOS scroll_to_index: ^3.0.1 share_plus: ^8.0.2 @@ -115,6 +115,7 @@ dependencies: in_app_purchase: ^3.1.13 jwt_decode: ^0.3.1 language_tool: ^2.2.0 + material_symbols_icons: ^4.2741.0 open_file: ^3.3.2 purchases_flutter: ^6.26.0 sentry_flutter: ^7.19.0