Merge pull request #323 from jgibbon/feature/messageContent_refactor

Message content refactor
This commit is contained in:
jgibbon 2021-01-17 22:08:08 +01:00 committed by GitHub
commit 55fefdd96d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 989 additions and 857 deletions

View file

@ -62,7 +62,6 @@ DISTFILES += qml/harbour-fernschreiber.qml \
qml/components/StickerPicker.qml \
qml/components/PhotoTextsListItem.qml \
qml/components/VoiceNoteOverlay.qml \
qml/components/WebPagePreview.qml \
qml/components/chatInformationPage/ChatInformationEditArea.qml \
qml/components/chatInformationPage/ChatInformationPageContent.qml \
qml/components/chatInformationPage/ChatInformationProfilePicture.qml \
@ -89,6 +88,20 @@ DISTFILES += qml/harbour-fernschreiber.qml \
qml/components/inlineQueryResults/InlineQueryResultVenue.qml \
qml/components/inlineQueryResults/InlineQueryResultVideo.qml \
qml/components/inlineQueryResults/InlineQueryResultVoiceNote.qml \
qml/components/messageContent/MessageAnimation.qml \
qml/components/messageContent/MessageAudio.qml \
qml/components/messageContent/MessageContentBase.qml \
qml/components/messageContent/MessageDocument.qml \
qml/components/messageContent/MessageGame.qml \
qml/components/messageContent/MessageLocation.qml \
qml/components/messageContent/MessagePhoto.qml \
qml/components/messageContent/MessagePoll.qml \
qml/components/messageContent/MessageSticker.qml \
qml/components/messageContent/MessageVenue.qml \
qml/components/messageContent/MessageVideoNote.qml \
qml/components/messageContent/MessageVideo.qml \
qml/components/messageContent/MessageVoiceNote.qml \
qml/components/messageContent/WebPagePreview.qml \
qml/js/debug.js \
qml/js/functions.js \
qml/pages/ChatInformationPage.qml \

View file

@ -1,125 +0,0 @@
/*
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 WerkWolf.Fernschreiber 1.0
import "../js/functions.js" as Functions
import "../js/twemoji.js" as Emoji
Column {
id: gamePreviewItem
property ListItem messageListItem
property MessageOverlayFlickable overlayFlickable
property var rawMessage: messageListItem ? messageListItem.myMessage : overlayFlickable.overlayMessage
property bool highlighted
width: parent.width
height: childrenRect.height
Label {
width: parent.width
font.bold: true
font.pixelSize: Theme.fontSizeSmall
text: Emoji.emojify(rawMessage.content.game.title || "", font.pixelSize)
truncationMode: TruncationMode.Fade
textFormat: Text.StyledText
wrapMode: Text.Wrap
}
Label {
width: parent.width
font.pixelSize: Theme.fontSizeExtraSmall
text: Emoji.emojify(rawMessage.content.game.description || "", font.pixelSize)
truncationMode: TruncationMode.Fade
textFormat: Text.StyledText
wrapMode: Text.Wrap
}
Label {
width: parent.width
font.pixelSize: Theme.fontSizeExtraSmall
text: Emoji.emojify(Functions.enhanceMessageText(rawMessage.content.game.text) || "", font.pixelSize)
truncationMode: TruncationMode.Fade
wrapMode: Text.Wrap
textFormat: Text.StyledText
onLinkActivated: {
var chatCommand = Functions.handleLink(link);
if(chatCommand) {
tdLibWrapper.sendTextMessage(chatInformation.id, chatCommand);
}
}
}
Item {
width: parent.width
height: Theme.paddingLarge
}
Image {
id: thumbnail
source: thumbnailFile.isDownloadingCompleted ? thumbnailFile.path : ""
fillMode: Image.PreserveAspectCrop
asynchronous: true
visible: opacity > 0
opacity: status === Image.Ready ? 1.0 : 0.0
Behavior on opacity { FadeAnimation {} }
layer.enabled: queryResultItem.pressed
layer.effect: PressEffect { source: thumbnail }
TDLibFile {
id: thumbnailFile
tdlib: tdLibWrapper
autoLoad: true
}
Rectangle {
width: Theme.iconSizeMedium
height: width
anchors {
top: parent.top
topMargin: Theme.paddingSmall
left: parent.left
leftMargin: Theme.paddingSmall
}
color: Theme.rgba(Theme.overlayBackgroundColor, 0.2)
radius: Theme.paddingSmall
Icon {
id: icon
source: "image://theme/icon-m-game-controller"
asynchronous: true
}
}
}
Component.onCompleted: {
if (rawMessage.content.game.photo) {
// Check first which size fits best...
var photo
for (var i = 0; i < rawMessage.content.game.photo.sizes.length; i++) {
photo = rawMessage.content.game.photo.sizes[i].photo
if (rawMessage.content.game.photo.sizes[i].width >= gamePreviewItem.width) {
break
}
}
if (photo) {
thumbnailFile.fileInformation = photo
}
}
}
}

View file

@ -18,6 +18,7 @@
*/
import QtQuick 2.6
import Sailfish.Silica 1.0
import "./messageContent"
import "../js/twemoji.js" as Emoji
import "../js/functions.js" as Functions
import "../js/debug.js" as Debug
@ -40,7 +41,7 @@ ListItem {
return existingMessage.id === messageId
});
readonly property bool isOwnMessage: page.myUserId === myMessage.sender.user_id
property string extraContentComponentName
property bool hasContentComponent
highlighted: (down || isSelected) && !menuOpen
openMenuOnPressAndHold: !messageListItem.precalculatedValues.pageIsSelecting
@ -199,17 +200,16 @@ ListItem {
repeat: false
running: false
onTriggered: {
if (typeof myMessage.content !== "undefined") {
if (messageListItem.extraContentComponentName !== "") {
extraContentLoader.setSource(
"../components/" +messageListItem.extraContentComponentName +".qml",
{
messageListItem: messageListItem
})
} else {
if (typeof myMessage.content.web_page !== "undefined") { // only in messageText
webPagePreviewLoader.active = true;
}
if (messageListItem.hasContentComponent) {
var type = myMessage.content["@type"];
extraContentLoader.setSource(
"../components/messageContent/" + type.charAt(0).toUpperCase() + type.substring(1) + ".qml",
{
messageListItem: messageListItem
})
} else {
if (typeof myMessage.content.web_page !== "undefined") { // only in messageText
webPagePreviewLoader.active = true;
}
}
}
@ -435,7 +435,7 @@ ListItem {
id: extraContentLoader
width: parent.width
asynchronous: true
height: item ? item.height : (messageListItem.extraContentComponentName !== "" ? chatView.getContentComponentHeight(messageListItem.extraContentComponentName, myMessage.content, width) : 0)
height: item ? item.height : (messageListItem.hasContentComponent ? chatView.getContentComponentHeight(model.content_type, myMessage.content, width) : 0)
}
Binding {

View file

@ -18,6 +18,7 @@
*/
import QtQuick 2.6
import Sailfish.Silica 1.0
import "./messageContent"
import "../js/functions.js" as Functions
import "../js/twemoji.js" as Emoji
import "../js/debug.js" as Debug
@ -34,8 +35,7 @@ Flickable {
readonly property var userInformation: tdLibWrapper.getUserInformation(overlayMessage.sender.user_id);
readonly property bool isOwnMessage: tdLibWrapper.getUserInformation().id === overlayMessage.sender.user_id;
readonly property bool isAnonymous: overlayMessage.sender["@type"] === "messageSenderChat"
readonly property string extraContentComponentName: (typeof overlayMessage.content !== "undefined" && typeof chatView.contentComponentNames[overlayMessage.content['@type']] !== "undefined" )
? chatView.contentComponentNames[overlayMessage.content['@type']] : ""
property bool hasContentComponent: overlayMessage.content && chatView.delegateMessagesContent.indexOf(overlayMessage.content['@type']) > -1
signal requestClose;
function getOriginalAuthor(forwardInformation, fontSize) {
@ -61,18 +61,15 @@ Flickable {
repeat: false
running: false
onTriggered: {
if (typeof overlayMessage.content !== "undefined") {
if (messageOverlayFlickable.extraContentComponentName !== "") {
overlayExtraContentLoader.setSource(
"../components/" + messageOverlayFlickable.extraContentComponentName + ".qml",
{
overlayFlickable: messageOverlayFlickable
})
} else {
if (typeof overlayMessage.content.web_page !== "undefined") {
overlayWebPagePreviewLoader.active = true;
}
}
if (messageOverlayFlickable.hasContentComponent) {
var type = overlayMessage.content["@type"];
overlayExtraContentLoader.setSource(
"../components/messageContent/" + type.charAt(0).toUpperCase() + type.substring(1) + ".qml",
{
overlayFlickable: messageOverlayFlickable
})
} else if(overlayMessage.content && overlayMessage.content.web_page) {
overlayWebPagePreviewLoader.active = true;
}
}
}

View file

@ -0,0 +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
MessageVideo {}

View file

@ -19,27 +19,21 @@
import QtQuick 2.6
import Sailfish.Silica 1.0
import QtMultimedia 5.6
import "../js/functions.js" as Functions
import "../js/debug.js" as Debug
import "../"
import "../../js/functions.js" as Functions
import "../../js/debug.js" as Debug
Item {
MessageContentBase {
id: audioMessageComponent
property ListItem messageListItem
property MessageOverlayFlickable overlayFlickable
property var rawMessage: messageListItem ? messageListItem.myMessage : overlayFlickable.overlayMessage
property var audioData: ( rawMessage.content['@type'] === "messageVoiceNote" ) ? rawMessage.content.voice_note : ( ( rawMessage.content['@type'] === "messageAudio" ) ? rawMessage.content.audio : "");
property string audioUrl;
property int previewFileId;
property int audioFileId;
property bool onScreen: messageListItem ? messageListItem.page.status === PageStatus.Active : true
property string audioType : "voiceNote";
property bool highlighted;
signal clicked();
width: parent.width
height: width / 2
function getTimeString(rawSeconds) {

View file

@ -0,0 +1,32 @@
/*
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 QtMultimedia 5.6
import "../"
import "../../js/functions.js" as Functions
import "../../js/debug.js" as Debug
Item {
property ListItem messageListItem
property MessageOverlayFlickable overlayFlickable
property var rawMessage: messageListItem ? messageListItem.myMessage : overlayFlickable.overlayMessage
property bool highlighted
signal clicked()
}

View file

@ -19,19 +19,13 @@
import QtQuick 2.6
import Sailfish.Silica 1.0
Item {
MessageContentBase {
id: documentPreviewItem
width: parent.width
height: Theme.itemSizeLarge
property ListItem messageListItem
property MessageOverlayFlickable overlayFlickable
property var rawMessage: messageListItem ? messageListItem.myMessage : overlayFlickable.overlayMessage
property var documentData: rawMessage.content.document
property bool openRequested: false;
property bool highlighted;
Component.onCompleted: {
updateDocument();
@ -128,7 +122,4 @@ Item {
}
}
}
}

View file

@ -0,0 +1,128 @@
/*
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 WerkWolf.Fernschreiber 1.0
import "../"
import "../../js/functions.js" as Functions
import "../../js/twemoji.js" as Emoji
MessageContentBase {
id: messageContent
height: gamePreviewItem.height
Column {
id: gamePreviewItem
width: parent.width
height: childrenRect.height
Label {
width: parent.width
font.bold: true
font.pixelSize: Theme.fontSizeSmall
text: Emoji.emojify(rawMessage.content.game.title || "", font.pixelSize)
truncationMode: TruncationMode.Fade
textFormat: Text.StyledText
wrapMode: Text.Wrap
}
Label {
width: parent.width
font.pixelSize: Theme.fontSizeExtraSmall
text: Emoji.emojify(rawMessage.content.game.description || "", font.pixelSize)
truncationMode: TruncationMode.Fade
textFormat: Text.StyledText
wrapMode: Text.Wrap
}
Label {
width: parent.width
font.pixelSize: Theme.fontSizeExtraSmall
text: Emoji.emojify(Functions.enhanceMessageText(rawMessage.content.game.text) || "", font.pixelSize)
truncationMode: TruncationMode.Fade
wrapMode: Text.Wrap
textFormat: Text.StyledText
onLinkActivated: {
var chatCommand = Functions.handleLink(link);
if(chatCommand) {
tdLibWrapper.sendTextMessage(chatInformation.id, chatCommand);
}
}
}
Item {
width: parent.width
height: Theme.paddingLarge
}
Image {
id: thumbnail
source: thumbnailFile.isDownloadingCompleted ? thumbnailFile.path : ""
fillMode: Image.PreserveAspectCrop
asynchronous: true
visible: opacity > 0
opacity: status === Image.Ready ? 1.0 : 0.0
width: parent.width
Behavior on opacity { FadeAnimation {} }
layer.enabled: messageContent.highlighted
layer.effect: PressEffect { source: thumbnail }
TDLibFile {
id: thumbnailFile
tdlib: tdLibWrapper
autoLoad: true
}
Rectangle {
width: Theme.iconSizeMedium
height: width
anchors {
top: parent.top
topMargin: Theme.paddingSmall
left: parent.left
leftMargin: Theme.paddingSmall
}
color: Theme.rgba(Theme.overlayBackgroundColor, 0.2)
radius: Theme.paddingSmall
Icon {
id: icon
source: "image://theme/icon-m-game-controller"
asynchronous: true
}
}
}
Component.onCompleted: {
if (rawMessage.content.game.photo) {
// Check first which size fits best...
var photo
for (var i = 0; i < rawMessage.content.game.photo.sizes.length; i++) {
photo = rawMessage.content.game.photo.sizes[i].photo
if (rawMessage.content.game.photo.sizes[i].width >= gamePreviewItem.width) {
break
}
}
if (photo) {
thumbnailFile.fileInformation = photo
}
}
}
}
}

View file

@ -19,28 +19,23 @@
import QtQuick 2.6
import QtGraphicalEffects 1.0
import Sailfish.Silica 1.0
import "../"
Item {
MessageContentBase {
id: imagePreviewItem
property ListItem messageListItem
property MessageOverlayFlickable overlayFlickable
property var rawMessage: messageListItem ? messageListItem.myMessage : overlayFlickable.overlayMessage
property bool highlighted
property var locationData : ( rawMessage.content['@type'] === "messageLocation" ) ? rawMessage.content.location : ( ( rawMessage.content['@type'] === "messageVenue" ) ? rawMessage.content.venue.location : "" )
property string chatId: rawMessage.chat_id
property var pictureFileInformation;
width: parent.width
height: width / 2
property string fileExtra
Component.onCompleted: {
updatePicture();
}
function clicked(){
onClicked: {
if(!processLauncher.launchProgram('harbour-pure-maps', ["geo:"+locationData.latitude+","+locationData.longitude])) {
imageNotification.show(qsTr("Install Pure Maps to inspect this location."));
}
@ -56,17 +51,16 @@ Item {
Connections {
target: tdLibWrapper
onFileUpdated: {
if(fileInformation["@extra"] !== imagePreviewItem.fileExtra) {
if(fileInformation["@extra"] !== imagePreviewItem.fileExtra && (!imagePreviewItem.pictureFileInformation || imagePreviewItem.pictureFileInformation.id !== fileInformation.id)) {
return;
}
if(!imagePreviewItem.pictureFileInformation) {
imagePreviewItem.pictureFileInformation = fileInformation;
tdLibWrapper.downloadFile(imagePreviewItem.pictureFileInformation.id);
} else if(imagePreviewItem.pictureFileInformation && fileInformation.id === imagePreviewItem.pictureFileInformation.id) {
imagePreviewItem.pictureFileInformation = fileInformation;
if(fileInformation.local.is_downloading_completed) {
singleImage.source = fileInformation.local.path;
} else if(fileInformation.local.can_be_downloaded && !fileInformation.local.is_downloading_active) {
tdLibWrapper.downloadFile(fileInformation.id);
}
imagePreviewItem.pictureFileInformation = fileInformation;
}
}

View file

@ -19,21 +19,17 @@
import QtQuick 2.6
import Sailfish.Silica 1.0
import WerkWolf.Fernschreiber 1.0
import "../"
Item {
MessageContentBase {
id: imagePreviewItem
property ListItem messageListItem
property MessageOverlayFlickable overlayFlickable
property var rawMessage: messageListItem ? messageListItem.myMessage : overlayFlickable.overlayMessage
readonly property int defaultHeight: Math.round(width * 2 / 3)
property bool highlighted
width: parent.width
height: singleImage.visible ? Math.min(defaultHeight, singleImage.bestHeight + Theme.paddingSmall) : defaultHeight
function clicked() {
pageStack.push(Qt.resolvedUrl("../pages/ImagePage.qml"), {
onClicked: {
pageStack.push(Qt.resolvedUrl("../../pages/ImagePage.qml"), {
"photoData" : imagePreviewItem.rawMessage.content.photo
})
}

View file

@ -21,15 +21,13 @@ import QtQuick 2.6
import Sailfish.Silica 1.0
import WerkWolf.Fernschreiber 1.0
import "../js/functions.js" as Functions
import "../js/twemoji.js" as Emoji
import "../../js/functions.js" as Functions
import "../../js/twemoji.js" as Emoji
Item {
MessageContentBase {
id: pollMessageComponent
height: pollColumn.height
property ListItem messageListItem
property MessageOverlayFlickable overlayFlickable
readonly property var rawMessage: messageListItem ? messageListItem.myMessage : overlayFlickable.overlayMessage
readonly property string chatId: rawMessage.chat_id
readonly property bool isOwnMessage: messageListItem ? messageListItem.isOwnMessage : overlayFlickable.isOwnMessage
readonly property string messageId: rawMessage.id
@ -44,9 +42,6 @@ Item {
}
readonly property bool canAnswer: !hasAnswered && !pollData.is_closed
readonly property bool isQuiz: pollData.type['@type'] === "pollTypeQuiz"
property bool highlighted
width: parent.width
height: pollColumn.height
property list<NamedAction> extraContextMenuItems: [
NamedAction {
visible: !pollData.is_closed && pollMessageComponent.canEdit
@ -264,7 +259,7 @@ Item {
visible: !pollMessageComponent.canAnswer && !pollData.is_anonymous && pollData.total_voter_count > 0
icon.source: "image://theme/icon-m-media-artists"
onClicked: {
pageStack.push(Qt.resolvedUrl("../pages/PollResultsPage.qml"), { chatId:chatId, message:pollMessageComponent.message});
pageStack.push(Qt.resolvedUrl("../../pages/PollResultsPage.qml"), { chatId:chatId, message:pollMessageComponent.message});
}
Icon {
opacity: 0.8

View file

@ -19,18 +19,15 @@
import QtQuick 2.6
import Sailfish.Silica 1.0
import WerkWolf.Fernschreiber 1.0
import "../"
Item {
property ListItem messageListItem
property MessageOverlayFlickable overlayFlickable
MessageContentBase {
readonly property var stickerData: messageListItem ? messageListItem.myMessage.content.sticker : overlayFlickable.overlayMessage.content.sticker;
readonly property bool animated: stickerData.is_animated && appSettings.animateStickers
readonly property bool stickerVisible: staticStickerLoader.item ? staticStickerLoader.item.visible :
animatedStickerLoader.item ? animatedStickerLoader.item.visible : false
readonly property bool isOwnSticker : messageListItem ? messageListItem.isOwnMessage : overlayFlickable.isOwnMessage
property real aspectRatio: stickerData.width / stickerData.height
property bool highlighted
implicitWidth: stickerData.width
implicitHeight: stickerData.height

View file

@ -0,0 +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
MessageLocation {}

View file

@ -19,16 +19,13 @@
import QtQuick 2.6
import Sailfish.Silica 1.0
import QtMultimedia 5.6
import "../js/functions.js" as Functions
import "../js/debug.js" as Debug
import "../"
import "../../js/functions.js" as Functions
import "../../js/debug.js" as Debug
Item {
MessageContentBase {
id: videoMessageComponent
property ListItem messageListItem
property MessageOverlayFlickable overlayFlickable
property var rawMessage: messageListItem ? messageListItem.myMessage : ( overlayFlickable ? overlayFlickable.overlayMessage : undefined )
property var videoData: ( rawMessage.content['@type'] === "messageVideo" ) ? rawMessage.content.video : ( ( rawMessage.content['@type'] === "messageAnimation" ) ? rawMessage.content.animation : rawMessage.content.video_note )
property string videoUrl;
property int previewFileId;
@ -38,10 +35,7 @@ Item {
property bool onScreen: messageListItem ? messageListItem.page.status === PageStatus.Active : true;
property string videoType : "video";
property bool playRequested: false;
property bool highlighted;
signal clicked();
width: parent.width
height: videoMessageComponent.isVideoNote ? width : Functions.getVideoHeight(width, videoData)
Timer {
@ -215,7 +209,7 @@ Item {
height: Theme.iconSizeLarge
icon {
asynchronous: true
source: "../../images/icon-l-fullscreen.svg"
source: "../../../images/icon-l-fullscreen.svg"
sourceSize {
width: Theme.iconSizeLarge
height: Theme.iconSizeLarge
@ -224,7 +218,7 @@ Item {
highlighted: videoMessageComponent.highlighted || down
visible: ( placeholderImage.status === Image.Ready && !videoMessageComponent.fullscreen ) ? true : false
onClicked: {
pageStack.push(Qt.resolvedUrl("../pages/VideoPage.qml"), {"videoData": videoData});
pageStack.push(Qt.resolvedUrl("../../pages/VideoPage.qml"), {"videoData": videoData});
}
}
}
@ -462,7 +456,7 @@ Item {
highlighted: videoMessageComponent.highlighted || down
icon {
asynchronous: true
source: "../../images/icon-l-fullscreen.svg"
source: "../../../images/icon-l-fullscreen.svg"
sourceSize {
width: Theme.iconSizeLarge
height: Theme.iconSizeLarge
@ -470,7 +464,7 @@ Item {
}
visible: ( videoComponentLoader.active && messageVideo.playbackState === MediaPlayer.PausedState ) ? true : false
onClicked: {
pageStack.push(Qt.resolvedUrl("../pages/VideoPage.qml"), {"videoData": videoData});
pageStack.push(Qt.resolvedUrl("../../pages/VideoPage.qml"), {"videoData": videoData});
}
}
}

View file

@ -0,0 +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
MessageVideo {}

View file

@ -0,0 +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
MessageAudio {}

View file

@ -20,7 +20,8 @@ import QtQuick 2.6
import QtGraphicalEffects 1.0
import Sailfish.Silica 1.0
import WerkWolf.Fernschreiber 1.0
import "../js/functions.js" as Functions
import "../"
import "../../js/functions.js" as Functions
Column {
id: webPagePreviewColumn
@ -132,7 +133,7 @@ Column {
MouseArea {
anchors.fill: parent
onClicked: {
pageStack.push(Qt.resolvedUrl("../pages/ImagePage.qml"), { "photoData" : webPageData.photo, "pictureFileInformation" : picture.fileInformation });
pageStack.push(Qt.resolvedUrl("../../pages/ImagePage.qml"), { "photoData" : webPageData.photo, "pictureFileInformation" : picture.fileInformation });
}
}
}

View file

@ -1056,39 +1056,53 @@ Page {
}
}
readonly property var contentComponentNames: ({
messageSticker: "StickerPreview",
messagePhoto: "ImagePreview",
messageVideo: "VideoPreview",
messageVideoNote: "VideoPreview",
messageAnimation: "VideoPreview",
messageAudio: "AudioPreview",
messageVoiceNote: "AudioPreview",
messageDocument: "DocumentPreview",
messageLocation: "LocationPreview",
messageVenue: "LocationPreview",
messagePoll: "PollPreview",
messageGame: "GamePreview"
})
function getContentComponentHeight(componentName, content, parentWidth) {
switch(componentName) {
case "StickerPreview": return content.sticker.height;
case "ImagePreview":
case "LocationPreview":
return parentWidth * 0.66666666; // 2 / 3;
case "VideoPreview":
return ( content['@type'] === "messageVideoNote" ) ? parentWidth : ( Functions.getVideoHeight(parentWidth, ( content['@type'] === "messageVideo" ) ? content.video : content.animation) );
case "AudioPreview":
return parentWidth / 2;
case "DocumentPreview":
function getContentComponentHeight(contentType, content, parentWidth) {
switch(contentType) {
case "messageAnimation":
return Functions.getVideoHeight(parentWidth, content.video);
case "messageAudio":
case "messageVoiceNote":
return Theme.itemSizeLarge;
case "messageDocument":
return Theme.itemSizeSmall;
case "PollPreview":
return Theme.itemSizeSmall * (4 + content.poll.options);
case "GamePreview":
case "messageGame":
return parentWidth * 0.66666666 + Theme.itemSizeLarge; // 2 / 3;
case "messageLocation":
case "messagePhoto":
case "messageVenue":
return parentWidth * 0.66666666; // 2 / 3;
case "messagePoll":
return Theme.itemSizeSmall * (4 + content.poll.options);
case "messageSticker":
return content.sticker.height;
case "messageVideo":
return Functions.getVideoHeight(parentWidth, content.video);
case "messageVideoNote":
return parentWidth
}
}
readonly property var delegateMessagesContent: [
"messageAnimation",
"messageAudio",
// "messageContact",
// "messageDice"
"messageDocument",
"messageGame",
// "messageInvoice",
"messageLocation",
// "messagePassportDataSent",
// "messagePaymentSuccessful",
"messagePhoto",
"messagePoll",
// "messageProximityAlertTriggered",
"messageSticker",
"messageVenue",
"messageVideo",
"messageVideoNote",
"messageVoiceNote"
]
readonly property var simpleDelegateMessages: ["messageBasicGroupChatCreate",
"messageChatAddMembers",
"messageChatChangePhoto",
@ -1098,6 +1112,7 @@ Page {
"messageChatJoinByLink",
"messageChatSetTtl",
"messageChatUpgradeFrom",
// "messageContactRegistered","messageExpiredPhoto", "messageExpiredVideo","messageWebsiteConnected"
"messageGameScore",
"messageChatUpgradeTo",
"messageCustomServiceAction",
@ -1115,7 +1130,7 @@ Page {
myMessage: model.display
messageId: model.message_id
messageIndex: model.index
extraContentComponentName: chatView.contentComponentNames[model.content_type] || ""
hasContentComponent: !!myMessage.content && chatView.delegateMessagesContent.indexOf(model.content_type) > -1
canReplyToMessage: chatPage.canSendMessages
onReplyToMessage: {
newMessageInReplyToRow.inReplyToMessage = myMessage

View file

@ -490,21 +490,6 @@
<translation>Chats</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Dokument herunterladen</translation>
</message>
<message>
<source>Open Document</source>
<translation>Dokument öffnen</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation>Dokument zu Downloads kopieren</translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -946,10 +931,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Installieren Sie Pure Maps, um diesen Ort zu erkunden.</translation>
<source>Download Document</source>
<translation>Dokument herunterladen</translation>
</message>
<message>
<source>Open Document</source>
<translation>Dokument öffnen</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation>Dokument zu Downloads kopieren</translation>
</message>
</context>
<context>
@ -1021,6 +1014,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Installieren Sie Pure Maps, um diesen Ort zu erkunden.</translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1032,6 +1032,41 @@
<translation>Diese Nachricht wurde weitergeleitet. Ursprünglicher Autor: %1</translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation>Umfrage beenden</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Antwort zurückziehen</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Endergebnis:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Mehrfachauswahl ist erlaubt.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%Ln Stimme insgesamt</numerusform>
<numerusform>%Ln Stimmen insgesamt</numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1272,41 +1307,6 @@
<translation>Quizze haben eine korrekte Antwort. Teilnehmer können ihre Antwort nicht zurückziehen.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Endergebnis:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Mehrfachauswahl ist erlaubt.</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%Ln Stimme insgesamt</numerusform>
<numerusform>%Ln Stimmen insgesamt</numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation>Umfrage beenden</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Antwort zurückziehen</translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>
@ -1986,7 +1986,7 @@
<message numerus="yes">
<source>scored %Ln points</source>
<comment>myself</comment>
<translation type="unfinished">
<translation>
<numerusform>haben %Ln Punkt erziehlt</numerusform>
<numerusform>haben %Ln Punkte erziehlt</numerusform>
</translation>

View file

@ -490,21 +490,6 @@
<translation>chats</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Download Document</translation>
</message>
<message>
<source>Open Document</source>
<translation>Open Document</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation>Copy Document to Downloads</translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -946,10 +931,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Install Pure Maps to inspect this location.</translation>
<source>Download Document</source>
<translation>Download Document</translation>
</message>
<message>
<source>Open Document</source>
<translation>Open Document</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation>Copy Document to Downloads</translation>
</message>
</context>
<context>
@ -1021,6 +1014,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Install Pure Maps to inspect this location.</translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1032,6 +1032,41 @@
<translation>This message was forwarded. Original author: %1</translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation>Close Poll</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Reset Answer</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Final Result:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Multiple Answers are allowed.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%Ln vote total</numerusform>
<numerusform>%Ln votes total</numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1272,41 +1307,6 @@
<translation>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Final Result:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Multiple Answers are allowed.</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%Ln vote total</numerusform>
<numerusform>%Ln votes total</numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation>Close Poll</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Reset Answer</translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<TS version="2.1" language="es">
<context>
<name>AboutPage</name>
<message>
@ -107,14 +107,16 @@
<name>ChatInformationPageContent</name>
<message numerus="yes">
<source>%1 subscribers</source>
<translation>
<translation type="unfinished">
<numerusform>%1 suscriptores</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%1 members</source>
<translation>
<translation type="unfinished">
<numerusform>%1 miembros</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -172,8 +174,9 @@
</message>
<message numerus="yes">
<source>%1 online</source>
<translation>
<translation type="unfinished">
<numerusform>%1 en línea</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -302,14 +305,16 @@
</message>
<message numerus="yes">
<source>%1 members</source>
<translation>
<translation type="unfinished">
<numerusform>%1 miembros</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%1 subscribers</source>
<translation>
<translation type="unfinished">
<numerusform>%1 suscriptores</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -362,28 +367,32 @@
</message>
<message numerus="yes">
<source>%Ln Messages deleted</source>
<translation>
<translation type="unfinished">
<numerusform>%Ln Mensajes borrados</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln messages have been copied</source>
<translation>
<translation type="unfinished">
<numerusform>%Ln se han copiado los mensajes</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>Forward %Ln messages</source>
<comment>dialog header</comment>
<translation>
<translation type="unfinished">
<numerusform>Reenviar %Ln mensajes</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln messages selected</source>
<comment>number of messages selected</comment>
<translation>
<translation type="unfinished">
<numerusform>%Ln mensajes seleccionados</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -393,8 +402,9 @@
</message>
<message numerus="yes">
<source>%1 online</source>
<translation>
<translation type="unfinished">
<numerusform>%1 en línea</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -480,21 +490,6 @@
<translation>charlas</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Bajar Documento</translation>
</message>
<message>
<source>Open Document</source>
<translation>Abrir Documento</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation>Copiar documento a Downloads</translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -826,12 +821,14 @@
<comment>myself</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>scored %Ln points</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -934,10 +931,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Instalar Pure Maps para inspeccionar esta ubicación.</translation>
<source>Download Document</source>
<translation>Bajar Documento</translation>
</message>
<message>
<source>Open Document</source>
<translation>Abrir Documento</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation>Copiar documento a Downloads</translation>
</message>
</context>
<context>
@ -998,15 +1003,24 @@
<comment>myself</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>scored %Ln points in %2</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Instalar Pure Maps para inspeccionar esta ubicación.</translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1018,6 +1032,41 @@
<translation>Este mensaje fue reenviado. Autor original: %1</translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation>Cerrar encuesta</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Restablecer respuesta</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Resultado final:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Se permiten múltiples respuestas.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform>%Ln%</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1077,8 +1126,9 @@
<name>NotificationManager</name>
<message numerus="yes">
<source>%Ln unread messages</source>
<translation>
<translation type="unfinished">
<numerusform>%Ln mensajes no leídos</numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
@ -1210,8 +1260,9 @@
</message>
<message numerus="yes">
<source>Question (%Ln characters left)</source>
<translation>
<translation type="unfinished">
<numerusform>Pregunta (quedan %Ln caracteres)</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -1225,8 +1276,9 @@
</message>
<message numerus="yes">
<source>Answer (%Ln characters left)</source>
<translation>
<translation type="unfinished">
<numerusform>Respuesta (quedan %Ln caracteres)</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -1255,39 +1307,6 @@
<translation>Los interrogatorios tienen una respuesta correcta. Los participantes no pueden revocar sus respuestas.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Resultado final:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Se permiten múltiples respuestas.</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%Ln votos totales</numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation>Cerrar encuesta</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Restablecer respuesta</translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>
@ -1301,8 +1320,9 @@
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<translation type="unfinished">
<numerusform>%Ln total de votos</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -1318,15 +1338,17 @@
<message numerus="yes">
<source>%Ln vote(s)</source>
<comment>number of votes for option</comment>
<translation>
<translation type="unfinished">
<numerusform>%Ln votos</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<translation type="unfinished">
<numerusform>%Ln%</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -1337,8 +1359,9 @@
<message numerus="yes">
<source>%Ln vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation>
<translation type="unfinished">
<numerusform>%Ln votos incluyendo el suyo</numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
@ -1366,14 +1389,16 @@
</message>
<message numerus="yes">
<source>%1 members</source>
<translation>
<translation type="unfinished">
<numerusform>%1 miembros</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%1 subscribers</source>
<translation>
<translation type="unfinished">
<numerusform>%1 suscriptores</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
@ -1963,6 +1988,7 @@
<comment>myself</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>

View file

@ -491,21 +491,6 @@
<translation>keskustelussa</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Lataa dokumentti</translation>
</message>
<message>
<source>Open Document</source>
<translation>Avaa dokumentti</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -947,10 +932,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Asenna Pure Maps tarkastellaksesi sijaintia.</translation>
<source>Download Document</source>
<translation>Lataa dokumentti</translation>
</message>
<message>
<source>Open Document</source>
<translation>Avaa dokumentti</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1022,6 +1015,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Asenna Pure Maps tarkastellaksesi sijaintia.</translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1033,6 +1033,41 @@
<translation>Välitetty viesti. Alkuperäinen lähettäjä: %1</translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation>Sulje kysely</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Tyhjennä vastaus</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Lopullinen tulos:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Useampi vastaus sallittu.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1273,41 +1308,6 @@
<translation>Visoilla on yksi oikea vastaus. Osallistujat eivät voi kumota vastaustaan.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Lopullinen tulos:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Useampi vastaus sallittu.</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>yhteensä %Ln ääni</numerusform>
<numerusform>yhteensä %Ln ääntä</numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation>Sulje kysely</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Tyhjennä vastaus</translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>

View file

@ -480,21 +480,6 @@
<translation>csevegések</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Dokumentum letöltése</translation>
</message>
<message>
<source>Open Document</source>
<translation>Dokumentum megyitása</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -934,9 +919,17 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<source>Download Document</source>
<translation type="unfinished">Dokumentum letöltése</translation>
</message>
<message>
<source>Open Document</source>
<translation type="unfinished">Dokumentum megyitása</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -1007,6 +1000,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1018,6 +1018,39 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Final Result:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1255,39 +1288,6 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>

View file

@ -490,21 +490,6 @@
<translation>Aggiorna contenuti...</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Scarica documento</translation>
</message>
<message>
<source>Open Document</source>
<translation>Apri documento</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -946,10 +931,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Installa Pure Maps per conoscere questo luogo.</translation>
<source>Download Document</source>
<translation type="unfinished">Scarica documento</translation>
</message>
<message>
<source>Open Document</source>
<translation type="unfinished">Apri documento</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1021,6 +1014,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation type="unfinished">Installa Pure Maps per conoscere questo luogo.</translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1032,6 +1032,41 @@
<translation>Questo è un messaggio inoltrato. Autore originale: %1</translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation type="unfinished">Termina sondaggio</translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished">Annulla risposta</translation>
</message>
<message>
<source>Final Result:</source>
<translation type="unfinished">Risultato:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation type="unfinished">Risposte multiple consentite.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform>%Ln voto in totale</numerusform>
<numerusform>%Ln voti in totale</numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1272,41 +1307,6 @@
<translation>I quiz hanno una sola risposta corretta. I partecipanti non possono revocare le risposte.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Risultato:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Risposte multiple consentite.</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%Ln voto in totale</numerusform>
<numerusform>%Ln voti in totale</numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation>Termina sondaggio</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Annulla risposta</translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>

View file

@ -500,21 +500,6 @@
<translation>czaty</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Pobierz dokument</translation>
</message>
<message>
<source>Open Document</source>
<translation>Otwórz dokument</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -958,10 +943,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Zainstaluj Pure Maps, aby sprawdzić lokalizację.</translation>
<source>Download Document</source>
<translation type="unfinished">Pobierz dokument</translation>
</message>
<message>
<source>Open Document</source>
<translation type="unfinished">Otwórz dokument</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1035,6 +1028,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation type="unfinished">Zainstaluj Pure Maps, aby sprawdzić lokalizację.</translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1046,6 +1046,43 @@
<translation>Ta wiadomość została przekazana. Oryginalny autor: %1</translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation type="unfinished">Zamknij ankietę</translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished">Resetuj odpowiedź</translation>
</message>
<message>
<source>Final Result:</source>
<translation type="unfinished">Ostateczny wynik:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation type="unfinished">Dozwolonych jest wiele odpowiedzi.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform>%Ln odpowiedź</numerusform>
<numerusform>%Ln odpowiedzi</numerusform>
<numerusform>%Ln odpowiedzi</numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1289,43 +1326,6 @@
<translation>Quizy mają jedną poprawną odpowiedź. Uczestnicy nie mogą odwołać swoich odpowiedzi.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Ostateczny wynik:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Dozwolonych jest wiele odpowiedzi.</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%Ln odpowiedź</numerusform>
<numerusform>%Ln odpowiedzi</numerusform>
<numerusform>%Ln odpowiedzi</numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation>Zamknij ankietę</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Resetuj odpowiedź</translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>

View file

@ -500,21 +500,6 @@
<translation>чатах</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Скачать документ</translation>
</message>
<message>
<source>Open Document</source>
<translation>Открыть документ</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished">Сохранить в Загрузках</translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -958,10 +943,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Для просмотра карты, установите Pure Maps.</translation>
<source>Download Document</source>
<translation type="unfinished">Скачать документ</translation>
</message>
<message>
<source>Open Document</source>
<translation type="unfinished">Открыть документ</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished">Сохранить в Загрузках</translation>
</message>
</context>
<context>
@ -1035,6 +1028,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation type="unfinished">Для просмотра карты, установите Pure Maps.</translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1046,6 +1046,43 @@
<translation>Это сообщение было переадресовано. Первоначальный автор: %1</translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation type="unfinished">Прекратить Опрос</translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished">Обнулить Ответ</translation>
</message>
<message>
<source>Final Result:</source>
<translation type="unfinished">Окончательный Результат</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation type="unfinished">Разрешено несколько вариантов ответов.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1289,43 +1326,6 @@
<translation>Тесты имеют один правильный ответ. Участники не могут отозвать свои ответы.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Окончательный Результат</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Разрешено несколько вариантов ответов.</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation>Прекратить Опрос</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Обнулить Ответ</translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>

View file

@ -490,21 +490,6 @@
<translation>chattar</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Ladda ner dokument</translation>
</message>
<message>
<source>Open Document</source>
<translation>Öppna dokument</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -946,10 +931,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Installera Pure Maps för att inspektera den här platsen.</translation>
<source>Download Document</source>
<translation type="unfinished">Ladda ner dokument</translation>
</message>
<message>
<source>Open Document</source>
<translation type="unfinished">Öppna dokument</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1021,6 +1014,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation type="unfinished">Installera Pure Maps för att inspektera den här platsen.</translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1032,6 +1032,41 @@
<translation>Detta meddelande är vidarebefordrat. Ursprunglig avsändare: %1</translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation type="unfinished">Stäng omröstningen</translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished">Återställ svar</translation>
</message>
<message>
<source>Final Result:</source>
<translation type="unfinished">Slutresultat:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation type="unfinished">Flera svarsalternativ tillåtna.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform>%Ln röst sammanlagt</numerusform>
<numerusform>%Ln röster sammanlagt</numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1272,41 +1307,6 @@
<translation>Frågor har ett (1) korrekt svar. Deltagarna kan inte återkalla sina svar.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>Final Result:</source>
<translation>Slutresultat:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Flera svarsalternativ tillåtna.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%Ln röst sammanlagt</numerusform>
<numerusform>%Ln röster sammanlagt</numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation>Stäng omröstningen</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Återställ svar</translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>

View file

@ -480,21 +480,6 @@
<translation></translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation></translation>
</message>
<message>
<source>Open Document</source>
<translation></translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation></translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -934,10 +919,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation> Pure Maps </translation>
<source>Download Document</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open Document</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1007,6 +1000,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation type="unfinished"> Pure Maps </translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1018,6 +1018,39 @@
<translation>: %1</translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Final Result:</source>
<translation type="unfinished">:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1255,39 +1288,6 @@
<translation>Quiz </translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation>:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation></translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform> %Ln </numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation></translation>
</message>
<message>
<source>Reset Answer</source>
<translation></translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>

View file

@ -490,21 +490,6 @@
<translation>chats</translation>
</message>
</context>
<context>
<name>DocumentPreview</name>
<message>
<source>Download Document</source>
<translation>Download Document</translation>
</message>
<message>
<source>Open Document</source>
<translation>Open Document</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditGroupChatPermissionsColumn</name>
<message>
@ -946,10 +931,18 @@
</message>
</context>
<context>
<name>LocationPreview</name>
<name>MessageDocument</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation>Install Pure Maps to inspect this location.</translation>
<source>Download Document</source>
<translation type="unfinished">Download Document</translation>
</message>
<message>
<source>Open Document</source>
<translation type="unfinished">Open Document</translation>
</message>
<message>
<source>Copy Document to Downloads</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1021,6 +1014,13 @@
</translation>
</message>
</context>
<context>
<name>MessageLocation</name>
<message>
<source>Install Pure Maps to inspect this location.</source>
<translation type="unfinished">Install Pure Maps to inspect this location.</translation>
</message>
</context>
<context>
<name>MessageOverlayFlickable</name>
<message>
@ -1032,6 +1032,41 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessagePoll</name>
<message>
<source>Close Poll</source>
<translation type="unfinished">Close Poll</translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished">Reset Answer</translation>
</message>
<message>
<source>Final Result:</source>
<translation type="unfinished">Final Result:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation type="unfinished">Multiple Answers are allowed.</translation>
</message>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation type="unfinished">
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform>%Ln vote total</numerusform>
<numerusform>%Ln votes total</numerusform>
</translation>
</message>
</context>
<context>
<name>MessageViaLabel</name>
<message>
@ -1272,41 +1307,6 @@
<translation>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message numerus="yes">
<source>%Ln%</source>
<comment>% of votes for option</comment>
<translation>
<numerusform>%Ln%</numerusform>
<numerusform>%Ln%</numerusform>
</translation>
</message>
<message>
<source>Final Result:</source>
<translation>Final Result:</translation>
</message>
<message>
<source>Multiple Answers are allowed.</source>
<translation>Multiple Answers are allowed.</translation>
</message>
<message numerus="yes">
<source>%Ln vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%Ln vote total</numerusform>
<numerusform>%Ln votes total</numerusform>
</translation>
</message>
<message>
<source>Close Poll</source>
<translation>Close Poll</translation>
</message>
<message>
<source>Reset Answer</source>
<translation>Reset Answer</translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>