Implement delete/add chat members properly, fixes #131

This commit is contained in:
Sebastian Wolf 2020-12-29 16:32:39 +01:00
parent 65c3871b4a
commit 775a31cecb
No known key found for this signature in database
GPG key ID: CEA9522B5F38A90A
23 changed files with 471 additions and 39 deletions

View file

@ -37,7 +37,7 @@ Row {
onInReplyToMessageChanged: { onInReplyToMessageChanged: {
if (inReplyToMessage) { if (inReplyToMessage) {
inReplyToUserText.text = (inReplyToMessage.sender["@type"] === "messageSenderChat" ? page.chatInformation.title : (inReplyToRow.inReplyToMessage.sender.user_id !== inReplyToRow.myUserId) ? Emoji.emojify(Functions.getUserName(tdLibWrapper.getUserInformation(inReplyToRow.inReplyToMessage.sender.user_id)), inReplyToUserText.font.pixelSize) : qsTr("You")); inReplyToUserText.text = (inReplyToMessage.sender["@type"] === "messageSenderChat" ? page.chatInformation.title : (inReplyToRow.inReplyToMessage.sender.user_id !== inReplyToRow.myUserId) ? Emoji.emojify(Functions.getUserName(tdLibWrapper.getUserInformation(inReplyToRow.inReplyToMessage.sender.user_id)), inReplyToUserText.font.pixelSize) : qsTr("You"));
inReplyToMessageText.text = Emoji.emojify(Functions.getMessageText(inReplyToRow.inReplyToMessage, true, inReplyToRow.inReplyToMessage.sender.user_id === inReplyToRow.myUserId, false), inReplyToMessageText.font.pixelSize); inReplyToMessageText.text = Emoji.emojify(Functions.getMessageText(inReplyToRow.inReplyToMessage, true, inReplyToRow.myUserId, false), inReplyToMessageText.font.pixelSize);
} }
} }

View file

@ -106,7 +106,7 @@ ListItem {
} }
MenuItem { MenuItem {
onClicked: { onClicked: {
Clipboard.text = Functions.getMessageText(myMessage, true, false, true); Clipboard.text = Functions.getMessageText(myMessage, true, userInformation.id, true);
} }
text: qsTr("Copy Message to Clipboard") text: qsTr("Copy Message to Clipboard")
} }
@ -163,7 +163,7 @@ ListItem {
if (index === modelIndex) { if (index === modelIndex) {
Debug.log("[ChatModel] This message was updated, index ", index, ", updating content..."); Debug.log("[ChatModel] This message was updated, index ", index, ", updating content...");
messageDateText.text = getMessageStatusText(myMessage, index, chatView.lastReadSentIndex, messageDateText.useElapsed); messageDateText.text = getMessageStatusText(myMessage, index, chatView.lastReadSentIndex, messageDateText.useElapsed);
messageText.text = Emoji.emojify(Functions.getMessageText(myMessage, false, messageListItem.isOwnMessage. false), messageText.font.pixelSize); messageText.text = Emoji.emojify(Functions.getMessageText(myMessage, false, page.myUserId, false), messageText.font.pixelSize);
} }
} }
} }
@ -392,7 +392,7 @@ ListItem {
Text { Text {
id: messageText id: messageText
width: parent.width width: parent.width
text: Emoji.emojify(Functions.getMessageText(myMessage, false, messageListItem.isOwnMessage, false), font.pixelSize) text: Emoji.emojify(Functions.getMessageText(myMessage, false, page.myUserId, false), font.pixelSize)
font.pixelSize: Theme.fontSizeSmall font.pixelSize: Theme.fontSizeSmall
color: messageListItem.textColor color: messageListItem.textColor
wrapMode: Text.Wrap wrapMode: Text.Wrap

View file

@ -43,7 +43,7 @@ Item {
color: Theme.highlightColor color: Theme.highlightColor
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
font.pixelSize: Theme.fontSizeExtraSmall font.pixelSize: Theme.fontSizeExtraSmall
text: "<a style=\"text-decoration: none; font-weight: bold; color:"+Theme.primaryColor+"\" href=\"userId://" + messageListItem.userInformation.id + "\">" + (!messageListItem.isOwnMessage ? Emoji.emojify(Functions.getUserName(messageListItem.userInformation), font.pixelSize) : qsTr("You")) + "</a> " + Emoji.emojify(Functions.getMessageText(messageListItem.myMessage, false, messageListItem.isOwnMessage, false), font.pixelSize) text: "<a style=\"text-decoration: none; font-weight: bold; color:"+Theme.primaryColor+"\" href=\"userId://" + messageListItem.userInformation.id + "\">" + (!messageListItem.isOwnMessage ? Emoji.emojify(Functions.getUserName(messageListItem.userInformation), font.pixelSize) : qsTr("You")) + "</a> " + Emoji.emojify(Functions.getMessageText(messageListItem.myMessage, false, chatPage.myUserId, false), font.pixelSize)
textFormat: Text.RichText textFormat: Text.RichText
wrapMode: Text.WrapAtWordBoundaryOrAnywhere wrapMode: Text.WrapAtWordBoundaryOrAnywhere
onLinkActivated: { onLinkActivated: {

View file

@ -139,7 +139,7 @@ Flickable {
Text { Text {
id: overlayMessageText id: overlayMessageText
width: parent.width width: parent.width
text: Emoji.emojify(Functions.getMessageText(overlayMessage, false, messageOverlayFlickable.isOwnMessage, false), font.pixelSize) text: Emoji.emojify(Functions.getMessageText(overlayMessage, false, tdLibWrapper.getUserInformation().id, false), font.pixelSize)
font.pixelSize: Theme.fontSizeMedium font.pixelSize: Theme.fontSizeMedium
color: Theme.primaryColor color: Theme.primaryColor
wrapMode: Text.Wrap wrapMode: Text.Wrap

View file

@ -35,7 +35,7 @@ Item {
Debug.log("[ChatPage] Activating pinned message"); Debug.log("[ChatPage] Activating pinned message");
var messageUserText = (pinnedMessage.sender.user_id !== chatPage.myUserId) ? Emoji.emojify(Functions.getUserName(tdLibWrapper.getUserInformation(pinnedMessage.sender.user_id)), pinnedMessageUserText.font.pixelSize) : qsTr("You"); var messageUserText = (pinnedMessage.sender.user_id !== chatPage.myUserId) ? Emoji.emojify(Functions.getUserName(tdLibWrapper.getUserInformation(pinnedMessage.sender.user_id)), pinnedMessageUserText.font.pixelSize) : qsTr("You");
pinnedMessageUserText.text = (messageUserText === "" ? qsTr("Pinned Message") : messageUserText ); pinnedMessageUserText.text = (messageUserText === "" ? qsTr("Pinned Message") : messageUserText );
pinnedMessageText.text = Emoji.emojify(Functions.getMessageText(pinnedMessage, true, pinnedMessage.sender.user_id === chatPage.myUserId, false), pinnedMessageText.font.pixelSize); pinnedMessageText.text = Emoji.emojify(Functions.getMessageText(pinnedMessage, true, chatPage.myUserId, false), pinnedMessageText.font.pixelSize);
pinnedMessageItem.visible = true; pinnedMessageItem.visible = true;
} else { } else {
pinnedMessageItem.visible = false; pinnedMessageItem.visible = false;

View file

@ -32,7 +32,10 @@ function getUserName(userInformation) {
return ((userInformation.first_name || "") + " " + (userInformation.last_name || "")).trim(); return ((userInformation.first_name || "") + " " + (userInformation.last_name || "")).trim();
} }
function getMessageText(message, simple, myself, ignoreEntities) { function getMessageText(message, simple, currentUserId, ignoreEntities) {
var myself = ( message.sender['@type'] === "messageSenderUser" && message.sender.user_id.toString() === currentUserId.toString() );
switch(message.content['@type']) { switch(message.content['@type']) {
case 'messageText': case 'messageText':
if (simple) { if (simple) {
@ -89,9 +92,24 @@ function getMessageText(message, simple, myself, ignoreEntities) {
case 'messageChatJoinByLink': case 'messageChatJoinByLink':
return myself ? qsTr("joined this chat", "myself") : qsTr("joined this chat"); return myself ? qsTr("joined this chat", "myself") : qsTr("joined this chat");
case 'messageChatAddMembers': case 'messageChatAddMembers':
return myself ? qsTr("were added to this chat", "myself") : qsTr("was added to this chat"); if (message.sender['@type'] === "messageSenderUser" && message.sender.user_id === message.content.member_user_ids[0]) {
return myself ? qsTr("were added to this chat", "myself") : qsTr("was added to this chat");
} else {
var addedUserNames = "";
for (var i = 0; i < message.content.member_user_ids.length; i++) {
if (i > 0) {
addedUserNames += ", ";
}
addedUserNames += getUserName(tdLibWrapper.getUserInformation(message.content.member_user_ids[i]));
}
return myself ? qsTr("have added %1 to the chat", "myself").arg(addedUserNames) : qsTr("has added %1 to the chat").arg(addedUserNames);
}
case 'messageChatDeleteMember': case 'messageChatDeleteMember':
return myself ? qsTr("left this chat", "myself") : qsTr("left this chat"); if (message.sender['@type'] === "messageSenderUser" && message.sender.user_id === message.content.user_id) {
return myself ? qsTr("left this chat", "myself") : qsTr("left this chat");
} else {
return myself ? qsTr("have removed %1 from the chat", "myself").arg(getUserName(tdLibWrapper.getUserInformation(message.content.user_id))) : qsTr("has removed %1 from the chat").arg(getUserName(tdLibWrapper.getUserInformation(message.content.user_id)));
}
case 'messageChatChangeTitle': case 'messageChatChangeTitle':
return myself ? qsTr("changed the chat title to %1", "myself").arg(message.content.title) : qsTr("changed the chat title to %1").arg(message.content.title); return myself ? qsTr("changed the chat title to %1", "myself").arg(message.content.title) : qsTr("changed the chat title to %1").arg(message.content.title);
case 'messagePoll': case 'messagePoll':
@ -415,7 +433,7 @@ function getMessagesArrayText(messages) {
lines.push(senderName); lines.push(senderName);
} }
lastSenderName = senderName; lastSenderName = senderName;
lines.push(getMessageText(messages[i], true, false)); lines.push(getMessageText(messages[i], true, tdLibWrapper.getUserInformation().id, false));
lines.push(""); lines.push("");
} }
return lines.join("\n"); return lines.join("\n");

View file

@ -935,7 +935,7 @@ Page {
} }
onEditMessage: { onEditMessage: {
newMessageColumn.editMessageId = messageId newMessageColumn.editMessageId = messageId
newMessageTextField.text = Functions.getMessageText(myMessage, false, false, true) newMessageTextField.text = Functions.getMessageText(myMessage, false, chatPage.myUserId, true)
newMessageTextField.focus = true newMessageTextField.focus = true
} }
} }

View file

@ -72,7 +72,7 @@ public:
RoleIsChannel RoleIsChannel
}; };
ChatData(const QVariantMap &data, const QVariantMap &userInformation); ChatData(TDLibWrapper *tdLibWrapper, const QVariantMap &data);
int compareTo(const ChatData *chat) const; int compareTo(const ChatData *chat) const;
bool setOrder(const QString &order); bool setOrder(const QString &order);
@ -94,6 +94,7 @@ public:
QVector<int> updateLastMessage(const QVariantMap &message); QVector<int> updateLastMessage(const QVariantMap &message);
QVector<int> updateGroup(const TDLibWrapper::Group *group); QVector<int> updateGroup(const TDLibWrapper::Group *group);
QVector<int> updateSecretChat(const QVariantMap &secretChatDetails); QVector<int> updateSecretChat(const QVariantMap &secretChatDetails);
TDLibWrapper *tdLibWrapper;
public: public:
QVariantMap chatData; QVariantMap chatData;
@ -107,7 +108,8 @@ public:
QVariantMap userInformation; QVariantMap userInformation;
}; };
ChatListModel::ChatData::ChatData(const QVariantMap &data, const QVariantMap &userInfo) : ChatListModel::ChatData::ChatData(TDLibWrapper *tdLibWrapper, const QVariantMap &data) :
tdLibWrapper(tdLibWrapper),
chatData(data), chatData(data),
chatId(data.value(ID).toLongLong()), chatId(data.value(ID).toLongLong()),
order(data.value(ORDER).toLongLong()), order(data.value(ORDER).toLongLong()),
@ -115,7 +117,7 @@ ChatListModel::ChatData::ChatData(const QVariantMap &data, const QVariantMap &us
verified(false), verified(false),
memberStatus(TDLibWrapper::ChatMemberStatusUnknown), memberStatus(TDLibWrapper::ChatMemberStatusUnknown),
secretChatState(TDLibWrapper::SecretChatStateUnknown), secretChatState(TDLibWrapper::SecretChatStateUnknown),
userInformation(userInfo) userInformation(tdLibWrapper->getUserInformation())
{ {
const QVariantMap type(data.value(TYPE).toMap()); const QVariantMap type(data.value(TYPE).toMap());
switch (chatType = TDLibWrapper::chatTypeFromString(type.value(_TYPE).toString())) { switch (chatType = TDLibWrapper::chatTypeFromString(type.value(_TYPE).toString())) {
@ -199,7 +201,7 @@ qlonglong ChatListModel::ChatData::senderMessageDate() const
QString ChatListModel::ChatData::senderMessageText() const QString ChatListModel::ChatData::senderMessageText() const
{ {
return FernschreiberUtils::getMessageShortText(lastMessage(CONTENT).toMap(), ( isChannel() ? false : this->userInformation.value(ID).toLongLong() == senderUserId() ) ); return FernschreiberUtils::getMessageShortText(tdLibWrapper, lastMessage(CONTENT).toMap(), isChannel(), this->userInformation.value(ID).toLongLong(), lastMessage(SENDER).toMap() );
} }
QString ChatListModel::ChatData::senderMessageStatus() const QString ChatListModel::ChatData::senderMessageStatus() const
@ -592,7 +594,7 @@ void ChatListModel::setShowAllChats(bool showAll)
void ChatListModel::handleChatDiscovered(const QString &, const QVariantMap &chatToBeAdded) void ChatListModel::handleChatDiscovered(const QString &, const QVariantMap &chatToBeAdded)
{ {
ChatData *chat = new ChatData(chatToBeAdded, tdLibWrapper->getUserInformation()); ChatData *chat = new ChatData(tdLibWrapper, chatToBeAdded);
const TDLibWrapper::Group *group = tdLibWrapper->getGroup(chat->groupId); const TDLibWrapper::Group *group = tdLibWrapper->getGroup(chat->groupId);
if (group) { if (group) {

View file

@ -8,12 +8,14 @@ FernschreiberUtils::FernschreiberUtils(QObject *parent) : QObject(parent)
} }
QString FernschreiberUtils::getMessageShortText(const QVariantMap &messageContent, const bool &myself) QString FernschreiberUtils::getMessageShortText(TDLibWrapper *tdLibWrapper, const QVariantMap &messageContent, const bool isChannel, const qlonglong currentUserId, const QVariantMap &messageSender)
{ {
if (messageContent.isEmpty()) { if (messageContent.isEmpty()) {
return QString(); return QString();
} }
const bool myself = !isChannel && (messageSender.value("@type").toString() == "messageSenderUser" && messageSender.value("user_id").toLongLong() == currentUserId);
QString contentType = messageContent.value("@type").toString(); QString contentType = messageContent.value("@type").toString();
if (contentType == "messageText") { if (contentType == "messageText") {
@ -53,10 +55,26 @@ QString FernschreiberUtils::getMessageShortText(const QVariantMap &messageConten
return myself ? tr("joined this chat", "myself") : tr("joined this chat"); return myself ? tr("joined this chat", "myself") : tr("joined this chat");
} }
if (contentType == "messageChatAddMembers") { if (contentType == "messageChatAddMembers") {
return myself ? tr("were added to this chat", "myself") : tr("was added to this chat"); if (messageSender.value("@type").toString() == "messageSenderUser" && messageSender.value("user_id").toLongLong() == messageContent.value("member_user_ids").toList().at(0).toLongLong()) {
return myself ? tr("were added to this chat", "myself") : tr("was added to this chat");
} else {
QVariantList memberUserIds = messageContent.value("member_user_ids").toList();
QString addedUserNames;
for (int i = 0; i < memberUserIds.size(); i++) {
if (i > 0) {
addedUserNames += ", ";
}
addedUserNames += getUserName(tdLibWrapper->getUserInformation(memberUserIds.at(i).toString()));
}
return myself ? tr("have added %1 to the chat", "myself").arg(addedUserNames) : tr("has added %1 to the chat").arg(addedUserNames);
}
} }
if (contentType == "messageChatDeleteMember") { if (contentType == "messageChatDeleteMember") {
return myself ? tr("left this chat", "myself") : tr("left this chat"); if (messageSender.value("@type").toString() == "messageSenderUser" && messageSender.value("user_id").toLongLong() == messageContent.value("user_id").toLongLong()) {
return myself ? tr("left this chat", "myself") : tr("left this chat");
} else {
return myself ? tr("have removed %1 from the chat", "myself").arg(getUserName(tdLibWrapper->getUserInformation(messageContent.value("user_id").toString()))) : tr("has removed %1 from the chat").arg(getUserName(tdLibWrapper->getUserInformation(messageContent.value("user_id").toString())));
}
} }
if (contentType == "messageChatChangeTitle") { if (contentType == "messageChatChangeTitle") {
return myself ? tr("changed the chat title", "myself") : tr("changed the chat title"); return myself ? tr("changed the chat title", "myself") : tr("changed the chat title");
@ -103,3 +121,10 @@ QString FernschreiberUtils::getMessageShortText(const QVariantMap &messageConten
return myself ? tr("sent an unsupported message: %1", "myself").arg(contentType.mid(7)) : tr("sent an unsupported message: %1").arg(contentType.mid(7)); return myself ? tr("sent an unsupported message: %1", "myself").arg(contentType.mid(7)) : tr("sent an unsupported message: %1").arg(contentType.mid(7));
} }
QString FernschreiberUtils::getUserName(const QVariantMap &userInformation)
{
const QString firstName = userInformation.value("first_name").toString();
const QString lastName = userInformation.value("last_name").toString();
return QString(firstName + " " + lastName).trimmed();
}

View file

@ -2,6 +2,7 @@
#define FERNSCHREIBERUTILS_H #define FERNSCHREIBERUTILS_H
#include <QObject> #include <QObject>
#include "tdlibwrapper.h"
class FernschreiberUtils : public QObject class FernschreiberUtils : public QObject
{ {
@ -9,7 +10,8 @@ class FernschreiberUtils : public QObject
public: public:
explicit FernschreiberUtils(QObject *parent = nullptr); explicit FernschreiberUtils(QObject *parent = nullptr);
static QString getMessageShortText(const QVariantMap &messageContent, const bool &myself); static QString getMessageShortText(TDLibWrapper *tdLibWrapper, const QVariantMap &messageContent, const bool isChannel, const qlonglong currentUserId, const QVariantMap &messageSender);
static QString getUserName(const QVariantMap &userInformation);
signals: signals:

View file

@ -332,25 +332,22 @@ void NotificationManager::publishNotification(const NotificationGroup *notificat
} }
QString notificationBody; QString notificationBody;
const QVariantMap senderInformation = messageMap.value(SENDER).toMap();
if (notificationGroup->totalCount == 1 && !messageMap.isEmpty()) { if (notificationGroup->totalCount == 1 && !messageMap.isEmpty()) {
LOG("Group" << notificationGroup->notificationGroupId << "has 1 notification"); LOG("Group" << notificationGroup->notificationGroupId << "has 1 notification");
if (chatInformation && (chatInformation->type == TDLibWrapper::ChatTypeBasicGroup || if (chatInformation && (chatInformation->type == TDLibWrapper::ChatTypeBasicGroup ||
(chatInformation->type == TDLibWrapper::ChatTypeSupergroup && !chatInformation->isChannel))) { (chatInformation->type == TDLibWrapper::ChatTypeSupergroup && !chatInformation->isChannel))) {
// Add author // Add author
const QVariantMap senderInformation = messageMap.value(SENDER).toMap();
QString fullName; QString fullName;
if (senderInformation.value(_TYPE).toString() == "messageSenderChat") { if (senderInformation.value(_TYPE).toString() == "messageSenderChat") {
fullName = tdLibWrapper->getChat(senderInformation.value(CHAT_ID).toString()).value(TITLE).toString(); fullName = tdLibWrapper->getChat(senderInformation.value(CHAT_ID).toString()).value(TITLE).toString();
} else { } else {
const QVariantMap authorInformation = tdLibWrapper->getUserInformation(senderInformation.value(USER_ID).toString()); fullName = FernschreiberUtils::getUserName(tdLibWrapper->getUserInformation(senderInformation.value(USER_ID).toString()));
const QString firstName = authorInformation.value(FIRST_NAME).toString();
const QString lastName = authorInformation.value(LAST_NAME).toString();
fullName = firstName + " " + lastName;
} }
notificationBody = notificationBody + fullName.trimmed() + ": "; notificationBody = notificationBody + fullName.trimmed() + ": ";
} }
notificationBody += getNotificationText(messageMap.value(CONTENT).toMap()); notificationBody += FernschreiberUtils::getMessageShortText(tdLibWrapper, messageMap.value(CONTENT).toMap(), (chatInformation ? chatInformation->isChannel : false), tdLibWrapper->getUserInformation().value(ID).toLongLong(), senderInformation );
nemoNotification->setBody(notificationBody); nemoNotification->setBody(notificationBody);
} else { } else {
// Either we have more than one notification or we have no content to display // Either we have more than one notification or we have no content to display
@ -380,13 +377,6 @@ void NotificationManager::publishNotification(const NotificationGroup *notificat
nemoNotification->publish(); nemoNotification->publish();
} }
QString NotificationManager::getNotificationText(const QVariantMap &notificationContent)
{
LOG("Getting notification text from content" << notificationContent);
return FernschreiberUtils::getMessageShortText(notificationContent, false);
}
void NotificationManager::controlLedNotification(bool enabled) void NotificationManager::controlLedNotification(bool enabled)
{ {
static const QString PATTERN("PatternCommunicationIM"); static const QString PATTERN("PatternCommunicationIM");

View file

@ -50,7 +50,6 @@ public slots:
private: private:
void publishNotification(const NotificationGroup *notificationGroup, bool needFeedback); void publishNotification(const NotificationGroup *notificationGroup, bool needFeedback);
QString getNotificationText(const QVariantMap &notificationContent);
void controlLedNotification(bool enabled); void controlLedNotification(bool enabled);
void updateNotificationGroup(int groupId, qlonglong chatId, int totalCount, void updateNotificationGroup(int groupId, qlonglong chatId, int totalCount,
const QVariantList &addedNotifications, const QVariantList &addedNotifications,

View file

@ -765,6 +765,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation>hat eine Audiodatei gesendet</translation> <translation>hat eine Audiodatei gesendet</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation>hat %1 zum Chat hinzugefügt</translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation>hat %1 vom Chat entfernt</translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation>haben %1 zum Chat hinzugefügt</translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation>haben %1 vom Chat entfernt</translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1028,11 +1046,11 @@
</message> </message>
<message> <message>
<source>Download of %1 successful.</source> <source>Download of %1 successful.</source>
<translation type="unfinished">Download von %1 erfolgreich.</translation> <translation>Download von %1 erfolgreich.</translation>
</message> </message>
<message> <message>
<source>Download failed.</source> <source>Download failed.</source>
<translation type="unfinished">Download fehlgeschlagen.</translation> <translation>Download fehlgeschlagen.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1712,5 +1730,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation>Ausstehende Bestätigung</translation> <translation>Ausstehende Bestätigung</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation>hat %1 zum Chat hinzugefügt</translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation>hat %1 vom Chat entfernt</translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation>haben %1 zum Chat hinzugefügt</translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation>haben %1 vom Chat entfernt</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -765,6 +765,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation>sent an audio</translation> <translation>sent an audio</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation>has added %1 to the chat</translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation>has removed %1 from the chat</translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation>have added %1 to the chat</translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation>have removed %1 from the chat</translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1028,11 +1046,11 @@
</message> </message>
<message> <message>
<source>Download of %1 successful.</source> <source>Download of %1 successful.</source>
<translation type="unfinished">Download of %1 successful.</translation> <translation>Download of %1 successful.</translation>
</message> </message>
<message> <message>
<source>Download failed.</source> <source>Download failed.</source>
<translation type="unfinished">Download failed.</translation> <translation>Download failed.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1712,5 +1730,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation>Pending acknowledgement</translation> <translation>Pending acknowledgement</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished">has added %1 to the chat</translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished">has removed %1 from the chat</translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished">have added %1 to the chat</translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished">have removed %1 from the chat</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -755,6 +755,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation>envió un audio</translation> <translation>envió un audio</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1693,5 +1711,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation>Pendiente de reconocimiento</translation> <translation>Pendiente de reconocimiento</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -766,6 +766,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation>lähetti äänitteen</translation> <translation>lähetti äänitteen</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1713,5 +1731,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation>Odottaa hyväksyntää</translation> <translation>Odottaa hyväksyntää</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -755,6 +755,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation type="unfinished">audiót küldött</translation> <translation type="unfinished">audiót küldött</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1693,5 +1711,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -765,6 +765,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation>ha inviato un audio</translation> <translation>ha inviato un audio</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1712,5 +1730,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation>In attesa di conferma</translation> <translation>In attesa di conferma</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -775,6 +775,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation>wysłał plik dźwiękowy</translation> <translation>wysłał plik dźwiękowy</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1731,5 +1749,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation>Oczekujące na potwierdzenie</translation> <translation>Oczekujące na potwierdzenie</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -775,6 +775,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation>отправил(а) аудио</translation> <translation>отправил(а) аудио</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1731,5 +1749,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation>Ожидание подтверждения</translation> <translation>Ожидание подтверждения</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -765,6 +765,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation>skickade en ljudfil</translation> <translation>skickade en ljudfil</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1712,5 +1730,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation>Väntar bekräftelse</translation> <translation>Väntar bekräftelse</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -755,6 +755,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1693,5 +1711,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -765,6 +765,24 @@
<source>sent an audio</source> <source>sent an audio</source>
<translation type="unfinished">sent an audio</translation> <translation type="unfinished">sent an audio</translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -1712,5 +1730,23 @@
<source>Pending acknowledgement</source> <source>Pending acknowledgement</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>has added %1 to the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>has removed %1 from the chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>have added %1 to the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>have removed %1 from the chat</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>