ChatInfoPage as attached page

fixes #150: Now basically everything is inside a loader; ChatInformationPage is added to ChatPage with pageStack.pushAttached

fixes #166: Replaces the clunky VisualItemModel in tab view and doesn't initialize multiple times.
This commit is contained in:
John Gibbon 2020-11-16 21:38:55 +01:00
parent cb20bb686b
commit 182a2d1344
19 changed files with 1089 additions and 1033 deletions

View file

@ -51,6 +51,7 @@ DISTFILES += qml/harbour-fernschreiber.qml \
qml/components/PhotoTextsListItem.qml \
qml/components/WebPagePreview.qml \
qml/components/chatInformationPage/ChatInformationEditArea.qml \
qml/components/chatInformationPage/ChatInformationPageContent.qml \
qml/components/chatInformationPage/ChatInformationProfilePicture.qml \
qml/components/chatInformationPage/ChatInformationProfilePictureList.qml \
qml/components/chatInformationPage/ChatInformationTabItemBase.qml \

View file

@ -0,0 +1,459 @@
/*
Copyright (C) 2020 Sebastian J. Wolf and other contributors
This file is part of Fernschreiber.
Fernschreiber is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Fernschreiber is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Fernschreiber. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.6
import Sailfish.Silica 1.0
import "./chatInformationPage"
import "../js/twemoji.js" as Emoji
import "../js/functions.js" as Functions
SilicaFlickable {
id: pageContent
property alias membersList: membersList
function initializePage() {
console.log("[ChatInformationPage] Initializing chat info page...");
membersList.clear();
var chatType = chatInformation.type["@type"];
switch(chatType) {
case "chatTypePrivate":
chatInformationPage.isPrivateChat = true;
chatInformationPage.chatPartnerGroupId = chatInformationPage.chatInformation.type.user_id.toString();
if(!chatInformationPage.privateChatUserInformation.id) {
chatInformationPage.privateChatUserInformation = tdLibWrapper.getUserInformation(chatInformationPage.chatPartnerGroupId);
}
tdLibWrapper.getUserFullInfo(chatInformationPage.chatPartnerGroupId);
tdLibWrapper.getUserProfilePhotos(chatInformationPage.chatPartnerGroupId, 100, 0);
break;
case "chatTypeBasicGroup":
chatInformationPage.isBasicGroup = true;
chatInformationPage.chatPartnerGroupId = chatInformation.type.basic_group_id.toString();
if(!chatInformationPage.groupInformation.id) {
chatInformationPage.groupInformation = tdLibWrapper.getBasicGroup(chatInformationPage.chatPartnerGroupId);
}
tdLibWrapper.getGroupFullInfo(chatInformationPage.chatPartnerGroupId, false);
break;
case "chatTypeSupergroup":
chatInformationPage.isSuperGroup = true;
chatInformationPage.chatPartnerGroupId = chatInformation.type.supergroup_id.toString();
if(!chatInformationPage.groupInformation.id) {
chatInformationPage.groupInformation = tdLibWrapper.getSuperGroup(chatInformationPage.chatPartnerGroupId);
}
tdLibWrapper.getGroupFullInfo(chatInformationPage.chatPartnerGroupId, true);
chatInformationPage.isChannel = chatInformationPage.groupInformation.is_channel;
break;
}
console.log("is set up", chatInformationPage.isPrivateChat, chatInformationPage.isBasicGroup, chatInformationPage.isSuperGroup, chatInformationPage.chatPartnerGroupId)
if(!chatInformationPage.isPrivateChat) {
updateGroupStatusText();
}
tabViewLoader.active = true;
}
function scrollUp(force) {
if(force) {
// animation does not always work while quick scrolling
scrollUpTimer.start()
} else {
scrollUpAnimation.start()
}
}
function scrollDown(force) {
if(force) {
scrollDownTimer.start()
} else {
scrollDownAnimation.start()
}
}
function handleBasicGroupFullInfo(groupFullInfo) {
chatInformationPage.groupFullInformation = groupFullInfo;
membersList.clear();
if(groupFullInfo.members && groupFullInfo.members.length > 0) {
for(var memberIndex in groupFullInfo.members) {
var memberData = groupFullInfo.members[memberIndex];
var userInfo = tdLibWrapper.getUserInformation(memberData.user_id) || {user:{}, bot_info:{}};
memberData.user = userInfo;
memberData.bot_info = memberData.bot_info || {};
membersList.append(memberData);
}
chatInformationPage.groupInformation.member_count = groupFullInfo.members.length
updateGroupStatusText();
}
}
function updateGroupStatusText() {
if (chatOnlineMemberCount > 0) {
headerItem.description = qsTr("%1 members, %2 online").arg(Functions.getShortenedCount(chatInformationPage.groupInformation.member_count)).arg(Functions.getShortenedCount(chatInformationPage.chatOnlineMemberCount));
} else {
if (isChannel) {
headerItem.description = qsTr("%1 subscribers").arg(Functions.getShortenedCount(chatInformationPage.groupInformation.member_count));
} else {
headerItem.description = qsTr("%1 members").arg(Functions.getShortenedCount(chatInformationPage.groupInformation.member_count));
}
}
}
Connections {
target: tdLibWrapper
onChatOnlineMemberCountUpdated: {
if ((chatInformationPage.isSuperGroup || chatInformationPage.isBasicGroup) && chatInformationPage.chatInformation.id.toString() === chatId) {
chatInformationPage.chatOnlineMemberCount = chatInformationPage.onlineMemberCount;
updateGroupStatusText();
}
}
onSupergroupFullInfoReceived: {
console.log("onSupergroupFullInfoReceived", chatInformationPage.isSuperGroup, chatInformationPage.chatPartnerGroupId, groupId)
if(chatInformationPage.isSuperGroup && chatInformationPage.chatPartnerGroupId === groupId) {
chatInformationPage.groupFullInformation = groupFullInfo;
}
}
onSupergroupFullInfoUpdated: {
console.log("onSupergroupFullInfoUpdated", chatInformationPage.isSuperGroup, chatInformationPage.chatPartnerGroupId, groupId)
if(chatInformationPage.isSuperGroup && chatInformationPage.chatPartnerGroupId === groupId) {
chatInformationPage.groupFullInformation = groupFullInfo;
}
}
onBasicGroupFullInfoReceived: {
if(chatInformationPage.isBasicGroup && chatInformationPage.chatPartnerGroupId === groupId) {
handleBasicGroupFullInfo(groupFullInfo)
}
}
onBasicGroupFullInfoUpdated: {
if(chatInformationPage.isBasicGroup && chatInformationPage.chatPartnerGroupId === groupId) {
handleBasicGroupFullInfo(groupFullInfo)
}
}
onUserFullInfoReceived: {
if(chatInformationPage.isPrivateChat && userFullInfo["@extra"] === chatInformationPage.chatPartnerGroupId) {
chatInformationPage.chatPartnerFullInformation = userFullInfo;
}
}
onUserFullInfoUpdated: {
if(chatInformationPage.isPrivateChat && userId === chatInformationPage.chatPartnerGroupId) {
chatInformationPage.chatPartnerFullInformation = userFullInfo;
}
}
onUserProfilePhotosReceived: {
if(chatInformationPage.isPrivateChat && extra === chatInformationPage.chatPartnerGroupId) {
chatInformationPage.chatPartnerProfilePhotos = photos;
}
}
onChatPermissionsUpdated: {
if (chatInformationPage.chatInformation.id.toString() === chatId) {
// set whole object to trigger change
var newInformation = chatInformation;
newInformation.permissions = permissions
chatInformationPage.chatInformation = newInformation
}
}
onChatTitleUpdated: {
if (chatInformationPage.chatInformation.id.toString() === chatId) {
// set whole object to trigger change
var newInformation = chatInformation;
newInformation.title = title
chatInformationPage.chatInformation = newInformation
}
}
}
Component.onCompleted: {
console.log("completed chatinformationpage");
initializePage();
}
ListModel {
id: membersList
}
AppNotification {
id: infoNotification
}
PullDownMenu {
MenuItem {
visible: (chatPage.isSuperGroup || chatPage.isBasicGroup) && groupInformation && groupInformation.status["@type"] !== "chatMemberStatusBanned"
text: chatInformationPage.userIsMember ? qsTr("Leave Chat") : qsTr("Join Chat")
onClicked: {
// ensure it's done even if the page is closed:
if (chatInformationPage.userIsMember) {
var remorse = Remorse.popupAction(appWindow, qsTr("Leaving chat"), (function(chatid) {
return function() {
tdLibWrapper.leaveChat(chatid);
// this does not care about the response (ideally type "ok" without further reference) for now
pageStack.pop(pageStack.find( function(page){ return(page._depth === 0)} ));
};
}(chatInformationPage.chatInformation.id)))
} else {
tdLibWrapper.joinChat(chatInformationPage.chatInformation.id);
}
}
}
MenuItem {
visible: chatInformationPage.userIsMember
onClicked: {
var newNotificationSettings = chatInformationPage.chatInformation.notification_settings;
if (newNotificationSettings.mute_for > 0) {
newNotificationSettings.mute_for = 0;
} else {
newNotificationSettings.mute_for = 6666666;
}
newNotificationSettings.use_default_mute_for = false;
tdLibWrapper.setChatNotificationSettings(chatInformationPage.chatInformation.id, newNotificationSettings);
}
text: chatInformation.notification_settings.mute_for > 0 ? qsTr("Unmute Chat") : qsTr("Mute Chat")
}
// MenuItem { //TODO Implement
// visible: !userIsMember
// onClicked: {
// tdLibWrapper.joinChat(chatInformationPage.chatInformation.id);
// }
// text: qsTr("Join Chat")
// }
}
// header
PageHeader {
id: headerItem
z: 5
Item {
id: imageContainer
property bool hasImage: typeof chatInformationPage.chatInformation.photo !== "undefined"
property int minDimension: chatInformationPage.isLandscape ? Theme.itemSizeSmall : Theme.itemSizeMedium
property int maxDimension: Screen.width / 2
property int minX: Theme.horizontalPageMargin
property int maxX: (chatInformationPage.width - maxDimension)/2
property int minY: (parent.height - minDimension)/2
property int maxY: parent.height
property double tweenFactor: {
if(!hasImage) {
return 0
}
return 1 - Math.max(0, Math.min(1, contentFlickable.contentY / maxDimension))
}
function getEased(min,max,factor) {
return min + (max-min)*factor
}
width: getEased(minDimension,maxDimension, tweenFactor)
height: width
x: getEased(minX,maxX, tweenFactor)
y: getEased(minY,maxY, tweenFactor)
ProfileThumbnail {
id: chatPictureThumbnail
photoData: imageContainer.hasImage ? chatInformationPage.chatInformation.photo.small : ""
replacementStringHint: headerItem.title
width: parent.width
height: width
radius: imageContainer.minDimension / 2
opacity: profilePictureLoader.status !== Loader.Ready || profilePictureLoader.item.opacity < 1 ? 1.0 : 0.0
optimizeImageSize: false
}
Loader {
id: profilePictureLoader
active: imageContainer.hasImage
asynchronous: true
anchors.fill: chatPictureThumbnail
source: chatInformationPage.isPrivateChat
? "../components/chatInformationPage/ChatInformationProfilePictureList.qml"
: "../components/chatInformationPage/ChatInformationProfilePicture.qml"
}
}
// PageHeader changes the html base path:
property url emojiBase: "../js/emoji/"
leftMargin: imageContainer.minDimension + Theme.horizontalPageMargin + Theme.paddingMedium
title: chatInformationPage.chatInformation.title !== "" ? Emoji.emojify(chatInformationPage.chatInformation.title, Theme.fontSizeLarge, emojiBase) : qsTr("Unknown")
description: chatInformationPage.isPrivateChat ? ("@"+(chatInformationPage.privateChatUserInformation.username || chatInformationPage.chatPartnerGroupId)) : ""
}
SilicaFlickable {
id: contentFlickable
contentHeight: groupInfoItem.height + tabViewLoader.height
clip: true
interactive: true//groupInfoItem.height > pageContent.height * 0.5
anchors {
top: headerItem.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
NumberAnimation {
id: scrollDownAnimation
target: contentFlickable
to: groupInfoItem.height
property: "contentY"
duration: 500
easing.type: Easing.InOutCubic
}
NumberAnimation {
id: scrollUpAnimation
target: contentFlickable
to: 0
property: "contentY"
duration: 500
easing.type: Easing.InOutCubic
property Timer scrollUpTimer: Timer {
id: scrollUpTimer
interval: 50
onTriggered: {
contentFlickable.scrollToTop()
}
}
property Timer scrollDownTimer: Timer {
id: scrollDownTimer
interval: 50
onTriggered: {
contentFlickable.scrollToBottom()
}
}
}
Column {
id: groupInfoItem
bottomPadding: Theme.paddingLarge
topPadding: Theme.paddingLarge
anchors {
top: parent.top
left: parent.left
leftMargin: Theme.horizontalPageMargin
right: parent.right
rightMargin: Theme.horizontalPageMargin
}
Item { //large image placeholder
width: parent.width
height: imageContainer.hasImage ? imageContainer.maxDimension : 0
}
ChatInformationEditArea {
visible: canEdit
canEdit: !chatInformationPage.isPrivateChat && chatInformationPage.groupInformation.status && (chatInformationPage.groupInformation.status.can_change_info || chatInformationPage.groupInformation.status["@type"] === "chatMemberStatusCreator")
headerText: qsTr("Chat Title", "group title header")
text: chatInformationPage.chatInformation.title
onSaveButtonClicked: {
if(!editItem.errorHighlight) {
tdLibWrapper.setChatTitle(chatInformationPage.chatInformation.id, textValue);
} else {
isEditing = true
}
}
onTextEdited: {
if(textValue.length > 0 && textValue.length < 129) {
editItem.errorHighlight = false
editItem.label = ""
editItem.placeholderText = ""
} else {
editItem.label = qsTr("Enter 1-128 characters")
editItem.placeholderText = editItem.label
editItem.errorHighlight = true
}
}
}
ChatInformationEditArea {
canEdit: (chatInformationPage.isPrivateChat && chatInformationPage.privateChatUserInformation.id === chatInformationPage.myUserId) || ((chatInformationPage.isBasicGroup || chatInformationPage.isSuperGroup) && chatInformationPage.groupInformation && (chatInformationPage.groupInformation.status.can_change_info || chatInformationPage.groupInformation.status["@type"] === "chatMemberStatusCreator"))
emptyPlaceholderText: qsTr("There is no information text available, yet.")
headerText: qsTr("Info", "group or user infotext header")
multiLine: true
text: (chatInformationPage.isPrivateChat ? chatInformationPage.chatPartnerFullInformation.bio : chatInformationPage.groupFullInformation.description) || ""
onSaveButtonClicked: {
if(chatInformationPage.isPrivateChat) { // own bio
tdLibWrapper.setBio(textValue);
} else { // group info
tdLibWrapper.setChatDescription(chatInformationPage.chatInformation.id, textValue);
}
}
}
ChatInformationTextItem {
headerText: qsTr("Phone Number", "user phone number header")
text: (chatInformationPage.isPrivateChat && chatInformationPage.privateChatUserInformation.phone_number ? "+"+chatInformationPage.privateChatUserInformation.phone_number : "") || ""
isLinkedLabel: true
}
SectionHeader {
font.pixelSize: Theme.fontSizeExtraSmall
visible: !!inviteLinkItem.text
height: visible ? Theme.itemSizeExtraSmall : 0
text: qsTr("Invite Link", "header")
x: 0
}
Row {
width: parent.width
visible: !!inviteLinkItem.text
ChatInformationTextItem {
id: inviteLinkItem
text: !isPrivateChat ? chatInformationPage.groupFullInformation.invite_link : ""
width: parent.width - inviteLinkButton.width
}
IconButton {
id: inviteLinkButton
icon.source: "image://theme/icon-m-clipboard"
anchors.verticalCenter: inviteLinkItem.verticalCenter
onClicked: {
Clipboard.text = chatInformationPage.groupFullInformation.invite_link
infoNotification.show(qsTr("The Invite Link has been copied to the clipboard."));
}
}
}
Item {
width: parent.width
height: Theme.paddingLarge
}
Separator {
width: parent.width
color: Theme.primaryColor
horizontalAlignment: Qt.AlignHCenter
opacity: (tabViewLoader.status === Loader.Ready && tabViewLoader.item.count > 0) ? 1.0 : 0.0
Behavior on opacity { PropertyAnimation {duration: 500}}
}
}
Loader {
id: tabViewLoader
asynchronous: true
active: false
anchors {
left: parent.left
right: parent.right
top: groupInfoItem.bottom
}
sourceComponent: Component {
ChatInformationTabView {
id: tabView
height: tabView.count > 0 ? chatInformationPage.height - headerItem.height : 0
}
}
}
}
}

View file

@ -30,15 +30,12 @@ Item {
property alias loadingVisible: loadingColumn.loadingVisible
property string loadingText
property int tabIndex: tabItem.VisualItemModel.index
property bool active: tabItem.ListView.isCurrentItem
property int tabIndex: index
property bool active: index === tabView.currentIndex
default property alias _data: contentItem.data
width: parent.width
height: tabView.maxHeight//Math.max(contentItem.height, loadingColumn.height)
opacity: active ? 1.0 : 0.0
opacity: active ? 1.0 : 0.2
Behavior on opacity { PropertyAnimation {duration: 300}}
Column {

View file

@ -27,8 +27,6 @@ import "../../js/functions.js" as Functions
ChatInformationTabItemBase {
id: tabBase
title: chatInformationPage.isPrivateChat ? qsTr("Groups", "Button: groups in common (short)") : qsTr("Members", "Button: Group Members")
image: "image://theme/icon-m-people"
loadingText: isPrivateChat ? qsTr("Loading common chats…", "chats you have in common with a user") : qsTr("Loading group members…")
loading: ( chatInformationPage.isSuperGroup || chatInformationPage.isPrivateChat) && !chatInformationPage.isChannel
loadingVisible: loading && membersView.count === 0
@ -37,7 +35,7 @@ ChatInformationTabItemBase {
SilicaListView {
id: membersView
model: isPrivateChat ? (chatPartnerCommonGroupsIds.length > 0 ? delegateModel : null) : chatInformationPage.membersList
model: chatInformationPage.isPrivateChat ? (chatPartnerCommonGroupsIds.length > 0 ? delegateModel : null) : pageContent.membersList
clip: true
height: tabBase.height
width: tabBase.width
@ -46,9 +44,9 @@ ChatInformationTabItemBase {
function handleScrollIntoView(force){
if(!tabBase.loading && !dragging && !quickScrollAnimating ) {
if(!atYBeginning) {
chatInformationPage.scrollDown()
pageContent.scrollDown()
} else {
chatInformationPage.scrollUp(force);
pageContent.scrollUp(force);
}
}
}
@ -59,8 +57,9 @@ ChatInformationTabItemBase {
handleScrollIntoView()
}
onAtYEndChanged: {
if(tabBase.active && !tabBase.loading && chatInformationPage.isSuperGroup && (groupInformation.member_count > membersView.count) && membersView.atYEnd) {
if(tabBase.active && !tabBase.loading && chatInformationPage.isSuperGroup && (chatInformationPage.groupInformation.member_count > membersView.count) && membersView.atYEnd) {
tabBase.loading = true;
console.log("LOAD MEMBERS BECAUSE ATYEND")
fetchMoreMembersTimer.start()
}
}
@ -78,7 +77,7 @@ ChatInformationTabItemBase {
}
width: parent.width
// chat title isPrivateChat ? () :
// chat title
primaryText.text: Emoji.emojify(Functions.getUserName(user), primaryText.font.pixelSize, "../js/emoji/")
// last user
prologSecondaryText.text: "@"+(user.username !== "" ? user.username : user_id) + (user_id === chatInformationPage.myUserId ? " " + qsTr("You") : "")
@ -100,7 +99,7 @@ ChatInformationTabItemBase {
}
footer: Component {
Item {
property bool active: tabBase.active && chatInformationPage.isSuperGroup && (groupInformation.member_count > membersView.count)
property bool active: tabBase.active && chatInformationPage.isSuperGroup && (chatInformationPage.groupInformation.member_count > membersView.count)
width: tabBase.width
height: active ? Theme.itemSizeLarge : Theme.paddingMedium
@ -174,9 +173,9 @@ ChatInformationTabItemBase {
interval: 600
property int fetchLimit: 50
onTriggered: {
if(isSuperGroup && !isChannel) {
if(chatInformationPage.isSuperGroup && !chatInformationPage.isChannel && (chatInformationPage.groupInformation.member_count > membersView.count)) { //
tabBase.loading = true
tdLibWrapper.getSupergroupMembers(chatInformationPage.chatPartnerGroupId, fetchLimit, membersList.count);
tdLibWrapper.getSupergroupMembers(chatInformationPage.chatPartnerGroupId, fetchLimit, pageContent.membersList.count);
fetchLimit = 200
interval = 400
}
@ -187,20 +186,20 @@ ChatInformationTabItemBase {
target: tdLibWrapper
onChatMembersReceived: {
if (isSuperGroup && chatInformationPage.chatPartnerGroupId === extra) {
if(members && members.length > 0) {
if (chatInformationPage.isSuperGroup && chatInformationPage.chatPartnerGroupId === extra) {
if(members && members.length > 0 && chatInformationPage.groupInformation.member_count > membersView.count) {
for(var memberIndex in members) {
var memberData = members[memberIndex];
var userInfo = tdLibWrapper.getUserInformation(memberData.user_id) || {user:{}, bot_info:{}};
memberData.user = userInfo;
memberData.bot_info = memberData.bot_info || {};
membersList.append(memberData);
pageContent.membersList.append(memberData);
}
groupInformation.member_count = totalMembers
chatInformationPage.groupInformation.member_count = totalMembers
updateGroupStatusText();
if(membersList.count < totalMembers) {
// if(pageContent.membersList.count < totalMembers) {
// fetchMoreMembersTimer.start()
}
// }
}
// if we set it directly, the views start scrolling
loadedTimer.start();
@ -224,9 +223,9 @@ ChatInformationTabItemBase {
}
Component.onCompleted: {
if(isPrivateChat) {
if(chatInformationPage.isPrivateChat) {
tdLibWrapper.getGroupsInCommon(chatInformationPage.chatPartnerGroupId, 200, 0); // we only use the first 200
} else if(isSuperGroup) {
} else if(chatInformationPage.isSuperGroup) {
fetchMoreMembersTimer.start();
}
}

View file

@ -27,8 +27,8 @@ import "../../js/functions.js" as Functions
ChatInformationTabItemBase {
id: tabBase
title: qsTr("Settings", "Button: Chat Settings")
image: "image://theme/icon-m-developer-mode"
// title: qsTr("Settings", "Button: Chat Settings")
// image: "image://theme/icon-m-developer-mode"
SilicaFlickable {
height: tabBase.height

View file

@ -54,22 +54,21 @@ Item {
width: parent.width
columns: tabView.count
Repeater {
model: tabView.count
model: tabModel
delegate: BackgroundItem {
id: headerItem
property bool loaded: tabItem.image !== "" && tabItem.title !== ""
property bool loaded: image !== "" && title !== ""
width: loaded ? (headerGrid.width / tabView.count) : 0
opacity: loaded ? 1.0 : 0.0
Behavior on width { PropertyAnimation {duration: 300}}
Behavior on opacity { PropertyAnimation {duration: 300}}
height: Theme.itemSizeLarge
property ChatInformationTabItemBase tabItem: tabView.model.get(index)
property int itemIndex: index
property bool itemIsActive: tabItem.active
property bool itemIsActive: tabView.currentIndex === itemIndex
Icon {
id: headerIcon
source: headerItem.tabItem.image
source: image
highlighted: headerItem.pressed || headerItem.itemIsActive
anchors {
top: parent.top
@ -77,7 +76,7 @@ Item {
}
}
Label {
text: headerItem.tabItem.title
text: title
width: parent.width
horizontalAlignment: Text.AlignHCenter
anchors.top: headerIcon.bottom
@ -85,7 +84,7 @@ Item {
font.pixelSize: Theme.fontSizeTiny
}
onClicked: {
chatInformationPage.scrollDown()
pageContent.scrollDown()
tabView.openTab(itemIndex)
}
}
@ -105,7 +104,6 @@ Item {
highlightMoveDuration: 500
property int maxHeight: tabViewItem.height - tabViewHeader.height
anchors {
top: tabViewHeader.bottom
left: parent.left
@ -116,51 +114,33 @@ Item {
function openTab(index) {
currentIndex = index;
}
model: VisualItemModel {
model: ListModel {
id: tabModel
}
}
Component {
id: membersGroupComponent
ChatInformationTabItemMembersGroups{
delegate: Loader {
width: tabView.width
height: tabView.maxHeight
asynchronous: true
source: Qt.resolvedUrl(tab+".qml")
}
}
Component {
id: settingsComponent
ChatInformationTabItemSettings {
width: tabView.width
}
}
Component {
id: debugComponent
ChatInformationTabItemDebug {
width: tabView.width
}
}
property var tabItems: {
var items = [];
Component.onCompleted: {
if(!(isPrivateChat && chatPartnerGroupId === myUserId.toString())) {
items.push(membersGroupComponent);
tabModel.append({
tab:"ChatInformationTabItemMembersGroups",
title: chatInformationPage.isPrivateChat ? qsTr("Groups", "Button: groups in common (short)") : qsTr("Members", "Button: Group Members"),
image: "image://theme/icon-m-people"
});
}
if(!isPrivateChat && (groupInformation.status.can_restrict_members || groupInformation.status["@type"] === "chatMemberStatusCreator")) {
items.push(settingsComponent);
tabModel.append({
tab:"ChatInformationTabItemSettings",
title: qsTr("Settings", "Button: Chat Settings"),
image: "image://theme/icon-m-developer-mode"
});
}
// items.push(debugComponent);
// tabModel.append({tab:"ChatInformationTabItemDebug"});
return items;
}
onTabItemsChanged: fillTabItems()
function fillTabItems() {
tabModel.clear()
for(var i in tabItems) {
tabModel.append(tabItems[i].createObject(tabModel));
}
}
Component.onCompleted: {
fillTabItems()
}
}

View file

@ -1,3 +1,21 @@
/*
Copyright (C) 2020 Sebastian J. Wolf and other contributors
This file is part of Fernschreiber.
Fernschreiber is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Fernschreiber is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Fernschreiber. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.6
import Sailfish.Silica 1.0
import "../components"
@ -36,427 +54,27 @@ Page {
property var groupInformation: ({});
property var groupFullInformation: ({});
property alias membersList: membersList
// property alias membersList: membersList
function initializePage() {
console.log("[ChatInformationPage] Initializing chat info page...");
membersList.clear();
var chatType = chatInformation.type["@type"];
switch(chatType) {
case "chatTypePrivate":
isPrivateChat = true;
chatInformationPage.chatPartnerGroupId = chatInformation.type.user_id.toString();
if(!privateChatUserInformation.id) {
privateChatUserInformation = tdLibWrapper.getUserInformation(chatInformationPage.chatPartnerGroupId);
}
tdLibWrapper.getUserFullInfo(chatInformationPage.chatPartnerGroupId);
tdLibWrapper.getUserProfilePhotos(chatInformationPage.chatPartnerGroupId, 100, 0);
onStatusChanged: {
switch(status) {
case PageStatus.Activating:
console.log("activating Loader")
mainContentLoader.active = true
break;
case "chatTypeBasicGroup":
isBasicGroup = true;
chatInformationPage.chatPartnerGroupId = chatInformation.type.basic_group_id.toString();
if(!groupInformation.id) {
groupInformation = tdLibWrapper.getBasicGroup(chatInformationPage.chatPartnerGroupId);
}
tdLibWrapper.getGroupFullInfo(chatInformationPage.chatPartnerGroupId, false);
break;
case "chatTypeSupergroup":
isSuperGroup = true;
chatInformationPage.chatPartnerGroupId = chatInformation.type.supergroup_id.toString();
if(!groupInformation.id) {
groupInformation = tdLibWrapper.getSuperGroup(chatInformationPage.chatPartnerGroupId);
}
tdLibWrapper.getGroupFullInfo(chatInformationPage.chatPartnerGroupId, true);
isChannel = groupInformation.is_channel;
case PageStatus.Active:
break;
}
if(!isPrivateChat) {
updateGroupStatusText();
}
}
function scrollUp(force) {
if(force) {
// animation does not always work while quick scrolling
scrollUpTimer.start()
} else {
scrollUpAnimation.start()
}
}
function scrollDown(force) {
if(force) {
scrollDownTimer.start()
} else {
scrollDownAnimation.start()
}
}
function handleBasicGroupFullInfo(groupFullInfo) {
groupFullInformation = groupFullInfo;
membersList.clear();
if(groupFullInfo.members && groupFullInfo.members.length > 0) {
for(var memberIndex in groupFullInfo.members) {
var memberData = groupFullInfo.members[memberIndex];
var userInfo = tdLibWrapper.getUserInformation(memberData.user_id) || {user:{}, bot_info:{}};
memberData.user = userInfo;
memberData.bot_info = memberData.bot_info || {};
membersList.append(memberData);
}
groupInformation.member_count = groupFullInfo.members.length
updateGroupStatusText();
}
}
Connections {
target: tdLibWrapper
onChatOnlineMemberCountUpdated: {
if ((isSuperGroup || isBasicGroup) && chatInformation.id.toString() === chatId) {
chatOnlineMemberCount = onlineMemberCount;
updateGroupStatusText();
}
}
onSupergroupFullInfoReceived: {
if(isSuperGroup && chatInformationPage.chatPartnerGroupId === groupId) {
groupFullInformation = groupFullInfo;
}
}
onSupergroupFullInfoUpdated: {
if(isSuperGroup && chatInformationPage.chatPartnerGroupId === groupId) {
groupFullInformation = groupFullInfo;
}
}
onBasicGroupFullInfoReceived: {
if(isBasicGroup && chatInformationPage.chatPartnerGroupId === groupId) {
handleBasicGroupFullInfo(groupFullInfo)
}
}
onBasicGroupFullInfoUpdated: {
if(isBasicGroup && chatInformationPage.chatPartnerGroupId === groupId) {
handleBasicGroupFullInfo(groupFullInfo)
}
}
onUserFullInfoReceived: {
if(isPrivateChat && userFullInfo["@extra"] === chatInformationPage.chatPartnerGroupId) {
chatPartnerFullInformation = userFullInfo;
}
}
onUserFullInfoUpdated: {
if(isPrivateChat && userId === chatInformationPage.chatPartnerGroupId) {
chatPartnerFullInformation = userFullInfo;
}
}
onUserProfilePhotosReceived: {
if(isPrivateChat && extra === chatInformationPage.chatPartnerGroupId) {
chatPartnerProfilePhotos = photos;
}
}
onChatPermissionsUpdated: {
if (chatInformation.id.toString() === chatId) {
// set whole object to trigger change
var newInformation = chatInformation;
newInformation.permissions = permissions
chatInformation = newInformation
}
}
onChatTitleUpdated: {
if (chatInformation.id.toString() === chatId) {
// set whole object to trigger change
var newInformation = chatInformation;
newInformation.title = title
chatInformation = newInformation
}
}
}
Component.onCompleted: initializePage();
ListModel {
id: membersList
}
AppNotification {
id: infoNotification
}
SilicaFlickable {
id: pageFlickable
Loader {
id: mainContentLoader
active: false
asynchronous: true
anchors.fill: parent
PullDownMenu {
MenuItem {
visible: (chatPage.isSuperGroup || chatPage.isBasicGroup) && groupInformation && groupInformation.status["@type"] !== "chatMemberStatusBanned"
text: userIsMember ? qsTr("Leave Chat") : qsTr("Join Chat")
onClicked: {
// ensure it's done even if the page is closed:
if (userIsMember) {
var remorse = Remorse.popupAction(appWindow, qsTr("Leaving chat"), (function(chatid) {
return function() {
tdLibWrapper.leaveChat(chatid);
// this does not care about the response (ideally type "ok" without further reference) for now
pageStack.pop(pageStack.find( function(page){ return(page._depth === 0)} ));
};
}(chatInformation.id)))
} else {
tdLibWrapper.joinChat(chatInformation.id);
}
}
}
MenuItem {
visible: userIsMember
onClicked: {
var newNotificationSettings = chatInformation.notification_settings;
if (newNotificationSettings.mute_for > 0) {
newNotificationSettings.mute_for = 0;
} else {
newNotificationSettings.mute_for = 6666666;
}
newNotificationSettings.use_default_mute_for = false;
tdLibWrapper.setChatNotificationSettings(chat_id, newNotificationSettings);
}
text: chatInformation.notification_settings.mute_for > 0 ? qsTr("Unmute Chat") : qsTr("Mute Chat")
}
// MenuItem { //TODO Implement
// visible: !userIsMember
// onClicked: {
// tdLibWrapper.joinChat(chat_id);
// }
// text: qsTr("Join Chat")
// }
}
// header
PageHeader {
id: headerItem
z: 5
Item {
id: imageContainer
property bool hasImage: typeof chatInformation.photo !== "undefined"
property int minDimension: chatInformationPage.isLandscape ? Theme.itemSizeSmall : Theme.itemSizeMedium
property int maxDimension: Screen.width / 2
property int minX: Theme.horizontalPageMargin
property int maxX: (chatInformationPage.width - maxDimension)/2
property int minY: (parent.height - minDimension)/2
property int maxY: parent.height
property double tweenFactor: {
if(!hasImage) {
return 0
}
return 1 - Math.max(0, Math.min(1, contentFlickable.contentY / maxDimension))
}
function getEased(min,max,factor) {
return min + (max-min)*factor
}
width: getEased(minDimension,maxDimension, tweenFactor)
height: width
x: getEased(minX,maxX, tweenFactor)
y: getEased(minY,maxY, tweenFactor)
ProfileThumbnail {
id: chatPictureThumbnail
photoData: imageContainer.hasImage ? chatInformation.photo.small : ""
replacementStringHint: headerItem.title
width: parent.width
height: width
radius: imageContainer.minDimension / 2
opacity: profilePictureLoader.status !== Loader.Ready || profilePictureLoader.item.opacity < 1 ? 1.0 : 0.0
optimizeImageSize: false
}
Loader {
id: profilePictureLoader
active: imageContainer.hasImage
asynchronous: true
anchors.fill: chatPictureThumbnail
source: chatInformationPage.isPrivateChat
? "../components/chatInformationPage/ChatInformationProfilePictureList.qml"
: "../components/chatInformationPage/ChatInformationProfilePicture.qml"
}
}
// PageHeader changes the html base path:
property url emojiBase: "../js/emoji/"
leftMargin: imageContainer.minDimension + Theme.horizontalPageMargin + Theme.paddingMedium
title: chatInformation.title !== "" ? Emoji.emojify(chatInformation.title, Theme.fontSizeLarge, emojiBase) : qsTr("Unknown")
description: chatInformationPage.isPrivateChat ? ("@"+(chatInformationPage.privateChatUserInformation.username || chatInformationPage.chatPartnerGroupId)) : ""
}
SilicaFlickable {
id: contentFlickable
contentHeight: groupInfoItem.height + tabViewLoader.height
clip: true
interactive: true//groupInfoItem.height > pageFlickable.height * 0.5
anchors {
top: headerItem.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
NumberAnimation {
id: scrollDownAnimation
target: contentFlickable
to: groupInfoItem.height
property: "contentY"
duration: 500
easing.type: Easing.InOutCubic
}
NumberAnimation {
id: scrollUpAnimation
target: contentFlickable
to: 0
property: "contentY"
duration: 500
easing.type: Easing.InOutCubic
property Timer scrollUpTimer: Timer {
id: scrollUpTimer
interval: 50
onTriggered: {
contentFlickable.scrollToTop()
}
}
property Timer scrollDownTimer: Timer {
id: scrollDownTimer
interval: 50
onTriggered: {
contentFlickable.scrollToBottom()
}
}
}
Column {
id: groupInfoItem
bottomPadding: Theme.paddingLarge
topPadding: Theme.paddingLarge
anchors {
top: parent.top
left: parent.left
leftMargin: Theme.horizontalPageMargin
right: parent.right
rightMargin: Theme.horizontalPageMargin
}
Item { //large image placeholder
width: parent.width
height: imageContainer.hasImage ? imageContainer.maxDimension : 0
}
ChatInformationEditArea {
visible: canEdit
canEdit: !chatInformationPage.isPrivateChat && chatInformationPage.groupInformation.status && (chatInformationPage.groupInformation.status.can_change_info || chatInformationPage.groupInformation.status["@type"] === "chatMemberStatusCreator")
headerText: qsTr("Chat Title", "group title header")
text: chatInformation.title
onSaveButtonClicked: {
if(!editItem.errorHighlight) {
tdLibWrapper.setChatTitle(chatInformationPage.chatInformation.id, textValue);
} else {
isEditing = true
}
}
onTextEdited: {
if(textValue.length > 0 && textValue.length < 129) {
editItem.errorHighlight = false
editItem.label = ""
editItem.placeholderText = ""
} else {
editItem.label = qsTr("Enter 1-128 characters")
editItem.placeholderText = editItem.label
editItem.errorHighlight = true
}
}
}
ChatInformationEditArea {
canEdit: (chatInformationPage.isPrivateChat && chatInformationPage.privateChatUserInformation.id === chatInformationPage.myUserId) || ((chatInformationPage.isBasicGroup || chatInformationPage.isSuperGroup) && chatInformationPage.groupInformation && (chatInformationPage.groupInformation.status.can_change_info || chatInformationPage.groupInformation.status["@type"] === "chatMemberStatusCreator"))
emptyPlaceholderText: qsTr("There is no information text available, yet.")
headerText: qsTr("Info", "group or user infotext header")
multiLine: true
text: (chatInformationPage.isPrivateChat ? chatInformationPage.chatPartnerFullInformation.bio : chatInformationPage.groupFullInformation.description) || ""
onSaveButtonClicked: {
if(chatInformationPage.isPrivateChat) { // own bio
tdLibWrapper.setBio(textValue);
} else { // group info
tdLibWrapper.setChatDescription(chatInformationPage.chatInformation.id, textValue);
}
}
}
ChatInformationTextItem {
headerText: qsTr("Phone Number", "user phone number header")
text: (chatInformationPage.isPrivateChat && chatInformationPage.privateChatUserInformation.phone_number ? "+"+chatInformationPage.privateChatUserInformation.phone_number : "") || ""
isLinkedLabel: true
}
SectionHeader {
font.pixelSize: Theme.fontSizeExtraSmall
visible: !!inviteLinkItem.text
height: visible ? Theme.itemSizeExtraSmall : 0
text: qsTr("Invite Link", "header")
x: 0
}
Row {
width: parent.width
visible: !!inviteLinkItem.text
ChatInformationTextItem {
id: inviteLinkItem
text: !isPrivateChat ? groupFullInformation.invite_link : ""
width: parent.width - inviteLinkButton.width
}
IconButton {
id: inviteLinkButton
icon.source: "image://theme/icon-m-clipboard"
anchors.verticalCenter: inviteLinkItem.verticalCenter
onClicked: {
Clipboard.text = groupFullInformation.invite_link
infoNotification.show(qsTr("The Invite Link has been copied to the clipboard."));
}
}
}
Item {
width: parent.width
height: Theme.paddingLarge
}
Separator {
width: parent.width
color: Theme.primaryColor
horizontalAlignment: Qt.AlignHCenter
opacity: (tabViewLoader.status === Loader.Ready && tabViewLoader.item.count > 0) ? 1.0 : 0.0
Behavior on opacity { PropertyAnimation {duration: 500}}
}
}
Loader {
id: tabViewLoader
asynchronous: true
active: true
anchors {
left: parent.left
right: parent.right
top: groupInfoItem.bottom
}
sourceComponent: Component {
ChatInformationTabView {
id: tabView
height: tabView.count > 0 ? chatInformationPage.height - headerItem.height : 0
}
}
}
}
}
function updateGroupStatusText() {
if (chatOnlineMemberCount > 0) {
headerItem.description = qsTr("%1 members, %2 online").arg(Functions.getShortenedCount(groupInformation.member_count)).arg(Functions.getShortenedCount(chatOnlineMemberCount));
} else {
if (isChannel) {
headerItem.description = qsTr("%1 subscribers").arg(Functions.getShortenedCount(groupInformation.member_count));
} else {
headerItem.description = qsTr("%1 members").arg(Functions.getShortenedCount(groupInformation.member_count));
}
}
source: Qt.resolvedUrl("../components/chatInformationPage/ChatInformationPageContent.qml");
}
}

View file

@ -298,6 +298,8 @@ Page {
case PageStatus.Active:
if (!chatPage.isInitialized) {
chatModel.initialize(chatInformation);
pageStack.pushAttached(Qt.resolvedUrl("../pages/ChatInformationPage.qml"), { "chatInformation" : chatInformation, "privateChatUserInformation": chatPartnerInformation, "groupInformation": chatGroupInformation, "chatOnlineMemberCount": chatOnlineMemberCount});
chatPage.isInitialized = true;
}
break;
@ -516,7 +518,7 @@ Page {
if(chatPage.state === "selectMessages") {
chatPage.selectedMessages = [];
} else {
pageStack.push(Qt.resolvedUrl("../pages/ChatInformationPage.qml"), { "chatInformation" : chatInformation, "privateChatUserInformation": chatPartnerInformation, "groupInformation": chatGroupInformation, "chatOnlineMemberCount": chatOnlineMemberCount});
pageStack.navigateForward();
}
}
}

View file

@ -96,74 +96,74 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation>Stummschaltung des Chats aufheben</translation>
</message>
<message>
<source>Mute Chat</source>
<translation>Chat stummschalten</translation>
</message>
<message>
<source>Unknown</source>
<translation>Unbekannt</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation>Der Einladungslink wurde in die Zwischenablage kopiert.</translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation>%1 Mitglieder, %2 online</translation>
<translation type="unfinished">%1 Mitglieder, %2 online</translation>
</message>
<message>
<source>%1 subscribers</source>
<translation>%1 Abonnenten</translation>
<translation type="unfinished">%1 Abonnenten</translation>
</message>
<message>
<source>%1 members</source>
<translation>%1 Mitglieder</translation>
<translation type="unfinished">%1 Mitglieder</translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished">Chat verlassen</translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished">Chat beitreten</translation>
</message>
<message>
<source>Leaving chat</source>
<translation>Verlasse Gruppe</translation>
<translation type="unfinished">Verlasse Chat</translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation>Info</translation>
<source>Unmute Chat</source>
<translation type="unfinished">Stummschaltung des Chats aufheben</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation>Telefonnummer</translation>
<source>Mute Chat</source>
<translation type="unfinished">Chat stummschalten</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation>Einladungslink</translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation>Es gibt noch keinen Informationstext.</translation>
<source>Unknown</source>
<translation type="unfinished">Unbekannt</translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation>Chattitel</translation>
<translation type="unfinished">Chattitel</translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation>Geben Sie 1-128 Zeichen ein</translation>
<translation type="unfinished">Geben Sie 1-128 Zeichen ein</translation>
</message>
<message>
<source>Leave Chat</source>
<translation>Chat verlassen</translation>
<source>There is no information text available, yet.</source>
<translation type="unfinished">Es gibt noch keinen Informationstext.</translation>
</message>
<message>
<source>Join Chat</source>
<translation>Chat beitreten</translation>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation type="unfinished">Info</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation type="unfinished">Telefonnummer</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation type="unfinished">Einladungslink</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished">Der Einladungslink wurde in die Zwischenablage kopiert.</translation>
</message>
</context>
<context>
@ -181,16 +181,6 @@
<source>Unknown</source>
<translation>Unbekannt</translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation>Gruppen</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation>Mitglieder</translation>
</message>
<message>
<source>Loading group members</source>
<translation>Lade Gruppenmitglieder</translation>
@ -209,11 +199,21 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished">Gruppen</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished">Mitglieder</translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>
<translation>Einstellungen</translation>
<translation type="unfinished">Einstellungen</translation>
</message>
</context>
<context>

View file

@ -96,74 +96,74 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation>Unmute Chat</translation>
</message>
<message>
<source>Mute Chat</source>
<translation>Mute Chat</translation>
</message>
<message>
<source>Unknown</source>
<translation>Unknown</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation>The Invite Link has been copied to the clipboard.</translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation>%1 members, %2 online</translation>
<translation type="unfinished">%1 members, %2 online</translation>
</message>
<message>
<source>%1 subscribers</source>
<translation>%1 subscribers</translation>
<translation type="unfinished">%1 subscribers</translation>
</message>
<message>
<source>%1 members</source>
<translation>%1 members</translation>
<translation type="unfinished">%1 members</translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished">Leave Chat</translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished">Join Chat</translation>
</message>
<message>
<source>Leaving chat</source>
<translation>Leaving chat</translation>
<translation type="unfinished">Leaving chat</translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation>Info</translation>
<source>Unmute Chat</source>
<translation type="unfinished">Unmute Chat</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation>Phone Number</translation>
<source>Mute Chat</source>
<translation type="unfinished">Mute Chat</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation>Invite Link</translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation>There is no information text available, yet.</translation>
<source>Unknown</source>
<translation type="unfinished">Unknown</translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation>Chat Title</translation>
<translation type="unfinished">Chat Title</translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation>Enter 1-128 characters</translation>
<translation type="unfinished">Enter 1-128 characters</translation>
</message>
<message>
<source>Leave Chat</source>
<translation>Leave Chat</translation>
<source>There is no information text available, yet.</source>
<translation type="unfinished">There is no information text available, yet.</translation>
</message>
<message>
<source>Join Chat</source>
<translation>Join Chat</translation>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation type="unfinished">Info</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation type="unfinished">Phone Number</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation type="unfinished">Invite Link</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished">The Invite Link has been copied to the clipboard.</translation>
</message>
</context>
<context>
@ -177,16 +177,6 @@
<source>Unknown</source>
<translation>Unknown</translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation>Groups</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation>Members</translation>
</message>
<message>
<source>Loading group members</source>
<translation>Loading group members</translation>
@ -209,11 +199,21 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished">Groups</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished">Members</translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>
<translation>Settings</translation>
<translation type="unfinished">Settings</translation>
</message>
</context>
<context>

View file

@ -96,74 +96,74 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation>habilitar notificación</translation>
</message>
<message>
<source>Mute Chat</source>
<translation>deshabilitar notificación</translation>
</message>
<message>
<source>Unknown</source>
<translation>Desconocido</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation>El enlace de invitación se ha copiado en el portapapeles.</translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation>%1 miembros, %2 en línea</translation>
<translation type="unfinished">%1 miembros, %2 en línea</translation>
</message>
<message>
<source>%1 subscribers</source>
<translation>%1 suscriptores</translation>
<translation type="unfinished">%1 suscriptores</translation>
</message>
<message>
<source>%1 members</source>
<translation>%1 miembros</translation>
<translation type="unfinished">%1 miembros</translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished">Salir del grupo</translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished">Unirse al grupo</translation>
</message>
<message>
<source>Leaving chat</source>
<translation>Saliendo del grupo</translation>
<translation type="unfinished">Saliendo del grupo</translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation>Información</translation>
<source>Unmute Chat</source>
<translation type="unfinished">habilitar notificación</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation>Número de teléfono</translation>
<source>Mute Chat</source>
<translation type="unfinished">deshabilitar notificación</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation>Enlace de invitación</translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation>Aún no hay texto de información disponible.</translation>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation>Título del grupo</translation>
<translation type="unfinished">Título del grupo</translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation>Marcar los caracteres 1-128</translation>
<translation type="unfinished">Marcar los caracteres 1-128</translation>
</message>
<message>
<source>Leave Chat</source>
<translation>Salir del grupo</translation>
<source>There is no information text available, yet.</source>
<translation type="unfinished">Aún no hay texto de información disponible.</translation>
</message>
<message>
<source>Join Chat</source>
<translation>Unirse al grupo</translation>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation type="unfinished">Información</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation type="unfinished">Número de teléfono</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation type="unfinished">Enlace de invitación</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished">El enlace de invitación se ha copiado en el portapapeles.</translation>
</message>
</context>
<context>
@ -177,16 +177,6 @@
<source>Unknown</source>
<translation>Desconocido</translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation>Grupos</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation>Miembros</translation>
</message>
<message>
<source>Loading group members</source>
<translation>Cargando miembros del grupo</translation>
@ -209,11 +199,21 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished">Grupos</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished">Miembros</translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>
<translation>Ajustes</translation>
<translation type="unfinished">Ajustes</translation>
</message>
</context>
<context>

View file

@ -96,74 +96,74 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation>Poista keskustelun vaimennus</translation>
</message>
<message>
<source>Mute Chat</source>
<translation>Vaimenna keskustelu</translation>
</message>
<message>
<source>Unknown</source>
<translation>Tuntematon</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation>Kutsulinkki on kopioitu leikepöydälle.</translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation>%1 jäsentä, %2 paikalla</translation>
<translation type="unfinished">%1 jäsentä, %2 paikalla</translation>
</message>
<message>
<source>%1 subscribers</source>
<translation>%1 tilaajaa</translation>
<translation type="unfinished">%1 tilaajaa</translation>
</message>
<message>
<source>%1 members</source>
<translation>%1 jäsentä</translation>
<translation type="unfinished">%1 jäsentä</translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished">Poistu keskustelusta</translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished">Liity keskusteluun</translation>
</message>
<message>
<source>Leaving chat</source>
<translation>Poistutaan keskustelusta</translation>
<translation type="unfinished">Poistutaan keskustelusta</translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation>Tietoa</translation>
<source>Unmute Chat</source>
<translation type="unfinished">Poista keskustelun vaimennus</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation>Puhelinnumero</translation>
<source>Mute Chat</source>
<translation type="unfinished">Vaimenna keskustelu</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation>Kutsulinkki</translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation>Tietoa ei ole vielä saatavilla.</translation>
<source>Unknown</source>
<translation type="unfinished">Tuntematon</translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation>Keskustelun otsikko</translation>
<translation type="unfinished">Keskustelun otsikko</translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation>Syötä 1-128 merkkiä</translation>
<translation type="unfinished">Syötä 1-128 merkkiä</translation>
</message>
<message>
<source>Leave Chat</source>
<translation>Poistu keskustelusta</translation>
<source>There is no information text available, yet.</source>
<translation type="unfinished">Tietoa ei ole vielä saatavilla.</translation>
</message>
<message>
<source>Join Chat</source>
<translation>Liity keskusteluun</translation>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation type="unfinished">Tietoa</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation type="unfinished">Puhelinnumero</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation type="unfinished">Kutsulinkki</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished">Kutsulinkki on kopioitu leikepöydälle.</translation>
</message>
</context>
<context>
@ -177,16 +177,6 @@
<source>Unknown</source>
<translation>Tuntematon</translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation>Ryhmät</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation>Jäsenet</translation>
</message>
<message>
<source>Loading group members</source>
<translation>Ladataan ryhmän jäseniä...</translation>
@ -209,11 +199,21 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished">Ryhmät</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished">Jäsenet</translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>
<translation>Asetukset</translation>
<translation type="unfinished">Asetukset</translation>
</message>
</context>
<context>

View file

@ -96,23 +96,7 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation type="unfinished">Csevegés némítás feloldása</translation>
</message>
<message>
<source>Mute Chat</source>
<translation type="unfinished">Csevegés némítása</translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Ismeretlen</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation type="unfinished">%1 tag, %2 online</translation>
@ -125,10 +109,43 @@
<source>%1 members</source>
<translation type="unfinished">%1 tag</translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Leaving chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unmute Chat</source>
<translation type="unfinished">Csevegés némítás feloldása</translation>
</message>
<message>
<source>Mute Chat</source>
<translation type="unfinished">Csevegés némítása</translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Ismeretlen</translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
@ -145,24 +162,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Join Chat</source>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -177,16 +177,6 @@
<source>Unknown</source>
<translation type="unfinished">Ismeretlen</translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading group members</source>
<translation type="unfinished"></translation>
@ -209,7 +199,17 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>

View file

@ -96,88 +96,78 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Leaving chat</source>
<translation>Lascia chat</translation>
</message>
<message>
<source>Unmute Chat</source>
<translation>Riattiva suoni chat</translation>
</message>
<message>
<source>Mute Chat</source>
<translation>Silenzia chat</translation>
</message>
<message>
<source>Unknown</source>
<translation>Sconosciuto</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation>Il link d&apos;invito è stato copiato nella clipboard.</translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation>%1 membri, %2 online</translation>
<translation type="unfinished">%1 membri, %2 online</translation>
</message>
<message>
<source>%1 subscribers</source>
<translation>%1 abbonati</translation>
<translation type="unfinished">%1 abbonati</translation>
</message>
<message>
<source>%1 members</source>
<translation>%1 membri</translation>
<translation type="unfinished">%1 membri</translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation>Info</translation>
<source>Leave Chat</source>
<translation type="unfinished">Lascia chat</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation>Telefono</translation>
<source>Join Chat</source>
<translation type="unfinished">Entra nella chat</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation>Link d&apos;invito</translation>
<source>Leaving chat</source>
<translation type="unfinished">Lascia chat</translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation>Attualmente non è disponibile nessuna informazione.</translation>
<source>Unmute Chat</source>
<translation type="unfinished">Riattiva suoni chat</translation>
</message>
<message>
<source>Mute Chat</source>
<translation type="unfinished">Silenzia chat</translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Sconosciuto</translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation>Titolo chat</translation>
<translation type="unfinished">Titolo chat</translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation>Inserisci da 1 a 128 caratteri</translation>
<translation type="unfinished">Inserisci da 1 a 128 caratteri</translation>
</message>
<message>
<source>Leave Chat</source>
<translation>Lascia chat</translation>
<source>There is no information text available, yet.</source>
<translation type="unfinished">Attualmente non è disponibile nessuna informazione.</translation>
</message>
<message>
<source>Join Chat</source>
<translation>Entra nella chat</translation>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation type="unfinished">Info</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation type="unfinished">Telefono</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation type="unfinished">Link d&apos;invito</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished">Il link d&apos;invito è stato copiato nella clipboard.</translation>
</message>
</context>
<context>
<name>ChatInformationTabItemMembersGroups</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation>Gruppi</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation>Membri</translation>
</message>
<message>
<source>You</source>
<translation>Tu</translation>
@ -209,11 +199,21 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished">Gruppi</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished">Membri</translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>
<translation>Impostazioni</translation>
<translation type="unfinished">Impostazioni</translation>
</message>
</context>
<context>

View file

@ -96,23 +96,7 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation type="unfinished">Wyłącz wyciszenie czatu</translation>
</message>
<message>
<source>Mute Chat</source>
<translation type="unfinished">Wycisz czat</translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Nieznany</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation type="unfinished">$1 członków, %2 online </translation>
@ -125,10 +109,43 @@
<source>%1 members</source>
<translation type="unfinished">%1 czlonków</translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Leaving chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unmute Chat</source>
<translation type="unfinished">Wyłącz wyciszenie czatu</translation>
</message>
<message>
<source>Mute Chat</source>
<translation type="unfinished">Wycisz czat</translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Nieznany</translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
@ -145,24 +162,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Join Chat</source>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -177,16 +177,6 @@
<source>Unknown</source>
<translation type="unfinished">Nieznany</translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading group members</source>
<translation type="unfinished"></translation>
@ -209,7 +199,17 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>

View file

@ -96,23 +96,7 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation>Включить уведомления</translation>
</message>
<message>
<source>Mute Chat</source>
<translation>Выключить уведомления</translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation>Ссылка для приглашения скопирована в буффер обмена</translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation type="unfinished">%1 участников, %2 онлайн</translation>
@ -125,45 +109,61 @@
<source>%1 members</source>
<translation type="unfinished">%1 участников</translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished">Выйти из чата</translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished">Зайти в чат</translation>
</message>
<message>
<source>Leaving chat</source>
<translation type="unfinished">Выход из чата</translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation>Информация</translation>
<source>Unmute Chat</source>
<translation type="unfinished">Включить уведомления</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation>Номер телефона</translation>
<source>Mute Chat</source>
<translation type="unfinished">Выключить уведомления</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation>Ссылка для приглашения</translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation>Информация отсутствует</translation>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation>Заголовок чата</translation>
<translation type="unfinished">Заголовок чата</translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation>Введите 1-128 символов</translation>
<translation type="unfinished">Введите 1-128 символов</translation>
</message>
<message>
<source>Leave Chat</source>
<translation>Выйти из чата</translation>
<source>There is no information text available, yet.</source>
<translation type="unfinished">Информация отсутствует</translation>
</message>
<message>
<source>Join Chat</source>
<translation>Зайти в чат</translation>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation type="unfinished">Информация</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation type="unfinished">Номер телефона</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation type="unfinished">Ссылка для приглашения</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished">Ссылка для приглашения скопирована в буффер обмена</translation>
</message>
</context>
<context>
@ -177,16 +177,6 @@
<source>Unknown</source>
<translation>нет информации</translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation>Группы</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation>Участники группы</translation>
</message>
<message>
<source>Loading group members</source>
<translation>Загрузка списка участников</translation>
@ -209,11 +199,21 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished">Группы</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished">Участники группы</translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>
<translation>Настройки</translation>
<translation type="unfinished">Настройки</translation>
</message>
</context>
<context>

View file

@ -96,74 +96,74 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation>Slå chatten</translation>
</message>
<message>
<source>Mute Chat</source>
<translation>Stäng av chatten</translation>
</message>
<message>
<source>Unknown</source>
<translation>Okänd</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation>Inbjudningslänken har kopierats till urklipp.</translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation>%1 medlemmar, %2 inloggade</translation>
<translation type="unfinished">%1 medlem(mar), %2 inloggad(e)</translation>
</message>
<message>
<source>%1 subscribers</source>
<translation>%1 prenumeranter</translation>
<translation type="unfinished">%1 prenumerant(er)</translation>
</message>
<message>
<source>%1 members</source>
<translation>%1 medlemmar</translation>
<translation type="unfinished">%1 medlem(mar)</translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished">Lämna chatten</translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished">Anslut till chatten</translation>
</message>
<message>
<source>Leaving chat</source>
<translation>Lämnar chatten</translation>
<translation type="unfinished">Lämnar chatten</translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation>Info</translation>
<source>Unmute Chat</source>
<translation type="unfinished">Slå chatten</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation>Telefonnummer</translation>
<source>Mute Chat</source>
<translation type="unfinished">Stäng av chatten</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation>Inbjudningslänk</translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation>Det finns ingen informationstext än.</translation>
<source>Unknown</source>
<translation type="unfinished">Okänd</translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation>Chattnamn</translation>
<translation type="unfinished">Chattnamn</translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation>Ange 1-128 tecken</translation>
<translation type="unfinished">Ange 1-128 tecken</translation>
</message>
<message>
<source>Leave Chat</source>
<translation>Lämna chatten</translation>
<source>There is no information text available, yet.</source>
<translation type="unfinished">Det finns ingen informationstext än.</translation>
</message>
<message>
<source>Join Chat</source>
<translation>Anslut till chatten</translation>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation type="unfinished">Info</translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation type="unfinished">Telefonnummer</translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation type="unfinished">Inbjudningslänk</translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished">Inbjudningslänken har kopierats till urklipp.</translation>
</message>
</context>
<context>
@ -177,16 +177,6 @@
<source>Unknown</source>
<translation>Okänd</translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation>Grupper</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation>Medlemmar</translation>
</message>
<message>
<source>Loading group members</source>
<translation>Läser in gruppmedlemmar...</translation>
@ -209,11 +199,21 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished">Grupper</translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished">Medlemmar</translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>
<translation>Inställningar</translation>
<translation type="unfinished">Inställningar</translation>
</message>
</context>
<context>

View file

@ -96,74 +96,74 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation></translation>
</message>
<message>
<source>Mute Chat</source>
<translation></translation>
</message>
<message>
<source>Unknown</source>
<translation></translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation></translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation>%1 , %2 线</translation>
<translation type="unfinished">%1 , %2 线</translation>
</message>
<message>
<source>%1 subscribers</source>
<translation>%1 </translation>
<translation type="unfinished">%1 </translation>
</message>
<message>
<source>%1 members</source>
<translation>%1 </translation>
<translation type="unfinished">%1 </translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Leaving chat</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation></translation>
<source>Unmute Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation></translation>
<source>Mute Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation></translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation></translation>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation> 1-128 </translation>
<translation type="unfinished"> 1-128 </translation>
</message>
<message>
<source>Leave Chat</source>
<translation></translation>
<source>There is no information text available, yet.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Join Chat</source>
<translation></translation>
<source>Info</source>
<comment>group or user infotext header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Phone Number</source>
<comment>user phone number header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invite Link</source>
<comment>header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -177,16 +177,6 @@
<source>Unknown</source>
<translation></translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation></translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation></translation>
</message>
<message>
<source>Loading group members</source>
<translation></translation>
@ -209,11 +199,21 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>
<translation></translation>
<translation type="unfinished"></translation>
</message>
</context>
<context>

View file

@ -96,23 +96,7 @@
</message>
</context>
<context>
<name>ChatInformationPage</name>
<message>
<source>Unmute Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mute Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
<name>ChatInformationPageContent</name>
<message>
<source>%1 members, %2 online</source>
<translation type="unfinished"></translation>
@ -125,10 +109,43 @@
<source>%1 members</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Join Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Leaving chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unmute Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mute Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Info</source>
<comment>group or user infotext header</comment>
@ -145,24 +162,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<source>There is no information text available, yet.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chat Title</source>
<comment>group title header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter 1-128 characters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Leave Chat</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Join Chat</source>
<source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -177,16 +177,6 @@
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading group members</source>
<translation type="unfinished"></translation>
@ -209,7 +199,17 @@
</message>
</context>
<context>
<name>ChatInformationTabItemSettings</name>
<name>ChatInformationTabView</name>
<message>
<source>Groups</source>
<comment>Button: groups in common (short)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Members</source>
<comment>Button: Group Members</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<comment>Button: Chat Settings</comment>