Languages + fix

This commit is contained in:
Julien Wadel 2021-08-02 14:45:01 +02:00
parent 464a750d16
commit 9eac0c77b2
24 changed files with 1648 additions and 1063 deletions

View file

@ -450,6 +450,14 @@ Server URL not configured.</translation>
<source>isComposing</source>
<translation>%1 is typing...</translation>
</message>
<message numerus="yes">
<source>chatTyping</source>
<extracomment>&apos;%1 is typing...&apos; indicate that someone is composing in chat</extracomment>
<translation>
<numerusform>%1 is typing...</numerusform>
<numerusform>%1 are typing...</numerusform>
</translation>
</message>
</context>
<context>
<name>Cli</name>
@ -693,6 +701,27 @@ Server URL not configured.</translation>
<source>cleanHistory</source>
<translation>Delete history</translation>
</message>
<message>
<source>conversationMenuGroupInformations</source>
<extracomment>&apos;Group informations&apos; : Item menu to get information about the chat room</extracomment>
<translation>Group informations</translation>
</message>
<message>
<source>conversationMenuDevices</source>
<extracomment>&quot;Conversation&apos;s devices&quot; : Item menu to get all participant devices of the chat room</extracomment>
<translation>Conversation&apos;s devices</translation>
</message>
<message>
<source>conversationMenuEphemeral</source>
<extracomment>&apos;Ephemeral messages&apos; : Item menu to enable ephemeral mode</extracomment>
<translation>Ephemeral messages</translation>
</message>
<message>
<source>adminStatus</source>
<extracomment>&apos;Admin&apos; : Admin(istrator)</extracomment>
<translation>Admin</translation>
<extra-Context>One word title for describing the current admin status</extra-Context>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -798,6 +827,76 @@ Server URL not configured.</translation>
<translation>Send a file</translation>
</message>
</context>
<context>
<name>EphemeralChatRoom</name>
<message>
<source>ephemeralTitle</source>
<extracomment>&quot;Ephemeral messages&quot; : Popup title for ephemerals</extracomment>
<translation>Ephemeral messages</translation>
</message>
<message>
<source>ephemeralText</source>
<extracomment>&apos;New messages will be deleted on both ends once it has been read by your contact. Select a timeout.&apos;</extracomment>
<translation>New messages will be deleted on both ends once it has been read by your contact. Select a timeout.</translation>
<extra-Context>Explanation for ephemerals</extra-Context>
</message>
<message>
<source>ephemeralNotInConference!</source>
<extracomment>&apos;
Ephemeral message is only supported in conference based chat room!&apos;</extracomment>
<translation>Ephemeral message is only supported in conference based chat room!</translation>
<extra-Context>Warning about not being in conference based chat room.</extra-Context>
</message>
<message>
<source>disabled</source>
<extracomment>&apos;Disabled&apos;</extracomment>
<translation>Disabled</translation>
</message>
<message numerus="yes">
<source>nMinute</source>
<extracomment>&apos;%1 minute&apos;</extracomment>
<translation>
<numerusform>%1 minute</numerusform>
<numerusform>%1 minutes</numerusform>
</translation>
</message>
<message numerus="yes">
<source>nHour</source>
<extracomment>&apos;%1 hour&apos;</extracomment>
<translation>
<numerusform>%1 hour</numerusform>
<numerusform>%1 hours</numerusform>
</translation>
</message>
<message numerus="yes">
<source>nDay</source>
<extracomment>&apos;%1 day&apos;
----------
&apos;%1 days&apos;</extracomment>
<translation>
<numerusform>%1 day</numerusform>
<numerusform>%1 days</numerusform>
</translation>
</message>
<message numerus="yes">
<source>nWeek</source>
<extracomment>&apos;%1 week&apos;</extracomment>
<translation>
<numerusform>%1 week</numerusform>
<numerusform>%1 weeks</numerusform>
</translation>
</message>
<message>
<source>cancelButton</source>
<extracomment>&apos;cancel&apos; : button text for cancelling operation</extracomment>
<translation>CANCEL</translation>
</message>
<message>
<source>startButton</source>
<extracomment>&apos;start&apos; : button text to start ephemeral mode</extracomment>
<translation>START</translation>
</message>
</context>
<context>
<name>Event</name>
<message>
@ -860,15 +959,15 @@ Server URL not configured.</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished">Edit contact</translation>
<translation>Edit contact</translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished">Add contact</translation>
<translation>Add contact</translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished">Delete history</translation>
<translation>Delete history</translation>
</message>
</context>
<context>
@ -956,6 +1055,76 @@ Server URL not configured.</translation>
<translation>Stop recording.</translation>
</message>
</context>
<context>
<name>InfoChatRoom</name>
<message>
<source>quitGroupButton</source>
<extracomment>&apos;Exit group&apos; : Button label</extracomment>
<translation>Exit group</translation>
</message>
<message>
<source>ok</source>
<extracomment>&apos;OK&apos; : Button label</extracomment>
<translation>OK</translation>
</message>
<message>
<source>addParticipantPlaceholder</source>
<extracomment>&apos;Add Participants&apos; : Placeholder in a search bar for adding participant to the chat room</extracomment>
<translation>Add Participants</translation>
</message>
<message>
<source>addParticipantTooltip</source>
<extracomment>&apos;Search participants in your contact list in order to invite them into the chat room.&apos;</extracomment>
<translation>Search participants in your contact list in order to invite them into the chat room.</translation>
<extra-Tooltip>Explanation for inviting the selected participants into chat room</extra-Tooltip>
</message>
<message>
<source>participantList</source>
<extracomment>&apos;Participant list&apos;</extracomment>
<translation>Participant list</translation>
</message>
<message>
<source>adminStatus</source>
<extracomment>&apos;Admin&apos; : Admin(istrator)</extracomment>
<translation>Admin</translation>
<extra-one>word for admin status</extra-one>
</message>
</context>
<context>
<name>InfoEncryption</name>
<message>
<source>cancelButton</source>
<extracomment>&apos;CANCEL&apos; : button text for cancelling operation</extracomment>
<translation>CANCEL</translation>
</message>
<message>
<source>callButton</source>
<extracomment>&apos;CALL&apos; : Button that lead to a call</extracomment>
<translation>CALL</translation>
</message>
<message>
<source>okButton</source>
<extracomment>&apos;OK&apos; : Button that validate the popup to be redirected to the device list</extracomment>
<translation>OK</translation>
</message>
<message>
<source>infoEncryptionTitle</source>
<extracomment>&apos;End-to-end encrypted&apos; Popup title about encryption information.</extracomment>
<translation>End-to-end encrypted</translation>
</message>
<message>
<source>encryptionExplanation</source>
<extracomment>&quot;Instant messages are end-to-end encrypted in secured conversations. It is possible to upgrade the security level of a conversation by authentificating participants.&quot;</extracomment>
<translation>Instant messages are end-to-end encrypted in secured conversations. It is possible to upgrade the security level of a conversation by authentificating participants.</translation>
<extra-Context>Explanation of Encryption</extra-Context>
</message>
<message>
<source>encryptionProcessExplanation</source>
<extracomment>&quot;To do so, call the contact and follow the authentification process.&quot;</extracomment>
<translation>To do so, call the contact and follow the authentification process.</translation>
<extra-Context>Explanation process</extra-Context>
</message>
</context>
<context>
<name>InviteFriends</name>
<message>
@ -1000,10 +1169,6 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>mainSearchBarPlaceholder</source>
<translation>Search contact, start a call or a chat...</translation>
</message>
<message>
<source>homeEntry</source>
<translation>HOME</translation>
</message>
<message>
<source>contactsEntry</source>
<translation>CONTACTS</translation>
@ -1076,6 +1241,40 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>menuPlayMe</source>
<translation>Play me!</translation>
</message>
<message>
<source>menuDeliveryStatus</source>
<extracomment>&apos;Delivery status&apos; : Item menu that lead to IMDN of a message</extracomment>
<translation>Delivery status</translation>
</message>
<message>
<source>menuDelete</source>
<extracomment>&apos;Delete&apos; : Item menu to delete a message</extracomment>
<translation>Delete</translation>
</message>
<message>
<source>deliveryDelivered</source>
<extracomment>&apos;Send to %1 - %2&apos; Little message to indicate the state of a message</extracomment>
<translation>Send to %1 - %2</translation>
<extra-Context>%1 is someone, %2 is a date/time. The state is that the message has been sent but not received.</extra-Context>
</message>
<message>
<source>deliveryDeliveredToUser</source>
<extracomment>&apos;Retrieved by %1 - %2&apos; Little message to indicate the state of a message</extracomment>
<translation>Retrieved by %1 - %2</translation>
<extra-Context>%1 is someone, %2 is a date/time. The state is that the message has been retrieved</extra-Context>
</message>
<message>
<source>deliveryDisplayed</source>
<extracomment>&apos;Read by %1 - %2&apos; Little message to indicate the state of a message</extracomment>
<translation>Read by %1 - %2</translation>
<extra-Context>%1 is someone, %2 is a date/time. The state that the message has been read.</extra-Context>
</message>
<message>
<source>deliveryNotDelivered</source>
<extracomment>&quot;%1 have nothing received&quot; Little message to indicate the state of a message</extracomment>
<translation>%1 have nothing received</translation>
<extra-Context>%1 is someone. The state is that the message hasn&apos;t been delivered.</extra-Context>
</message>
</context>
<context>
<name>MultimediaParameters</name>
@ -1084,6 +1283,67 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>
<source>cancelButton</source>
<extracomment>&apos;Cancel&apos; : Cancel button</extracomment>
<translation>CANCEL</translation>
</message>
<message>
<source>startButton</source>
<extracomment>&apos;Launch&apos; : Start button</extracomment>
<translation>LAUNCH</translation>
</message>
<message>
<source>newChatRoomTitle</source>
<extracomment>&apos;Start a chat room&apos; : Title of a popup about creation of a chat room</extracomment>
<translation>Start a chat room</translation>
</message>
<message>
<source>askEncryption</source>
<extracomment>&apos;Would you like to encrypt your chat?&apos; : Ask about setting the chat room as secured.</extracomment>
<translation>Would you like to encrypt your chat?</translation>
</message>
<message>
<source>subjectLabel</source>
<extracomment>&apos;Subject&apos; : Label of a text field about the subject of the chat room</extracomment>
<translation>Subject</translation>
</message>
<message>
<source>subjectTooltip</source>
<extracomment>&apos;Current subject of the Chat Room. It cannot be empty&apos;</extracomment>
<translation>Current subject of the Chat Room. It cannot be empty.</translation>
<extra-Tooltip>Explanation about the subject of the chat room</extra-Tooltip>
</message>
<message>
<source>participantSelectionPlaceholder</source>
<extracomment>&apos;Select participants&apos; : Placeholder for a search on participant to add them in selection.</extracomment>
<translation>Select participants</translation>
</message>
<message>
<source>participantSelectionTooltip</source>
<extracomment>&apos;Search in your contacts or add a custom one to the chat room.&apos;</extracomment>
<translation>Search in your contacts or add a custom one to the chat room.</translation>
</message>
<message>
<source>adminStatus</source>
<extracomment>&apos;Admin&apos; : Admin(istrator)</extracomment>
<translation>Admin</translation>
<extra-one>word for admin status</extra-one>
</message>
<message>
<source>removeParticipantSelection</source>
<extracomment>&apos;Remove this participant from the selection&apos; : Explanation abo^ut removing participant from a selection</extracomment>
<translation>Remove this participant from the selection</translation>
<extra-Tooltip>This is a tooltip</extra-Tooltip>
</message>
<message>
<source>requiredField</source>
<extracomment>&apos;Required&apos; : Word relative to a star to explain that it is a requirement (Field form)</extracomment>
<translation>Required</translation>
</message>
</context>
<context>
<name>Notifier</name>
<message>
@ -1133,6 +1393,15 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<translation>Delivered</translation>
</message>
</context>
<context>
<name>ParticipantsView</name>
<message>
<source>participantsAdminHeader</source>
<extracomment>&apos;(Admin)&apos; : One word for Admin(istrator)</extracomment>
<translation>(Admin)</translation>
<extra-Context>Little Header in one word for a column in participant</extra-Context>
</message>
</context>
<context>
<name>Presence</name>
<message>
@ -1207,6 +1476,11 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>contactsTitle</source>
<translation>Address Book Connector</translation>
</message>
<message>
<source>noPlugin</source>
<extracomment>&apos;No Plugins to load&apos; : Text in combobox</extracomment>
<translation>No Plugins to load</translation>
</message>
</context>
<context>
<name>SettingsAudio</name>
@ -2018,8 +2292,54 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<context>
<name>Timeline</name>
<message>
<source>timelineTitle</source>
<translation>Previously</translation>
<source>timelineFilter</source>
<extracomment>A title for filtering mode.</extracomment>
<translation>Filter</translation>
</message>
<message>
<source>timelineFilterAll</source>
<extracomment>&apos;All&apos; The mode for timelines filtering.</extracomment>
<translation>All</translation>
</message>
<message>
<source>timelineFilterCustom</source>
<extracomment>&apos;Custom&apos; The mode for timelines filtering.</extracomment>
<translation>Custom</translation>
</message>
<message>
<source>timelineFilterSimpleRooms</source>
<extracomment>&apos;Simple rooms&apos; : Filter item</extracomment>
<translation>Simple rooms</translation>
<extra-Mode>Selecting it will show all simple romms</extra-Mode>
</message>
<message>
<source>timelineFilterSecureRooms</source>
<extracomment>&apos;Secure rooms&apos; : Filter item</extracomment>
<translation>Secure rooms</translation>
<extra-Mode>Selecting it will show all secure rooms</extra-Mode>
</message>
<message>
<source>timelineFilterChatGroups</source>
<extracomment>&apos;Chat groups&apos; : Filter item</extracomment>
<translation>Chat groups</translation>
<extra-Mode>Selecting it will show all chat groups (with more than one participant)</extra-Mode>
</message>
<message>
<source>timelineFilterSecureChatGroups</source>
<extracomment>&apos;Secure Chat Groups&apos; : Filter item</extracomment>
<translation>Secure Chat Groups</translation>
<extra-Mode>Selecting it will show all secure chat groups (with more than one participant)</extra-Mode>
</message>
<message>
<source>timelineFilterEphemerals</source>
<extracomment>&apos;Ephemerals&apos; : Filter item</extracomment>
<translation>Ephemerals</translation>
<extra-Mode>Selecting it will show all chat rooms where the ephemeral mode has been enabled.</extra-Mode>
</message>
<message>
<source>timelineSearchPlaceholderText</source>
<extracomment>&apos;Search in the list&apos; : ths is a placeholder when searching something in the timeline list</extracomment>
<translation>Search in the list</translation>
</message>
</context>
<context>

View file

@ -92,6 +92,22 @@
<source>about</source>
<translation>Acerca De</translation>
</message>
<message>
<source>commandLineOptionFetchConfig</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>commandLineOptionFetchConfigArg</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>commandLineOptionCall</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>commandLineOptionCallArg</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AssistantAbstractView</name>
@ -434,6 +450,14 @@ URL del servidor no configurada.</translation>
<source>isComposing</source>
<translation>%1 está escribiendo...</translation>
</message>
<message numerus="yes">
<source>chatTyping</source>
<extracomment>&apos;%1 is typing...&apos; indicate that someone is composing in chat</extracomment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>Cli</name>
@ -473,6 +497,10 @@ URL del servidor no configurada.</translation>
<source>joinConferenceAsFunctionDescription</source>
<translation>Únase a la conferencia organizada por la dirección de sip-como con la dirección de sip-guest. Si no está conectado a un proxy-config, consulte join-conference.</translation>
</message>
<message>
<source>byeFunctionDescription</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CodecsViewer</name>
@ -673,6 +701,27 @@ URL del servidor no configurada.</translation>
<source>cleanHistory</source>
<translation>Eliminar historial</translation>
</message>
<message>
<source>conversationMenuGroupInformations</source>
<extracomment>&apos;Group informations&apos; : Item menu to get information about the chat room</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuDevices</source>
<extracomment>&quot;Conversation&apos;s devices&quot; : Item menu to get all participant devices of the chat room</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>conversationMenuEphemeral</source>
<extracomment>&apos;Ephemeral messages&apos; : Item menu to enable ephemeral mode</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>adminStatus</source>
<extracomment>&apos;Admin&apos; : Admin(istrator)</extracomment>
<translation type="unfinished"></translation>
<extra-Context>One word title for describing the current admin status</extra-Context>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -778,6 +827,76 @@ URL del servidor no configurada.</translation>
<translation>Enviar un archivo</translation>
</message>
</context>
<context>
<name>EphemeralChatRoom</name>
<message>
<source>ephemeralTitle</source>
<extracomment>&quot;Ephemeral messages&quot; : Popup title for ephemerals</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>ephemeralText</source>
<extracomment>&apos;New messages will be deleted on both ends once it has been read by your contact. Select a timeout.&apos;</extracomment>
<translation type="unfinished"></translation>
<extra-Context>Explanation for ephemerals</extra-Context>
</message>
<message>
<source>ephemeralNotInConference!</source>
<extracomment>&apos;
Ephemeral message is only supported in conference based chat room!&apos;</extracomment>
<translation type="unfinished"></translation>
<extra-Context>Warning about not being in conference based chat room.</extra-Context>
</message>
<message>
<source>disabled</source>
<extracomment>&apos;Disabled&apos;</extracomment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>nMinute</source>
<extracomment>&apos;%1 minute&apos;</extracomment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>nHour</source>
<extracomment>&apos;%1 hour&apos;</extracomment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>nDay</source>
<extracomment>&apos;%1 day&apos;
----------
&apos;%1 days&apos;</extracomment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>nWeek</source>
<extracomment>&apos;%1 week&apos;</extracomment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>cancelButton</source>
<extracomment>&apos;cancel&apos; : button text for cancelling operation</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>startButton</source>
<extracomment>&apos;start&apos; : button text to start ephemeral mode</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Event</name>
<message>
@ -936,6 +1055,76 @@ URL del servidor no configurada.</translation>
<translation>Parar grabación.</translation>
</message>
</context>
<context>
<name>InfoChatRoom</name>
<message>
<source>quitGroupButton</source>
<extracomment>&apos;Exit group&apos; : Button label</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>ok</source>
<extracomment>&apos;OK&apos; : Button label</extracomment>
<translation type="unfinished">OK</translation>
</message>
<message>
<source>addParticipantPlaceholder</source>
<extracomment>&apos;Add Participants&apos; : Placeholder in a search bar for adding participant to the chat room</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>addParticipantTooltip</source>
<extracomment>&apos;Search participants in your contact list in order to invite them into the chat room.&apos;</extracomment>
<translation type="unfinished"></translation>
<extra-Tooltip>Explanation for inviting the selected participants into chat room</extra-Tooltip>
</message>
<message>
<source>participantList</source>
<extracomment>&apos;Participant list&apos;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>adminStatus</source>
<extracomment>&apos;Admin&apos; : Admin(istrator)</extracomment>
<translation type="unfinished"></translation>
<extra-one>word for admin status</extra-one>
</message>
</context>
<context>
<name>InfoEncryption</name>
<message>
<source>cancelButton</source>
<extracomment>&apos;CANCEL&apos; : button text for cancelling operation</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>callButton</source>
<extracomment>&apos;CALL&apos; : Button that lead to a call</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>okButton</source>
<extracomment>&apos;OK&apos; : Button that validate the popup to be redirected to the device list</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>infoEncryptionTitle</source>
<extracomment>&apos;End-to-end encrypted&apos; Popup title about encryption information.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>encryptionExplanation</source>
<extracomment>&quot;Instant messages are end-to-end encrypted in secured conversations. It is possible to upgrade the security level of a conversation by authentificating participants.&quot;</extracomment>
<translation type="unfinished"></translation>
<extra-Context>Explanation of Encryption</extra-Context>
</message>
<message>
<source>encryptionProcessExplanation</source>
<extracomment>&quot;To do so, call the contact and follow the authentification process.&quot;</extracomment>
<translation type="unfinished"></translation>
<extra-Context>Explanation process</extra-Context>
</message>
</context>
<context>
<name>InviteFriends</name>
<message>
@ -980,10 +1169,6 @@ Haga clic aquí: &lt;a href=&quot;%1&quot;&gt;%1 &lt;/a&gt;
<source>mainSearchBarPlaceholder</source>
<translation>Buscar contacto, empezar una llamada o un chat</translation>
</message>
<message>
<source>homeEntry</source>
<translation>INICIO</translation>
</message>
<message>
<source>contactsEntry</source>
<translation>CONTACTOS</translation>
@ -1056,6 +1241,40 @@ Haga clic aquí: &lt;a href=&quot;%1&quot;&gt;%1 &lt;/a&gt;
<source>menuPlayMe</source>
<translation>¡Reprodúceme!</translation>
</message>
<message>
<source>menuDeliveryStatus</source>
<extracomment>&apos;Delivery status&apos; : Item menu that lead to IMDN of a message</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>menuDelete</source>
<extracomment>&apos;Delete&apos; : Item menu to delete a message</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>deliveryDelivered</source>
<extracomment>&apos;Send to %1 - %2&apos; Little message to indicate the state of a message</extracomment>
<translation type="unfinished"></translation>
<extra-Context>%1 is someone, %2 is a date/time. The state is that the message has been sent but not received.</extra-Context>
</message>
<message>
<source>deliveryDeliveredToUser</source>
<extracomment>&apos;Retrieved by %1 - %2&apos; Little message to indicate the state of a message</extracomment>
<translation type="unfinished"></translation>
<extra-Context>%1 is someone, %2 is a date/time. The state is that the message has been retrieved</extra-Context>
</message>
<message>
<source>deliveryDisplayed</source>
<extracomment>&apos;Read by %1 - %2&apos; Little message to indicate the state of a message</extracomment>
<translation type="unfinished"></translation>
<extra-Context>%1 is someone, %2 is a date/time. The state that the message has been read.</extra-Context>
</message>
<message>
<source>deliveryNotDelivered</source>
<extracomment>&quot;%1 have nothing received&quot; Little message to indicate the state of a message</extracomment>
<translation type="unfinished"></translation>
<extra-Context>%1 is someone. The state is that the message hasn&apos;t been delivered.</extra-Context>
</message>
</context>
<context>
<name>MultimediaParameters</name>
@ -1064,6 +1283,67 @@ Haga clic aquí: &lt;a href=&quot;%1&quot;&gt;%1 &lt;/a&gt;
<translation>OK</translation>
</message>
</context>
<context>
<name>NewChatRoom</name>
<message>
<source>cancelButton</source>
<extracomment>&apos;Cancel&apos; : Cancel button</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>startButton</source>
<extracomment>&apos;Launch&apos; : Start button</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>newChatRoomTitle</source>
<extracomment>&apos;Start a chat room&apos; : Title of a popup about creation of a chat room</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>askEncryption</source>
<extracomment>&apos;Would you like to encrypt your chat?&apos; : Ask about setting the chat room as secured.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>subjectLabel</source>
<extracomment>&apos;Subject&apos; : Label of a text field about the subject of the chat room</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>subjectTooltip</source>
<extracomment>&apos;Current subject of the Chat Room. It cannot be empty&apos;</extracomment>
<translation type="unfinished"></translation>
<extra-Tooltip>Explanation about the subject of the chat room</extra-Tooltip>
</message>
<message>
<source>participantSelectionPlaceholder</source>
<extracomment>&apos;Select participants&apos; : Placeholder for a search on participant to add them in selection.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>participantSelectionTooltip</source>
<extracomment>&apos;Search in your contacts or add a custom one to the chat room.&apos;</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>adminStatus</source>
<extracomment>&apos;Admin&apos; : Admin(istrator)</extracomment>
<translation type="unfinished"></translation>
<extra-one>word for admin status</extra-one>
</message>
<message>
<source>removeParticipantSelection</source>
<extracomment>&apos;Remove this participant from the selection&apos; : Explanation abo^ut removing participant from a selection</extracomment>
<translation type="unfinished"></translation>
<extra-Tooltip>This is a tooltip</extra-Tooltip>
</message>
<message>
<source>requiredField</source>
<extracomment>&apos;Required&apos; : Word relative to a star to explain that it is a requirement (Field form)</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Notifier</name>
<message>
@ -1113,6 +1393,15 @@ Haga clic aquí: &lt;a href=&quot;%1&quot;&gt;%1 &lt;/a&gt;
<translation>Enviado</translation>
</message>
</context>
<context>
<name>ParticipantsView</name>
<message>
<source>participantsAdminHeader</source>
<extracomment>&apos;(Admin)&apos; : One word for Admin(istrator)</extracomment>
<translation type="unfinished"></translation>
<extra-Context>Little Header in one word for a column in participant</extra-Context>
</message>
</context>
<context>
<name>Presence</name>
<message>
@ -1187,6 +1476,11 @@ Haga clic aquí: &lt;a href=&quot;%1&quot;&gt;%1 &lt;/a&gt;
<source>contactsTitle</source>
<translation type="unfinished">Contactos</translation>
</message>
<message>
<source>noPlugin</source>
<extracomment>&apos;No Plugins to load&apos; : Text in combobox</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsAudio</name>
@ -1366,6 +1660,172 @@ Haga clic aquí: &lt;a href=&quot;%1&quot;&gt;%1 &lt;/a&gt;
<translation>El cifrado es obligatorio</translation>
</message>
</context>
<context>
<name>SettingsLdap</name>
<message>
<source>newServer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsLdapEdit</name>
<message>
<source>cancel</source>
<translation type="unfinished">CANCELAR</translation>
</message>
<message>
<source>confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>displayNameLabel</source>
<translation type="unfinished">Nombre mostrado (opcional)</translation>
</message>
<message>
<source>displayNameTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>connectionTitle</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>serverLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>serverTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>bindDNLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>bindDNTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>passwordLabel</source>
<translation type="unfinished">Contraseña</translation>
</message>
<message>
<source>useTLSLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>useTLSTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>useSalLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>useSalTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>verifyTLSLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AutoMode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>offMode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>onMode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>verifyTLSTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>searchTitle</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>baseObjectLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>baseObjectPlaceholder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>baseObjectTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>filterLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>filterTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>maxResultsLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>maxResultsTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>timeoutLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>timeoutTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>parsingTitle</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>nameAttributesLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>nameAttributesTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sipAttributesLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sipAttributesTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>domainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>domainTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>miscLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>debugLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>debugTooltip</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>
<message>
@ -1809,8 +2269,54 @@ Haga clic aquí: &lt;a href=&quot;%1&quot;&gt;%1 &lt;/a&gt;
<context>
<name>Timeline</name>
<message>
<source>timelineTitle</source>
<translation>Previamente</translation>
<source>timelineFilter</source>
<extracomment>A title for filtering mode.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>timelineFilterAll</source>
<extracomment>&apos;All&apos; The mode for timelines filtering.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>timelineFilterCustom</source>
<extracomment>&apos;Custom&apos; The mode for timelines filtering.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>timelineFilterSimpleRooms</source>
<extracomment>&apos;Simple rooms&apos; : Filter item</extracomment>
<translation type="unfinished"></translation>
<extra-Mode>Selecting it will show all simple romms</extra-Mode>
</message>
<message>
<source>timelineFilterSecureRooms</source>
<extracomment>&apos;Secure rooms&apos; : Filter item</extracomment>
<translation type="unfinished"></translation>
<extra-Mode>Selecting it will show all secure rooms</extra-Mode>
</message>
<message>
<source>timelineFilterChatGroups</source>
<extracomment>&apos;Chat groups&apos; : Filter item</extracomment>
<translation type="unfinished"></translation>
<extra-Mode>Selecting it will show all chat groups (with more than one participant)</extra-Mode>
</message>
<message>
<source>timelineFilterSecureChatGroups</source>
<extracomment>&apos;Secure Chat Groups&apos; : Filter item</extracomment>
<translation type="unfinished"></translation>
<extra-Mode>Selecting it will show all secure chat groups (with more than one participant)</extra-Mode>
</message>
<message>
<source>timelineFilterEphemerals</source>
<extracomment>&apos;Ephemerals&apos; : Filter item</extracomment>
<translation type="unfinished"></translation>
<extra-Mode>Selecting it will show all chat rooms where the ephemeral mode has been enabled.</extra-Mode>
</message>
<message>
<source>timelineSearchPlaceholderText</source>
<extracomment>&apos;Search in the list&apos; : ths is a placeholder when searching something in the timeline list</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>

File diff suppressed because it is too large Load diff

View file

@ -386,6 +386,10 @@ QString ChatMessageModel::getFromDisplayName() const{
return Utils::getDisplayName(mChatMessage->getFromAddress());
}
QString ChatMessageModel::getFromSipAddress() const{
return Utils::cleanSipAddress(Utils::coreStringToAppString(mChatMessage->getFromAddress()->asStringUriOnly()));
}
QString ChatMessageModel::getToDisplayName() const{
return Utils::getDisplayName(mChatMessage->getToAddress());
}

View file

@ -135,6 +135,7 @@ public:
Q_PROPERTY(QString fromDisplayName READ getFromDisplayName CONSTANT)
Q_PROPERTY(QString fromSipAddress READ getFromSipAddress CONSTANT)
Q_PROPERTY(QString toDisplayName READ getToDisplayName CONSTANT)
Q_PROPERTY(ContactModel * contactModel READ getContactModel CONSTANT)
@ -159,6 +160,7 @@ public:
//----------------------------------------------------------------------------
QString getFromDisplayName() const;
QString getFromSipAddress() const;
QString getToDisplayName() const;
ContactModel * getContactModel() const;
bool isEphemeral() const;

View file

@ -654,19 +654,21 @@ void ChatRoomModel::onIsComposingReceived(const std::shared_ptr<linphone::ChatRo
}else
mComposers[remoteAddress] = Utils::getDisplayName(remoteAddress);
emit isRemoteComposingChanged();
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}
void ChatRoomModel::onMessageReceived(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<linphone::ChatMessage> & message){
setUnreadMessagesCount(chatRoom->getUnreadMessagesCount());
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}
void ChatRoomModel::onNewEvent(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
if( eventLog->getType() == linphone::EventLog::Type::ConferenceCallEnd ){
setMissedCallsCount(mMissedCallsCount+1);
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}else if( eventLog->getType() == linphone::EventLog::Type::ConferenceCreated ){
emit fullPeerAddressChanged();
}
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}
void ChatRoomModel::onChatMessageReceived(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog) {
@ -688,6 +690,7 @@ void ChatRoomModel::onChatMessageSending(const std::shared_ptr<linphone::ChatRoo
}
void ChatRoomModel::onChatMessageSent(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}
void ChatRoomModel::onParticipantAdded(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
@ -695,6 +698,7 @@ void ChatRoomModel::onParticipantAdded(const std::shared_ptr<linphone::ChatRoom>
auto e = std::find(events.begin(), events.end(), eventLog);
if( e != events.end() )
insertNotice(*e);
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit participantAdded(chatRoom, eventLog);
emit fullPeerAddressChanged();
}
@ -704,16 +708,19 @@ void ChatRoomModel::onParticipantRemoved(const std::shared_ptr<linphone::ChatRoo
auto e = std::find(events.begin(), events.end(), eventLog);
if( e != events.end() )
insertNotice(*e);
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit participantRemoved(chatRoom, eventLog);
emit fullPeerAddressChanged();
}
void ChatRoomModel::onParticipantAdminStatusChanged(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit participantAdminStatusChanged(chatRoom, eventLog);
emit isMeAdminChanged(); // It is not the case all the time but calling getters is not a heavy request
}
void ChatRoomModel::onStateChanged(const std::shared_ptr<linphone::ChatRoom> & chatRoom, linphone::ChatRoom::State newState){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit stateChanged(getState());
}
@ -722,21 +729,26 @@ void ChatRoomModel::onSecurityEvent(const std::shared_ptr<linphone::ChatRoom> &
auto e = std::find(events.begin(), events.end(), eventLog);
if( e != events.end() )
insertNotice(*e);
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit securityLevelChanged((int)chatRoom->getSecurityLevel());
}
void ChatRoomModel::onSubjectChanged(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog) {
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit subjectChanged(getSubject());
emit usernameChanged();
}
void ChatRoomModel::onUndecryptableMessageReceived(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<linphone::ChatMessage> & message){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}
void ChatRoomModel::onParticipantDeviceAdded(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit participantDeviceAdded(chatRoom, eventLog);
}
void ChatRoomModel::onParticipantDeviceRemoved(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit participantDeviceRemoved(chatRoom, eventLog);
}
@ -752,6 +764,7 @@ void ChatRoomModel::onConferenceJoined(const std::shared_ptr<linphone::ChatRoom>
insertNotice(*e);
}
setUnreadMessagesCount(mChatRoom->getUnreadMessagesCount()); // Update message count. In the case of joining conference, the conference id was not valid thus, the missing count was not about the chat room but a global one.
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit usernameChanged();
emit conferenceJoined(chatRoom, eventLog);
emit hasBeenLeftChanged();
@ -769,6 +782,7 @@ void ChatRoomModel::onConferenceLeft(const std::shared_ptr<linphone::ChatRoom> &
if(e != events.end() )
insertNotice(*e);
}
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit conferenceLeft(chatRoom, eventLog);
emit hasBeenLeftChanged();
}
@ -779,18 +793,23 @@ void ChatRoomModel::onEphemeralEvent(const std::shared_ptr<linphone::ChatRoom> &
auto e = std::find(events.begin(), events.end(), eventLog);
if(e != events.end() )
insertNotice(*e);
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}
void ChatRoomModel::onEphemeralMessageTimerStarted(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}
void ChatRoomModel::onEphemeralMessageDeleted(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::EventLog> & eventLog){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}
void ChatRoomModel::onConferenceAddressGeneration(const std::shared_ptr<linphone::ChatRoom> & chatRoom){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
}
void ChatRoomModel::onParticipantRegistrationSubscriptionRequested(const std::shared_ptr<linphone::ChatRoom> & chatRoom, const std::shared_ptr<const linphone::Address> & participantAddress){
setLastUpdateTime(QDateTime::fromMSecsSinceEpoch(chatRoom->getLastUpdateTime()));
emit participantRegistrationSubscriptionRequested(chatRoom, participantAddress);
}

View file

@ -65,7 +65,7 @@ void TimelineListModel::update(){
void TimelineListModel::selectAll(const bool& selected){
for(auto it = mTimelines.begin() ; it != mTimelines.end() ; ++it)
(*it)->mSelected = selected;
(*it)->setSelected(selected);
}
int TimelineListModel::rowCount (const QModelIndex &) const {
return mTimelines.count();
@ -275,6 +275,7 @@ void TimelineListModel::updateTimelines () {
}
void TimelineListModel::add (std::shared_ptr<TimelineModel> timeline){
connect(timeline->getChatRoomModel(), &ChatRoomModel::lastUpdateTimeChanged, this, &TimelineListModel::updated);
int row = mTimelines.count();
beginInsertRows(QModelIndex(), row, row);
mTimelines << timeline;

View file

@ -28,6 +28,8 @@ Item {
property alias text: button.text
property bool enabled: true
property bool showBorder : false
property alias capitalization : button.capitalization
signal clicked
@ -72,6 +74,7 @@ Item {
Button {
id: button
property int capitalization
background: Rectangle {
color: _getBackgroundColor()
@ -85,6 +88,7 @@ Item {
font {
bold: true
pointSize: AbstractTextButtonStyle.text.pointSize
capitalization: button.capitalization
}
wrapMode: Text.WordWrap
//elide: Text.ElideRight

View file

@ -36,7 +36,9 @@ MouseArea {
delay: tooltipArea.delay
parent: tooltipParent
visible: _visible || force
width: tooltipParent.width>TooltipStyle.minWidth?tooltipParent.width:TooltipStyle.minWidth
width: Math.min(tooltip.implicitWidth, Math.max(tooltipParent.width, TooltipStyle.minWidth))
//tooltipParent.width>TooltipStyle.minWidth?tooltipParent.width:TooltipStyle.minWidth
timeout: -1

View file

@ -200,84 +200,9 @@ Rectangle {
leftPadding: ChatStyle.composingText.leftPadding
visible: composers.length > 0 && SettingsModel.chatEnabled
wrapMode: Text.Wrap
text:(composers.length==0?'':(composers.length>1 ? '%1 are typing...' : '%1 is typing...').arg(container.proxyModel.getDisplayNameComposers()))
//: '%1 is typing...' indicate that someone is composing in chat
text:(composers.length==0?'': qsTr('chatTyping','',composers.length).arg(container.proxyModel.getDisplayNameComposers()))
}
/* GridView{
height: visible ? ChatStyle.composingText.height*container.proxyModel.composers.length : 0
width:parent.width
cellWidth: parent.width; cellHeight: ChatStyle.composingText.height
property var composersLength : container.proxyModel.composers.length
onComposersLengthChanged:{
model.clear()
console.log(container.proxyModel.composers)
for(var j = 0 ; j < container.proxyModel.composers.length ; ++j) {
console.log(container.proxyModel.composers[j])
model.append({text:container.proxyModel.composers[j]})
}
}
model: ListModel{}
delegate:Rectangle{
height:ChatStyle.composingText.height
width:parent.width
color:"red"
}
}*/
/*
Column{
height: 100 *container.proxyModel.composers.length
width:parent.width
onHeightChanged: {
composerRepeater.model = []
composerRepeater.model = container.proxyModel.composers
}
Repeater{
id:composerRepeater
model:["toto"]
Rectangle{
height:100
width:parent.width
color:"red"
}
}
}*/
/*
Column{
height: visible ? ChatStyle.composingText.height*container.proxyModel.composers.length : 0
width:parent.width
visible:SettingsModel.chatEnabled
onHeightChanged: {
composers.clear()
composerRepeater.model = []
composerRepeater.model = container.proxyModel.composers
}
Repeater{
id:composerRepeater
model:ListModel{
id:composers
}
onModelChanged: console.log(container.proxyModel.composers.length)
Text {
color: ChatStyle.composingText.color
font.pointSize: ChatStyle.composingText.pointSize
height: visible ? ChatStyle.composingText.height : 0
leftPadding: ChatStyle.composingText.leftPadding
visible: text.length > 0 && SettingsModel.chatEnabled
text: modelData + ' ' +'is typing...'
Component.onCompleted: console.log(text + "=>" +width+"/"+height+" : "+visible)
}
}
}*/
}
// -------------------------------------------------------------------------

View file

@ -9,63 +9,69 @@ import LinphoneUtils 1.0
// =============================================================================
RowLayout {
implicitHeight: message.height
spacing: 0
Item {
Layout.alignment: Qt.AlignTop
Layout.preferredHeight: ChatStyle.entry.lineHeight
Layout.preferredWidth: ChatStyle.entry.metaWidth
Avatar {
anchors.centerIn: parent
height: ChatStyle.entry.message.incoming.avatarSize
image: $chatEntry.contactModel? $chatEntry.contactModel.vcard.avatar : '' //chat.sipAddressObserver.contact ? chat.sipAddressObserver.contact.vcard.avatar : ''
username: $chatEntry.fromDisplayName
width: ChatStyle.entry.message.incoming.avatarSize
// The avatar is only visible for the first message of a incoming messages sequence.
visible: {
if (index <= 0) {
return true // 1. First message, so visible.
}
var previousEntry = proxyModel.data(proxyModel.index(index - 1, 0))
if (!previousEntry) {
return true
}
// 2. Previous entry is a call event. => Visible.
// 3. I have sent a message before my contact. => Visible.
// 4. One hour between two incoming messages. => Visible.
return previousEntry.type !== ChatRoomModel.MessageEntry ||
previousEntry.isOutgoing ||
$chatEntry.timestamp.getTime() - previousEntry.timestamp.getTime() > 3600
}
}
}
Message {
id: message
Layout.fillWidth: true
// Not a style. Workaround to avoid a 0 width.
// Arbitrary value.
Layout.minimumWidth: 1
backgroundColor: ChatStyle.entry.message.incoming.backgroundColor
color: ChatStyle.entry.message.incoming.text.color
pointSize: ChatStyle.entry.message.incoming.text.pointSize
ActionButton {
height: ChatStyle.entry.lineHeight
icon: 'delete'
iconSize: ChatStyle.entry.deleteIconSize
visible: isHoverEntry()
onClicked: removeEntry()
}
}
id:mainRow
implicitHeight: message.height
spacing: 0
Item {
Layout.alignment: Qt.AlignTop
Layout.preferredHeight: ChatStyle.entry.lineHeight
Layout.preferredWidth: ChatStyle.entry.metaWidth
Avatar {
id:avatar
anchors.centerIn: parent
height: ChatStyle.entry.message.incoming.avatarSize
image: $chatEntry.contactModel? $chatEntry.contactModel.vcard.avatar : '' //chat.sipAddressObserver.contact ? chat.sipAddressObserver.contact.vcard.avatar : ''
username: $chatEntry.fromDisplayName
width: ChatStyle.entry.message.incoming.avatarSize
// The avatar is only visible for the first message of a incoming messages sequence.
visible: {
if (index <= 0) {
return true // 1. First message, so visible.
}
var previousEntry = proxyModel.data(proxyModel.index(index - 1, 0))
if (!previousEntry) {
return true
}
// 2. Previous entry is a call event. => Visible.
// 3. I have sent a message before my contact. => Visible.
// 4. One hour between two incoming messages. => Visible.
return previousEntry.type !== ChatRoomModel.MessageEntry ||
previousEntry.isOutgoing ||
$chatEntry.timestamp.getTime() - previousEntry.timestamp.getTime() > 3600
}
TooltipArea{
text:avatar.username+'\n'+$chatEntry.fromSipAddress
tooltipParent:mainRow
}
}
}
Message {
id: message
Layout.fillWidth: true
// Not a style. Workaround to avoid a 0 width.
// Arbitrary value.
Layout.minimumWidth: 1
backgroundColor: ChatStyle.entry.message.incoming.backgroundColor
color: ChatStyle.entry.message.incoming.text.color
pointSize: ChatStyle.entry.message.incoming.text.pointSize
ActionButton {
height: ChatStyle.entry.lineHeight
icon: 'delete'
iconSize: ChatStyle.entry.deleteIconSize
visible: isHoverEntry()
onClicked: removeEntry()
}
}
}

View file

@ -124,7 +124,8 @@ Item {
onTriggered: TextToSpeech.say($chatEntry.content)
}
MenuItem {
text: 'Delivery Status'
//: 'Delivery status' : Item menu that lead to IMDN of a message
text: qsTr('menuDeliveryStatus')
iconMenu: 'menu_imdn_info'
iconSizeMenu: 17
iconLayoutDirection: Qt.RightToLeft
@ -133,7 +134,8 @@ Item {
onTriggered: deliveryLayout.visible = !deliveryLayout.visible
}
MenuItem {
text: 'Delete'
//: 'Delete' : Item menu to delete a message
text: qsTr('menuDelete')
iconMenu: 'menu_delete'
iconSizeMenu: 17
iconLayoutDirection: Qt.RightToLeft
@ -191,21 +193,23 @@ Item {
}
}*/
model: $chatEntry.getProxyImdnStates()
property var i18n: [
'Envoyé à %1 - %2', // LinphoneEnums.ChatMessageStateDelivered
'Reçu par %1 - %2', // LinphoneEnums.ChatMessageStateDeliveredToUser
'Lu par %1 - %2' , // LinphoneEnums.ChatMessageStateDisplayed
"%1 n'a encore rien reçu" // LinphoneEnums.ChatMessageStateNotDelivered
]
function getText(state){
if(state == LinphoneEnums.ChatMessageStateDelivered)
return i18n[0]
//: 'Send to %1 - %2' Little message to indicate the state of a message
//~ Context %1 is someone, %2 is a date/time. The state is that the message has been sent but not received.
return qsTr('deliveryDelivered')
else if(state == LinphoneEnums.ChatMessageStateDeliveredToUser)
return i18n[1]
//: 'Retrieved by %1 - %2' Little message to indicate the state of a message
//~ Context %1 is someone, %2 is a date/time. The state is that the message has been retrieved
return qsTr('deliveryDeliveredToUser')
else if(state == LinphoneEnums.ChatMessageStateDisplayed)
return i18n[2]
//: 'Read by %1 - %2' Little message to indicate the state of a message
//~ Context %1 is someone, %2 is a date/time. The state that the message has been read.
return qsTr('deliveryDisplayed')
else if(state == LinphoneEnums.ChatMessageStateNotDelivered)
return i18n[3]
//: "%1 have nothing received" Little message to indicate the state of a message
//~ Context %1 is someone. The state is that the message hasn't been delivered.
return qsTr('deliveryNotDelivered')
else return ''
}
delegate:Text{

View file

@ -90,8 +90,13 @@ Rectangle {
Layout.leftMargin: TimelineStyle.legend.leftMargin
color: TimelineStyle.legend.color
font.pointSize: TimelineStyle.legend.pointSize
//height: parent.height
text: 'Filter : ' +(timeline.model.filterFlags == 0 || timeline.model.filterFlags == TimelineProxyModel.AllChatRooms?'All' : 'Custom')
//: A title for filtering mode.
text: qsTr('timelineFilter')+' : '
+(timeline.model.filterFlags == 0 || timeline.model.filterFlags == TimelineProxyModel.AllChatRooms
//: 'All' The mode for timelines filtering.
? qsTr('timelineFilterAll')
//: 'Custom' The mode for timelines filtering.
: qsTr('timelineFilterCustom'))
verticalAlignment: Text.AlignVCenter
}
@ -146,31 +151,41 @@ Rectangle {
}
CheckBoxText {
id:simpleFilter
text:'Simple rooms'
//: 'Simple rooms' : Filter item
//~ Mode Selecting it will show all simple romms
text:qsTr('timelineFilterSimpleRooms')
property var value : (checked?TimelineProxyModel.SimpleChatRoom:0)
onValueChanged: timeline.model.filterFlags = filterChoices.getFilterFlags()
}
CheckBoxText {
id:secureFilter
text:'Secure rooms'
//: 'Secure rooms' : Filter item
//~ Mode Selecting it will show all secure rooms
text:qsTr('timelineFilterSecureRooms')
property var value : (checked?TimelineProxyModel.SecureChatRoom:0)
onValueChanged: timeline.model.filterFlags = filterChoices.getFilterFlags()
}
CheckBoxText {
id:groupFilter
text:'Chat groups'
//: 'Chat groups' : Filter item
//~ Mode Selecting it will show all chat groups (with more than one participant)
text:qsTr('timelineFilterChatGroups')
property var value : (checked?TimelineProxyModel.GroupChatRoom:0)
onValueChanged: timeline.model.filterFlags = filterChoices.getFilterFlags()
}
CheckBoxText {
id:secureGroupFilter
text:'Secure Chat Groups'
//: 'Secure Chat Groups' : Filter item
//~ Mode Selecting it will show all secure chat groups (with more than one participant)
text:qsTr('timelineFilterSecureChatGroups')
property var value : (checked?TimelineProxyModel.SecureGroupChatRoom:0)
onValueChanged: timeline.model.filterFlags = filterChoices.getFilterFlags()
}
CheckBoxText {
id:ephemeralsFilter
text:'Ephemerals'
//: 'Ephemerals' : Filter item
//~ Mode Selecting it will show all chat rooms where the ephemeral mode has been enabled.
text:qsTr('timelineFilterEphemerals')
property var value : (checked?TimelineProxyModel.EphemeralChatRoom:0)
onValueChanged: timeline.model.filterFlags = filterChoices.getFilterFlags()
}
@ -190,19 +205,20 @@ Rectangle {
visible:false
//color: ContactsStyle.bar.backgroundColor
onVisibleChanged: timeline.model.filterText = (visible?searchBar.text : '')
TextField {
id:searchBar
anchors {
TextField {
id:searchBar
anchors {
fill: parent
margins: 7
}
}
Layout.fillWidth: true
icon: 'search'
placeholderText: 'Search in the list'
//: 'Search in the list' : ths is a placeholder when searching something in the timeline list
placeholderText: qsTr('timelineSearchPlaceholderText')
onTextChanged: timeline.model.filterText = text
}
}
}
// -------------------------------------------------------------------------
@ -213,9 +229,6 @@ Rectangle {
id: view
Layout.fillHeight: true
Layout.fillWidth: true
//anchors.left:parent.left
//anchors.right:parent.right
//anchors.bottom:parent.bottom
currentIndex: -1
delegate: Item {
@ -234,8 +247,6 @@ Rectangle {
: TimelineStyle.contact.backgroundColor.b
)
displayUnreadMessageCount: SettingsModel.chatEnabled
//entry: $timelineEntry
//entry: SipAddressesModel.getSipAddressObserver(modelData.fullPeerAddress, modelData.fullLocalAddress)
entry: modelData.chatRoomModel
sipAddressColor: isSelected
? TimelineStyle.contact.sipAddress.color.selected
@ -271,7 +282,6 @@ Rectangle {
//timeline.model.unselectAll()
modelData.selected = true
view.currentIndex = index;
//timeline.entrySelected($timelineEntry.sipAddress, $timelineEntry.isSecure)
}
}
Connections{
@ -282,7 +292,6 @@ Rectangle {
}
}
}
// onCountChanged: Logic.handleCountChanged(count)
}
}
}

View file

@ -229,7 +229,9 @@ ScrollableListView {
Layout.fillHeight: true
Layout.fillWidth: true
showContactAddress: sipAddressesView.showContactAddress
statusText : showAdminStatus && modelData.adminStatus ? '(Admin)' : ''
//: '(Admin)' : One word for Admin(istrator)
//~ Context Little Header in one word for a column in participant
statusText : showAdminStatus && modelData.adminStatus ? qsTr('participantsAdminHeader') : ''
entry: modelData

View file

@ -197,24 +197,6 @@ ColumnLayout {
CallsListModel.launchAudioCall,
function (sipAddress) {CallsListModel.launchChat( sipAddress,0 )},
function (sipAddress) {CallsListModel.launchChat( sipAddress,1 )}
/*
function (sipAddress) {
CallsListModel.launchSecureChat(sipAddress)
window.setView('Conversation', {
chatRoomModel: CallsListModel.createSecureChat("", sipAddress),
//peerAddress: sipAddress,
//localAddress: AccountSettingsModel.sipAddress,
//fullPeerAddress: sipAddress,
//fullLocalAddress: AccountSettingsModel.fullSipAddress,
isSecure:1
})
//Logic.manageAccounts()
window.attachVirtualWindow(Qt.resolvedUrl('Dialogs/ManageChatRoom.qml'), {
//window.setView('Dialogs/ManageChatRoom', {
participantAddress: sipAddress
})
}*/
]
model: handlers

View file

@ -70,7 +70,7 @@ ColumnLayout {
//username: Logic.getUsername()
username: chatRoomModel?chatRoomModel.username:Logic.getUsername()
visible: !groupChat.visible
visible: !groupChat.visible
}
Icon {
@ -107,7 +107,9 @@ ColumnLayout {
}
Text{
anchors.verticalCenter: parent.verticalCenter
text:'Admin'
//: 'Admin' : Admin(istrator)
//~ Context One word title for describing the current admin status
text: qsTr('adminStatus')
color:"#9FA6AB"
font.pointSize: Units.dp * 8
}
@ -248,7 +250,8 @@ ColumnLayout {
y:mainBar.height
menuStyle : MenuStyle.aux2
MenuItem{
text:'Groupe informations'
//: 'Group informations' : Item menu to get information about the chat room
text: qsTr('conversationMenuGroupInformations')
iconMenu: (hovered ? 'menu_infos_selected' : 'menu_infos')
iconSizeMenu: 25
menuItemStyle : MenuItemStyle.aux2
@ -264,7 +267,8 @@ ColumnLayout {
color:Colors.u.color
}
MenuItem{
text:"Conversation's devices"
//: "Conversation's devices" : Item menu to get all participant devices of the chat room
text: qsTr('conversationMenuDevices')
iconMenu: (hovered ? 'menu_devices_selected' : 'menu_devices' )
iconSizeMenu: 25
menuItemStyle : MenuItemStyle.aux2
@ -280,7 +284,8 @@ ColumnLayout {
color:Colors.u.color
}
MenuItem{
text:'Ephemeral messages'
//: 'Ephemeral messages' : Item menu to enable ephemeral mode
text: qsTr('conversationMenuEphemeral')
iconMenu: (hovered ? 'menu_ephemeral_selected' : 'menu_ephemeral')
iconSizeMenu: 25
menuItemStyle : MenuItemStyle.aux2

View file

@ -17,17 +17,18 @@ DialogPlus {
id:dialog
buttons: [
TextButtonA {
text: 'CANCEL'
//: 'cancel' : button text for cancelling operation
text: qsTr('cancelButton')
capitalization: Font.AllUppercase
onClicked:{
exit(0)
}
},
TextButtonB {
text: 'START'
//: 'start' : button text to start ephemeral mode
text: qsTr('startButton')
onClicked: {
console.log("Timer selected : " +dialog.timer)
if(dialog.timer=== 0)
chatRoomModel.ephemeralEnabled = false
else {
@ -39,8 +40,8 @@ DialogPlus {
}
]
flat : true
title: "Ephemeral messages"
//: "Ephemeral messages" : Popup title for ephemerals
title: qsTr('ephemeralTitle')
showCloseCross:false
property ChatRoomModel chatRoomModel
@ -74,8 +75,12 @@ DialogPlus {
maximumLineCount: 4
wrapMode: Text.Wrap
text: 'New messages will be deleted on both ends once it has been read by your contact. Select a timeout.'
+(!chatRoomModel.canBeEphemeral?'\nEphemeral message is only supported in conference based chat room!':'')
//: 'New messages will be deleted on both ends once it has been read by your contact. Select a timeout.'
//~ Context Explanation for ephemerals
text: qsTr('ephemeralText')
//: '\nEphemeral message is only supported in conference based chat room!'
//~ Context Warning about not being in conference based chat room.
+(!chatRoomModel.canBeEphemeral?'\n'+qsTr('ephemeralNotInConference!'):'')
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
font.pointSize: Units.dp * 11
@ -100,22 +105,40 @@ DialogPlus {
return 4;
else if( chatRoomModel.ephemeralLifetime <= 604800 )
return 5;
model:ListModel{
ListElement{ text:'Disabled'
value:0}
ListElement{ text:'1 minute'
value:60}
ListElement{ text:'1 heure'
value:3600}
ListElement{ text:'1 jour'
value:86400}
ListElement{ text:'3 jours'
value:259200}
ListElement{ text:'1 semaine'
value:604800}
}
else
return 5;
/*
property var fields : [
//: 'Disabled'
qsTr('disabled'),
//: '%1 minute'
qsTr('nMinute', '', 1).arg(1),
//: '%1 hour'
qsTr('nHour', '', 1).arg(1),
//: '%1 day'
qsTr('nDay', '', 1).arg(1),
//: '%1 days'
qsTr('nDay', '', 3).arg(3),
//: '%1 week'
qsTr('nWeek', '', 1).arg(1)
]
*/
model:[
//: 'Disabled'
{text:qsTr('disabled'), value:0},
//: '%1 minute'
{ text:qsTr('nMinute', '', 1).arg(1), value:60},
//: '%1 hour'
{ text:qsTr('nHour', '', 1).arg(1), value:3600},
//: '%1 day'
{ text:qsTr('nDay', '', 1).arg(1), value:86400},
//: '%1 days'
{ text:qsTr('nDay', '', 3).arg(3), value:259200},
//: '%1 week'
{ text:qsTr('nWeek', '', 1).arg(1), value:604800}
]
onActivated: dialog.timer = model.get(index).value
onActivated: dialog.timer = model[index].value
visible: chatRoomModel.canBeEphemeral
}

View file

@ -17,7 +17,9 @@ DialogPlus {
id:dialog
buttons: [
TextButtonA {
text: 'QUITTER LE GROUPE'
//: 'Exit group' : Button label
text: qsTr('quitGroupButton')
capitalization: Font.AllUppercase
textButtonStyle: InfoChatRoomStyle.leaveButton
showBorder: true
onClicked:{
@ -29,7 +31,9 @@ DialogPlus {
Layout.fillWidth: true
},
TextButtonB {
text: 'OK'
//: 'OK' : Button label
text: qsTr('ok')
capitalization: Font.AllUppercase
onClicked: {
if(!chatRoomModel.hasBeenLeft)
@ -40,7 +44,8 @@ DialogPlus {
]
flat : true
showCloseCross: true
//: "Group information" : Popup title.
//~ This popup display data about the current chat room
title: "Group information"
property ChatRoomModel chatRoomModel
@ -73,8 +78,11 @@ DialogPlus {
visible: dialog.adminMode && chatRoomModel.canHandleParticipants
maxMenuHeight: MainWindowStyle.searchBox.maxHeight
placeholderText: 'Ajouter des participants'
tooltipText: "Rechercher des participants dans votre liste de contact pour les inviter dans le groupe. L'ajout est effectif une fois le formulaire validé."
//: 'Add Participants' : Placeholder in a search bar for adding participant to the chat room
placeholderText: qsTr('addParticipantPlaceholder')
//: 'Search participants in your contact list in order to invite them into the chat room.'
//~ Tooltip Explanation for inviting the selected participants into chat room
tooltipText: qsTr('addParticipantTooltip')
actions:[{
icon: 'add_participant',
secure:0,
@ -104,7 +112,8 @@ DialogPlus {
Text{
Layout.topMargin: InfoChatRoomStyle.results.title.topMargin
Layout.leftMargin: InfoChatRoomStyle.results.title.leftMargin
text:'Liste des participants'
//: 'Participant list'
text:qsTr('participantList')
color: InfoChatRoomStyle.results.title.color
font.pointSize:InfoChatRoomStyle.results.title.pointSize
font.weight: InfoChatRoomStyle.results.title.weight
@ -114,7 +123,9 @@ DialogPlus {
Layout.rightMargin: InfoChatRoomStyle.results.header.rightMargin
Layout.alignment: Qt.AlignRight | Qt.AlignBottom
//Layout.topMargin: InfoChatRoomStyle.results.topMargin
text : 'Admin'
//: 'Admin' : Admin(istrator)
//~ one word for admin status
text : qsTr('adminStatus')
color: InfoChatRoomStyle.results.header.color
font.pointSize: InfoChatRoomStyle.results.header.pointSize

View file

@ -17,14 +17,19 @@ DialogPlus {
id:dialog
buttons: [
TextButtonA {
text: 'CANCEL'
//visible: addressToCall != ''
//: 'CANCEL' : button text for cancelling operation
text: qsTr('cancelButton')
capitalization: Font.AllUppercase
onClicked:{
exit(0)
}
},
TextButtonB {
text: (addressToCall != '' ? 'CALL' : 'OK')
//: 'CALL' : Button that lead to a call
text: (addressToCall != '' ? qsTr('callButton')
//: 'OK' : Button that validate the popup to be redirected to the device list
: qsTr('okButton')
)
textButtonStyle: InfoEncryptionStyle.okButton
onClicked: {
if(addressToCall != ''){
@ -35,8 +40,8 @@ DialogPlus {
}
]
flat : true
title: "End-to-end encrypted"
//: 'End-to-end encrypted' Popup title about encryption information.
title: qsTr('infoEncryptionTitle')
showCloseCross:false
property int securityLevel
@ -76,11 +81,12 @@ DialogPlus {
color: Colors.d.color
wrapMode: Text.Wrap
text: "Instant messages are end-to-end encrypted in secured conversations. It is possible to upgrade the security level of a conversation by authentificating participants."
//: "Instant messages are end-to-end encrypted in secured conversations. It is possible to upgrade the security level of a conversation by authentificating participants."
//~ Context Explanation of Encryption
text: qsTr('encryptionExplanation')
}
Text{
Layout.fillWidth: true
Layout.fillWidth: true
Layout.alignment: Qt.AlignCenter
Layout.leftMargin: 10
Layout.rightMargin: 10
@ -91,7 +97,9 @@ DialogPlus {
color: Colors.d.color
wrapMode: Text.Wrap
text :"To do so, call the contact and follow the authentification process."
//: "To do so, call the contact and follow the authentification process."
//~ Context Explanation process
text: qsTr('encryptionProcessExplanation')
}
}
}

View file

@ -1,142 +0,0 @@
import QtQuick 2.7
import Common 1.0
import Linphone 1.0
import Utils 1.0
import App.Styles 1.0
// =============================================================================
DialogPlus {
property ChatRoomModel chatRoomModel
property var participantAddress : (chatRoomModel?chatRoomModel.getParticipants(): null)
buttons: [
TextButtonA {
text: 'cancel'
onClicked: exit(0)
},
TextButtonB {
text: 'del'
visible:chatRoomModel
onClicked: {
if(chatRoomModel){
chatRoomModel.leaveChatRoom()
exit(0)
}
}
},
TextButtonB {
text: 'ok'
onClicked: {
if(chatRoomModel && CallsListModel.createSecureChat(subject.text, participantAddress))
exit(0)
}
}
]
buttonsAlignment: Qt.AlignCenter
height: ManageAccountsStyle.height + 30
width: ManageAccountsStyle.width
// ---------------------------------------------------------------------------
Form {
anchors.fill: parent
orientation: Qt.Vertical
FormLine {
FormGroup {
label: 'Details'
FormLine {
FormGroup {
label: 'Subject*'
TextField {
id:subject
placeholderText :"Subject"
text:(chatRoomModel?chatRoomModel.getSubject():'')
Keys.onReturnPressed: nextItemInFocusChain().forceActiveFocus()
error : text == ''
TooltipArea{
text : 'Current subject of the ChatRoom. It cannot be empty'
}
}
}
}
}
}
FormLine {
FormGroup {
label: 'Participants : '+participantAddress
/*
ScrollableListViewField {
width: parent.width
height: ManageAccountsStyle.accountSelector.height
radius: 0
ScrollableListView {
id: view
property string textRole: 'fullSipAddress' // Used by delegate.
anchors.fill: parent
model: AccountSettingsModel.accounts
onModelChanged: currentIndex = Utils.findIndex(AccountSettingsModel.accounts, function (account) {
return account.sipAddress === AccountSettingsModel.sipAddress
})
delegate: CommonItemDelegate {
id: item
container: view
flattenedModel: modelData
itemIcon: ''//Start with no error and let some time before getting status with the below timer
width: parent.width
Timer{// This timer is used to synchronize registration state by proxy, without having to deal with change signals
interval: 1000; running: item.visible; repeat: true
onTriggered:itemIcon= Logic.getItemIcon(flattenedModel)
}
ActionButton {
icon: 'options'
iconSize: 30
anchors.fill: parent
visible:false
//TODO handle click and jump to proxy config settings
}
onClicked: {
container.currentIndex = index
if(flattenedModel.proxyConfig)
AccountSettingsModel.setDefaultProxyConfig(flattenedModel.proxyConfig)
else
AccountSettingsModel.setDefaultProxyConfig()
}
MessageCounter {
anchors.fill: parent
count: flattenedModel.unreadMessageCount+flattenedModel.missedCallCount
}
}
}
}
*/
}
}
}
}

View file

@ -22,13 +22,17 @@ DialogPlus {
buttons: [
TextButtonA {
text: 'CANCEL'
//: 'Cancel' : Cancel button
text: qsTr('cancelButton')
capitalization: Font.AllUppercase
onClicked: exit(0)
},
TextButtonB {
//enabled: toAddView.count >= conferenceManager.minParticipants
text: 'LANCER'
//: 'Launch' : Start button
text: qsTr('startButton')
capitalization: Font.AllUppercase
onClicked: {
if(CallsListModel.createChatRoom(subject.text, secureSwitch.checked, selectedParticipants.getParticipants() ))
@ -38,7 +42,8 @@ DialogPlus {
]
buttonsAlignment: Qt.AlignRight
title:'Lancer un chat de groupe'
//: 'Start a chat room' : Title of a popup about creation of a chat room
title:qsTr('newChatRoomTitle')
height: 500
width: 800
@ -70,7 +75,8 @@ DialogPlus {
spacing:4
Text {
Layout.fillWidth: true
text:'Would you like to encrypt your chat?'
//: 'Would you like to encrypt your chat?' : Ask about setting the chat room as secured.
text:qsTr('askEncryption')
color: Colors.g.color
font.pointSize: Units.dp * 11
font.weight: Font.DemiBold
@ -94,7 +100,6 @@ DialogPlus {
anchors.leftMargin : 5
anchors.verticalCenter: parent.verticalCenter
width:50
//Layout.preferredWidth: 50
enabled:true
onClicked: checked = !checked
indicatorStyle: SwitchStyle.aux
@ -121,7 +126,8 @@ DialogPlus {
spacing:10
Text{
textFormat: Text.RichText
text :'Nom du groupe' +'<span style="color:red">*</span>'
//: 'Subject' : Label of a text field about the subject of the chat room
text :qsTr('subjectLabel') +'<span style="color:red">*</span>'
color: Colors.g.color
font.pointSize: Units.dp * 11
font.weight: Font.DemiBold
@ -130,12 +136,14 @@ DialogPlus {
id:subject
Layout.fillWidth: true
Layout.rightMargin: 15
placeholderText :"Nommer le groupe"
//: 'Give a subject' : Placeholder in a form about setting a subject
placeholderText :'Give a subject'
text:(chatRoomModel?chatRoomModel.getSubject():'')
Keys.onReturnPressed: nextItemInFocusChain().forceActiveFocus()
//error : text == ''
TooltipArea{
text : 'Current subject of the ChatRoom. It cannot be empty'
//: 'Current subject of the Chat Room. It cannot be empty'
//~ Tooltip Explanation about the subject of the chat room
text : qsTr('subjectTooltip')
}
}
@ -146,10 +154,10 @@ DialogPlus {
ColumnLayout {
Layout.fillWidth: true
Layout.fillHeight: true
//Layout.preferredHeight: 200
spacing:20
Text{
text :'Contacts récents'
//: 'Last contacts' : Header for showing last contacts
text :'Last contacts'
color: Colors.g.color
font.pointSize: Units.dp * 11
font.weight: Font.DemiBold
@ -163,7 +171,6 @@ DialogPlus {
id:lastContacts
property int reloadCount : 0
model:TimelineListModel.getLastChatRooms(5)
//[{username:'Danyl Robertson'}, {username:'Toto harrytop'}]
delegate :
Item{
Layout.fillHeight: true
@ -184,25 +191,11 @@ DialogPlus {
anchors.topMargin: -5
visible: UtilsCpp.hasCapability(modelData.sipAddress, LinphoneEnums.FriendCapabilityLimeX3Dh)
icon: 'secure_on'
iconSize:20/*
Rectangle{
id:secureMask
anchors.fill:parent
color:'white'
opacity: 0.5
visible: smartSearchBar.isIgnored(modelData.sipAddress)
Connections{// Workaround for refreshing data on events
target:lastContacts
onReloadCountChanged: {
secureMask.visible=smartSearchBar.isIgnored(modelData.sipAddress)
}
}
}*/
iconSize:20
}
}
Text{
Layout.fillHeight: true
//Layout.maximumHeight: 100
Layout.preferredWidth: 60
Layout.alignment: Qt.AlignVCenter | Qt.AlignTop
maximumLineCount: 5
@ -252,48 +245,6 @@ DialogPlus {
}
}
}
/*
ScrollableListViewField {
Layout.fillHeight: true
Layout.fillWidth: true
readOnly: toAddView.count >= conferenceManager.maxParticipants
SipAddressesView {
anchors.fill: parent
actions: [{
icon: 'transfer',
handler: function (entry) {
conferenceHelperModel.toAdd.addToConference(entry.sipAddress)
}
}]
genSipAddress: filter.text
model: ConferenceHelperModel {
id: conferenceHelperModel
}
onEntryClicked: actions[0].handler(entry)
}
}
}
}
*/
// -------------------------------------------------------------------------
// Separator.
// -------------------------------------------------------------------------
/*
Rectangle {
Layout.fillHeight: true
Layout.leftMargin: ConferenceManagerStyle.columns.separator.leftMargin
Layout.preferredWidth: ConferenceManagerStyle.columns.separator.width
Layout.rightMargin: ConferenceManagerStyle.columns.separator.rightMargin
color: ConferenceManagerStyle.columns.separator.color
}
*/
// -------------------------------------------------------------------------
// See and remove selected addresses.
// -------------------------------------------------------------------------
@ -324,8 +275,10 @@ DialogPlus {
showHeader:false
maxMenuHeight: MainWindowStyle.searchBox.maxHeight
placeholderText: 'toto'
tooltipText: 'tooltip'
//: 'Select participants' : Placeholder for a search on participant to add them in selection.
placeholderText: qsTr('participantSelectionPlaceholder')
//: 'Search in your contacts or add a custom one to the chat room.'
tooltipText: qsTr('participantSelectionTooltip')
actions:[{
icon: 'add_participant',
secure:0,
@ -340,28 +293,16 @@ DialogPlus {
selectedParticipants.add(entry)
smartSearchBar.addAddressToIgnore(entry);
++lastContacts.reloadCount
//selectedParticipants.append({$sipAddress:entry})
}
//resultExceptions: selectedParticipants
}
/*
TextField {
id: filter
Layout.fillWidth: true
icon: 'search'
onTextChanged: conferenceHelperModel.setFilter(text)
}
*/
Text{
Layout.preferredHeight: 20
Layout.rightMargin: 65
Layout.alignment: Qt.AlignRight | Qt.AlignBottom
Layout.topMargin: ConferenceManagerStyle.columns.selector.spacing
text : 'Admin'
//: 'Admin' : Admin(istrator)
//~ one word for admin status
text : qsTr('adminStatus')
color: Colors.g.color
font.pointSize: Units.dp * 11
@ -390,7 +331,9 @@ DialogPlus {
actions: [{
icon: 'remove_participant',
tooltipText: 'Remove this participant from the selection',
//: 'Remove this participant from the selection' : Explanation abo^ut removing participant from a selection
//~ Tooltip This is a tooltip
tooltipText: qsTr('removeParticipantSelection'),
handler: function (entry) {
smartSearchBar.removeAddressToIgnore(entry.sipAddress)
selectedParticipants.remove(entry)
@ -405,81 +348,19 @@ DialogPlus {
chatRoomModel:null
}
onEntryClicked: actions[0].handler(entry)
}
}
}
}
/*
SearchBox{
id: searchBox
anchors.left:parent.left
anchors.right:parent.right
anchors.top:parent.top
anchors.topMargin: 30
anchors.leftMargin:15
anchors.rightMargin: 15
placeholderText:'Search contact or enter SIP address'
entryHeight: 200
SipAddressesView {
id: view
actions: [{
icon: 'add',
secure:0,
handler: function (entry) {
//searchBox.closeMenu()
//searchBox.launchVideoCall(entry.sipAddress)
},
visible: true
}]
genSipAddress: searchBox.filter
model: SearchSipAddressesModel {}
}
}
ScrollableListViewField {
anchors.top:search.bottom
anchors.bottom:parent.bottom
anchors.left:parent.left
anchors.right:parent.right
anchors.leftMargin:15
anchors.rightMargin: 15
anchors.topMargin: 15
SipAddressesView {
id: toAddView
anchors.fill: parent
actions: [{
icon: 'cancel',
handler: function (entry) {
//model.removeFromConference(entry.sipAddress)
}
}]
//model: conferenceHelperModel.toAdd
//onEntryClicked: actions[0].handler(entry)
}
}
}*/
Item{
Layout.fillWidth: true
Layout.preferredHeight: 20
Text{
anchors.fill:parent
textFormat: Text.RichText
text : '<span style="color:red">*</span> Obligatoire'
//: 'Required' : Word relative to a star to explain that it is a requirement (Field form)
text : '<span style="color:red">*</span> '+qsTr('requiredField')
//font.weight: Font.DemiBold
color: Colors.g.color
font.pointSize: Units.dp * 8

View file

@ -271,7 +271,10 @@ ApplicationWindow {
name: qsTr('contactsEntry')
visible: SettingsModel.contactsEnabled
onSelected: setView('Contacts')
onSelected: {
timeline.model.unselectAll()
setView('Contacts')
}
Icon{
anchors.right:parent.right
anchors.verticalCenter: parent.verticalCenter

View file

@ -57,6 +57,7 @@ DialogPlus {
Keys.onReturnPressed: nextItemInFocusChain().forceActiveFocus()
TooltipArea{
text : qsTr('displayNameTooltip')//'The display name of the server to be shown in the list'
//tooltipParent: dialog
}
}
}
@ -79,6 +80,7 @@ DialogPlus {
error : ldapData.serverFieldError
TooltipArea{
text : qsTr('serverTooltip')//'LDAP Server. eg: ldap:/// for a localhost server or ldap://ldap.example.org/'
//tooltipParent: dialog
}
}
}
@ -96,6 +98,7 @@ DialogPlus {
onTextChanged: ldapData.bindDn= text
TooltipArea{
text : qsTr('bindDNTooltip')//'The bind DN is the credential that is used to authenticate against an LDAP.\n eg: cn=ausername,ou=people,dc=bc,dc=com'
//tooltipParent: dialog
}
}
}
@ -162,6 +165,7 @@ DialogPlus {
onActivated: ldapData.verifyServerCertificates = index-1
TooltipArea{
text : qsTr('verifyTLSTooltip')//'Specify whether the tls server certificate must be verified when connecting to a LDAP server.'
//tooltipParent: dialog
}
}
}
@ -187,6 +191,7 @@ DialogPlus {
onTextChanged: ldapData.baseObject = text
TooltipArea{
text : qsTr('baseObjectTooltip')//'BaseObject is a specification for LDAP Search Scopes that specifies that the Search Request should only be performed against the entry specified as the search base DN.\n\nNo entries below it will be considered.'
//tooltipParent: dialog
}
}
}
@ -206,6 +211,7 @@ DialogPlus {
placeholderText :"(sn=%s)"
TooltipArea{
text : qsTr('filterTooltip')//'The search is base on this filter to search friends. Default value : (sn=%s)'
//tooltipParent: dialog
}
}
}
@ -249,6 +255,7 @@ DialogPlus {
// -----------------------------------------------------------------------
Form {
id:parsingForm
title: qsTr('parsingTitle')//'Parsing'
width: parent.width
@ -263,6 +270,7 @@ DialogPlus {
onTextChanged: ldapData.nameAttributes = text
TooltipArea{
text : qsTr('nameAttributesTooltip')//'Check these attributes To build Name Friend, separated by a comma and the first is the highest priority. The default value is: sn'
tooltipParent: nameAttributes
}
}
}
@ -278,6 +286,7 @@ DialogPlus {
onTextChanged: ldapData.sipAttributes = text
TooltipArea{
text : qsTr('sipAttributesTooltip')//'Check these attributes to build the SIP username in address of Friend. Attributes are separated by a comma and the first is the highest priority. The default value is: mobile,telephoneNumber,homePhone,sn'
tooltipParent: sipAttributes
}
}
}
@ -293,6 +302,7 @@ DialogPlus {
onTextChanged: ldapData.sipDomain = text
TooltipArea{
text : qsTr('domainTooltip')//'Add the domain to the sip address(username@domain). The default value is sip.linphone.org'
//tooltipParent: dialog
}
}
}

View file

@ -279,13 +279,14 @@ TabContainer {
id: pluginChoice
model:ContactsImporterPluginsManager.getPlugins()
textRole: "pluginTitle"
displayText: currentIndex === -1 ? 'No Plugins to load' : currentText
//: 'No Plugins to load' : Text in combobox
displayText: currentIndex === -1 ? qsTr('noPlugin') : currentText
Text{// Hack, combobox show empty text when empty
anchors.fill:parent
visible:pluginChoice.currentIndex===-1
verticalAlignment: Qt.AlignVCenter
horizontalAlignment: Qt.AlignHCenter
text: 'No Plugins to load'
text: qsTr('noPlugin')
font {
bold:false
italic: true