diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 17575393..5f0c70a1 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -1,6 +1,6 @@ { "@@locale": "de", - "@@last_modified": "2021-06-29T19:15:43+02:00", + "@@last_modified": "2021-07-05T21:26:10+02:00", "tooltipRejectContactRequest": "Reject this contact request", "tooltipAcceptContactRequest": "Accept this contact request.", "notificationNewMessageFromGroup": "Neue Nachricht in einer Gruppe!", @@ -42,16 +42,10 @@ "tooltipAddContact": "Neuen Kontakt oder Unterhaltung hinzufügen", "titleManageContacts": "Unterhaltungen", "titleManageServers": "Server verwalten", - "dateMonthsAgo": "Months Ago", "dateNever": "Nie", - "dateYearsAgo": "X Years Ago (displayed next to a contact row to indicate time of last action)", "dateLastYear": "Letzes Jahr", "dateYesterday": "Gestern", "dateLastMonth": "Letzter Monat", - "dateWeeksAgo": "Weeks Ago", - "dateDaysAgo": "Days Ago", - "dateHoursAgo": "Hours Ago", - "dateMinutesAgo": "Minutes Ago", "dateRightNow": "Jetzt", "successfullAddedContact": "Erfolgreich hinzugefügt", "descriptionBlockUnknownConnections": "Falls aktiviert, wird diese Einstellung alle Verbindungen von Cwtch Usern autmoatisch schliessen, wenn sie nicht in deinen Kontakten sind.", diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 7d6a2fac..208e19f7 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1,6 +1,6 @@ { "@@locale": "en", - "@@last_modified": "2021-06-29T19:15:43+02:00", + "@@last_modified": "2021-07-05T21:26:10+02:00", "tooltipRejectContactRequest": "Reject this contact request", "tooltipAcceptContactRequest": "Accept this contact request.", "notificationNewMessageFromGroup": "New message in a group!", @@ -42,16 +42,10 @@ "tooltipAddContact": "Add a new contact or conversation", "titleManageContacts": "Conversations", "titleManageServers": "Manage Servers", - "dateMonthsAgo": "Months Ago", "dateNever": "Never", - "dateYearsAgo": "X Years Ago (displayed next to a contact row to indicate time of last action)", "dateLastYear": "Last Year", "dateYesterday": "Yesterday", "dateLastMonth": "Last Month", - "dateWeeksAgo": "Weeks Ago", - "dateDaysAgo": "Days Ago", - "dateHoursAgo": "Hours Ago", - "dateMinutesAgo": "Minutes Ago", "dateRightNow": "Right Now", "successfullAddedContact": "Successfully added ", "descriptionBlockUnknownConnections": "If turned on, this option will automatically close connections from Cwtch users that have not been added to your contact list.", diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index 9046ba26..f5b3f7cd 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -1,6 +1,6 @@ { "@@locale": "es", - "@@last_modified": "2021-06-29T19:15:43+02:00", + "@@last_modified": "2021-07-05T21:26:10+02:00", "tooltipRejectContactRequest": "Reject this contact request", "tooltipAcceptContactRequest": "Accept this contact request.", "notificationNewMessageFromGroup": "New message in a group!", @@ -42,16 +42,10 @@ "tooltipAddContact": "Add a new contact or conversation", "titleManageContacts": "Conversations", "titleManageServers": "Manage Servers", - "dateMonthsAgo": "Months Ago", "dateNever": "Never", - "dateYearsAgo": "X Years Ago (displayed next to a contact row to indicate time of last action)", "dateLastYear": "Last Year", "dateYesterday": "Yesterday", "dateLastMonth": "Last Month", - "dateWeeksAgo": "Weeks Ago", - "dateDaysAgo": "Days Ago", - "dateHoursAgo": "Hours Ago", - "dateMinutesAgo": "Minutes Ago", "dateRightNow": "Right Now", "successfullAddedContact": "Successfully added ", "descriptionBlockUnknownConnections": "If turned on, this option will automatically close connections from Cwtch users that have not been added to your contact list.", diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index a08e85e1..39b89c1b 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -1,18 +1,18 @@ { "@@locale": "fr", - "@@last_modified": "2021-06-29T19:15:43+02:00", - "tooltipRejectContactRequest": "Reject this contact request", - "tooltipAcceptContactRequest": "Accept this contact request.", + "@@last_modified": "2021-07-05T21:26:10+02:00", + "tooltipRejectContactRequest": "Refuser cette demande de contact", + "tooltipAcceptContactRequest": "Acceptez cette demande de contact.", "notificationNewMessageFromGroup": "Nouveau message dans un groupe !", "notificationNewMessageFromPeer": "Nouveau message d'un contact !", "tooltipHidePassword": "Masquer le mot de passe", "tooltipShowPassword": "Afficher le mot de passe", "serverNotSynced": "Synchronisation des nouveaux messages (Cela peut prendre un certain temps)...", "groupInviteSettingsWarning": "Vous avez été invité à rejoindre un groupe ! Veuillez activer l'expérience de discussion de groupe dans les paramètres pour afficher cette invitation.", - "shutdownCwtchAction": "Arrêt Cwtch", + "shutdownCwtchAction": "Arrêt de Cwtch", "shutdownCwtchDialog": "Êtes-vous sûr de vouloir arrêter Cwtch ? Ceci fermera toutes les connexions, et quittera l'application.", "shutdownCwtchDialogTitle": "Arrêter Cwtch ?", - "shutdownCwtchTooltip": "Arrêt Cwtch", + "shutdownCwtchTooltip": "Arrêt de Cwtch", "malformedMessage": "Message mal formé", "profileDeleteSuccess": "Le profil a été supprimé avec succès", "debugLog": "Activer le journal de la console de débogage", @@ -42,16 +42,10 @@ "tooltipAddContact": "Ajouter un nouveau contact ou une nouvelle conversation", "titleManageContacts": "Conversations", "titleManageServers": "Gérer les serveurs", - "dateMonthsAgo": "Il y a plusieurs mois", "dateNever": "Jamais", - "dateYearsAgo": "Il y a X ans (affiché à côté d'une ligne de contact pour indiquer l'heure de la dernière action)", "dateLastYear": "L'année dernière", "dateYesterday": "Hier", "dateLastMonth": "Le mois dernier", - "dateWeeksAgo": "Il y a quelques semaines", - "dateDaysAgo": "Il y a quelques jours", - "dateHoursAgo": "Il y a quelques heures", - "dateMinutesAgo": "Il y a quelques minutes", "dateRightNow": "Maintenant", "successfullAddedContact": "Ajouté avec succès ", "descriptionBlockUnknownConnections": "Si elle est activée, cette option fermera automatiquement les connexions des utilisateurs de Cwtch qui n'ont pas été ajoutés à votre liste de contacts.", @@ -66,7 +60,7 @@ "enterCurrentPasswordForDelete": "Veuillez entrer le mot de passe actuel pour supprimer ce profil.", "enableGroups": "Activer la discussion de groupe", "experimentsEnabled": "Activer les expériences", - "localeIt": "Italienne", + "localeIt": "Italien", "localeEs": "Espagnol", "addListItem": "Ajouter un nouvel élément de liste", "addNewItem": "Ajouter un nouvel élément à la liste", @@ -80,9 +74,9 @@ "loadingTor": "Chargement de tor...", "smallTextLabel": "Petit", "defaultScalingText": "Taille par défaut du texte (échelle:", - "builddate": "Construit sur : 2%", - "version": "Version 1%", - "versionTor": "Version 1% avec tor 2%", + "builddate": "Construit le : %2", + "version": "Version %1", + "versionTor": "Version %1 avec tor %2", "themeDark": "Sombre", "themeLight": "Clair", "settingTheme": "Thème", @@ -94,8 +88,8 @@ "localeEn": "Anglais", "settingLanguage": "Langue", "blockUnknownLabel": "Bloquer les pairs inconnus", - "zoomLabel": "Interface zoom (essentiellement la taille du texte et des composants de l'interface)", - "versionBuilddate": "Version 1% avec tor 2%", + "zoomLabel": "Zoom de l'interface (affecte principalement la taille du texte et des boutons)", + "versionBuilddate": "Version : %1 Construite le : %2", "cwtchSettingsTitle": "Préférences Cwtch", "unlock": "Déverrouiller", "yourServers": "Vos serveurs", @@ -105,7 +99,7 @@ "enterProfilePassword": "Entrez un mot de passe pour consulter vos profils", "addNewProfileBtn": "Ajouter un nouveau profil", "deleteConfirmText": "SUPPRIMER", - "deleteProfileConfirmBtn": "Vraiment supprimer le profil", + "deleteProfileConfirmBtn": "Supprimer vraiment le profil ?", "deleteConfirmLabel": "Tapez SUPPRIMER pour confirmer", "deleteProfileBtn": "Supprimer le profil", "passwordChangeError": "Erreur lors de la modification du mot de passe : le mot de passe fourni est rejeté", @@ -129,7 +123,7 @@ "profileName": "Pseudo", "editProfileTitle": "Modifier le profil", "addProfileTitle": "Ajouter un nouveau profil", - "deleteBtn": "Effacer", + "deleteBtn": "Supprimer", "unblockBtn": "Débloquer le pair", "dontSavePeerHistory": "Supprimer l'historique des pairs", "savePeerHistoryDescription": "Détermine s'il faut ou non supprimer tout historique associé au pair.", @@ -150,16 +144,16 @@ "peerOfflineMessage": "Le pair est hors ligne, les messages ne peuvent pas être remis pour le moment", "peerBlockedMessage": "Le pair est bloqué", "pendingLabel": "En attente", - "acknowledgedLabel": "Confirmé", + "acknowledgedLabel": "Accusé de réception", "couldNotSendMsgError": "Impossible d'envoyer ce message", "dmTooltip": "Envoyer un message privé", - "membershipDescription": "Liste des utilisateurs ayant envoyés un ou plusieurs messages au groupe. Cette liste peut ne pas être representatives de l'ensemble des membres du groupe.", + "membershipDescription": "Liste des utilisateurs ayant envoyés un ou plusieurs messages au groupe. Cette liste peut ne pas être représentatives de l'ensemble des membres du groupe.", "addListItemBtn": "Ajouter un élément", "peerNotOnline": "Le pair est hors ligne, les messages ne peuvent pas être remis pour le moment", "searchList": "Liste de recherche", "update": "Mise à jour", "inviteBtn": "Invitation", - "inviteToGroupLabel": "Inviter quelqu'un", + "inviteToGroupLabel": "Inviter au groupe", "groupNameLabel": "Nom du groupe", "viewServerInfo": "Informations sur le serveur", "serverSynced": "Synchronisé", @@ -192,6 +186,6 @@ "createGroupTab": "Créer un groupe", "addPeerTab": "Ajouter un pair", "createGroupBtn": "Créer", - "defaultGroupName": "Un super groupe", + "defaultGroupName": "Un groupe génial", "createGroupTitle": "Créer un groupe" } \ No newline at end of file diff --git a/lib/l10n/intl_it.arb b/lib/l10n/intl_it.arb index d4300a5b..8d95c3da 100644 --- a/lib/l10n/intl_it.arb +++ b/lib/l10n/intl_it.arb @@ -1,71 +1,65 @@ { "@@locale": "it", - "@@last_modified": "2021-06-29T19:15:43+02:00", - "tooltipRejectContactRequest": "Reject this contact request", - "tooltipAcceptContactRequest": "Accept this contact request.", - "notificationNewMessageFromGroup": "New message in a group!", - "notificationNewMessageFromPeer": "New message from a contact!", - "tooltipHidePassword": "Hide Password", - "tooltipShowPassword": "Show Password", - "serverNotSynced": "Non sincronizzato", - "groupInviteSettingsWarning": "You have been invited to join a group! Please enable the Group Chat Experiment in Settings to view this Invitation.", - "shutdownCwtchAction": "Shutdown Cwtch", - "shutdownCwtchDialog": "Are you sure you want to shutdown Cwtch? This will close all connections, and exit the application.", - "shutdownCwtchDialogTitle": "Shutdown Cwtch?", - "shutdownCwtchTooltip": "Shutdown Cwtch", - "malformedMessage": "Malformed message", - "profileDeleteSuccess": "Successfully deleted profile", - "debugLog": "Turn on console debug logging", - "torNetworkStatus": "Tor network status", - "addContactFirst": "Add or pick a contact to begin chatting.", - "createProfileToBegin": "Please create or unlock a profile to begin", - "nickChangeSuccess": "Profile nickname changed successfully", - "addServerFirst": "You need to add a server before you can create a group", - "deleteProfileSuccess": "Successfully deleted profile", - "sendInvite": "Send a contact or group invite", - "sendMessage": "Send Message", - "cancel": "Cancel", - "resetTor": "Reset", - "torStatus": "Tor Status", - "torVersion": "Tor Version", - "sendAnInvitation": "You sent an invitation for: ", - "contactSuggestion": "This is a contact suggestion for: ", - "rejected": "Rejected!", - "accepted": "Accepted!", - "chatHistoryDefault": "This conversation will be deleted when Cwtch is closed! Message history can be enabled per-conversation via the Settings menu in the upper right.", - "newPassword": "New Password", - "yesLeave": "Yes, Leave This Conversation", - "reallyLeaveThisGroupPrompt": "Are you sure you want to leave this conversation? All messages and attributes will be deleted.", - "leaveGroup": "Leave This Conversation", - "inviteToGroup": "You have been invited to join a group:", - "pasteAddressToAddContact": "... incolla qui un indirizzo per aggiungere un contatto...", - "tooltipAddContact": "Add a new contact or conversation", - "titleManageContacts": "Conversations", - "titleManageServers": "Manage Servers", - "dateMonthsAgo": "Months Ago", - "dateNever": "Never", - "dateYearsAgo": "X Years Ago (displayed next to a contact row to indicate time of last action)", - "dateLastYear": "Last Year", - "dateYesterday": "Yesterday", - "dateLastMonth": "Last Month", - "dateWeeksAgo": "Weeks Ago", - "dateDaysAgo": "Days Ago", - "dateHoursAgo": "Hours Ago", - "dateMinutesAgo": "Minutes Ago", - "dateRightNow": "Right Now", - "successfullAddedContact": "Successfully added ", - "descriptionBlockUnknownConnections": "If turned on, this option will automatically close connections from Cwtch users that have not been added to your contact list.", - "descriptionExperimentsGroups": "The group experiment allows Cwtch to connect with untrusted server infrastructure to facilitate communication with more than one contact.", - "descriptionExperiments": "Cwtch experiments are optional, opt-in features that add additional functionality to Cwtch that may have different privacy considerations than traditional 1:1 metadata resistant chat e.g. group chat, bot integration etc.", - "titleManageProfiles": "Manage Cwtch Profiles", - "tooltipUnlockProfiles": "Unlock encrypted profiles by entering their password.", - "tooltipOpenSettings": "Open the settings pane", - "invalidImportString": "Invalid import string", - "contactAlreadyExists": "Contact Already Exists", - "conversationSettings": "Conversation Settings", - "enterCurrentPasswordForDelete": "Please enter current password to delete this profile.", - "enableGroups": "Enable Group Chat", - "experimentsEnabled": "Esperimenti abilitati", + "@@last_modified": "2021-07-05T21:26:10+02:00", + "tooltipRejectContactRequest": "Rifiuta questa richiesta di contatto", + "tooltipAcceptContactRequest": "Accetta questa richiesta di contatto.", + "notificationNewMessageFromGroup": "Nuovo messaggio in un gruppo!", + "notificationNewMessageFromPeer": "Nuovo messaggio da un contatto!", + "tooltipHidePassword": "Nascondi la password", + "tooltipShowPassword": "Mostra la password", + "serverNotSynced": "Sincronizzazione nuovi messaggi (l'operazione può richiedere del tempo)...", + "groupInviteSettingsWarning": "Sei stato invitato ad unirti ad un gruppo! Abilita l'Esperimento di chat di gruppo in Impostazioni per visualizzare questo Invito.", + "shutdownCwtchAction": "Chiudi Cwtch", + "shutdownCwtchDialog": "Sei sicuro di voler chiudere Cwtch? Questo chiuderà tutte le connessioni e uscirà dall'applicazione.", + "shutdownCwtchDialogTitle": "Chiudi Cwtch?", + "shutdownCwtchTooltip": "Chiudi Cwtch", + "malformedMessage": "Messaggio non valido", + "profileDeleteSuccess": "Profilo eliminato con successo", + "debugLog": "Attiva la registrazione del debug della console", + "torNetworkStatus": "Stato della rete Tor", + "addContactFirst": "Aggiungi o scegli un contatto per iniziare a chattare.", + "createProfileToBegin": "Crea o sblocca un profilo per iniziare", + "nickChangeSuccess": "Nickname del profilo modificato con successo", + "addServerFirst": "È necessario aggiungere un server prima di poter creare un gruppo", + "deleteProfileSuccess": "Profilo eliminato con successo", + "sendInvite": "Invia un invito a un contatto o a un gruppo", + "sendMessage": "Invia messaggio", + "cancel": "Annulla", + "resetTor": "Resettare", + "torStatus": "Stato di Tor", + "torVersion": "Versione di Tor", + "sendAnInvitation": "Hai inviato un invito per:", + "contactSuggestion": "Questo è un suggerimento di contatto per:", + "rejected": "Rifiutato!", + "accepted": "Accettato!", + "chatHistoryDefault": "Questa conversazione sarà cancellata quando Cwtch sarà chiuso! La cronologia dei messaggi può essere abilitata per ogni conversazione tramite il menu Impostazioni in alto a destra.", + "newPassword": "Nuova password", + "yesLeave": "Sì, lascia questa conversazione", + "reallyLeaveThisGroupPrompt": "Uscire da questa conversazione? Tutti i messaggi e gli attributi verranno eliminati.", + "leaveGroup": "Lascia questa conversazione", + "inviteToGroup": "Hai ricevuto un invito a unirti a un gruppo:", + "pasteAddressToAddContact": "Incolla qui un indirizzo cwtch, un invito o un mazzo di chiavi per aggiungere una nuova conversazione", + "tooltipAddContact": "Aggiungi un nuovo contatto o conversazione", + "titleManageContacts": "Conversazioni", + "titleManageServers": "Gestisci i server", + "dateNever": "Mai", + "dateLastYear": "L'anno scorso", + "dateYesterday": "Ieri", + "dateLastMonth": "Mese scorso", + "dateRightNow": "Ora", + "successfullAddedContact": "Aggiunto con successo ", + "descriptionBlockUnknownConnections": "Se attivata, questa opzione chiuderà automaticamente le connessioni degli utenti Cwtch che non sono stati aggiunti alla tua lista di contatti.", + "descriptionExperimentsGroups": "L'esperimento di gruppo permette a Cwtch di connettersi con un'infrastruttura server non fidata per facilitare la comunicazione con più di un contatto.", + "descriptionExperiments": "Gli esperimenti di Cwtch sono opzioni a scelta che aggiungono a Cwtch funzionalità che possono avere diverse considerazioni sulla privacy rispetto alla tradizionale chat 1:1 resistente ai metadati, ad esempio chat di gruppo, integrazione di bot ecc.", + "titleManageProfiles": "Gestisci i profili Cwtch", + "tooltipUnlockProfiles": "Sblocca i profili crittografati inserendo la loro password.", + "tooltipOpenSettings": "Aprire il pannello delle impostazioni", + "invalidImportString": "Importazione stringa non valida", + "contactAlreadyExists": "Il contatto esiste già", + "conversationSettings": "Impostazioni di conversazione", + "enterCurrentPasswordForDelete": "Inserisci la password attuale per eliminare questo profilo.", + "enableGroups": "Abilita la chat di gruppo", + "experimentsEnabled": "Abilita esperimenti", "localeIt": "Italiano", "localeEs": "Spagnolo", "addListItem": "Aggiungi un nuovo elemento alla lista", diff --git a/lib/widgets/quotedmessage.dart b/lib/widgets/quotedmessage.dart new file mode 100644 index 00000000..a0cba993 --- /dev/null +++ b/lib/widgets/quotedmessage.dart @@ -0,0 +1,89 @@ +import 'package:cwtch/widgets/malformedbubble.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../model.dart'; +import 'package:intl/intl.dart'; + +import '../settings.dart'; +import 'messagebubbledecorations.dart'; + +class QuotedMessageBubble extends StatefulWidget { + @override + QuotedMessageBubbleState createState() => QuotedMessageBubbleState(); +} + +class QuotedMessageBubbleState extends State { + FocusNode _focus = FocusNode(); + + @override + Widget build(BuildContext context) { + var fromMe = Provider.of(context).senderOnion == Provider.of(context).onion; + var prettyDate = ""; + var borderRadiousEh = 15.0; + var myKey = Provider.of(context).profileOnion + "::" + Provider.of(context).contactHandle + "::" + Provider.of(context).messageIndex.toString(); + + if (Provider.of(context).timestamp != null) { + // user-configurable timestamps prolly ideal? #todo + DateTime messageDate = Provider.of(context).timestamp; + prettyDate = DateFormat.yMd().add_jm().format(messageDate.toLocal()); + } + + // If the sender is not us, then we want to give them a nickname... + var senderDisplayStr = ""; + if (!fromMe && Provider.of(context).senderOnion != null) { + ContactInfoState? contact = Provider.of(context).contactList.getContact(Provider.of(context).senderOnion); + if (contact != null) { + senderDisplayStr = contact.nickname; + } else { + senderDisplayStr = Provider.of(context).senderOnion; + } + } + var wdgSender = SelectableText(senderDisplayStr, + style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor())); + + var wdgMessage = SelectableText( + (Provider.of(context).message ?? "") + '\u202F', + key: Key(myKey), + focusNode: _focus, + style: TextStyle( + color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor(), + ), + textAlign: TextAlign.left, + textWidthBasis: TextWidthBasis.longestLine, + ); + + var wdgDecorations = MessageBubbleDecoration(ackd: Provider.of(context).ackd, errored: Provider.of(context).error, fromMe: fromMe, prettyDate: prettyDate); + + var error = Provider.of(context).error; + + return LayoutBuilder(builder: (context, constraints) { + //print(constraints.toString()+", "+constraints.maxWidth.toString()); + return RepaintBoundary( + child: Container( + child: Container( + decoration: BoxDecoration( + color: error + ? malformedColor + : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor()), + border: Border.all( + color: error + ? malformedColor + : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor()), + width: 1), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(borderRadiousEh), + topRight: Radius.circular(borderRadiousEh), + bottomLeft: fromMe ? Radius.circular(borderRadiousEh) : Radius.zero, + bottomRight: fromMe ? Radius.zero : Radius.circular(borderRadiousEh), + ), + ), + child: Padding( + padding: EdgeInsets.all(9.0), + child: Column( + crossAxisAlignment: fromMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, + mainAxisAlignment: fromMe ? MainAxisAlignment.end : MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: fromMe ? [wdgMessage, wdgDecorations] : [wdgSender, wdgMessage, wdgDecorations]))))); + }); + } +}