I can see secret chats... ;)

This commit is contained in:
Sebastian Wolf 2020-11-25 00:23:38 +01:00
parent 4713fbfba6
commit a6d8328b10
21 changed files with 419 additions and 115 deletions

View file

@ -1,5 +1,6 @@
import QtQuick 2.6 import QtQuick 2.6
import Sailfish.Silica 1.0 import Sailfish.Silica 1.0
import WerkWolf.Fernschreiber 1.0
import "../js/twemoji.js" as Emoji import "../js/twemoji.js" as Emoji
import "../js/functions.js" as Functions import "../js/functions.js" as Functions
@ -14,12 +15,13 @@ PhotoTextsListItem {
// chat title // chat title
primaryText.text: title ? Emoji.emojify(title + ( display.notification_settings.mute_for > 0 ? " 🔇" : "" ), Theme.fontSizeMedium) : qsTr("Unknown") primaryText.text: title ? Emoji.emojify(title + ( display.notification_settings.mute_for > 0 ? " 🔇" : "" ), Theme.fontSizeMedium) : qsTr("Unknown")
// last user // last user
prologSecondaryText.text: is_channel ? "" : ( last_message_sender_id ? ( last_message_sender_id !== ownUserId ? Emoji.emojify(Functions.getUserName(tdLibWrapper.getUserInformation(last_message_sender_id)), primaryText.font.pixelSize) : qsTr("You") ) : qsTr("Unknown") ) prologSecondaryText.text: is_channel ? "" : ( last_message_sender_id ? ( last_message_sender_id !== ownUserId ? Emoji.emojify(Functions.getUserName(tdLibWrapper.getUserInformation(last_message_sender_id)), primaryText.font.pixelSize) : qsTr("You") ) : "" )
// last message // last message
secondaryText.text: last_message_text ? Emoji.emojify(Functions.enhanceHtmlEntities(last_message_text), Theme.fontSizeExtraSmall) : qsTr("Unknown") secondaryText.text: last_message_text ? Emoji.emojify(Functions.enhanceHtmlEntities(last_message_text), Theme.fontSizeExtraSmall) : "<i>" + qsTr("No message in this chat.") + "</i>"
// message date // message date
tertiaryText.text: ( last_message_date ? Functions.getDateTimeElapsed(last_message_date) : qsTr("Unknown") ) + Emoji.emojify(last_message_status, tertiaryText.font.pixelSize) tertiaryText.text: ( last_message_date ? ( last_message_date.length === 0 ? "" : Functions.getDateTimeElapsed(last_message_date) + Emoji.emojify(last_message_status, tertiaryText.font.pixelSize) ) : "" )
unreadCount: unread_count unreadCount: unread_count
isSecret: ( chat_type === TelegramAPI.ChatTypeSecret )
openMenuOnPressAndHold: true//chat_id != overviewPage.ownUserId openMenuOnPressAndHold: true//chat_id != overviewPage.ownUserId
menu: ContextMenu { menu: ContextMenu {

View file

@ -1,5 +1,7 @@
import QtQuick 2.6 import QtQuick 2.6
import Sailfish.Silica 1.0 import Sailfish.Silica 1.0
import WerkWolf.Fernschreiber 1.0
ListItem { ListItem {
id: chatListViewItem id: chatListViewItem
@ -10,6 +12,7 @@ ListItem {
property alias tertiaryText: tertiaryText //usually last message date property alias tertiaryText: tertiaryText //usually last message date
property int unreadCount property int unreadCount
property bool isSecret: false
property alias pictureThumbnail: pictureThumbnail property alias pictureThumbnail: pictureThumbnail
contentHeight: mainRow.height + separator.height + 2 * Theme.paddingMedium contentHeight: mainRow.height + separator.height + 2 * Theme.paddingMedium
@ -50,6 +53,27 @@ ListItem {
height: parent.width height: parent.width
} }
Rectangle {
id: chatSecretBackground
color: Theme.overlayBackgroundColor
width: Theme.fontSizeExtraLarge
height: Theme.fontSizeExtraLarge
anchors.left: parent.left
anchors.bottom: parent.bottom
radius: parent.width / 2
visible: chatListViewItem.isSecret
}
Image {
id: chatSecretImage
source: "image://theme/icon-s-secure"
height: Theme.fontSizeMedium
width: Theme.fontSizeMedium
anchors.centerIn: chatSecretBackground
visible: chatListViewItem.isSecret
}
Rectangle { Rectangle {
id: chatUnreadMessagesCountBackground id: chatUnreadMessagesCountBackground
color: Theme.highlightBackgroundColor color: Theme.highlightBackgroundColor
@ -104,6 +128,7 @@ ListItem {
width: parent.width - Theme.paddingMedium - prologSecondaryText.width width: parent.width - Theme.paddingMedium - prologSecondaryText.width
truncationMode: TruncationMode.Fade truncationMode: TruncationMode.Fade
textFormat: Text.StyledText textFormat: Text.StyledText
visible: prologSecondaryText.width < ( parent.width - Theme.paddingLarge )
} }
} }

View file

@ -160,6 +160,7 @@ function getMessageText(message, simple, myself) {
return myself ? qsTr("sent an unsupported message: %1", "myself; %1 is message type").arg(message.content['@type'].substring(7)) : qsTr("sent an unsupported message: %1", "%1 is message type").arg(message.content['@type'].substring(7)); return myself ? qsTr("sent an unsupported message: %1", "myself; %1 is message type").arg(message.content['@type'].substring(7)) : qsTr("sent an unsupported message: %1", "%1 is message type").arg(message.content['@type'].substring(7));
} }
function getChatPartnerStatusText(statusType, was_online) { function getChatPartnerStatusText(statusType, was_online) {
switch(statusType) { switch(statusType) {
case "userStatusEmpty": case "userStatusEmpty":
@ -176,6 +177,18 @@ function getChatPartnerStatusText(statusType, was_online) {
return qsTr("offline, was recently online"); return qsTr("offline, was recently online");
} }
} }
function getSecretChatStatus(secretChatDetails) {
switch (secretChatDetails.state["@type"]) {
case "secretChatStateClosed":
return "<b>" + qsTr("Closed!") + "</b>";
case "secretChatStatePending":
return qsTr("Pending acknowledgement");
case "secretChatStateReady":
return qsTr("Ready to use");
}
}
function getChatMemberStatusText(statusType) { function getChatMemberStatusText(statusType) {
// chatMemberStatusAdministrator, chatMemberStatusBanned, chatMemberStatusCreator, chatMemberStatusLeft, chatMemberStatusMember, and chatMemberStatusRestricted. // chatMemberStatusAdministrator, chatMemberStatusBanned, chatMemberStatusCreator, chatMemberStatusLeft, chatMemberStatusMember, and chatMemberStatusRestricted.
switch(statusType) { switch(statusType) {

View file

@ -36,8 +36,10 @@ Page {
property bool isInitialized: false; property bool isInitialized: false;
readonly property int myUserId: tdLibWrapper.getUserInformation().id; readonly property int myUserId: tdLibWrapper.getUserInformation().id;
property var chatInformation; property var chatInformation;
property var secretChatDetails;
property alias chatPicture: chatPictureThumbnail.photoData property alias chatPicture: chatPictureThumbnail.photoData
property bool isPrivateChat: false; property bool isPrivateChat: false;
property bool isSecretChat: false;
property bool isBasicGroup: false; property bool isBasicGroup: false;
property bool isSuperGroup: false; property bool isSuperGroup: false;
property bool isChannel: false; property bool isChannel: false;
@ -104,11 +106,18 @@ Page {
} }
function updateChatPartnerStatusText() { function updateChatPartnerStatusText() {
if(chatPage.state === "selectMessages") { if (chatPage.state === "selectMessages") {
return return
} }
var statusText = Functions.getChatPartnerStatusText(chatPartnerInformation.status['@type'], chatPartnerInformation.status.was_online); var statusText = Functions.getChatPartnerStatusText(chatPartnerInformation.status['@type'], chatPartnerInformation.status.was_online);
if(statusText) { if (chatPage.secretChatDetails) {
if (statusText) {
statusText += " - ";
}
statusText += Functions.getSecretChatStatus(chatPage.secretChatDetails);
}
if (statusText) {
chatStatusText.text = statusText; chatStatusText.text = statusText;
} }
} }
@ -138,12 +147,16 @@ Page {
chatView.currentIndex = -1; chatView.currentIndex = -1;
chatView.lastReadSentIndex = 0; chatView.lastReadSentIndex = 0;
var chatType = chatInformation.type['@type']; var chatType = chatInformation.type['@type'];
isPrivateChat = ( chatType === "chatTypePrivate" ); isPrivateChat = ( chatType === "chatTypePrivate"|| chatType === "chatTypeSecret" );
isSecretChat = chatType === "chatTypeSecret";
isBasicGroup = ( chatType === "chatTypeBasicGroup" ); isBasicGroup = ( chatType === "chatTypeBasicGroup" );
isSuperGroup = ( chatType === "chatTypeSupergroup" ); isSuperGroup = ( chatType === "chatTypeSupergroup" );
if (isPrivateChat) { if (isPrivateChat) {
chatPartnerInformation = tdLibWrapper.getUserInformation(chatInformation.type.user_id); chatPartnerInformation = tdLibWrapper.getUserInformation(chatInformation.type.user_id);
updateChatPartnerStatusText(); updateChatPartnerStatusText();
if (isSecretChat) {
tdLibWrapper.getSecretChat(chatInformation.type.secret_chat_id);
}
} }
else if (isBasicGroup) { else if (isBasicGroup) {
chatGroupInformation = tdLibWrapper.getBasicGroup(chatInformation.type.basic_group_id); chatGroupInformation = tdLibWrapper.getBasicGroup(chatInformation.type.basic_group_id);
@ -410,6 +423,20 @@ Page {
pinnedMessageItem.pinnedMessage = message; pinnedMessageItem.pinnedMessage = message;
} }
} }
onSecretChatReceived: {
if (secretChatId === chatInformation.type.secret_chat_id.toString()) {
Debug.log("[ChatPage] Received detailed information about this secret chat");
chatPage.secretChatDetails = secretChat;
updateChatPartnerStatusText();
}
}
onSecretChatUpdated: {
if (secretChatId === chatInformation.type.secret_chat_id.toString()) {
Debug.log("[ChatPage] Detailed information about this secret chat was updated");
chatPage.secretChatDetails = secretChat;
updateChatPartnerStatusText();
}
}
} }
Connections { Connections {
@ -604,23 +631,49 @@ Page {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
spacing: Theme.paddingMedium spacing: Theme.paddingMedium
ProfileThumbnail { Item {
id: chatPictureThumbnail
replacementStringHint: chatNameText.text
width: chatOverviewItem.height width: chatOverviewItem.height
height: chatOverviewItem.height height: chatOverviewItem.height
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.bottomMargin: chatPage.isPortrait ? Theme.paddingMedium : Theme.paddingSmall anchors.bottomMargin: chatPage.isPortrait ? Theme.paddingMedium : Theme.paddingSmall
// Setting it directly may cause an stale state for the thumbnail in case the chat page ProfileThumbnail {
// was previously loaded with a picture and now it doesn't have one. Instead setting it id: chatPictureThumbnail
// when the ChatModel indicates a change. This also avoids flickering when the page is loaded... replacementStringHint: chatNameText.text
Connections { width: parent.height
target: chatModel height: parent.height
onSmallPhotoChanged: {
chatPictureThumbnail.photoData = chatModel.smallPhoto; // Setting it directly may cause an stale state for the thumbnail in case the chat page
// was previously loaded with a picture and now it doesn't have one. Instead setting it
// when the ChatModel indicates a change. This also avoids flickering when the page is loaded...
Connections {
target: chatModel
onSmallPhotoChanged: {
chatPictureThumbnail.photoData = chatModel.smallPhoto;
}
} }
} }
Rectangle {
id: chatSecretBackground
color: Theme.overlayBackgroundColor
width: chatPage.isPortrait ? Theme.fontSizeLarge : Theme.fontSizeMedium
height: width
anchors.left: parent.left
anchors.bottom: parent.bottom
radius: parent.width / 2
visible: chatPage.isSecretChat
}
Image {
id: chatSecretImage
source: "image://theme/icon-s-secure"
width: chatPage.isPortrait ? Theme.fontSizeSmall : Theme.fontSizeExtraSmall
height: width
anchors.centerIn: chatSecretBackground
visible: chatPage.isSecretChat
}
} }
Item { Item {

View file

@ -166,7 +166,7 @@ Page {
Item { Item {
id: privateChatItem id: privateChatItem
height: parent.height height: parent.height
width: parent.width / 2 + ( Theme.horizontalPageMargin / 2 ) width: parent.width / 2 // - ( Theme.horizontalPageMargin / 2 )
anchors.left: parent.left anchors.left: parent.left
anchors.top: parent.top anchors.top: parent.top
@ -218,7 +218,7 @@ Page {
wrapMode: Text.Wrap wrapMode: Text.Wrap
elide: Text.ElideRight elide: Text.ElideRight
textFormat: Text.StyledText textFormat: Text.StyledText
text: qsTr("Transport-encrypted, stored in Telegram Cloud, sharable across devices") text: qsTr("Transport-encrypted, uses Telegram Cloud, sharable across devices")
} }
} }
@ -241,7 +241,7 @@ Page {
Item { Item {
id: secretChatItem id: secretChatItem
height: parent.height height: parent.height
width: parent.width / 2 + ( Theme.horizontalPageMargin / 2 ) width: parent.width / 2 //+ ( Theme.horizontalPageMargin / 2 )
anchors.left: privateChatItem.right anchors.left: privateChatItem.right
anchors.top: parent.top anchors.top: parent.top
@ -301,7 +301,7 @@ Page {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
console.log("SECRET CHAT!"); tdLibWrapper.createNewSecretChat(display.id);
} }
onPressed: { onPressed: {
secretChatHighlightBackground.visible = true; secretChatHighlightBackground.visible = true;
@ -344,7 +344,7 @@ Page {
InfoLabel { InfoLabel {
id: loadingLabel id: loadingLabel
text: qsTr("Loading contacs...") text: qsTr("Loading contacts...")
} }
BusyIndicator { BusyIndicator {

View file

@ -10,6 +10,10 @@ FernschreiberUtils::FernschreiberUtils(QObject *parent) : QObject(parent)
QString FernschreiberUtils::getMessageShortText(const QVariantMap &messageContent, const bool &myself) QString FernschreiberUtils::getMessageShortText(const QVariantMap &messageContent, const bool &myself)
{ {
if (messageContent.isEmpty()) {
return QString();
}
QString contentType = messageContent.value("@type").toString(); QString contentType = messageContent.value("@type").toString();
if (contentType == "messageText") { if (contentType == "messageText") {

View file

@ -126,6 +126,8 @@ TDLibReceiver::TDLibReceiver(void *tdLibClient, QObject *parent) : QThread(paren
handlers.insert("users", &TDLibReceiver::processUsers); handlers.insert("users", &TDLibReceiver::processUsers);
handlers.insert("error", &TDLibReceiver::processError); handlers.insert("error", &TDLibReceiver::processError);
handlers.insert("ok", &TDLibReceiver::nop); handlers.insert("ok", &TDLibReceiver::nop);
handlers.insert("secretChat", &TDLibReceiver::processSecretChat);
handlers.insert("updateSecretChat", &TDLibReceiver::processUpdateSecretChat);
} }
void TDLibReceiver::setActive(bool active) void TDLibReceiver::setActive(bool active)
@ -523,3 +525,15 @@ void TDLibReceiver::processError(const QVariantMap &receivedInformation)
void TDLibReceiver::nop(const QVariantMap &) void TDLibReceiver::nop(const QVariantMap &)
{ {
} }
void TDLibReceiver::processSecretChat(const QVariantMap &receivedInformation)
{
LOG("Received a secret chat");
emit secretChat(receivedInformation.value(ID).toString(), receivedInformation);
}
void TDLibReceiver::processUpdateSecretChat(const QVariantMap &receivedInformation)
{
LOG("A secret chat was updated");
emit secretChatUpdated(receivedInformation.value(ID).toString(), receivedInformation);
}

View file

@ -85,7 +85,8 @@ signals:
void chatPinnedMessageUpdated(qlonglong chatId, qlonglong pinnedMessageId); void chatPinnedMessageUpdated(qlonglong chatId, qlonglong pinnedMessageId);
void usersReceived(const QString &extra, const QVariantList &userIds, int totalUsers); void usersReceived(const QString &extra, const QVariantList &userIds, int totalUsers);
void errorReceived(const int code, const QString &message); void errorReceived(const int code, const QString &message);
void secretChat(const QString &secretChatId, const QVariantMap &secretChat);
void secretChatUpdated(const QString &secretChatId, const QVariantMap &secretChat);
private: private:
typedef void (TDLibReceiver::*Handler)(const QVariantMap &); typedef void (TDLibReceiver::*Handler)(const QVariantMap &);
@ -145,6 +146,8 @@ private:
void processUsers(const QVariantMap &receivedInformation); void processUsers(const QVariantMap &receivedInformation);
void processError(const QVariantMap &receivedInformation); void processError(const QVariantMap &receivedInformation);
void nop(const QVariantMap &receivedInformation); void nop(const QVariantMap &receivedInformation);
void processSecretChat(const QVariantMap &receivedInformation);
void processUpdateSecretChat(const QVariantMap &receivedInformation);
}; };
#endif // TDLIBRECEIVER_H #endif // TDLIBRECEIVER_H

View file

@ -94,6 +94,8 @@ TDLibWrapper::TDLibWrapper(AppSettings *appSettings, MceInterface *mceInterface,
connect(this->tdLibReceiver, SIGNAL(messagesDeleted(QString, QVariantList)), this, SIGNAL(messagesDeleted(QString, QVariantList))); connect(this->tdLibReceiver, SIGNAL(messagesDeleted(QString, QVariantList)), this, SIGNAL(messagesDeleted(QString, QVariantList)));
connect(this->tdLibReceiver, SIGNAL(chats(QVariantMap)), this, SIGNAL(chatsReceived(QVariantMap))); connect(this->tdLibReceiver, SIGNAL(chats(QVariantMap)), this, SIGNAL(chatsReceived(QVariantMap)));
connect(this->tdLibReceiver, SIGNAL(chat(QVariantMap)), this, SLOT(handleChatReceived(QVariantMap))); connect(this->tdLibReceiver, SIGNAL(chat(QVariantMap)), this, SLOT(handleChatReceived(QVariantMap)));
connect(this->tdLibReceiver, SIGNAL(secretChat(QString, QVariantMap)), this, SIGNAL(secretChatReceived(QString, QVariantMap)));
connect(this->tdLibReceiver, SIGNAL(secretChatUpdated(QString, QVariantMap)), this, SIGNAL(secretChatUpdated(QString, QVariantMap)));
connect(this->tdLibReceiver, SIGNAL(recentStickersUpdated(QVariantList)), this, SIGNAL(recentStickersUpdated(QVariantList))); connect(this->tdLibReceiver, SIGNAL(recentStickersUpdated(QVariantList)), this, SIGNAL(recentStickersUpdated(QVariantList)));
connect(this->tdLibReceiver, SIGNAL(stickers(QVariantList)), this, SIGNAL(stickersReceived(QVariantList))); connect(this->tdLibReceiver, SIGNAL(stickers(QVariantList)), this, SIGNAL(stickersReceived(QVariantList)));
connect(this->tdLibReceiver, SIGNAL(installedStickerSetsUpdated(QVariantList)), this, SIGNAL(installedStickerSetsUpdated(QVariantList))); connect(this->tdLibReceiver, SIGNAL(installedStickerSetsUpdated(QVariantList)), this, SIGNAL(installedStickerSetsUpdated(QVariantList)));
@ -809,6 +811,15 @@ void TDLibWrapper::getContacts()
this->sendRequest(requestObject); this->sendRequest(requestObject);
} }
void TDLibWrapper::getSecretChat(const QString &secretChatId)
{
LOG("Getting detailed information about secret chat" << secretChatId);
QVariantMap requestObject;
requestObject.insert(_TYPE, "getSecretChat");
requestObject.insert("secret_chat_id", secretChatId);
this->sendRequest(requestObject);
}
void TDLibWrapper::searchEmoji(const QString &queryString) void TDLibWrapper::searchEmoji(const QString &queryString)
{ {
LOG("Searching emoji" << queryString); LOG("Searching emoji" << queryString);

View file

@ -164,6 +164,7 @@ public:
Q_INVOKABLE void joinChatByInviteLink(const QString &inviteLink); Q_INVOKABLE void joinChatByInviteLink(const QString &inviteLink);
Q_INVOKABLE void getDeepLinkInfo(const QString &link); Q_INVOKABLE void getDeepLinkInfo(const QString &link);
Q_INVOKABLE void getContacts(); Q_INVOKABLE void getContacts();
Q_INVOKABLE void getSecretChat(const QString &secretChatId);
// Others (candidates for extraction ;)) // Others (candidates for extraction ;))
Q_INVOKABLE void searchEmoji(const QString &queryString); Q_INVOKABLE void searchEmoji(const QString &queryString);
@ -207,6 +208,8 @@ signals:
void messagesDeleted(const QString &chatId, const QVariantList &messageIds); void messagesDeleted(const QString &chatId, const QVariantList &messageIds);
void chatsReceived(const QVariantMap &chats); void chatsReceived(const QVariantMap &chats);
void chatReceived(const QVariantMap &chat); void chatReceived(const QVariantMap &chat);
void secretChatReceived(const QString &secretChatId, const QVariantMap &secretChat);
void secretChatUpdated(const QString &secretChatId, const QVariantMap &secretChat);
void recentStickersUpdated(const QVariantList &stickerIds); void recentStickersUpdated(const QVariantList &stickerIds);
void stickersReceived(const QVariantList &stickers); void stickersReceived(const QVariantList &stickers);
void installedStickerSetsUpdated(const QVariantList &stickerSetIds); void installedStickerSetsUpdated(const QVariantList &stickerSetIds);

View file

@ -260,6 +260,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation>Nachrichten als gelesen markieren</translation> <translation>Nachrichten als gelesen markieren</translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation>Keine Nachricht in diesem Chat</translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -894,35 +898,35 @@
<name>NewChatPage</name> <name>NewChatPage</name>
<message> <message>
<source>Your Contacts</source> <source>Your Contacts</source>
<translation type="unfinished"></translation> <translation>Ihre Kontakte</translation>
</message> </message>
<message> <message>
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation>Sie haben keine Kontakte</translation>
</message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation>Privater Chat</translation>
</message> </message>
<message> <message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source> <source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation> <translation>Transportverschlüsselt, nutzt Telegram-Cloud, teilbar zwischen Geräten</translation>
</message> </message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation>Geheimer Chat</translation>
</message> </message>
<message> <message>
<source>End-to-end-encrypted, accessible on this device only</source> <source>End-to-end-encrypted, accessible on this device only</source>
<translation type="unfinished"></translation> <translation>Ende-zu-Ende-verschlüsselt, nur auf diesem Gerät zugreifbar</translation>
</message> </message>
<message> <message>
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation>Suchen Sie einen Kontakt</translation>
</message>
<message>
<source>Loading contacts...</source>
<translation>Lade Kontakte...</translation>
</message> </message>
</context> </context>
<context> <context>
@ -979,7 +983,7 @@
</message> </message>
<message> <message>
<source>New Chat</source> <source>New Chat</source>
<translation type="unfinished"></translation> <translation>Neuer Chat</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1643,5 +1647,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation>Sie sind bereits Mitglied dieses Chats.</translation> <translation>Sie sind bereits Mitglied dieses Chats.</translation>
</message> </message>
<message>
<source>Closed!</source>
<translation>Geschlossen!</translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation>Ausstehende Bestätigung</translation>
</message>
<message>
<source>Ready to use</source>
<translation>Einsatzbereit</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -260,6 +260,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation>Mark all messages as read</translation> <translation>Mark all messages as read</translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -900,18 +904,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -924,6 +920,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1643,5 +1647,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation>You are already a member of this chat.</translation> <translation>You are already a member of this chat.</translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -257,6 +257,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation>Marcar todos como leídos</translation> <translation>Marcar todos como leídos</translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -890,18 +894,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -914,6 +910,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1624,5 +1628,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation>Ya eres miembro de este grupo.</translation> <translation>Ya eres miembro de este grupo.</translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -260,6 +260,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation>Merkitse kaikki viestit luetuiksi</translation> <translation>Merkitse kaikki viestit luetuiksi</translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -901,18 +905,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -925,6 +921,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1644,5 +1648,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation>Olet jo tämän ryhmän jäsen.</translation> <translation>Olet jo tämän ryhmän jäsen.</translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -257,6 +257,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -890,18 +894,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -914,6 +910,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1624,5 +1628,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -260,6 +260,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation>Segna tutti i messaggi come già letti</translation> <translation>Segna tutti i messaggi come già letti</translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -900,18 +904,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -924,6 +920,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1643,5 +1647,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation>Sei già membro di questa chat.</translation> <translation>Sei già membro di questa chat.</translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -263,6 +263,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation>Zaznacz wszystkie wiadomości jako przeczytane</translation> <translation>Zaznacz wszystkie wiadomości jako przeczytane</translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -910,18 +914,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -934,6 +930,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1662,5 +1666,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation>Jesteś już członkiem tego czatu.</translation> <translation>Jesteś już członkiem tego czatu.</translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -263,6 +263,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation>Отметить все сообщения как прочитанные</translation> <translation>Отметить все сообщения как прочитанные</translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -910,18 +914,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -934,6 +930,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1662,5 +1666,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation>Вы уже в этом чате.</translation> <translation>Вы уже в этом чате.</translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -260,6 +260,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation>Markera alla meddelanden som lästa</translation> <translation>Markera alla meddelanden som lästa</translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -900,18 +904,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -924,6 +920,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1643,5 +1647,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation>Du är redan medlem i den här chatten.</translation> <translation>Du är redan medlem i den här chatten.</translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -257,6 +257,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -890,18 +894,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -914,6 +910,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1624,5 +1628,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -260,6 +260,10 @@
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation>Mark all messages as read</translation> <translation>Mark all messages as read</translation>
</message> </message>
<message>
<source>No message in this chat.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ChatPage</name> <name>ChatPage</name>
@ -900,18 +904,10 @@
<source>You don&apos;t have any contacts.</source> <source>You don&apos;t have any contacts.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacs...</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Private Chat</source> <source>Private Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transport-encrypted, stored in Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Secret Chat</source> <source>Secret Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -924,6 +920,14 @@
<source>Search a contact</source> <source>Search a contact</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Loading contacts...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Transport-encrypted, uses Telegram Cloud, sharable across devices</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>NotificationManager</name> <name>NotificationManager</name>
@ -1643,5 +1647,17 @@
<source>You are already a member of this chat.</source> <source>You are already a member of this chat.</source>
<translation>You are already a member of this chat.</translation> <translation>You are already a member of this chat.</translation>
</message> </message>
<message>
<source>Closed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pending acknowledgement</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ready to use</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>