diff --git a/Linphone/core/account/AccountDeviceList.cpp b/Linphone/core/account/AccountDeviceList.cpp index a576e31a1..42447ce88 100644 --- a/Linphone/core/account/AccountDeviceList.cpp +++ b/Linphone/core/account/AccountDeviceList.cpp @@ -76,9 +76,7 @@ void AccountDeviceList::setAccount(const QSharedPointer &accountCor void AccountDeviceList::refreshDevices() { mustBeInMainThread(log().arg(Q_FUNC_INFO)); - beginResetModel(); - clearData(); - endResetModel(); + resetData(); if (mAccountCore) { auto requestDeviceList = [this] { if (!mAccountManagerServicesModelConnection) return; @@ -150,14 +148,14 @@ void AccountDeviceList::setSelf(QSharedPointer me) { &AccountManagerServicesModel::requestError, [this](const std::shared_ptr &request, int statusCode, const std::string &errorMessage, - const std::shared_ptr ¶meterErrors) { - lDebug() << "REQUEST ERROR" << errorMessage << "/" << int(request->getType()); - QString message = QString::fromStdString(errorMessage); - if (request->getType() == linphone::AccountManagerServicesRequest::Type::GetDevicesList) { - //: "Erreur lors de la récupération des appareils" - message = tr("manage_account_no_device_found_error_message"); - } - emit requestError(message); + const std::shared_ptr ¶meterErrors) { + lDebug() << "REQUEST ERROR" << errorMessage << "/" << int(request->getType()); + QString message = QString::fromStdString(errorMessage); + if (request->getType() == linphone::AccountManagerServicesRequest::Type::GetDevicesList) { + //: "Erreur lors de la récupération des appareils" + message = tr("manage_account_no_device_found_error_message"); + } + emit requestError(message); }); mAccountManagerServicesModelConnection->makeConnectToModel( &AccountManagerServicesModel::devicesListFetched, diff --git a/Linphone/core/chat/message/ChatMessageCore.cpp b/Linphone/core/chat/message/ChatMessageCore.cpp index 85e5b9bf5..f6dd6d203 100644 --- a/Linphone/core/chat/message/ChatMessageCore.cpp +++ b/Linphone/core/chat/message/ChatMessageCore.cpp @@ -114,6 +114,7 @@ ChatMessageCore::ChatMessageCore(const std::shared_ptr &c fromAddress->clean(); mFromAddress = Utils::coreStringToAppString(fromAddress->asStringUriOnly()); mFromName = ToolModel::getDisplayName(chatmessage->getFromAddress()->clone()); + mToName = ToolModel::getDisplayName(chatmessage->getToAddress()->clone()); auto chatroom = chatmessage->getChatRoom(); mIsFromChatGroup = chatroom->hasCapability((int)linphone::ChatRoom::Capabilities::Conference) && @@ -166,6 +167,13 @@ ChatMessageCore::ChatMessageCore(const std::shared_ptr &c mIsForward = chatmessage->isForward(); mIsReply = chatmessage->isReply(); + if (mIsReply) { + auto replymessage = chatmessage->getReplyMessage(); + if (replymessage) { + mReplyText = ToolModel::getMessageFromContent(replymessage->getContents()); + if (mIsFromChatGroup) mRepliedToName = ToolModel::getDisplayName(replymessage->getToAddress()->clone()); + } + } mImdnStatusList = computeDeliveryStatus(chatmessage); } @@ -380,6 +388,10 @@ QString ChatMessageCore::getToAddress() const { return mToAddress; } +QString ChatMessageCore::getToName() const { + return mToName; +} + QString ChatMessageCore::getMessageId() const { return mMessageId; } @@ -575,4 +587,4 @@ std::shared_ptr ChatMessageCore::getModel() const { ChatMessageContentGui *ChatMessageCore::getVoiceRecordingContent() const { return new ChatMessageContentGui(mVoiceRecordingContent); -} +} \ No newline at end of file diff --git a/Linphone/core/chat/message/ChatMessageCore.hpp b/Linphone/core/chat/message/ChatMessageCore.hpp index b2c6c1875..9dda840d5 100644 --- a/Linphone/core/chat/message/ChatMessageCore.hpp +++ b/Linphone/core/chat/message/ChatMessageCore.hpp @@ -100,6 +100,8 @@ class ChatMessageCore : public QObject, public AbstractObject { QStringList reactionsSingletonAsStrings READ getReactionsSingletonAsStrings NOTIFY singletonReactionMapChanged) Q_PROPERTY(bool isForward MEMBER mIsForward CONSTANT) Q_PROPERTY(bool isReply MEMBER mIsReply CONSTANT) + Q_PROPERTY(QString replyText MEMBER mReplyText CONSTANT) + Q_PROPERTY(QString repliedToName MEMBER mRepliedToName CONSTANT) Q_PROPERTY(bool hasFileContent MEMBER mHasFileContent CONSTANT) Q_PROPERTY(bool isVoiceRecording MEMBER mIsVoiceRecording CONSTANT) Q_PROPERTY(bool isCalendarInvite MEMBER mIsCalendarInvite CONSTANT) @@ -123,6 +125,7 @@ public: QString getFromAddress() const; QString getFromName() const; QString getToAddress() const; + QString getToName() const; QString getMessageId() const; bool isRemoteMessage() const; @@ -182,6 +185,7 @@ private: QString mFromAddress; QString mToAddress; QString mFromName; + QString mToName; QString mPeerName; QString mMessageId; QString mOwnReaction; @@ -194,6 +198,8 @@ private: bool mIsRead = false; bool mIsForward = false; bool mIsReply = false; + QString mReplyText; + QString mRepliedToName; bool mHasFileContent = false; bool mIsCalendarInvite = false; bool mIsVoiceRecording = false; diff --git a/Linphone/core/chat/message/EventLogCore.cpp b/Linphone/core/chat/message/EventLogCore.cpp index d3ab6a5fc..e88b01039 100644 --- a/Linphone/core/chat/message/EventLogCore.cpp +++ b/Linphone/core/chat/message/EventLogCore.cpp @@ -43,11 +43,11 @@ EventLogCore::EventLogCore(const std::shared_ptr &even } else if (eventLog->getCallLog()) { mCallHistoryCore = CallHistoryCore::create(eventLog->getCallLog()); mEventId = Utils::coreStringToAppString(eventLog->getCallLog()->getCallId()); - } else { // getNotifyId + } + if (mEventId.isEmpty()) { // getNotifyId QString type = QString::fromLatin1( QMetaEnum::fromType().valueToKey(static_cast(mEventLogType))); mEventId = type + QString::number(static_cast(eventLog->getCreationTime())); - ; computeEvent(eventLog); } } diff --git a/Linphone/data/languages/de.ts b/Linphone/data/languages/de.ts index f52e39627..50f0aba58 100644 --- a/Linphone/data/languages/de.ts +++ b/Linphone/data/languages/de.ts @@ -13,13 +13,13 @@ AbstractWindow - + contact_dialog_pick_phone_number_or_sip_address_title "Choisissez un numéro ou adresse SIP" Telefonnummer oder SIP-Adresse wählen - + fps_counter %1 FPS @@ -393,7 +393,7 @@ Kontakte finden - + add_participant_selected_count 0 "%n participant(s) sélectionné(s)" @@ -403,13 +403,13 @@ - + list_filter_no_result_found "Aucun contact" Kein Ergebnis gefunden… - + contact_list_empty Zurzeit keine Kontakte @@ -523,74 +523,74 @@ App - + remote_provisioning_dialog Voulez-vous télécharger et appliquer la configuration depuis cette adresse ? Möchten Sie die Remote-Konfiguration von dieser Adresse herunterladen und anwenden? - + application_description "A free and open source SIP video-phone." Ein kostenloses Open-Source SIP Video-Telefon. - + command_line_arg_order "Send an order to the application towards a command line" Kommandozeilen-Befehl an die Anwendung schicken - + command_line_option_show_help Zeige Hilfe - + command_line_option_show_app_version Zeige App-Version - + command_line_option_config_to_fetch "Specify the linphone configuration file to be fetched. It will be merged with the current configuration." Abzurufende Linphone-Konfigurationsdatei angeben. Sie wird mit der aktuellen Konfiguration zusammengeführt. - + command_line_option_config_to_fetch_arg "URL, path or file" URL, Pfad oder Datei - + command_line_option_minimized - + command_line_option_log_to_stdout Debug-Informationen auf der Standardausgabe ausgeben - + command_line_option_print_app_logs_only "Print only logs from the application" Nur Anwendungs-Logs ausgeben - + hide_action "Cacher" "Afficher" Ausblenden - + show_action Zeigen - + quit_action "Quitter" Beenden @@ -1743,13 +1743,13 @@ ChatDroppableTextArea - + chat_view_send_area_placeholder_text Say something… : placeholder text for sending message text area - + cannot_record_while_in_call_tooltip Cannot record a message while a call is ongoing @@ -1769,31 +1769,30 @@ - + chat_room_delete "Supprimer" - - - chat_room_mute - "Mute" - - - - - chat_room_unmute - "Unmute" - - - + + chat_room_mute + + + + + chat_room_unmute + "Sourdine" + + + + chat_list_delete_chat_popup_title Delete the conversation ? - + chat_list_delete_chat_popup_message This conversation and all its messages will be deleted. Do You want to continue ? @@ -1802,37 +1801,67 @@ ChatMessage - + chat_message_copy_selection "Copy selection" - + chat_message_copy "Copy" - + chat_message_copied_to_clipboard_title Copied - + chat_message_copied_to_clipboard_toast "to clipboard" - - chat_message_see_status - "See message status" + + chat_message_remote_replied + %1 replied - + + chat_message_remote_replied_to + %1 replied to %2 + + + + + chat_message_user_replied_to + You replied to %1 + + + + + chat_message_user_replied + You replied + + + + + chat_message_reception_info + "Reception info" + + + + + chat_message_reply + Reply + + + + chat_message_delete "Delete" @@ -1922,19 +1951,19 @@ Error ChatMessageCore - + all_reactions_label "Reactions": all reactions for one message label - + info_toast_deleted_title Deleted - + info_toast_deleted_message The message has been deleted @@ -1987,20 +2016,20 @@ Error ChatMessagesListView - + chat_message_list_encrypted_header_title End to end encrypted chat - + chat_message_list_encrypted_header_message Les messages de cette conversation sont chiffrés de bout en bout. Seul votre correspondant peut les déchiffrer. - + chat_message_is_writing_info %1 is writing… @@ -2895,63 +2924,63 @@ Error EventLogCore - + conference_created_event - + conference_created_terminated - + conference_participant_added_event - + conference_participant_removed_event - - + + conference_security_event - + conference_ephemeral_message_enabled_event - + conference_ephemeral_message_lifetime_changed_event - + conference_ephemeral_message_disabled_event - + conference_subject_changed_event - + conference_participant_unset_admin_event - + conference_participant_set_admin_event - + nMinute @@ -2959,7 +2988,7 @@ Error - + nHour @@ -2967,8 +2996,8 @@ Error - - + + nDay @@ -2976,7 +3005,7 @@ Error - + nWeek @@ -2984,7 +3013,7 @@ Error - + nSeconds @@ -3027,73 +3056,71 @@ Error GroupChatInfoParticipants - + group_infos_participant_is_admin Admin - + group_infos_manage_participants_title - "Gérer les participants" + "Gérer des participants" Manage Participants - + menu_see_existing_contact "Show contact" Kontakt anzeigen - + menu_add_address_to_contacts "Add to contacts" Zu Kontakten hinzufügen - + group_infos_give_admin_rights Give admin rights - + group_infos_remove_admin_rights Remove admin rights - + group_infos_copy_sip_address Copy SIP Address - + group_infos_remove_participant Remove participant - + group_infos_remove_participants_toast_title Remove participant ? - + group_infos_remove_participants_toast_message Participant will be removed from chat room. GroupConversationInfos - - - group_infos_manage_participants - Participants - Participants - - - - group_infos_participants_edit_apply - Apply - Apply - + + + group_infos_manage_participants + Participants + + + + group_infos_participants_edit_apply + Apply + group_infos_call @@ -3101,17 +3128,16 @@ Error Anrufen - + group_infos_mute - "Sourdine" Stummschalten - - - group_infos_unmute - "Réactiver les notifications" - Unmute - + + + group_infos_unmute + "Sourdine" + Unmute + group_infos_meeting @@ -3119,13 +3145,13 @@ Error Meeting - + group_infos_participants Participants (%1) - - + + group_infos_media_docs Medien & Dokumente @@ -3135,55 +3161,55 @@ Error Geteilte Medien - + group_infos_shared_docs Geteilte Dokumente - + group_infos_other_actions Weitere Aktionen - + group_infos_enable_ephemerals Flüchtige Nachrichten aktivieren - + group_infos_disable_ephemerals Flüchtige Nachrichten deaktivieren - + group_infos_leave_room - + group_infos_delete_history Verlauf löschen - + group_infos_delete_history_toast_title Delete history ? Verlauf löschen? - + group_infos_delete_history_toast_message All the messages will be removed from the chat room. Do you want to continue ? Alle Nachrichten werden aus dem Chat entfernt. Möchten Sie fortfahren? - + group_infos_leave_room_toast_title Leave Chat Room ? Chatraum verlassen? - + group_infos_leave_room_toast_message All the messages will be removed from the chat room. Do you want to continue ? Alle Nachrichten werden aus dem Chat entfernt. Möchten Sie fortfahren? @@ -3661,78 +3687,78 @@ Error MainWindow - + information_popup_connexion_succeed_title "Connexion réussie" Verbindung erfolgreich - + information_popup_connexion_succeed_message "Vous êtes connecté en mode %1" Sie sind im %1-Modus verbunden - + interoperable interopérable interoperabel - + call_transfer_successful_toast_title "Appel transféré" Anruf weitergeleitet - + call_transfer_successful_toast_message "Votre correspondant a été transféré au contact sélectionné" Ihr Gesprächspartner wurde an den ausgewählten Kontakt weitergeleitet - + information_popup_success_title Gespeichert - + information_popup_changes_saved "Les changements ont été sauvegardés" Änderungen wurden gespeichert - + captcha_validation_loading_message "Veuillez valider le captcha sur la page web" Bitte das Captcha auf der Webseite bestätigen - + assistant_register_error_title "Erreur lors de la création" Fehler bei der Erstellung - + assistant_register_success_title "Compte créé" Konto erstellt - + assistant_register_success_message "Le compte a été créé. Vous pouvez maintenant vous connecter" Das Konto wurde erstellt. Sie können sich jetzt anmelden. - + assistant_register_error_code "Erreur dans le code de validation" Fehler im Bestätigungscode - + information_popup_error_title Fehler @@ -3956,16 +3982,14 @@ Error "Ajouter des participants" Teilnehmer hinzufügen - - - meeting_schedule_add_participants_apply - Apply - Apply - + meeting_schedule_add_participants_apply + Apply + + add - Hinzufügen + Hinzufügen @@ -4036,12 +4060,6 @@ Error Message status - - - click_to_delete_reaction_info - Click to delete - - MessageReactionsInfos @@ -4153,24 +4171,24 @@ Error Notifier - + new_voice_message 'Voice message received!' : message to warn the user in a notofication for voice messages. - + new_file_message - + new_conference_invitation 'Conference invitation received!' : Notification about receiving an invitation to a conference. - + new_chat_room_messages 'New messages received!' Notification that warn the user of new messages. @@ -4302,15 +4320,14 @@ Error one_one_infos_mute - "Sourdine" Stummschalten - - - one_one_infos_unmute - "Réactiver les notifications" - Unmute - + + + one_one_infos_unmute + "Sourdine" + Unmute + one_one_infos_search @@ -4913,10 +4930,16 @@ Pour les activer dans un projet commercial, merci de nous contacter. SelectedChatView - + chat_view_group_call_toast_message Start a group call ? + + + reply_to_label + Reply to %1 + + SettingsPage @@ -5032,22 +5055,22 @@ Pour les activer dans un projet commercial, merci de nous contacter. - + conference_invitation - + conference_invitation_updated - + conference_invitation_cancelled - + unknown_audio_device_name Unbekannter Gerätename @@ -5055,16 +5078,16 @@ Pour les activer dans un projet commercial, merci de nous contacter. Utils - + information_popup_call_not_created_message "L'appel n'a pas pu être créé" Anruf konnte nicht erstellt werden - - - - + + + + information_popup_error_title Error ---------- @@ -5072,12 +5095,12 @@ Failed to create 1-1 conversation with %1 ! - + information_popup_group_call_not_created_message - + number_of_years %n an(s) @@ -5086,7 +5109,7 @@ Failed to create 1-1 conversation with %1 ! - + number_of_month "%n mois" @@ -5095,7 +5118,7 @@ Failed to create 1-1 conversation with %1 ! - + number_of_weeks %n semaine(s) @@ -5104,7 +5127,7 @@ Failed to create 1-1 conversation with %1 ! - + number_of_days %n jour(s) @@ -5113,81 +5136,92 @@ Failed to create 1-1 conversation with %1 ! - + today "Aujourd'hui" Heute - + yesterday "Hier Gestern - + call_zrtp_token_verification_possible_characters "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 - - + + information_popup_chatroom_creation_error_message Failed to create 1-1 conversation with %1 ! - + contact_presence_status_available - + contact_presence_status_away - + contact_presence_status_busy Beschäftigt - + contact_presence_status_do_not_disturb Nicht stören - + contact_presence_status_offline Offline - + + chatMessage_error + Cannot reply to invalid message + + + + recorder_error Error with the recorder - + + chat_error - - + + + + info_popup_error_title Error - + + info_popup_send_voice_message_error_message Could not send voice message : %1 - + + info_popup_send_voice_message_sending_error_message Failed to create message from record @@ -5355,1117 +5389,1117 @@ Failed to create 1-1 conversation with %1 ! country - + Afghanistan Afghanistan - + Albania Albanien - + Algeria Algerien - + AmericanSamoa Amerikanisch-Samoa - + Andorra Andorra - + Angola Angola - + Anguilla Anguilla - + AntiguaAndBarbuda Antigua und Barbuda - + Argentina Argentinien - + Armenia Armenien - + Aruba Aruba - + Australia Australien - + Austria Österreich - + Azerbaijan Aserbaidschan - + Bahamas Bahamas - + Bahrain Bahrain - + Bangladesh Bangladesch - + Barbados Barbados - + Belarus Belarus - + Belgium Belgien - + Belize Belize - + Benin Benin - + Bermuda Bermuda - + Bhutan Bhutan - + Bolivia Bolivien - + BosniaAndHerzegowina Bosnien und Herzegowina - + Botswana Botswana - + Brazil Brasilien - + Brunei Brunei - + Bulgaria Bulgarien - + BurkinaFaso Burkina Faso - + Burundi Burundi - + Cambodia Kambodscha - + Cameroon Kamerun - + Canada Kanada - + CapeVerde Kap Verde - + CaymanIslands Caymaninseln - + CentralAfricanRepublic Zentralafrikanische Republik - + Chad Tschad - + Chile Chile - + China China - + Colombia Kolumbien - + Comoros Komoren - + PeoplesRepublicOfCongo Volksrepublik Kongo - + CookIslands Cookinseln - + CostaRica Kosta Rica - + IvoryCoast Elfenbeinküste - + Croatia Kroatien - + Cuba Kuba - + Cyprus Zypern - + CzechRepublic Tschechische Republik - + Denmark Dänemark - + Djibouti Dschibuti - + Dominica Dominica - + DominicanRepublic Dominikanische Republik - + Ecuador Ecuador - + Egypt Ägypten - + ElSalvador El Salvador - + EquatorialGuinea Äquatorialguinea - + Eritrea Eritrea - + Estonia Estland - + Ethiopia Äthiopien - + FalklandIslands Falklandinseln - + FaroeIslands Färöer-Inseln - + Fiji Fidschi - + Finland Finnland - + France Frankreich - + FrenchGuiana Französisch-Guayana - + FrenchPolynesia Französisch-Polynesien - + Gabon Gabon - + Gambia Gambia - + Georgia Georgien - + Germany Deutschland - + Ghana Ghana - + Gibraltar Gibraltar - + Greece Griechenland - + Greenland Grönland - + Grenada Grenada - + Guadeloupe Guadeloupe - + Guam Guam - + Guatemala Guatemala - + Guinea Guinea - + GuineaBissau Guinea-Bissau - + Guyana Guyana - + Haiti Haiti - + Honduras Honduras - + DemocraticRepublicOfCongo Demokratische Republik Kongo - + HongKong Hongkong - + Hungary Ungarn - + Iceland Island - + India Indien - + Indonesia Indonesien - + Iran Iran - + Iraq Irak - + Ireland Irland - + Israel Israel - + Italy Italien - + Jamaica Jamaika - + Japan Japan - + Jordan Jordanien - + Kazakhstan Kasachstan - + Kenya Kenia - + Kiribati Kiribati - + DemocraticRepublicOfKorea Demokratische Volksrepublik Korea - + RepublicOfKorea Republik Korea - + Kuwait Kuwait - + Kyrgyzstan Kirgisistan - + Laos Laos - + Latvia Lettland - + Lebanon Libanon - + Lesotho Lesotho - + Liberia Liberien - + Libya Libyen - + Liechtenstein Liechtenstein - + Lithuania Litauen - + Luxembourg Luxemburg - + Macau Macau - + Macedonia Mazedonien - + Madagascar Madagaskar - + Malawi Malawi - + Malaysia Malaysien - + Maldives Malediven - + Mali Mali - + Malta Malta - + MarshallIslands Marshallinseln - + Martinique Martinique - + Mauritania Mauretanien - + Mauritius Mauritius - + Mayotte Mayotte - + Mexico Mexiko - + Micronesia Föderierte Staaten von Mikronesien - + Moldova Moldawien - + Monaco Monaco - + Mongolia Mongolei - + Montenegro Montenegro - + Montserrat Montserrat - + Morocco Marokko - + Mozambique Mosambik - + Myanmar Myanmar - + Namibia Namibia - + NauruCountry Nauru - + Nepal Nepal - + Netherlands Niederlande - + NewCaledonia Neukaledonien - + NewZealand Neuseeland - + Nicaragua Nicaragua - + Niger Niger - + Nigeria Nigeria - + Niue Niue - + NorfolkIsland Norfolkinsel - + NorthernMarianaIslands Nördliche Marianeninseln - + Norway Norwegen - + Oman Oman - + Pakistan Pakistan - + Palau Palau - + PalestinianTerritories Palästinensische Gebiete - + Panama Panama - + PapuaNewGuinea Papua-Neuguinea - + Paraguay Paraguay - + Peru Peru - + Philippines Philippinen - + Poland Polen - + Portugal Portugal - + PuertoRico Puerto Rico - + Qatar Katar - + Reunion Réunion - + Romania Rumänien - + RussianFederation Russische Föderation - + Rwanda Ruanda - + SaintHelena Sankt Helena - + SaintKittsAndNevis Sankt Kitts und Nevis - + SaintLucia Sankt Lucia - + SaintPierreAndMiquelon Sankt Pierre und Miquelon - + SaintVincentAndTheGrenadines Sankt Vincent und die Grenadinen - + Samoa Samoa - + SanMarino San Marino - + SaoTomeAndPrincipe São Tomé und Príncipe - + SaudiArabia Saudi-Arabien - + Senegal Senegal - + Serbia Serbien - + Seychelles Seychellen - + SierraLeone Sierra Leone - + Singapore Singapur - + Slovakia Slowakei - + Slovenia Slowenien - + SolomonIslands Salomonen - + Somalia Somalia - + SouthAfrica Südafrika - + Spain Spanien - + SriLanka Sri Lanka - + Sudan Sudan - + Suriname Suriname - + Swaziland Eswatini - + Sweden Schweden - + Switzerland Schweiz - + Syria Syrien - + Taiwan Taiwan - + Tajikistan Tadschikistan - + Tanzania Tansania - + Thailand Thailand - + Togo Togo - + Tokelau Tokelau - + Tonga Tonga - + TrinidadAndTobago Trinidad und Tobago - + Tunisia Tunesien - + Turkey Türkei - + Turkmenistan Turkmenistan - + TurksAndCaicosIslands Turks- und Caicosinseln - + Tuvalu Tuvalu - + Uganda Uganda - + Ukraine Ukraine - + UnitedArabEmirates Vereinigte Arabische Emirate - + UnitedKingdom Vereinigtes Königreich - + UnitedStates Vereinigte Staaten - + Uruguay Uruguay - + Uzbekistan Usbekistan - + Vanuatu Vanuatu - + Venezuela Venezuela - + Vietnam Vietnam - + WallisAndFutunaIslands Wallis und Futuna Inseln - + Yemen Jemen - + Zambia Sambia - + Zimbabwe Simbabwe diff --git a/Linphone/data/languages/en.ts b/Linphone/data/languages/en.ts index 92972c053..23846f3e3 100644 --- a/Linphone/data/languages/en.ts +++ b/Linphone/data/languages/en.ts @@ -13,13 +13,13 @@ AbstractWindow - + contact_dialog_pick_phone_number_or_sip_address_title "Choisissez un numéro ou adresse SIP" Choose a SIP number or address - + fps_counter %1 FPS @@ -393,7 +393,7 @@ Find contacts - + add_participant_selected_count 0 "%n participant(s) sélectionné(s)" @@ -403,13 +403,13 @@ - + list_filter_no_result_found "Aucun contact" No result found… - + contact_list_empty No contact for the moment @@ -523,74 +523,74 @@ App - + remote_provisioning_dialog Voulez-vous télécharger et appliquer la configuration depuis cette adresse ? Do you want to download and apply remote provisioning from this address ? - + application_description "A free and open source SIP video-phone." A free and open source SIP video-phone. - + command_line_arg_order "Send an order to the application towards a command line" Send an order to the application towards a command line - + command_line_option_show_help Show this help - + command_line_option_show_app_version Show app version - + command_line_option_config_to_fetch "Specify the linphone configuration file to be fetched. It will be merged with the current configuration." Specify the linphone configuration file to be fetched. It will be merged with the current configuration. - + command_line_option_config_to_fetch_arg "URL, path or file" URL, path or file - + command_line_option_minimized Minimize - + command_line_option_log_to_stdout Log to stdout some debug information while running - + command_line_option_print_app_logs_only "Print only logs from the application" Print only logs from the application - + hide_action "Cacher" "Afficher" Hide - + show_action Show - + quit_action "Quitter" Quit @@ -1705,13 +1705,13 @@ ChatDroppableTextArea - + chat_view_send_area_placeholder_text Say something… : placeholder text for sending message text area Say something… - + cannot_record_while_in_call_tooltip Cannot record a message while a call is ongoing Cannot record a message while a call is ongoing @@ -1731,31 +1731,30 @@ Draft : %1 - + chat_room_delete "Supprimer" Delete - - - chat_room_mute - "Sourdine" - Mute - - - - chat_room_unmute - "Unmute" - Unmute - - + + chat_room_mute + Mute + + + + chat_room_unmute + "Sourdine" + Unmute + + + chat_list_delete_chat_popup_title Delete the conversation ? Delete the conversation ? - + chat_list_delete_chat_popup_message This conversation and all its messages will be deleted. Do You want to continue ? This conversation and all its messages will be deleted. Do You want to continue ? @@ -1764,37 +1763,67 @@ ChatMessage - + chat_message_copy_selection "Copy selection" Copy selection - + chat_message_copy "Copy" Copy - + chat_message_copied_to_clipboard_title Copied Copied - + chat_message_copied_to_clipboard_toast "to clipboard" in clipboard - - chat_message_see_status - "See message status" - See message status + + chat_message_remote_replied + %1 replied + %1 replied to - + + chat_message_remote_replied_to + %1 replied to %2 + %1 replied to %2 + + + + chat_message_user_replied_to + You replied to %1 + You replied to %1 + + + + chat_message_user_replied + You replied + You replied + + + + chat_message_reception_info + "Reception info" + Reception info + + + + chat_message_reply + Reply + Reply + + + chat_message_delete "Delete" Delete @@ -1884,19 +1913,19 @@ Error ChatMessageCore - + all_reactions_label "Reactions": all reactions for one message label Reactions - + info_toast_deleted_title Deleted Deleted - + info_toast_deleted_message The message has been deleted The message has been deleted @@ -1949,13 +1978,13 @@ Error ChatMessagesListView - + chat_message_list_encrypted_header_title End to end encrypted chat End to end encrypted chat - + chat_message_list_encrypted_header_message Les messages de cette conversation sont chiffrés de bout en bout. Seul votre correspondant peut les déchiffrer. @@ -1963,7 +1992,7 @@ Error Only your correspondent can decrypt them. - + chat_message_is_writing_info %1 is writing… %1 is writing… @@ -2818,63 +2847,63 @@ Only your correspondent can decrypt them. EventLogCore - + conference_created_event You have joined the group - + conference_created_terminated You have left the group - + conference_participant_added_event %1 has joined - + conference_participant_removed_event %1 is no longer in the conversation - + conference_participant_set_admin_event %1 is now an admin - + conference_participant_unset_admin_event %1 is no longer an admin - - + + conference_security_event Security level degraded by %1 - + conference_ephemeral_message_enabled_event Ephemeral messages have been enabled: %1 - + conference_ephemeral_message_disabled_event Ephemeral messages have been disabled - + conference_subject_changed_event New subject: %1 - + conference_ephemeral_message_lifetime_changed_event Ephemeral messages have been updated: %1 - + nSeconds %1 second @@ -2882,7 +2911,7 @@ Only your correspondent can decrypt them. - + nMinute %1 minute @@ -2890,7 +2919,7 @@ Only your correspondent can decrypt them. - + nHour %1 hour @@ -2898,8 +2927,8 @@ Only your correspondent can decrypt them. - - + + nDay %1 day @@ -2907,7 +2936,7 @@ Only your correspondent can decrypt them. - + nWeek %1 week @@ -2950,73 +2979,71 @@ Only your correspondent can decrypt them. GroupChatInfoParticipants - + group_infos_manage_participants_title - "Gérer les participants" + "Gérer des participants" Manage participants - + group_infos_participant_is_admin Admin - + menu_see_existing_contact "Show contact" Show contact - + menu_add_address_to_contacts "Add to contacts" Add to contacts - + group_infos_give_admin_rights Give admin rights - + group_infos_remove_admin_rights Remove admin rights - + group_infos_copy_sip_address Copy SIP Address - + group_infos_remove_participant Remove participant - + group_infos_remove_participants_toast_title Remove participant ? - + group_infos_remove_participants_toast_message Participant will be removed from chat room. GroupConversationInfos - - - group_infos_manage_participants - Participants - Participants - - - - group_infos_participants_edit_apply - Apply - Apply - + + + group_infos_manage_participants + Participants + + + + group_infos_participants_edit_apply + Apply + group_infos_call @@ -3024,17 +3051,16 @@ Only your correspondent can decrypt them. Call - + group_infos_mute - "Sourdine" Mute - - - group_infos_unmute - "Réactiver les notifications" - Unmute - + + + group_infos_unmute + "Sourdine" + Unmute + group_infos_meeting @@ -3042,66 +3068,66 @@ Only your correspondent can decrypt them. Meeting - + group_infos_participants Participants (%1) - - + + group_infos_media_docs Medias & documents - + group_infos_shared_docs Shared documents - + group_infos_other_actions Other actions - + group_infos_enable_ephemerals Enable ephemeral messages - + group_infos_disable_ephemerals Disable ephemeral messages - + group_infos_delete_history Delete history - + group_infos_delete_history_toast_title Delete history ? Delete history ? - + group_infos_delete_history_toast_message All the messages will be removed from the chat room. Do you want to continue ? All the messages will be removed from the chat room. Do you want to continue ? - + group_infos_leave_room Leave Chat Room - + group_infos_leave_room_toast_title Leave Chat Room ? Leave Chat Room ? - + group_infos_leave_room_toast_message All the messages will be removed from the chat room. Do you want to continue ? All the messages will be removed from the chat room. Do you want to continue ? @@ -3574,78 +3600,78 @@ Only your correspondent can decrypt them. MainWindow - + information_popup_connexion_succeed_title "Connexion réussie" Connection succeed - + information_popup_connexion_succeed_message "Vous êtes connecté en mode %1" You are logged in %1 mode - + interoperable interopérable interoperable - + call_transfer_successful_toast_title "Appel transféré" Call forwarded - + call_transfer_successful_toast_message "Votre correspondant a été transféré au contact sélectionné" Your correspondent has been transferred to the selected contact - + information_popup_success_title Saved - + information_popup_changes_saved "Les changements ont été sauvegardés" Changes have been saved - + captcha_validation_loading_message "Veuillez valider le captcha sur la page web" Please validate the captcha on the web page - + assistant_register_error_title "Erreur lors de la création" Error while creating - + assistant_register_success_title "Compte créé" Account created - + assistant_register_success_message "Le compte a été créé. Vous pouvez maintenant vous connecter" The account has been created. You can now log in. - + assistant_register_error_code "Erreur dans le code de validation" Error in validation code - + information_popup_error_title Error @@ -3869,16 +3895,10 @@ Only your correspondent can decrypt them. "Ajouter des participants" Add participants - - - meeting_schedule_add_participants_apply - Apply - Apply - - add - Add + meeting_schedule_add_participants_apply + Apply @@ -3950,10 +3970,9 @@ Only your correspondent can decrypt them. Message status - click_to_delete_reaction_info Click to delete - Click to delete + Click to delete @@ -4061,24 +4080,24 @@ Only your correspondent can decrypt them. Notifier - + new_voice_message 'Voice message received!' : message to warn the user in a notofication for voice messages. Voice message received! - + new_file_message File received! - + new_conference_invitation 'Conference invitation received!' : Notification about receiving an invitation to a conference. Conference invitation received ! - + new_chat_room_messages 'New messages received!' Notification that warn the user of new messages. New messages received ! @@ -4210,15 +4229,14 @@ Only your correspondent can decrypt them. one_one_infos_mute - "Sourdine" Mute - - - one_one_infos_unmute - "Réactiver les notifications" - Unmute - + + + one_one_infos_unmute + "Sourdine" + Unmute + one_one_infos_search @@ -4809,10 +4827,16 @@ To enable them in a commercial project, please contact us. SelectedChatView - + chat_view_group_call_toast_message Start a group call ? + + + reply_to_label + Reply to %1 + Reply to %1 + SettingsPage @@ -4928,22 +4952,22 @@ To enable them in a commercial project, please contact us. Group call couldn't be created - + unknown_audio_device_name Unknown device name - + conference_invitation Meeting invitation - + conference_invitation_cancelled Meeting cancellation - + conference_invitation_updated Meeting modification @@ -4951,41 +4975,41 @@ To enable them in a commercial project, please contact us. Utils - + contact_presence_status_available Available - + contact_presence_status_busy Busy - + contact_presence_status_do_not_disturb Do not disturb - + contact_presence_status_offline Offline - + contact_presence_status_away Idle/Away - + information_popup_call_not_created_message "L'appel n'a pas pu être créé" Call could not be created - - - - + + + + information_popup_error_title Error ---------- @@ -4993,12 +5017,12 @@ Failed to create 1-1 conversation with %1 ! Error - + information_popup_group_call_not_created_message Group call couldn't be created - + number_of_years %n an(s) @@ -5007,7 +5031,7 @@ Failed to create 1-1 conversation with %1 ! - + number_of_month "%n mois" @@ -5016,7 +5040,7 @@ Failed to create 1-1 conversation with %1 ! - + number_of_weeks %n semaine(s) @@ -5025,7 +5049,7 @@ Failed to create 1-1 conversation with %1 ! - + number_of_days %n jour(s) @@ -5034,56 +5058,67 @@ Failed to create 1-1 conversation with %1 ! - + today "Aujourd'hui" Today - + yesterday "Hier Yesterday - + call_zrtp_token_verification_possible_characters "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 - - + + information_popup_chatroom_creation_error_message Failed to create 1-1 conversation with %1 ! Failed to create 1-1 conversation with %1 ! - + + chatMessage_error + Cannot reply to invalid message + Cannot reply to invalid message + + + recorder_error Error with the recorder Error with the recorder - + + chat_error Error in the chat - - + + + + info_popup_error_title Error Error - + + info_popup_send_voice_message_error_message Could not send voice message : %1 Could not send voice message : %1 - + + info_popup_send_voice_message_sending_error_message Failed to create message from record Failed to create message from record @@ -5251,1117 +5286,1117 @@ Failed to create 1-1 conversation with %1 ! country - + Afghanistan Afghanistan - + Albania Albania - + Algeria Algeria - + AmericanSamoa American Samoa - + Andorra Andorra - + Angola Angola - + Anguilla Anguilla - + AntiguaAndBarbuda Antigua-et-Barbuda - + Argentina Argentina - + Armenia Armenia - + Aruba Aruba - + Australia Australia - + Austria Austria - + Azerbaijan Azerbaijan - + Bahamas Bahamas - + Bahrain Bahrain - + Bangladesh Bangladesh - + Barbados Barbados - + Belarus Belarus - + Belgium Belgium - + Belize Belize - + Benin Benin - + Bermuda Bermuda - + Bhutan Bhutan - + Bolivia Bolivia - + BosniaAndHerzegowina Bosnia And Herzegowina - + Botswana Botswana - + Brazil Brazil - + Brunei Brunei - + Bulgaria Bulgaria - + BurkinaFaso Burkina Faso - + Burundi Burundi - + Cambodia Cambodia - + Cameroon Cameroon - + Canada Canada - + CapeVerde Cape Verde - + CaymanIslands Cayman Islands - + CentralAfricanRepublic Central African Republic - + Chad Chad - + Chile Chile - + China China - + Colombia Colombia - + Comoros Comoros - + PeoplesRepublicOfCongo Peoples Republic Of Congo - + CookIslands Cook Islands - + CostaRica Costa Rica - + IvoryCoast Ivory Coast - + Croatia Croatia - + Cuba Cuba - + Cyprus Cyprus - + CzechRepublic Czech Republic - + Denmark Denmark - + Djibouti Djibouti - + Dominica Dominica - + DominicanRepublic Dominican Republic - + Ecuador Ecuador - + Egypt Egypt - + ElSalvador El Salvador - + EquatorialGuinea Equatorial Guinea - + Eritrea Eritrea - + Estonia Estonia - + Ethiopia Ethiopia - + FalklandIslands Falkland Islands - + FaroeIslands Faroe Islands - + Fiji Fiji - + Finland Finland - + France France - + FrenchGuiana French Guiana - + FrenchPolynesia French Polynesia - + Gabon Gabon - + Gambia Gambia - + Georgia Georgia - + Germany Germany - + Ghana Ghana - + Gibraltar Gibraltar - + Greece Greece - + Greenland Greenland - + Grenada Grenada - + Guadeloupe Guadeloupe - + Guam Guam - + Guatemala Guatemala - + Guinea Guinea - + GuineaBissau Guinea-Bissau - + Guyana Guyana - + Haiti Haiti - + Honduras Honduras - + DemocraticRepublicOfCongo Democratic Republic Of Congo - + HongKong Hong Kong - + Hungary Hungary - + Iceland Iceland - + India India - + Indonesia Indonesia - + Iran Iran - + Iraq Iraq - + Ireland Ireland - + Israel Israel - + Italy Italie - + Jamaica Jamaica - + Japan Japan - + Jordan Jordan - + Kazakhstan Kazakhstan - + Kenya Kenya - + Kiribati Kiribati - + DemocraticRepublicOfKorea Democratic Republic Of Korea - + RepublicOfKorea Republic Of Korea - + Kuwait Kuwait - + Kyrgyzstan Kyrgyzstan - + Laos Laos - + Latvia Latvia - + Lebanon Lebanon - + Lesotho Lesotho - + Liberia Liberia - + Libya Libya - + Liechtenstein Liechtenstein - + Lithuania Lithuania - + Luxembourg Luxembourg - + Macau Macau - + Macedonia Macedonia - + Madagascar Madagascar - + Malawi Malawi - + Malaysia Malaysia - + Maldives Maldives - + Mali Mali - + Malta Malta - + MarshallIslands Marshall Islands - + Martinique Martinique - + Mauritania Mauritania - + Mauritius Mauritius - + Mayotte Mayotte - + Mexico Mexico - + Micronesia Micronesia - + Moldova Moldova - + Monaco Monaco - + Mongolia Mongolia - + Montenegro Montenegro - + Montserrat Montserrat - + Morocco Morocco - + Mozambique Mozambique - + Myanmar Myanmar - + Namibia Namibia - + NauruCountry Nauru Country - + Nepal Nepal - + Netherlands Netherlands - + NewCaledonia New-Caledonia - + NewZealand New-Zealand - + Nicaragua Nicaragua - + Niger Niger - + Nigeria Nigeria - + Niue Niue - + NorfolkIsland Norfolk Island - + NorthernMarianaIslands Northern Mariana Islands - + Norway Norway - + Oman Oman - + Pakistan Pakistan - + Palau Palau - + PalestinianTerritories Palestinian Territories - + Panama Panama - + PapuaNewGuinea Papua-New-Guinea - + Paraguay Paraguay - + Peru Peru - + Philippines Philippines - + Poland Poland - + Portugal Portugal - + PuertoRico Puerto Rico - + Qatar Qatar - + Reunion Reunion - + Romania Romania - + RussianFederation Russian Federation - + Rwanda Rwanda - + SaintHelena Saint-Helena - + SaintKittsAndNevis Saint-Kitts-And-Nevis - + SaintLucia Saint-Lucia - + SaintPierreAndMiquelon Saint-Pierre-And-Miquelon - + SaintVincentAndTheGrenadines Saint-Vincent And The Grenadines - + Samoa Samoa - + SanMarino San-Marino - + SaoTomeAndPrincipe Sao Tome-And-Principe - + SaudiArabia Saudi Arabia - + Senegal Senegal - + Serbia Serbia - + Seychelles Seychelles - + SierraLeone Sierra Leone - + Singapore Singapore - + Slovakia Slovakia - + Slovenia Slovenia - + SolomonIslands Solomon Islands - + Somalia Somalia - + SouthAfrica South Africa - + Spain Spain - + SriLanka Sri Lanka - + Sudan Sudan - + Suriname Suriname - + Swaziland Swaziland - + Sweden Sweden - + Switzerland Switzerland - + Syria Syria - + Taiwan Taiwan - + Tajikistan Tajikistan - + Tanzania Tanzania - + Thailand Thailand - + Togo Togo - + Tokelau Tokelau - + Tonga Tonga - + TrinidadAndTobago Trinidad-And-Tobago - + Tunisia Tunisia - + Turkey Turkey - + Turkmenistan Turkmenistan - + TurksAndCaicosIslands Turks And Caicos Islands - + Tuvalu Tuvalu - + Uganda Uganda - + Ukraine Ukraine - + UnitedArabEmirates United Arab Emirates - + UnitedKingdom United-Kingdom - + UnitedStates United-States - + Uruguay Uruguay - + Uzbekistan Uzbekistan - + Vanuatu Vanuatu - + Venezuela Venezuela - + Vietnam Vietnam - + WallisAndFutunaIslands Wallis And Futuna Islands - + Yemen Yemen - + Zambia Zambia - + Zimbabwe Zimbabwe diff --git a/Linphone/data/languages/fr_FR.ts b/Linphone/data/languages/fr_FR.ts index 15cf8df15..d3ea36f05 100644 --- a/Linphone/data/languages/fr_FR.ts +++ b/Linphone/data/languages/fr_FR.ts @@ -13,13 +13,13 @@ AbstractWindow - + contact_dialog_pick_phone_number_or_sip_address_title "Choisissez un numéro ou adresse SIP" Choisissez un numéro ou adresse SIP - + fps_counter %1 FPS @@ -393,7 +393,7 @@ Rechercher des contacts - + add_participant_selected_count 0 "%n participant(s) sélectionné(s)" @@ -403,13 +403,13 @@ - + list_filter_no_result_found "Aucun contact" Aucun résultat… - + contact_list_empty Aucun contact @@ -523,74 +523,74 @@ App - + remote_provisioning_dialog Voulez-vous télécharger et appliquer la configuration depuis cette adresse ? Voulez-vous télécharger et appliquer la configuration depuis cette adresse ? - + application_description "A free and open source SIP video-phone." A free and open source SIP video-phone. - + command_line_arg_order "Send an order to the application towards a command line" Send an order to the application towards a command line - + command_line_option_show_help Show this help - + command_line_option_show_app_version Afficher la version de l'application - + command_line_option_config_to_fetch "Specify the linphone configuration file to be fetched. It will be merged with the current configuration." Specify the linphone configuration file to be fetched. It will be merged with the current configuration. - + command_line_option_config_to_fetch_arg "URL, path or file" URL, path or file - + command_line_option_minimized Minimiser - + command_line_option_log_to_stdout Log to stdout some debug information while running - + command_line_option_print_app_logs_only "Print only logs from the application" Print only logs from the application - + hide_action "Cacher" "Afficher" Cacher - + show_action Afficher - + quit_action "Quitter" Quitter @@ -1705,13 +1705,13 @@ ChatDroppableTextArea - + chat_view_send_area_placeholder_text Say something… : placeholder text for sending message text area Dites quelque chose… - + cannot_record_while_in_call_tooltip Cannot record a message while a call is ongoing Impossible d'enregistrer un message vocal pendant un appel @@ -1731,31 +1731,30 @@ Brouillon : %1 - + chat_room_delete "Supprimer" Supprimer - - - chat_room_mute - "Sourdine" - Mettre en sourdine - - - - chat_room_unmute - "Unmute" - Enlever la sourdine - - + + chat_room_mute + Mettre en sourdine + + + + chat_room_unmute + "Sourdine" + Enlever la sourdine + + + chat_list_delete_chat_popup_title Delete the conversation ? Supprimer la conversation ? - + chat_list_delete_chat_popup_message This conversation and all its messages will be deleted. Do You want to continue ? La conversation et tous ses messages seront supprimés. Souhaitez-vous continuer ? @@ -1764,37 +1763,67 @@ ChatMessage - + chat_message_copy_selection "Copy selection" Copier la sélection - + chat_message_copy "Copy" Copier - + chat_message_copied_to_clipboard_title Copied Copié - + chat_message_copied_to_clipboard_toast "to clipboard" dans le presse-papiers - - chat_message_see_status - "See message status" - Voir les statuts du message + + chat_message_remote_replied + %1 replied + %1 a répondu - + + chat_message_remote_replied_to + %1 replied to %2 + %1 a répondu à %2 + + + + chat_message_user_replied_to + You replied to %1 + Vous avez répondu à %1 + + + + chat_message_user_replied + You replied + Vous avez répondu + + + + chat_message_reception_info + "Reception info" + Info de réception + + + + chat_message_reply + Reply + Répondre + + + chat_message_delete "Delete" Supprimer @@ -1884,19 +1913,19 @@ Error ChatMessageCore - + all_reactions_label "Reactions": all reactions for one message label Réactions - + info_toast_deleted_title Deleted Supprimé - + info_toast_deleted_message The message has been deleted Le message a été supprimé @@ -1949,13 +1978,13 @@ Error ChatMessagesListView - + chat_message_list_encrypted_header_title End to end encrypted chat Conversation chiffrée de bout en bout - + chat_message_list_encrypted_header_message Les messages de cette conversation sont chiffrés de bout en bout. Seul votre correspondant peut les déchiffrer. @@ -1963,7 +1992,7 @@ Error en bout. Seul votre correspondant peut les déchiffrer. - + chat_message_is_writing_info %1 is writing… %1 est en train d'écrire… @@ -2818,63 +2847,63 @@ en bout. Seul votre correspondant peut les déchiffrer. EventLogCore - + conference_created_event Vous avez rejoint le groupe - + conference_created_terminated Vous avez quitté le groupe - + conference_participant_added_event %1 a rejoint le groupe - + conference_participant_removed_event %1 ne fait plus partie du groupe - - + + conference_security_event Niveau de sécurité dégradé par %1 - + conference_ephemeral_message_enabled_event Les messages éphémères ont été activés : %1 - + conference_ephemeral_message_lifetime_changed_event Les messages éphémères ont été mis à jour : %1 - + conference_ephemeral_message_disabled_event Les messages éphémères ont été désactivés : %1 - + conference_subject_changed_event Nouveau sujet : %1 - + conference_participant_unset_admin_event %1 n'est plus admin - + conference_participant_set_admin_event %1 est maintenant admin - + nMinute %1 minute @@ -2882,7 +2911,7 @@ en bout. Seul votre correspondant peut les déchiffrer. - + nHour %1 heure @@ -2890,8 +2919,8 @@ en bout. Seul votre correspondant peut les déchiffrer. - - + + nDay %1 jour @@ -2899,7 +2928,7 @@ en bout. Seul votre correspondant peut les déchiffrer. - + nWeek %1 semaine @@ -2907,7 +2936,7 @@ en bout. Seul votre correspondant peut les déchiffrer. - + nSeconds %1 seconde @@ -2950,73 +2979,71 @@ en bout. Seul votre correspondant peut les déchiffrer. GroupChatInfoParticipants - + group_infos_manage_participants_title - "Gérer les participants" + "Gérer des participants" Gérer les participants - + group_infos_participant_is_admin Admin - + menu_see_existing_contact "Show contact" Voir le contact - + menu_add_address_to_contacts "Add to contacts" Ajouter aux contacts - + group_infos_give_admin_rights Donner les droits admins - + group_infos_remove_admin_rights Retirer les droits admins - + group_infos_copy_sip_address Copier l’adresse SIP - + group_infos_remove_participant Retirer le participant - + group_infos_remove_participants_toast_title Retirer le participant ? - + group_infos_remove_participants_toast_message La participant sere retiré de la conversation GroupConversationInfos - - - group_infos_manage_participants - Participants - Participants - - - - group_infos_participants_edit_apply - Apply - Appliquer - + + + group_infos_manage_participants + Participants + + + + group_infos_participants_edit_apply + Appliquer + group_infos_call @@ -3024,17 +3051,16 @@ en bout. Seul votre correspondant peut les déchiffrer. Appel - + group_infos_mute - "Sourdine" Sourdine - - - group_infos_unmute - "Réactiver les notifications" - Réactiver les notifications - + + + group_infos_unmute + "Sourdine" + Réactiver les notifications + group_infos_meeting @@ -3042,66 +3068,66 @@ en bout. Seul votre correspondant peut les déchiffrer. Réunion - + group_infos_participants Participants (%1) - - + + group_infos_media_docs Medias & documents - + group_infos_shared_docs Documents partagés - + group_infos_other_actions Autres actions - + group_infos_enable_ephemerals Activer les messages éphémères - + group_infos_disable_ephemerals Désactiver les messages éphémères - + group_infos_delete_history Supprimer l'historique - + group_infos_delete_history_toast_title Delete history ? Supprimer l'historique ? - + group_infos_delete_history_toast_message All the messages will be removed from the chat room. Do you want to continue ? Tous les messages seront supprimés. Souhaitez-vous continuer ? - + group_infos_leave_room Quitter la conversation - + group_infos_leave_room_toast_title Leave Chat Room ? Quitter la conversation ? - + group_infos_leave_room_toast_message All the messages will be removed from the chat room. Do you want to continue ? Vous ne recevrez ni pourrez envoyer des messages dans cette conversation, quitter ? @@ -3574,78 +3600,78 @@ en bout. Seul votre correspondant peut les déchiffrer. MainWindow - + information_popup_connexion_succeed_title "Connexion réussie" Connexion réussie - + information_popup_connexion_succeed_message "Vous êtes connecté en mode %1" Vous êtes connecté en mode %1 - + interoperable interopérable interopérable - + call_transfer_successful_toast_title "Appel transféré" Appel transféré - + call_transfer_successful_toast_message "Votre correspondant a été transféré au contact sélectionné" Votre correspondant a été transféré au contact sélectionné - + information_popup_success_title Enregistré - + information_popup_changes_saved "Les changements ont été sauvegardés" Les changements ont été sauvegardés - + captcha_validation_loading_message "Veuillez valider le captcha sur la page web" Veuillez valider le captcha sur la page web - + assistant_register_error_title "Erreur lors de la création" Erreur lors de la création - + assistant_register_success_title "Compte créé" Compte créé - + assistant_register_success_message "Le compte a été créé. Vous pouvez maintenant vous connecter" Le compte a été créé. Vous pouvez maintenant vous connecter - + assistant_register_error_code "Erreur dans le code de validation" Erreur dans le code de validation - + information_popup_error_title Erreur @@ -3869,16 +3895,10 @@ en bout. Seul votre correspondant peut les déchiffrer. "Ajouter des participants" Ajouter des participants - - - meeting_schedule_add_participants_apply - Appliquer - Appliquer - - add - Ajouter + meeting_schedule_add_participants_apply + Appliquer @@ -3949,12 +3969,6 @@ en bout. Seul votre correspondant peut les déchiffrer. Message status Statut du message - - - click_to_delete_reaction_info - Click to delete - Appuyez pour supprimer - MessageReactionsInfos @@ -4061,24 +4075,24 @@ en bout. Seul votre correspondant peut les déchiffrer. Notifier - + new_voice_message 'Voice message received!' : message to warn the user in a notofication for voice messages. Message vocal reçu ! - + new_file_message Fichier reçu ! - + new_conference_invitation 'Conference invitation received!' : Notification about receiving an invitation to a conference. Nouvelle invitation à une conférence ! - + new_chat_room_messages 'New messages received!' Notification that warn the user of new messages. Nouveaux messages reçus ! @@ -4210,15 +4224,14 @@ en bout. Seul votre correspondant peut les déchiffrer. one_one_infos_mute - "Sourdine" Sourdine - - - one_one_infos_unmute - "Réactiver les notifications" - Réactiver les notifications - + + + one_one_infos_unmute + "Sourdine" + Réactiver les notifications + one_one_infos_search @@ -4809,10 +4822,16 @@ Pour les activer dans un projet commercial, merci de nous contacter. SelectedChatView - + chat_view_group_call_toast_message Démarrer un appel de groupe ? + + + reply_to_label + Reply to %1 + Réponse à %1 + SettingsPage @@ -4928,22 +4947,22 @@ Pour les activer dans un projet commercial, merci de nous contacter.L'appel de groupe n'a pas pu être créé - + unknown_audio_device_name Appareil inconnu - + conference_invitation Invitation à une réunion - + conference_invitation_cancelled Annulation d'une réunion - + conference_invitation_updated Modification d'une réunion @@ -4951,41 +4970,41 @@ Pour les activer dans un projet commercial, merci de nous contacter. Utils - + contact_presence_status_available Disponible - + contact_presence_status_busy Occupé - + contact_presence_status_do_not_disturb Ne pas déranger - + contact_presence_status_offline Hors ligne - + contact_presence_status_away Inactif/Absent - + information_popup_call_not_created_message "L'appel n'a pas pu être créé" L'appel n'a pas pu être créé - - - - + + + + information_popup_error_title Error ---------- @@ -4993,12 +5012,12 @@ Failed to create 1-1 conversation with %1 ! Erreur - + information_popup_group_call_not_created_message L'appel de groupe n'a pas pu être créé - + number_of_years %n an(s) @@ -5007,7 +5026,7 @@ Failed to create 1-1 conversation with %1 ! - + number_of_month "%n mois" @@ -5016,7 +5035,7 @@ Failed to create 1-1 conversation with %1 ! - + number_of_weeks %n semaine(s) @@ -5025,7 +5044,7 @@ Failed to create 1-1 conversation with %1 ! - + number_of_days %n jour(s) @@ -5034,56 +5053,67 @@ Failed to create 1-1 conversation with %1 ! - + today "Aujourd'hui" Aujourd'hui - + yesterday "Hier Hier - + call_zrtp_token_verification_possible_characters "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 - - + + information_popup_chatroom_creation_error_message Failed to create 1-1 conversation with %1 ! Erreur lors de la création de la conversation avec %1 - + + chatMessage_error + Cannot reply to invalid message + Impossible de répondre : message invalide + + + recorder_error Error with the recorder Erreur avec l'enregistreur - + + chat_error Erreur dans le chat - - + + + + info_popup_error_title Error Erreur - + + info_popup_send_voice_message_error_message Could not send voice message : %1 Impossible d'envoyer le message vocal : %1 - + + info_popup_send_voice_message_sending_error_message Failed to create message from record Impossible de créer le message vocal @@ -5251,1117 +5281,1117 @@ Failed to create 1-1 conversation with %1 ! country - + Afghanistan Afghanistan - + Albania Albanie - + Algeria Algérie - + AmericanSamoa Samoa américaines - + Andorra Andorre - + Angola Angola - + Anguilla Anguilla - + AntiguaAndBarbuda Antigua-et-Barbuda - + Argentina Argentine - + Armenia Arménie - + Aruba Aruba - + Australia Australie - + Austria Autriche - + Azerbaijan Azerbaïdjan - + Bahamas Bahamas - + Bahrain Bahreïn - + Bangladesh Bangladesh - + Barbados Barbade - + Belarus Biélorussie - + Belgium Belgique - + Belize Belize - + Benin Bénin - + Bermuda Bermudes - + Bhutan Bhoutan - + Bolivia Bolivie - + BosniaAndHerzegowina Bosnie-Herzégovine - + Botswana Botswana - + Brazil Brésil - + Brunei Brunéi - + Bulgaria Bulgarie - + BurkinaFaso Burkina Faso - + Burundi Burundi - + Cambodia Cambodge - + Cameroon Cameroun - + Canada Canada - + CapeVerde Cap-Vert - + CaymanIslands Îles Caïmans - + CentralAfricanRepublic République centrafricaine - + Chad Tchad - + Chile Chili - + China Chine - + Colombia Colombie - + Comoros Comores - + PeoplesRepublicOfCongo République populaire du Congo - + CookIslands Îles Cook - + CostaRica Costa Rica - + IvoryCoast Côte d'Ivoire - + Croatia Croatie - + Cuba Cuba - + Cyprus Chypre - + CzechRepublic République Tchèque - + Denmark Danemark - + Djibouti Djibouti - + Dominica Dominique - + DominicanRepublic République dominicaine - + Ecuador Équateur - + Egypt Égypte - + ElSalvador El Salvador - + EquatorialGuinea Guinée équatoriale - + Eritrea Érythrée - + Estonia Estonie - + Ethiopia Éthiopie - + FalklandIslands Îles Falkland - + FaroeIslands Îles Féroé - + Fiji Fidji - + Finland Finlande - + France France - + FrenchGuiana Guyane française - + FrenchPolynesia Polynésie française - + Gabon Gabon - + Gambia Gambie - + Georgia Géorgie - + Germany Allemagne - + Ghana Ghana - + Gibraltar Gibraltar - + Greece Grèce - + Greenland Groenland - + Grenada Grenade - + Guadeloupe Guadeloupe - + Guam Guam - + Guatemala Guatemala - + Guinea Guinée - + GuineaBissau Guinée-Bissau - + Guyana Guyana - + Haiti Haïti - + Honduras Honduras - + DemocraticRepublicOfCongo République démocratique du Congo - + HongKong Hong Kong - + Hungary Hongrie - + Iceland Islande - + India Inde - + Indonesia Indonésie - + Iran Iran - + Iraq Irak - + Ireland Irlande - + Israel Israël - + Italy Italie - + Jamaica Jamaïque - + Japan Japon - + Jordan Jordanie - + Kazakhstan Kazakhstan - + Kenya Kenya - + Kiribati Kiribati - + DemocraticRepublicOfKorea Corée du Nord - + RepublicOfKorea Corée du Sud - + Kuwait Koweït - + Kyrgyzstan Kirghizistan - + Laos Laos - + Latvia Lettonie - + Lebanon Liban - + Lesotho Lesotho - + Liberia Libéria - + Libya Libye - + Liechtenstein Liechtenstein - + Lithuania Lituanie - + Luxembourg Luxembourg - + Macau Macao - + Macedonia Macédoine - + Madagascar Madagascar - + Malawi Malawi - + Malaysia Malaisie - + Maldives Maldives - + Mali Mali - + Malta Malte - + MarshallIslands Îles Marshall - + Martinique Martinique - + Mauritania Mauritanie - + Mauritius Maurice - + Mayotte Mayotte - + Mexico Mexique - + Micronesia Micronésie - + Moldova Moldavie - + Monaco Monaco - + Mongolia Mongolie - + Montenegro Montenegro - + Montserrat Montserrat - + Morocco Maroc - + Mozambique Mozambique - + Myanmar Myanmar - + Namibia Namibie - + NauruCountry Nauru - + Nepal Népal - + Netherlands Pays-Bas - + NewCaledonia Nouvelle-Calédonie - + NewZealand Nouvelle-Zélande - + Nicaragua Nicaragua - + Niger Niger - + Nigeria Nigeria - + Niue Niué - + NorfolkIsland Île Norfolk - + NorthernMarianaIslands Îles Mariannes du Nord - + Norway Norvège - + Oman Oman - + Pakistan Pakistan - + Palau Palaos - + PalestinianTerritories Palestine - + Panama Panama - + PapuaNewGuinea Papouasie-Nouvelle-Guinée - + Paraguay Paraguay - + Peru Pérou - + Philippines Philippines - + Poland Pologne - + Portugal Portugal - + PuertoRico Porto Rico - + Qatar Qatar - + Reunion La Réunion - + Romania Roumanie - + RussianFederation Russie - + Rwanda Rwanda - + SaintHelena Sainte-Hélène - + SaintKittsAndNevis Saint-Christophe-et-Niévès - + SaintLucia Sainte-Lucie - + SaintPierreAndMiquelon Saint-Pierre-et-Miquelon - + SaintVincentAndTheGrenadines Saint-Vincent et les Grenadines - + Samoa Samoa - + SanMarino Saint-Marin - + SaoTomeAndPrincipe Sao Tomé-et-Principe - + SaudiArabia Arabie saoudite - + Senegal Sénégal - + Serbia Serbie - + Seychelles Seychelles - + SierraLeone Sierra Leone - + Singapore Singapour - + Slovakia Slovaquie - + Slovenia Slovénie - + SolomonIslands Îles Salomon - + Somalia Somalie - + SouthAfrica Afrique du Sud - + Spain Espagne - + SriLanka Sri Lanka - + Sudan Soudan - + Suriname Suriname - + Swaziland Eswatini - + Sweden Suède - + Switzerland Suisse - + Syria Syrie - + Taiwan Taïwan - + Tajikistan Tadjikistan - + Tanzania Tanzanie - + Thailand Thaïlande - + Togo Togo - + Tokelau Tokelau - + Tonga Tonga - + TrinidadAndTobago Trinité-et-Tobago - + Tunisia Tunisie - + Turkey Turquie - + Turkmenistan Turkménistan - + TurksAndCaicosIslands Îles Turks et Caïques - + Tuvalu Tuvalu - + Uganda Ouganda - + Ukraine Ukraine - + UnitedArabEmirates Émirats arabes unis - + UnitedKingdom Royaume-Uni - + UnitedStates États-Unis - + Uruguay Uruguay - + Uzbekistan Ouzbékistan - + Vanuatu Vanuatu - + Venezuela Venezuela - + Vietnam Vietnam - + WallisAndFutunaIslands Wallis et Futuna - + Yemen Yémen - + Zambia Zambie - + Zimbabwe Zimbabwe diff --git a/Linphone/model/chat/ChatModel.cpp b/Linphone/model/chat/ChatModel.cpp index 82f6b1f8a..e6d991931 100644 --- a/Linphone/model/chat/ChatModel.cpp +++ b/Linphone/model/chat/ChatModel.cpp @@ -137,6 +137,11 @@ ChatModel::createVoiceRecordingMessage(const std::shared_ptr return mMonitor->createVoiceRecordingMessage(recorder); } +std::shared_ptr +ChatModel::createReplyMessage(const std::shared_ptr &message) { + return mMonitor->createReplyMessage(message); +} + std::shared_ptr ChatModel::createTextMessageFromText(QString text) { return mMonitor->createMessageFromUtf8(Utils::appStringToCoreString(text)); } diff --git a/Linphone/model/chat/ChatModel.hpp b/Linphone/model/chat/ChatModel.hpp index 1be12dcd9..1e64a9012 100644 --- a/Linphone/model/chat/ChatModel.hpp +++ b/Linphone/model/chat/ChatModel.hpp @@ -52,6 +52,9 @@ public: void leave(); std::shared_ptr createVoiceRecordingMessage(const std::shared_ptr &recorder); + + std::shared_ptr createReplyMessage(const std::shared_ptr &message); + std::shared_ptr createTextMessageFromText(QString text); std::shared_ptr createMessage(QString text, QList> filesContent); diff --git a/Linphone/model/tool/ToolModel.cpp b/Linphone/model/tool/ToolModel.cpp index 91b651596..b123ff59e 100644 --- a/Linphone/model/tool/ToolModel.cpp +++ b/Linphone/model/tool/ToolModel.cpp @@ -388,11 +388,13 @@ bool ToolModel::friendIsInFriendList(const std::shared_ptr QString ToolModel::getMessageFromContent(std::list> contents) { mustBeInLinphoneThread(sLog().arg(Q_FUNC_INFO)); + QString res; for (auto &content : contents) { if (content->isText()) { return Utils::coreStringToAppString(content->getUtf8Text()); } else if (content->isFile()) { - return Utils::coreStringToAppString(content->getName()); + if (res.isEmpty()) res.append(Utils::coreStringToAppString(content->getName())); + else res.append(", " + Utils::coreStringToAppString(content->getName())); } else if (content->isIcalendar()) { auto conferenceInfo = linphone::Factory::get()->createConferenceInfoFromIcalendarContent(content); auto conferenceInfoCore = ConferenceInfoCore::create(conferenceInfo); @@ -406,7 +408,7 @@ QString ToolModel::getMessageFromContent(std::listgetParts()); } } - return QString(""); + return res; } // Load downloaded codecs like OpenH264 (needs to be after core is created and has loaded its plugins, as diff --git a/Linphone/tool/Utils.cpp b/Linphone/tool/Utils.cpp index a77799429..b8351ac42 100644 --- a/Linphone/tool/Utils.cpp +++ b/Linphone/tool/Utils.cpp @@ -25,6 +25,7 @@ #include "core/call/CallGui.hpp" #include "core/chat/ChatCore.hpp" #include "core/chat/ChatGui.hpp" +#include "core/chat/message/ChatMessageGui.hpp" #include "core/conference/ConferenceCore.hpp" #include "core/conference/ConferenceInfoCore.hpp" #include "core/conference/ConferenceInfoGui.hpp" @@ -1950,6 +1951,50 @@ QString Utils::getSafeFilePath(const QString &filePath, bool *soFarSoGood) { return QString(""); } +void Utils::sendReplyMessage(ChatMessageGui *message, ChatGui *chatGui, QString text, QVariantList files) { + auto chatModel = chatGui && chatGui->mCore ? chatGui->mCore->getModel() : nullptr; + auto chatMessageModel = message && message->mCore ? message->mCore->getModel() : nullptr; + if (!chatModel || !chatMessageModel) { + //: Cannot reply to invalid message + QString error = !chatMessageModel ? tr("chatMessage_error") + //: Error in the chat + : tr("chat_error"); + //: Error + showInformationPopup(tr("info_popup_error_title"), + //: Could not send voice message : %1 + tr("info_popup_send_voice_message_error_message").arg(error)); + return; + } + QList> filesContent; + for (auto &file : files) { + auto contentGui = qvariant_cast(file); + if (contentGui) { + auto contentCore = contentGui->mCore; + filesContent.append(contentCore->getContentModel()); + } + } + App::postModelAsync([chatModel, chatMessageModel, text, filesContent] { + mustBeInLinphoneThread(sLog().arg(Q_FUNC_INFO)); + auto chat = chatModel->getMonitor(); + auto messageToReplyTo = chatMessageModel->getMonitor(); + auto linMessage = chatModel->createReplyMessage(messageToReplyTo); + if (linMessage) { + linMessage->addUtf8TextContent(Utils::appStringToCoreString(text)); + for (auto &content : filesContent) { + linMessage->addFileContent(content->getContent()); + } + linMessage->send(); + } else { + App::postCoreAsync([] { + //: Error + showInformationPopup(tr("info_popup_error_title"), + //: Failed to create message from record + tr("info_popup_send_voice_message_sending_error_message")); + }); + } + }); +} + VariantObject *Utils::createVoiceRecordingMessage(RecorderGui *recorderGui, ChatGui *chatGui) { VariantObject *data = new VariantObject("createVoiceRecordingMessage"); if (!data) return nullptr; diff --git a/Linphone/tool/Utils.hpp b/Linphone/tool/Utils.hpp index cecd2e17f..5346c1025 100644 --- a/Linphone/tool/Utils.hpp +++ b/Linphone/tool/Utils.hpp @@ -52,6 +52,7 @@ class ConferenceCore; class ParticipantDeviceCore; class DownloadablePayloadTypeCore; class ChatGui; +class ChatMessageGui; class RecorderGui; class Utils : public QObject, public AbstractObject { @@ -176,6 +177,8 @@ public: Q_INVOKABLE static QString toTimeString(QDateTime date, const QString &format = "hh:mm:ss"); Q_INVOKABLE static VariantObject *createVoiceRecordingMessage(RecorderGui *recorderGui, ChatGui *chatGui); + Q_INVOKABLE static void + sendReplyMessage(ChatMessageGui *message, ChatGui *chatGui, QString text, QVariantList files); Q_INVOKABLE static void sendVoiceRecordingMessage(RecorderGui *recorderGui, ChatGui *chatGui); // QDir findDirectoryByName(QString startPath, QString name); diff --git a/Linphone/view/Control/Display/Chat/ChatMessage.qml b/Linphone/view/Control/Display/Chat/ChatMessage.qml index 8e849ec7e..e96bd8a65 100644 --- a/Linphone/view/Control/Display/Chat/ChatMessage.qml +++ b/Linphone/view/Control/Display/Chat/ChatMessage.qml @@ -19,6 +19,8 @@ Control.Control { property string fromAddress: chatMessage? chatMessage.core.fromAddress : "" property bool isRemoteMessage: chatMessage? chatMessage.core.isRemoteMessage : false property bool isFromChatGroup: chatMessage? chatMessage.core.isFromChatGroup : false + property bool isReply: chatMessage? chatMessage.core.isReply : false + property string replyText: chatMessage? chatMessage.core.replyText : false property var msgState: chatMessage ? chatMessage.core.messageState : LinphoneEnums.ChatMessageState.StateIdle hoverEnabled: true property bool linkHovered: false @@ -30,6 +32,7 @@ Control.Control { signal isFileHoveringChanged(bool isFileHovering) signal showReactionsForMessageRequested() signal showImdnStatusForMessageRequested() + signal replyToMessageRequested() background: Item { anchors.fill: parent @@ -41,52 +44,119 @@ Control.Control { } } - contentItem: RowLayout { - spacing: 0 - layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft - - Avatar { - id: avatar - visible: mainItem.isFromChatGroup && mainItem.isRemoteMessage - Layout.preferredWidth: mainItem.isRemoteMessage ? 26 * DefaultStyle.dp : 0 - Layout.preferredHeight: 26 * DefaultStyle.dp + contentItem: ColumnLayout { + spacing: Math.round(5 * DefaultStyle.dp) + Text { + id: fromNameText Layout.alignment: Qt.AlignTop - Layout.topMargin: isFirstMessage ? 16 * DefaultStyle.dp : 0 - _address: chatMessage ? chatMessage.core.fromAddress : "" + Layout.leftMargin: mainItem.isFromChatGroup ? Math.round(9 * DefaultStyle.dp) + avatar.width : 0 + visible: mainItem.isFromChatGroup && mainItem.isRemoteMessage && mainItem.isFirstMessage && !replyLayout.visible + maximumLineCount: 1 + width: implicitWidth + x: mapToItem(this, chatBubble.x, chatBubble.y).x + text: mainItem.chatMessage.core.fromName + color: DefaultStyle.main2_500main + font { + pixelSize: Typography.p4.pixelSize + weight: Typography.p4.weight + } } - ColumnLayout { - Layout.alignment: Qt.AlignTop - spacing: 0 - Text { - id: fromNameText - Layout.alignment: Qt.AlignTop - visible: mainItem.isFromChatGroup && mainItem.isRemoteMessage && mainItem.isFirstMessage - // anchors.top: parent.top - // anchors.left: parent.left - // anchors.leftMargin: avatar.width// mainItem.isFromChatGroup ? Math.round(9 * DefaultStyle.dp) : 0 - maximumLineCount: 1 - Layout.leftMargin: mainItem.isFromChatGroup ? Math.round(9 * DefaultStyle.dp) : 0 - width: implicitWidth - x: mapToItem(this, chatBubble.x, chatBubble.y).x - text: mainItem.chatMessage.core.fromName - color: DefaultStyle.main2_500main - font { - pixelSize: Typography.p4.pixelSize - weight: Typography.p4.weight + RowLayout { + id: replyLayout + visible: mainItem.isReply + Layout.leftMargin: mainItem.isFromChatGroup ? Math.round(9 * DefaultStyle.dp) + avatar.width : 0 + layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft + ColumnLayout { + spacing: Math.round(5 * DefaultStyle.dp) + RowLayout { + id: replyLabel + spacing: Math.round(8 * DefaultStyle.dp) + Layout.fillWidth: false + Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft : Qt.AlignRight + EffectImage { + imageSource: AppIcons.reply + colorizationColor: DefaultStyle.main2_500main + Layout.preferredWidth: Math.round(12 * DefaultStyle.dp) + Layout.preferredHeight: Math.round(12 * DefaultStyle.dp) + } + Text { + Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft: Qt.AlignRight + text: mainItem.isRemoteMessage + ? mainItem.chatMessage.core.repliedToName !== "" + //: %1 replied to %2 + ? qsTr("chat_message_remote_replied_to").arg(mainItem.chatMessage.core.fromName).arg(mainItem.chatMessage.core.repliedToName) + //: %1 replied + : qsTr("chat_message_remote_replied").arg(mainItem.chatMessage.core.fromName) + : mainItem.chatMessage.core.repliedToName !== "" + //: You replied to %1 + ? qsTr("chat_message_user_replied_to").arg(mainItem.chatMessage.core.repliedToName) + //: You replied + : qsTr("chat_message_user_replied") + color: DefaultStyle.main2_600 + font { + pixelSize: Typography.p4.pixelSize + weight: Typography.p4.weight + } + } + } + Control.Control { + id: replyMessage + visible: mainItem.replyText !== "" + Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft : Qt.AlignRight + spacing: Math.round(5 * DefaultStyle.dp) + topPadding: Math.round(12 * DefaultStyle.dp) + bottomPadding: Math.round(19 * DefaultStyle.dp) + leftPadding: Math.round(18 * DefaultStyle.dp) + rightPadding: Math.round(18 * DefaultStyle.dp) + width: Math.min(implicitWidth, mainItem.maxWidth - avatar.implicitWidth) + background: Rectangle { + anchors.fill: parent + color: DefaultStyle.grey_200 + radius: Math.round(16 * DefaultStyle.dp) + } + contentItem: Text { + Layout.fillWidth: true + text: mainItem.replyText + color: DefaultStyle.main2_800 + font { + pixelSize: Typography.p1.pixelSize + weight: Typography.p1.weight + } + } } } + Item{Layout.fillWidth: true} + } + RowLayout { + id: bubbleLayout + z: replyLayout.z + 1 + spacing: 0 + layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft + Layout.topMargin: replyMessage.visible ? Math.round(-20 * DefaultStyle.dp) : 0 + + Avatar { + id: avatar + visible: mainItem.isFromChatGroup && mainItem.isRemoteMessage + Layout.preferredWidth: mainItem.isRemoteMessage ? 26 * DefaultStyle.dp : 0 + Layout.preferredHeight: 26 * DefaultStyle.dp + Layout.alignment: Qt.AlignTop + Layout.topMargin: isFirstMessage ? 16 * DefaultStyle.dp : 0 + _address: chatMessage ? chatMessage.core.fromAddress : "" + } Item { + id: bubbleContainer // Layout.topMargin: isFirstMessage ? 16 * DefaultStyle.dp : 0 Layout.leftMargin: mainItem.isFromChatGroup ? Math.round(9 * DefaultStyle.dp) : 0 Layout.preferredHeight: childrenRect.height Layout.preferredWidth: childrenRect.width + Control.Control { id: chatBubble spacing: Math.round(2 * DefaultStyle.dp) topPadding: Math.round(12 * DefaultStyle.dp) bottomPadding: Math.round(6 * DefaultStyle.dp) - leftPadding: Math.round(12 * DefaultStyle.dp) - rightPadding: Math.round(12 * DefaultStyle.dp) + leftPadding: Math.round(18 * DefaultStyle.dp) + rightPadding: Math.round(18 * DefaultStyle.dp) width: Math.min(implicitWidth, mainItem.maxWidth - avatar.implicitWidth) MouseArea { // Default mouse area. Each sub bubble can control the mouse and pass on to the main mouse handler. Child bubble mouse area must cover the entire bubble. @@ -133,6 +203,7 @@ Control.Control { } } RowLayout { + Layout.fillWidth: false Layout.alignment: mainItem.isRemoteMessage ? Qt.AlignLeft : Qt.AlignRight Text { text: UtilsCpp.formatDate(mainItem.chatMessage.core.timestamp, true, false, "dd/MM") @@ -217,118 +288,130 @@ Control.Control { } } } - } - RowLayout { - id: actionsLayout - visible: mainItem.hovered || optionsMenu.hovered || optionsMenu.popup.opened || emojiButton.hovered || emojiButton.popup.opened - Layout.leftMargin: Math.round(8 * DefaultStyle.dp) - Layout.rightMargin: Math.round(8 * DefaultStyle.dp) - Layout.alignment: Qt.AlignVCenter - // Layout.fillWidth: true - spacing: Math.round(7 * DefaultStyle.dp) - layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft - PopupButton { - id: optionsMenu - popup.padding: 0 - popup.contentItem: ColumnLayout { - spacing: 0 - IconLabelButton { - inverseLayout: true - text: chatBubbleContent.selectedText != "" - //: "Copy selection" - ? qsTr("chat_message_copy_selection") - //: "Copy" - : qsTr("chat_message_copy") - icon.source: AppIcons.copy - // spacing: Math.round(10 * DefaultStyle.dp) - Layout.fillWidth: true - Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) - onClicked: { - var success = UtilsCpp.copyToClipboard(chatBubbleContent.selectedText != "" ? chatBubbleContent.selectedText : mainItem.chatMessage.core.text) - //: Copied - if (success) UtilsCpp.showInformationPopup(qsTr("chat_message_copied_to_clipboard_title"), - //: "to clipboard" - qsTr("chat_message_copied_to_clipboard_toast")) - optionsMenu.close() - } - } - IconLabelButton { - inverseLayout: true - //: "See message status" - text: qsTr("chat_message_see_status") - icon.source: AppIcons.chatTeardropText - Layout.fillWidth: true - Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) - onClicked: { - mainItem.showImdnStatusForMessageRequested() - optionsMenu.close() - } - } - Rectangle { - Layout.fillWidth: true - Layout.preferredHeight: Math.min(1, Math.round(1 * DefaultStyle.dp)) - color: DefaultStyle.main2_400 - } - IconLabelButton { - inverseLayout: true - //: "Delete" - text: qsTr("chat_message_delete") - icon.source: AppIcons.trashCan - // spacing: Math.round(10 * DefaultStyle.dp) - Layout.fillWidth: true - Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) - onClicked: { - mainItem.messageDeletionRequested() - optionsMenu.close() - } - style: ButtonStyle.hoveredBackgroundRed - } - } - } - PopupButton { - id: emojiButton - style: ButtonStyle.noBackground - icon.source: AppIcons.smiley - popup.contentItem: RowLayout { - Repeater { - model: ConstantsCpp.reactionsList - delegate: Button { - text: UtilsCpp.encodeEmojiToQmlRichFormat(modelData) - background: Rectangle { - anchors.fill: parent - color: DefaultStyle.grey_200 - radius: parent.width * 4 - visible: mainItem.ownReaction === modelData - } + RowLayout { + id: actionsLayout + visible: mainItem.hovered || optionsMenu.hovered || optionsMenu.popup.opened || emojiButton.hovered || emojiButton.popup.opened + Layout.leftMargin: Math.round(8 * DefaultStyle.dp) + Layout.rightMargin: Math.round(8 * DefaultStyle.dp) + Layout.alignment: Qt.AlignVCenter + // Layout.fillWidth: true + spacing: Math.round(7 * DefaultStyle.dp) + layoutDirection: mainItem.isRemoteMessage ? Qt.LeftToRight : Qt.RightToLeft + PopupButton { + id: optionsMenu + popup.padding: 0 + popup.contentItem: ColumnLayout { + spacing: 0 + IconLabelButton { + inverseLayout: true + //: "Reception info" + text: qsTr("chat_message_reception_info") + icon.source: AppIcons.chatTeardropText + Layout.fillWidth: true + Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) onClicked: { - if(modelData) { - if (mainItem.ownReaction === modelData) mainItem.chatMessage.core.lRemoveReaction() - else mainItem.chatMessage.core.lSendReaction(modelData) - } - emojiButton.close() + mainItem.showImdnStatusForMessageRequested() + optionsMenu.close() } } + IconLabelButton { + inverseLayout: true + //: Reply + text: qsTr("chat_message_reply") + icon.source: AppIcons.reply + Layout.fillWidth: true + Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) + onClicked: { + mainItem.replyToMessageRequested() + optionsMenu.close() + } + } + IconLabelButton { + inverseLayout: true + text: chatBubbleContent.selectedText != "" + //: "Copy selection" + ? qsTr("chat_message_copy_selection") + //: "Copy" + : qsTr("chat_message_copy") + icon.source: AppIcons.copy + // spacing: Math.round(10 * DefaultStyle.dp) + Layout.fillWidth: true + Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) + onClicked: { + var success = UtilsCpp.copyToClipboard(chatBubbleContent.selectedText != "" ? chatBubbleContent.selectedText : mainItem.chatMessage.core.text) + //: Copied + if (success) UtilsCpp.showInformationPopup(qsTr("chat_message_copied_to_clipboard_title"), + //: "to clipboard" + qsTr("chat_message_copied_to_clipboard_toast")) + optionsMenu.close() + } + } + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: Math.min(1, Math.round(1 * DefaultStyle.dp)) + color: DefaultStyle.main2_400 + } + IconLabelButton { + inverseLayout: true + //: "Delete" + text: qsTr("chat_message_delete") + icon.source: AppIcons.trashCan + // spacing: Math.round(10 * DefaultStyle.dp) + Layout.fillWidth: true + Layout.preferredHeight: Math.round(45 * DefaultStyle.dp) + onClicked: { + mainItem.messageDeletionRequested() + optionsMenu.close() + } + style: ButtonStyle.hoveredBackgroundRed + } } - PopupButton { - id: emojiPickerButton - icon.source: AppIcons.plusCircle - popup.width: Math.round(393 * DefaultStyle.dp) - popup.height: Math.round(291 * DefaultStyle.dp) - popup.contentItem: EmojiPicker { - id: emojiPicker - onEmojiClicked: (emoji) => { - if (mainItem.chatMessage) { - if (mainItem.ownReaction === emoji) mainItem.chatMessage.core.lRemoveReaction() - else mainItem.chatMessage.core.lSendReaction(emoji) + } + PopupButton { + id: emojiButton + style: ButtonStyle.noBackground + icon.source: AppIcons.smiley + popup.contentItem: RowLayout { + Repeater { + model: ConstantsCpp.reactionsList + delegate: Button { + text: UtilsCpp.encodeEmojiToQmlRichFormat(modelData) + background: Rectangle { + anchors.fill: parent + color: DefaultStyle.grey_200 + radius: parent.width * 4 + visible: mainItem.ownReaction === modelData + } + onClicked: { + if(modelData) { + if (mainItem.ownReaction === modelData) mainItem.chatMessage.core.lRemoveReaction() + else mainItem.chatMessage.core.lSendReaction(modelData) + } + emojiButton.close() + } + } + } + PopupButton { + id: emojiPickerButton + icon.source: AppIcons.plusCircle + popup.width: Math.round(393 * DefaultStyle.dp) + popup.height: Math.round(291 * DefaultStyle.dp) + popup.contentItem: EmojiPicker { + id: emojiPicker + onEmojiClicked: (emoji) => { + if (mainItem.chatMessage) { + if (mainItem.ownReaction === emoji) mainItem.chatMessage.core.lRemoveReaction() + else mainItem.chatMessage.core.lSendReaction(emoji) + } + emojiPickerButton.close() + emojiButton.close() } - emojiPickerButton.close() - emojiButton.close() } } } } } + Item{Layout.fillWidth: true} } - Item{Layout.fillWidth: true} } } diff --git a/Linphone/view/Control/Display/Chat/ChatMessagesListView.qml b/Linphone/view/Control/Display/Chat/ChatMessagesListView.qml index 3cc031c4c..223e8ba2a 100644 --- a/Linphone/view/Control/Display/Chat/ChatMessagesListView.qml +++ b/Linphone/view/Control/Display/Chat/ChatMessagesListView.qml @@ -16,6 +16,7 @@ ListView { property color backgroundColor signal showReactionsForMessageRequested(ChatMessageGui chatMessage) signal showImdnStatusForMessageRequested(ChatMessageGui chatMessage) + signal replyToMessageRequested(ChatMessageGui chatMessage) Component.onCompleted: { var index = eventLogProxy.findFirstUnreadIndex() @@ -137,6 +138,7 @@ ListView { onMessageDeletionRequested: modelData.core.lDelete() onShowReactionsForMessageRequested: mainItem.showReactionsForMessageRequested(modelData) onShowImdnStatusForMessageRequested: mainItem.showImdnStatusForMessageRequested(modelData) + onReplyToMessageRequested: mainItem.replyToMessageRequested(modelData) } } diff --git a/Linphone/view/Control/Input/Chat/ChatDroppableTextArea.qml b/Linphone/view/Control/Input/Chat/ChatDroppableTextArea.qml index 8ab8f7319..8a96c087c 100644 --- a/Linphone/view/Control/Input/Chat/ChatDroppableTextArea.qml +++ b/Linphone/view/Control/Input/Chat/ChatDroppableTextArea.qml @@ -37,7 +37,6 @@ Control.Control { function _emitFiles (files) { // Filtering files, other urls are forbidden. files = files.reduce(function (files, file) { - console.log("dropping", file.toString()) if (file.toString().startsWith("file:")) { files.push(Utils.getSystemPathFromUri(file)) } diff --git a/Linphone/view/Page/Form/Chat/SelectedChatView.qml b/Linphone/view/Page/Form/Chat/SelectedChatView.qml index cbc1c1af5..bd5023537 100644 --- a/Linphone/view/Page/Form/Chat/SelectedChatView.qml +++ b/Linphone/view/Page/Form/Chat/SelectedChatView.qml @@ -18,6 +18,7 @@ RowLayout { property var contact: contactObj?.value || null property CallGui call property alias callHeaderContent: splitPanel.headerContent + property bool replyingToMessage: false spacing: 0 signal oneOneCall(bool video) @@ -161,6 +162,10 @@ RowLayout { contentLoader.showingImdnStatus = true detailsPanel.visible = true } + onReplyToMessageRequested: (chatMessage) => { + mainItem.chatMessage = chatMessage + mainItem.replyingToMessage = true + } Popup { id: emojiPickerPopup @@ -208,9 +213,9 @@ RowLayout { } Control.Control { id: selectedFilesArea - visible: selectedFiles.count > 0 + visible: selectedFiles.count > 0 || mainItem.replyingToMessage Layout.fillWidth: true - Layout.preferredHeight: Math.round(104 * DefaultStyle.dp) + Layout.preferredHeight: implicitHeight topPadding: Math.round(12 * DefaultStyle.dp) bottomPadding: Math.round(12 * DefaultStyle.dp) leftPadding: Math.round(19 * DefaultStyle.dp) @@ -225,6 +230,7 @@ RowLayout { style: ButtonStyle.noBackground onClicked: { contents.clear() + mainItem.replyingToMessage = false } } background: Item{ @@ -233,7 +239,6 @@ RowLayout { color: DefaultStyle.grey_0 border.color: DefaultStyle.main2_100 border.width: Math.round(2 * DefaultStyle.dp) - radius: Math.round(20 * DefaultStyle.dp) height: parent.height / 2 anchors.top: parent.top anchors.left: parent.left @@ -246,37 +251,73 @@ RowLayout { height: 2 * parent.height / 3 } } - contentItem: ListView { - id: selectedFiles - orientation: ListView.Horizontal - spacing: Math.round(16 * DefaultStyle.dp) - model: ChatMessageContentProxy { - id: contents - filterType: ChatMessageContentProxy.FilterContentType.File - } - delegate: Item { - width: Math.round(80 * DefaultStyle.dp) - height: Math.round(80 * DefaultStyle.dp) - FileView { - contentGui: modelData - anchors.left: parent.left - anchors.bottom: parent.bottom - width: Math.round(69 * DefaultStyle.dp) - height: Math.round(69 * DefaultStyle.dp) + contentItem: ColumnLayout { + spacing: Math.round(5 * DefaultStyle.dp) + ColumnLayout { + id: replyLayout + spacing: 0 + visible: mainItem.chatMessage && mainItem.replyingToMessage + Text { + Layout.fillWidth: true + //: Reply to %1 + text: mainItem.chatMessage ? qsTr("reply_to_label").arg(UtilsCpp.boldTextPart(mainItem.chatMessage.core.fromName, mainItem.chatMessage.core.fromName)) : "" + color: DefaultStyle.main2_500main + font { + pixelSize: Typography.p3.pixelSize + weight: Typography.p3.weight + } } - RoundButton { - icon.source: AppIcons.closeX - icon.width: Math.round(12 * DefaultStyle.dp) - icon.height: Math.round(12 * DefaultStyle.dp) - anchors.top: parent.top - anchors.right: parent.right - style: ButtonStyle.numericPad - shadowEnabled: true - padding: Math.round(3 * DefaultStyle.dp) - onClicked: contents.removeContent(modelData) + Text { + Layout.fillWidth: true + text: mainItem.chatMessage ? mainItem.chatMessage.core.text : "" + color: DefaultStyle.main2_400 + font { + pixelSize: Typography.p3.pixelSize + weight: Typography.p3.weight + } } } - Control.ScrollBar.horizontal: selectedFilesScrollbar + Rectangle { + Layout.fillWidth: true + visible: replyLayout.visible && selectedFiles.visible + color: DefaultStyle.main2_300 + Layout.preferredHeight: Math.max(1, Math.round(1 * DefaultStyle.dp)) + } + ListView { + id: selectedFiles + orientation: ListView.Horizontal + visible: count > 0 + spacing: Math.round(16 * DefaultStyle.dp) + Layout.fillWidth: true + Layout.preferredHeight: Math.round(104 * DefaultStyle.dp) + model: ChatMessageContentProxy { + id: contents + filterType: ChatMessageContentProxy.FilterContentType.File + } + delegate: Item { + width: Math.round(80 * DefaultStyle.dp) + height: Math.round(80 * DefaultStyle.dp) + FileView { + contentGui: modelData + anchors.left: parent.left + anchors.bottom: parent.bottom + width: Math.round(69 * DefaultStyle.dp) + height: Math.round(69 * DefaultStyle.dp) + } + RoundButton { + icon.source: AppIcons.closeX + icon.width: Math.round(12 * DefaultStyle.dp) + icon.height: Math.round(12 * DefaultStyle.dp) + anchors.top: parent.top + anchors.right: parent.right + style: ButtonStyle.numericPad + shadowEnabled: true + padding: Math.round(3 * DefaultStyle.dp) + onClicked: contents.removeContent(modelData) + } + } + Control.ScrollBar.horizontal: selectedFilesScrollbar + } } ScrollBar { id: selectedFilesScrollbar @@ -304,7 +345,11 @@ RowLayout { } onSendMessage: { var filesContents = contents.getAll() - if (filesContents.length === 0) + if (mainItem.replyingToMessage) { + mainItem.replyingToMessage = false + UtilsCpp.sendReplyMessage(mainItem.chatMessage, mainItem.chat, text, filesContents) + } + else if (filesContents.length === 0) mainItem.chat.core.lSendTextMessage(text) else mainItem.chat.core.lSendMessage(text, filesContents) contents.clear()