Merge branch 'master' into const-refs

This commit is contained in:
Sebastian Wolf 2020-10-26 21:28:39 +01:00 committed by GitHub
commit 3175e641dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 3283 additions and 157 deletions

View file

@ -39,6 +39,7 @@ DISTFILES += qml/harbour-fernschreiber.qml \
qml/components/ImagePreview.qml \ qml/components/ImagePreview.qml \
qml/components/InReplyToRow.qml \ qml/components/InReplyToRow.qml \
qml/components/LocationPreview.qml \ qml/components/LocationPreview.qml \
qml/components/PollPreview.qml \
qml/components/StickerPicker.qml \ qml/components/StickerPicker.qml \
qml/components/PhotoTextsListItem.qml \ qml/components/PhotoTextsListItem.qml \
qml/components/WebPagePreview.qml \ qml/components/WebPagePreview.qml \
@ -60,6 +61,8 @@ DISTFILES += qml/harbour-fernschreiber.qml \
qml/pages/InitializationPage.qml \ qml/pages/InitializationPage.qml \
qml/pages/OverviewPage.qml \ qml/pages/OverviewPage.qml \
qml/pages/AboutPage.qml \ qml/pages/AboutPage.qml \
qml/pages/PollCreationPage.qml \
qml/pages/PollResultsPage.qml \
qml/pages/SettingsPage.qml \ qml/pages/SettingsPage.qml \
qml/pages/VideoPage.qml \ qml/pages/VideoPage.qml \
rpm/harbour-fernschreiber.changes.in \ rpm/harbour-fernschreiber.changes.in \

View file

@ -0,0 +1,293 @@
/*
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.0
import Sailfish.Silica 1.0
import QtGraphicalEffects 1.0
import "../js/functions.js" as Functions
import "../js/twemoji.js" as Emoji
Item {
id: pollMessageComponent
property string chatId
property var message:({})
property bool isOwnMessage
property string messageId: message.id
property bool canEdit: message.can_be_edited
property var pollData: message.content.poll
property var chosenPollData:({})
property var chosenIndexes: []
property bool hasAnswered: {
return pollData.options.filter(function(option){
return option.is_chosen
}).length > 0;
}
property bool canAnswer: !hasAnswered && !pollData.is_closed
property bool isQuiz: pollData.type['@type'] === "pollTypeQuiz"
property Item messageItem
height: pollColumn.height
opacity: 0
Behavior on opacity { FadeAnimation {} }
function handleChoose(index) {
if(!pollData.type.allow_multiple_answers) {
chosenIndexes = [index];
sendResponse();
return;
}
var indexes = chosenIndexes;
var found = indexes.indexOf(index);
if(found > -1) { // uncheck
indexes.splice(found, 1);
} else {
indexes.push(index)
}
chosenIndexes = indexes;
}
function resetChosen() {
chosenIndexes = [];
sendResponse();
}
function sendResponse() {
tdLibWrapper.setPollAnswer(chatId, messageId, chosenIndexes);
}
Column {
id: pollColumn
width: parent.width
spacing: Theme.paddingSmall
Label {
font.pixelSize: Theme.fontSizeSmall
width: parent.width
visible: text !== ""
text: Emoji.emojify(pollData.question, Theme.fontSizeSmall)
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
color: pollMessageComponent.isOwnMessage ? Theme.highlightColor : Theme.primaryColor
}
Label {
font.pixelSize: Theme.fontSizeTiny
width: parent.width
visible: text !== ""
text: pollData.is_closed ? qsTr("Final Result:") : (pollData.type.allow_multiple_answers ? qsTr("Multiple Answers are allowed.") : "")
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
color: pollMessageComponent.isOwnMessage ? Theme.secondaryHighlightColor : Theme.secondaryColor
}
Item {
visible: !pollMessageComponent.canAnswer
width: parent.width
height: Theme.paddingSmall
}
Component {
id: canAnswerDelegate
TextSwitch {
id: optionDelegate
width: pollMessageComponent.width
automaticCheck: false
// emojify does not work here :/
text: modelData.text
checked: pollMessageComponent.chosenIndexes.indexOf(index) > -1
onClicked: {
pollMessageComponent.handleChoose(index);
}
}
}
Component {
id: resultDelegate
Item {
id: optionDelegate
width: pollMessageComponent.width
height: displayOptionLabel.height + displayOptionStatistics.height
Rectangle {
id: displayOptionChosenMarker
height: parent.height
width: Theme.horizontalPageMargin/2
color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity)
visible: modelData.is_chosen
x: -width
}
OpacityRampEffect {
sourceItem: displayOptionChosenMarker
direction: OpacityRamp.LeftToRight
}
Column {
id: iconsColumn
width: pollMessageComponent.isQuiz ?Theme.iconSizeSmall + Theme.paddingMedium : Theme.paddingMedium
anchors {
left: parent.left
verticalCenter: parent.verticalCenter
}
Icon {
highlighted: pollMessageComponent.isOwnMessage
property bool isRight: pollMessageComponent.isQuiz && pollData.type.correct_option_id === index
source: "image://theme/icon-s-accept"
visible: isRight
}
}
Label {
id: displayOptionLabel
text: Emoji.emojify(modelData.text, Theme.fontSizeMedium)
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
anchors {
left: iconsColumn.right
top: parent.top
right: parent.right
}
color: pollMessageComponent.isOwnMessage ? Theme.highlightColor : Theme.primaryColor
}
Item {
id: displayOptionStatistics
height: optionVoterPercentage.height + optionVoterPercentageBar.height
anchors {
top: displayOptionLabel.bottom
left: iconsColumn.right
right: parent.right
}
Label {
id: optionVoterPercentage
font.pixelSize: Theme.fontSizeTiny
text: qsTr("%L1\%", "% of votes for option").arg(modelData.vote_percentage)
horizontalAlignment: Text.AlignRight
anchors {
right: parent.right
left: parent.horizontalCenter
leftMargin: Theme.paddingSmall
}
color: pollMessageComponent.isOwnMessage ? Theme.secondaryHighlightColor : Theme.secondaryColor
}
Rectangle {
id: optionVoterPercentageBar
height: Theme.paddingSmall
width: parent.width
color: Theme.rgba(pollMessageComponent.isOwnMessage ? Theme.secondaryHighlightColor : Theme.secondaryColor, 0.3)
radius: height/2
anchors {
left: parent.left
bottom: parent.bottom
}
Rectangle {
height: parent.height
color: pollMessageComponent.isOwnMessage ? Theme.highlightColor : Theme.primaryColor
radius: height/2
width: parent.width * modelData.vote_percentage * 0.01
}
}
}
}
}
Repeater {
model: pollData.options
delegate: pollMessageComponent.canAnswer ? canAnswerDelegate : resultDelegate
}
Row {
layoutDirection: Qt.RightToLeft
width: parent.width
spacing: Theme.paddingMedium
Behavior on height { NumberAnimation {}}
Label {
id: totalVoterCount
font.pixelSize: Theme.fontSizeTiny
anchors.verticalCenter: parent.verticalCenter
text: qsTr("%L1 vote(s) total", "number of total votes", pollData.total_voter_count).arg(pollData.total_voter_count)
width: contentWidth
height: contentHeight
horizontalAlignment: Text.AlignRight
color: pollMessageComponent.isOwnMessage ? Theme.secondaryHighlightColor : Theme.secondaryColor
}
Row {
spacing: Theme.paddingSmall
width: parent.width - totalVoterCount.width - parent.spacing
IconButton {
visible: !pollData.is_closed && pollMessageComponent.chosenIndexes.length > 0 && pollData.type.allow_multiple_answers && !pollMessageComponent.hasAnswered
opacity: visible ? 1.0 : 0.0
Behavior on opacity { FadeAnimation {}}
icon.source: "image://theme/icon-m-send"
onClicked: {
pollMessageComponent.sendResponse()
}
}
IconButton {
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});
}
Icon {
opacity: 0.8
source: "image://theme/icon-s-maybe"
anchors {
right: parent.right
top: parent.top
}
}
}
}
}
}
Component {
id: closePollMenuItemComponent
MenuItem {
text: qsTr("Close Poll")
onClicked: {
tdLibWrapper.stopPoll(pollMessageComponent.chatId, pollMessageComponent.messageId);
}
}
}
Component {
id: resetAnswerMenuItemComponent
MenuItem {
text: qsTr("Reset Answer")
onClicked: {
pollMessageComponent.resetChosen()
}
}
}
Component.onCompleted: {
opacity = 1;
if(messageItem && messageItem.menu ) { // workaround to add menu entries
if(!pollData.is_closed && pollMessageComponent.canEdit) {
closePollMenuItemComponent.createObject(messageItem.menu._contentColumn);
}
if(!pollData.is_closed && !pollMessageComponent.isQuiz && pollMessageComponent.hasAnswered) {
resetAnswerMenuItemComponent.createObject(messageItem.menu._contentColumn);
}
}
}
}

View file

@ -97,6 +97,18 @@ function getMessageText(message, simple, myself) {
if (message.content['@type'] === 'messageChatChangeTitle') { if (message.content['@type'] === 'messageChatChangeTitle') {
return myself ? qsTr("changed the chat title to %1", "myself").arg(message.content.title) : qsTr("changed the chat title to %1").arg(message.content.title); return myself ? qsTr("changed the chat title to %1", "myself").arg(message.content.title) : qsTr("changed the chat title to %1").arg(message.content.title);
} }
if (message.content['@type'] === 'messagePoll') {
if(message.content.poll.type['@type'] === "pollTypeQuiz") {
if(message.content.poll.is_anonymous) {
return myself ? qsTr("sent an anonymous quiz", "myself") : qsTr("sent an anonymous quiz");
}
return myself ? qsTr("sent a quiz", "myself") : qsTr("sent a quiz");
}
if(message.content.poll.is_anonymous) {
return myself ? qsTr("sent an anonymous poll", "myself") : qsTr("sent an anonymous poll");
}
return myself ? qsTr("sent a poll", "myself") : qsTr("sent a poll");
}
return qsTr("Unsupported message: %1").arg(message.content['@type'].substring(7)); return qsTr("Unsupported message: %1").arg(message.content['@type'].substring(7));
} }

View file

@ -220,7 +220,6 @@ Page {
tdLibWrapper.openChat(chatInformation.id); tdLibWrapper.openChat(chatInformation.id);
break; break;
case PageStatus.Active: case PageStatus.Active:
console.log("CHAT opendirectly?", chatPage.isInitialized)
if (!chatPage.isInitialized) { if (!chatPage.isInitialized) {
chatModel.initialize(chatInformation); chatModel.initialize(chatInformation);
chatPage.isInitialized = true; chatPage.isInitialized = true;
@ -537,6 +536,7 @@ Page {
property bool containsAudio: (( display.content['@type'] === "messageVoiceNote" ) || ( display.content['@type'] === "messageAudio" )); property bool containsAudio: (( display.content['@type'] === "messageVoiceNote" ) || ( display.content['@type'] === "messageAudio" ));
property bool containsDocument: ( display.content['@type'] === "messageDocument" ) property bool containsDocument: ( display.content['@type'] === "messageDocument" )
property bool containsLocation: ( display.content['@type'] === "messageLocation" || ( display.content['@type'] === "messageVenue" )) property bool containsLocation: ( display.content['@type'] === "messageLocation" || ( display.content['@type'] === "messageVenue" ))
property bool containsPoll: display.content['@type'] === "messagePoll"
menu: ContextMenu { menu: ContextMenu {
MenuItem { MenuItem {
@ -594,6 +594,7 @@ Page {
audioPreviewLoader.active = messageListItem.containsAudio; audioPreviewLoader.active = messageListItem.containsAudio;
documentPreviewLoader.active = messageListItem.containsDocument; documentPreviewLoader.active = messageListItem.containsDocument;
locationPreviewLoader.active = messageListItem.containsLocation; locationPreviewLoader.active = messageListItem.containsLocation;
pollPreviewLoader.active = messageListItem.containsPoll;
forwardedInformationLoader.active = messageListItem.isForwarded; forwardedInformationLoader.active = messageListItem.isForwarded;
} }
} }
@ -921,6 +922,25 @@ Page {
} }
} }
Loader {
id: pollPreviewLoader
active: false
asynchronous: true
width: parent.width
// height: messageListItem.containsLocation ? (item ? item.height : (parent.width * 2 / 3)) : 0
sourceComponent: Component {
id: pollPreviewComponent
PollPreview {
id: messageLocationPreview
width: parent.width
chatId: chatInformation.id
isOwnMessage: messageListItem.isOwnMessage
message: display
messageItem: messageListItem
}
}
}
Timer { Timer {
id: messageDateUpdater id: messageDateUpdater
interval: 60000 interval: 60000
@ -1160,6 +1180,17 @@ Page {
} }
} }
} }
IconButton {
visible: !chatPage.isPrivateChat &&
(chatGroupInformation.status["@type"] === "chatMemberStatusCreator"
|| chatGroupInformation.status["@type"] === "chatMemberStatusAdministrator"
|| (chatGroupInformation.status["@type"] === "chatMemberStatusMember" && chatInformation.permissions.can_send_polls))
icon.source: "image://theme/icon-m-question"
onClicked: {
pageStack.push(Qt.resolvedUrl("../pages/PollCreationPage.qml"), { "chatId" : chatInformation.id, groupName: chatInformation.title});
attachmentOptionsRow.visible = false;
}
}
} }
Row { Row {

View file

@ -154,7 +154,6 @@ Page {
} }
onChatReceived: { onChatReceived: {
if(chat["@extra"] === "openDirectly") { if(chat["@extra"] === "openDirectly") {
console.log("ON CHAT RECEIVED", JSON.stringify(chat, null, 2));
if (status !== PageStatus.Active) { if (status !== PageStatus.Active) {
pageStack.pop(pageStack.find( function(page){ return(page._depth === 0)} ), PageStackAction.Immediate); pageStack.pop(pageStack.find( function(page){ return(page._depth === 0)} ), PageStackAction.Immediate);
} }

View file

@ -0,0 +1,351 @@
/*
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.0
import "../components"
import "../js/functions.js" as Functions
import "../js/twemoji.js" as Emoji
Dialog {
id: pollCreationPage
allowedOrientations: Orientation.All
property string groupName
// poll request data start
property string chatId
property alias pollQuestion: questionTextArea.text
property ListModel options: ListModel {
ListElement {
text: ""
}
}
property alias anonymous: anonymousSwitch.checked
property int correctOption: -1
property alias quiz: quizSwitch.checked
property alias multiple: multipleSwitch.checked
property string replyToMessageId: "0"
// poll request data end
canAccept: validationErrors.length === 0
onDone: {
}
onAcceptPendingChanged: {
if(acceptPending) {
validate();
if(validationErrors.length > 0) {
validationErrorsVisible = true;
contentFlickable.scrollToTop();
}
}
}
property var validationErrorsVisible: false
property var validationErrors:[""]
function validate() {
var errors = [];
if(pollQuestion.length === 0) {
errors.push(qsTr("You have to enter a question."));
} else if(pollQuestion.length > 255) {
errors.push(qsTr("The question has to be shorter than 256 characters."));
}
if(options.count < 2 || options.count > 10) {
errors.push(qsTr("A poll requires 2-10 answers."));
} else {
for(var i = 0; i < options.count; i += 1) {
var len = options.get(i).text.length
if(len < 1 || len > 100) {
errors.push(qsTr("All answers have to contain 1-100 characters."));
break;
}
}
}
if(quiz && (correctOption < 0 || correctOption > options.count - 1)) {
errors.push(qsTr("To send a quiz, you have to specify the right answer."));
}
if(errors.length === 0) {
validationErrorsVisible = false;
}
validationErrors = errors;
}
function createNewOption() {
if(options.count < 10) {
pollCreationPage.options.append({text:""});
focusLastOptionTimer.start();
}
}
signal focusOption(int focusIndex)
DialogHeader {
id: header
dialog: pollCreationPage
title: qsTr("Create a Poll", "Dialog Header")
}
Label {
id: subHeaderLabel
anchors {
verticalCenter: header.bottom
left: parent.left
right: parent.right
leftMargin: Theme.horizontalPageMargin
rightMargin: Theme.horizontalPageMargin
}
color: Theme.secondaryHighlightColor
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
text: qsTr("in %1", "After dialog header… Create a Poll in [group name]").arg(Emoji.emojify(pollCreationPage.groupName, font.pixelSize))
font.pixelSize: Theme.fontSizeSmall
}
SilicaFlickable {
id: contentFlickable
clip: true
anchors {
top: subHeaderLabel.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
contentHeight: contentColumn.height
Column {
id: contentColumn
width: parent.width
topPadding: Theme.paddingLarge
bottomPadding: Theme.paddingLarge
Item {
id: errorItem
width: parent.width - Theme.horizontalPageMargin * 2
x: Theme.horizontalPageMargin
property bool shown: pollCreationPage.validationErrorsVisible && pollCreationPage.validationErrors.length > 0
property int visibleHeight: errorContentColumn.height
height: pollCreationPage.validationErrorsVisible ? visibleHeight : 0
clip: true;
opacity: pollCreationPage.validationErrorsVisible ? 1.0 : 0.0
Behavior on opacity { FadeAnimation {} }
Behavior on height { NumberAnimation {duration: 200; easing.type: Easing.InOutQuad}}
Rectangle {
color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity)
anchors.fill: parent
radius: Theme.paddingLarge
IconButton {
icon.source: "image://theme/icon-m-close"
anchors {
right: parent.right
top: parent.top
}
onClicked: {
pollCreationPage.validationErrorsVisible = false
}
}
}
Column {
id: errorContentColumn
width: parent.width - Theme.paddingLarge * 2 - Theme.itemSizeSmall
spacing: Theme.paddingMedium
padding: Theme.paddingLarge
Repeater {
model: pollCreationPage.validationErrors
delegate: Label {
font.pixelSize: Theme.fontSizeSmall
color: Theme.highlightColor
width: errorContentColumn.width
text: modelData
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
leftPadding: Theme.iconSizeSmall + Theme.paddingSmall
Icon {
highlighted: true
source: "image://theme/icon-s-high-importance"
y: Theme.paddingSmall / 2
}
}
}
}
}
TextArea {
id: questionTextArea
width: parent.width
placeholderText: qsTr("Enter your question here")
property int charactersLeft: 255 - text.length
color: charactersLeft < 0 ? Theme.errorColor : Theme.highlightColor
label: qsTr("Question (%n1 characters left)", "", charactersLeft).arg(charactersLeft)
wrapMode: TextEdit.Wrap
onFocusChanged: {
validate();
}
}
SectionHeader {
topPadding: 0
text: qsTr("Answers", "Section header")
}
Column {
id: optionsListView
width: parent.width - Theme.horizontalPageMargin * 2
x: Theme.horizontalPageMargin
add: Transition {
NumberAnimation { properties: "opacity"; from: 0; to: 1; duration: 200; easing.type: Easing.InOutCubic }
NumberAnimation { properties: "height"; from: 0; to: ViewTransition.item.childrenRect.height; duration: 200; easing.type: Easing.InOutCubic }
}
move: Transition {
NumberAnimation { properties: "y"; duration: 200; easing.type: Easing.InOutCubic }
}
Behavior on height { NumberAnimation {duration: 200; easing.type: Easing.InOutCubic}}
Repeater {
model: pollCreationPage.options
delegate: Row {
width: parent.width
BackgroundItem {
id: answerCorrectBackgroundItem
width: enabled ? Theme.itemSizeSmall : 0
contentItem.radius: height/2
height: Theme.itemSizeSmall
property bool checked: pollCreationPage.correctOption === index
enabled: pollCreationPage.quiz
opacity: enabled ? (checked ? 1.0 : 0.5) : 0.0
Behavior on opacity { FadeAnimation {} }
Behavior on width { NumberAnimation {duration: 500; easing.type: Easing.InOutQuad}}
Icon {
source: "image://theme/icon-m-accept"
anchors.centerIn: parent
}
onClicked: {
pollCreationPage.correctOption = index
validate();
}
}
TextField {
id: answerTextArea
textMargin: Theme.paddingSmall
width: answerCorrectBackgroundItem.enabled ? parent.width - Theme.itemSizeSmall * 2 : parent.width - Theme.itemSizeSmall
Behavior on width { NumberAnimation {duration: 500; easing.type: Easing.InOutCubic}}
text: model.text
onTextChanged: {
pollCreationPage.options.setProperty(index, "text", text)
pollCreationPage.validate()
}
placeholderText: qsTr("Enter an answer here")
property int charactersLeft: 100 - text.length
color: charactersLeft < 0 ? Theme.errorColor : Theme.highlightColor
label: qsTr("Answer (%n1 characters left)", "", charactersLeft).arg(charactersLeft)
property bool hasNextOption: index < pollCreationPage.options.count - 1
EnterKey.onClicked: {
if(hasNextOption) {
pollCreationPage.focusOption(index + 1);
} else if(pollCreationPage.options.count < 10) {
pollCreationPage.createNewOption();
} else {
focus = false;
}
}
EnterKey.iconSource: hasNextOption ? "image://theme/icon-m-enter-next" : (pollCreationPage.options.count < 10 ? "image://theme/icon-m-add" : "image://theme/icon-m-enter-close")
onFocusChanged: {
validate();
}
}
Connections {
target: pollCreationPage
onFocusOption: {
if(focusIndex === index) answerTextArea.forceActiveFocus()
}
}
IconButton {
icon.source: "image://theme/icon-m-remove"
onClicked: {
pollCreationPage.options.remove(index)
validate();
}
}
}
}
}
ButtonLayout {
Button {
enabled: pollCreationPage.options.count < 10
text: qsTr("Add an answer")
onClicked: {
pollCreationPage.createNewOption();
validate();
}
}
}
Timer {
id: focusLastOptionTimer
interval: 20
onTriggered: {
pollCreationPage.focusOption(pollCreationPage.options.count - 1);
}
}
SectionHeader {
text: qsTr("Poll Options", "Section header")
}
TextSwitch {
id: anonymousSwitch
text: qsTr("Anonymous answers")
}
TextSwitch {
id: multipleSwitch
text: qsTr("Multiple answers allowed")
onCheckedChanged: {
if(checked) {
quizSwitch.checked = false
}
}
}
TextSwitch {
id: quizSwitch
text: qsTr("Quiz Mode")
onCheckedChanged: {
if(checked) {
multipleSwitch.checked = false
}
validate();
}
description: qsTr("Quizzes have one correct answer. Participants can't revoke their responses.")
}
}
}
onAccepted: {
var optionsArr = [];
for(var i = 0; i < options.count; i += 1) {
optionsArr.push(options.get(i).text);
}
tdLibWrapper.sendPollMessage(chatId, pollQuestion, optionsArr, anonymous, quiz ? correctOption : -1, multiple, "0");
}
}

View file

@ -0,0 +1,328 @@
/*
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.0
import "../components"
import "../js/functions.js" as Functions
import "../js/twemoji.js" as Emoji
Page {
id: pollResultsPage
allowedOrientations: Orientation.All
property string chatId;
property var message: ({});
property string messageId: message.id;
property var pollData: message.content.poll
property var userInformation: tdLibWrapper.getUserInformation(message.sender_user_id)
property bool isQuiz: pollData.type['@type'] === "pollTypeQuiz"
property bool hasAnswered: {
return pollData.options.filter(function(option){
return option.is_chosen
}).length > 0;
}
property bool canAnswer: !hasAnswered && !pollData.is_closed
onCanAnswerChanged: {
if(canAnswer) { // vote removed from another client?
pageStack.pop()
}
}
SilicaFlickable {
anchors.fill: parent
contentHeight: pageHeader.height + contentColumn.height
PageHeader {
id: pageHeader
title: pollResultsPage.isQuiz ? qsTr("Quiz Results") : qsTr("Poll Results")
description: qsTr("%L1 vote(s) total", "number of total votes", pollData.total_voter_count).arg(pollData.total_voter_count)
leftMargin: headerPictureThumbnail.width + Theme.paddingLarge + Theme.horizontalPageMargin
ProfileThumbnail {
id: headerPictureThumbnail
photoData: (typeof pollResultsPage.userInformation.profile_photo !== "undefined") ? pollResultsPage.userInformation.profile_photo.small : ""
replacementStringHint: Emoji.emojify(Functions.getUserName(pollResultsPage.userInformation), font.pixelSize)
width: visible ? Theme.itemSizeSmall : 0
height: visible ? Theme.itemSizeSmall : 0
anchors {
verticalCenter: pageHeader.verticalCenter
left: parent.left
leftMargin: Theme.horizontalPageMargin
}
}
}
Column {
id: contentColumn
anchors {
left: parent.left
leftMargin: Theme.horizontalPageMargin
right: parent.right
rightMargin: Theme.horizontalPageMargin
top: pageHeader.bottom
}
SectionHeader {
x: 0
text: qsTr("Question", "section header")
}
// Label {
// width: parent.width
// font.pixelSize: Theme.fontSizeTiny
// wrapMode: Text.Wrap
// color: Theme.secondaryHighlightColor
// text: JSON.stringify(pollData, null, 2)
// }
// Label {
// width: parent.width
// font.pixelSize: Theme.fontSizeTiny
// wrapMode: Text.Wrap
// color: Theme.secondaryHighlightColor
// text: JSON.stringify(userInformation, null, 2)
// }
Label {
width: parent.width
wrapMode: Text.Wrap
color: Theme.secondaryHighlightColor
text: Emoji.emojify(pollData.question, font.pixelSize)
}
Column {
id: resultsColumn
width: parent.width
topPadding: Theme.paddingLarge
bottomPadding: Theme.paddingLarge
SectionHeader {
x: 0
text: qsTr("Results", "section header")
}
Repeater {
model: pollData.options
delegate: Item {
id: optionDelegate
width: resultsColumn.width
height: displayOptionLabel.height + displayOptionStatistics.height + displayOptionUsers.height + Theme.paddingLarge
property ListModel users: ListModel {}
property string usersResponseIdentifierString: "pollResults."+pollResultsPage.chatId+"."+pollResultsPage.messageId+"."+index
function loadUsers() {
if(users.count < modelData.voter_count) {
tdLibWrapper.getPollVoters(pollResultsPage.chatId, pollResultsPage.messageId, index, 50, users.length, usersResponseIdentifierString)
}
}
Component.onCompleted: {
// loadUsers()
loadUsersTimer.start()
}
Timer {
id: loadUsersTimer
interval: index * 80
onTriggered: {
optionDelegate.loadUsers();
}
}
Connections {
target: tdLibWrapper
onUsersReceived: {
if(extra === optionDelegate.usersResponseIdentifierString) {
for(var i = 0; i < userIds.length; i += 1) {
optionDelegate.users.append({id: userIds[i], user:tdLibWrapper.getUserInformation(userIds[i])});
console.log("APPEND USER", JSON.stringify({id: userIds[i], user:tdLibWrapper.getUserInformation(userIds[i])}));
}
loadUsersTimer.start();
}
}
}
Rectangle {
id: displayOptionChosenMarker
height: parent.height
width: Theme.horizontalPageMargin/2
color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity)
visible: modelData.is_chosen
x: -width
}
OpacityRampEffect {
sourceItem: displayOptionChosenMarker
direction: OpacityRamp.LeftToRight
}
Column {
id: iconsColumn
width: pollResultsPage.isQuiz ?Theme.iconSizeSmall + Theme.paddingMedium : Theme.paddingMedium
height: displayOptionLabel.height + displayOptionStatistics.height
anchors {
left: parent.left
// verticalCenter: parent.verticalCenter
}
Icon {
highlighted: true
property bool isRight: pollResultsPage.isQuiz && pollData.type.correct_option_id === index
source: "image://theme/icon-s-accept"
visible: isRight
anchors.verticalCenter: parent.verticalCenter
}
}
Label {
id: displayOptionLabel
text: Emoji.emojify(modelData.text, Theme.fontSizeMedium)
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
anchors {
left: iconsColumn.right
top: parent.top
right: parent.right
}
color: Theme.highlightColor
}
Item {
id: displayOptionStatistics
height: optionVoterPercentage.height + optionVoterPercentageBar.height
anchors {
top: displayOptionLabel.bottom
left: iconsColumn.right
right: parent.right
}
Label {
id: optionVoterCount
font.pixelSize: Theme.fontSizeTiny
text: modelData.is_chosen ? qsTr("%L1 vote(s) including yours", "number of votes for option", modelData.voter_count).arg(modelData.voter_count) : qsTr("%L1 vote(s)", "number of votes for option", modelData.voter_count).arg(modelData.voter_count)
anchors {
left: parent.left
right: parent.horizontalCenter
rightMargin: Theme.paddingSmall
}
color: Theme.secondaryHighlightColor
}
Label {
id: optionVoterPercentage
font.pixelSize: Theme.fontSizeTiny
text: qsTr("%L1\%", "% of votes for option").arg(modelData.vote_percentage)
horizontalAlignment: Text.AlignRight
anchors {
right: parent.right
left: parent.horizontalCenter
leftMargin: Theme.paddingSmall
}
color: Theme.secondaryHighlightColor
}
Rectangle {
id: optionVoterPercentageBar
height: Theme.paddingSmall
width: parent.width
color: Theme.rgba(Theme.secondaryHighlightColor, 0.3)
radius: height/2
anchors {
left: parent.left
bottom: parent.bottom
}
Rectangle {
height: parent.height
color: Theme.highlightColor
radius: height/2
width: parent.width * modelData.vote_percentage * 0.01
}
}
}
// users voted for this:
Flow {
id: displayOptionUsers
anchors.top: displayOptionStatistics.bottom
width: parent.width
visible: optionDelegate.users.count > 0
topPadding: Theme.paddingLarge
spacing: Theme.paddingMedium
leftPadding: iconsColumn.width
property int itemHeight: Theme.itemSizeExtraSmall / 2
Item {
height: displayOptionUsers.itemHeight
width: chosenByUserText.width
Label {
id: chosenByUserText
font.pixelSize: Theme.fontSizeTiny
text: qsTr("Chosen by:", "This answer has been chosen by the following users")
width: contentWidth
anchors.centerIn: parent
color: Theme.secondaryHighlightColor
}
}
Repeater {
model: optionDelegate.users
delegate:
Item {
id: chosenByUserItem
width: chosenByUserPictureThumbnail.width + chosenByUserLabel.width + Theme.paddingSmall
height: displayOptionUsers.itemHeight
ProfileThumbnail {
id: chosenByUserPictureThumbnail
photoData: (typeof model.user.profile_photo !== "undefined") ? model.user.profile_photo.small : ""
replacementStringHint: chosenByUserLabel.text
width: visible ? parent.height : 0
height: width
anchors {
left: parent.left
verticalCenter: parent.verticalCenter
}
}
Label {
id: chosenByUserLabel
font.pixelSize: Theme.fontSizeSmall
text: Emoji.emojify(Functions.getUserName(model.user), font.pixelSize)
width: contentWidth
height: contentHeight
color: Theme.highlightColor
anchors {
right: parent.right
verticalCenter: parent.verticalCenter
}
}
}
}
}
}
}
}
}
}
Connections {
target: tdLibWrapper
onMessageContentUpdated: {
if(chatId === pollResultsPage.chatId && messageId === pollResultsPage.messageId) {
pollResultsPage.pollData = newContent.poll;
}
}
}
}

View file

@ -54,5 +54,11 @@ QString FernschreiberUtils::getMessageShortText(const QVariantMap &messageConten
if (contentType == "messageChatChangeTitle") { if (contentType == "messageChatChangeTitle") {
return myself ? tr("changed the chat title", "myself") : tr("changed the chat title"); return myself ? tr("changed the chat title", "myself") : tr("changed the chat title");
} }
if (contentType == "messagePoll") {
if(messageContent.value("poll").toMap().value("type").toMap().value("@type").toString() == "pollTypeQuiz") {
return myself ? tr("sent a quiz", "myself") : tr("sent a quiz");
}
return myself ? tr("sent a poll", "myself") : tr("sent a poll");
}
return tr("Unsupported message: %1").arg(contentType.mid(7)); return tr("Unsupported message: %1").arg(contentType.mid(7));
} }

View file

@ -116,6 +116,7 @@ TDLibReceiver::TDLibReceiver(void *tdLibClient, QObject *parent) : QThread(paren
handlers.insert("userProfilePhotos", &TDLibReceiver::processUserProfilePhotos); handlers.insert("userProfilePhotos", &TDLibReceiver::processUserProfilePhotos);
handlers.insert("updateChatPermissions", &TDLibReceiver::processUpdateChatPermissions); handlers.insert("updateChatPermissions", &TDLibReceiver::processUpdateChatPermissions);
handlers.insert("updateChatTitle", &TDLibReceiver::processUpdateChatTitle); handlers.insert("updateChatTitle", &TDLibReceiver::processUpdateChatTitle);
handlers.insert("users", &TDLibReceiver::processUsers);
} }
void TDLibReceiver::setActive(bool active) void TDLibReceiver::setActive(bool active)
@ -494,3 +495,9 @@ void TDLibReceiver::processUpdateChatTitle(const QVariantMap &receivedInformatio
LOG("Received UpdateChatTitle"); LOG("Received UpdateChatTitle");
emit chatTitleUpdated(receivedInformation.value("chat_id").toString(), receivedInformation.value("title").toString()); emit chatTitleUpdated(receivedInformation.value("chat_id").toString(), receivedInformation.value("title").toString());
} }
void TDLibReceiver::processUsers(const QVariantMap &receivedInformation)
{
LOG("Received Users");
emit usersReceived(receivedInformation.value(EXTRA).toString(), receivedInformation.value("user_ids").toList(), receivedInformation.value("total_count").toInt());
}

View file

@ -80,6 +80,7 @@ signals:
void userProfilePhotos(const QString &extra, const QVariantList &photos, int totalPhotos); void userProfilePhotos(const QString &extra, const QVariantList &photos, int totalPhotos);
void chatPermissionsUpdated(const QString &chatId, const QVariantMap &chatPermissions); void chatPermissionsUpdated(const QString &chatId, const QVariantMap &chatPermissions);
void chatTitleUpdated(const QString &chatId, const QString &title); void chatTitleUpdated(const QString &chatId, const QString &title);
void usersReceived(const QString &extra, const QVariantList &userIds, int totalUsers);
private: private:
typedef void (TDLibReceiver::*Handler)(const QVariantMap &); typedef void (TDLibReceiver::*Handler)(const QVariantMap &);
@ -134,6 +135,7 @@ private:
void processUserProfilePhotos(const QVariantMap &receivedInformation); void processUserProfilePhotos(const QVariantMap &receivedInformation);
void processUpdateChatPermissions(const QVariantMap &receivedInformation); void processUpdateChatPermissions(const QVariantMap &receivedInformation);
void processUpdateChatTitle(const QVariantMap &receivedInformation); void processUpdateChatTitle(const QVariantMap &receivedInformation);
void processUsers(const QVariantMap &receivedInformation);
}; };
#endif // TDLIBRECEIVER_H #endif // TDLIBRECEIVER_H

View file

@ -104,6 +104,7 @@ TDLibWrapper::TDLibWrapper(QObject *parent) : QObject(parent)
connect(this->tdLibReceiver, SIGNAL(userProfilePhotos(QString, QVariantList, int)), this, SIGNAL(userProfilePhotosReceived(QString, QVariantList, int))); connect(this->tdLibReceiver, SIGNAL(userProfilePhotos(QString, QVariantList, int)), this, SIGNAL(userProfilePhotosReceived(QString, QVariantList, int)));
connect(this->tdLibReceiver, SIGNAL(chatPermissionsUpdated(QString, QVariantMap)), this, SIGNAL(chatPermissionsUpdated(QString, QVariantMap))); connect(this->tdLibReceiver, SIGNAL(chatPermissionsUpdated(QString, QVariantMap)), this, SIGNAL(chatPermissionsUpdated(QString, QVariantMap)));
connect(this->tdLibReceiver, SIGNAL(chatTitleUpdated(QString, QString)), this, SIGNAL(chatTitleUpdated(QString, QString))); connect(this->tdLibReceiver, SIGNAL(chatTitleUpdated(QString, QString)), this, SIGNAL(chatTitleUpdated(QString, QString)));
connect(this->tdLibReceiver, SIGNAL(usersReceived(QString, QVariantList, int)), this, SIGNAL(usersReceived(QString, QVariantList, int)));
connect(&emojiSearchWorker, SIGNAL(searchCompleted(QString, QVariantList)), this, SLOT(handleEmojiSearchCompleted(QString, QVariantList))); connect(&emojiSearchWorker, SIGNAL(searchCompleted(QString, QVariantList)), this, SLOT(handleEmojiSearchCompleted(QString, QVariantList)));
@ -382,6 +383,36 @@ void TDLibWrapper::sendStickerMessage(const QString &chatId, const QString &file
this->sendRequest(requestObject); this->sendRequest(requestObject);
} }
void TDLibWrapper::sendPollMessage(const QString &chatId, const QString &question, const QVariantList &options, const bool &anonymous, const int &correctOption, const bool &multiple, const QString &replyToMessageId)
{
LOG("Sending poll message" << chatId << question << replyToMessageId);
QVariantMap requestObject;
requestObject.insert(_TYPE, "sendMessage");
requestObject.insert("chat_id", chatId);
if (replyToMessageId != "0") {
requestObject.insert("reply_to_message_id", replyToMessageId);
}
QVariantMap inputMessageContent;
inputMessageContent.insert(_TYPE, "inputMessagePoll");
QVariantMap pollType;
if(correctOption > -1) {
pollType.insert(_TYPE, "pollTypeQuiz");
pollType.insert("correct_option_id", correctOption);
} else {
pollType.insert(_TYPE, "pollTypeRegular");
pollType.insert("allow_multiple_answers", multiple);
}
inputMessageContent.insert("type", pollType);
inputMessageContent.insert("question", question);
inputMessageContent.insert("options", options);
inputMessageContent.insert("is_anonymous", anonymous);
requestObject.insert("input_message_content", inputMessageContent);
this->sendRequest(requestObject);
}
void TDLibWrapper::getMessage(const QString &chatId, const QString &messageId) void TDLibWrapper::getMessage(const QString &chatId, const QString &messageId)
{ {
LOG("Retrieving message" << chatId << messageId); LOG("Retrieving message" << chatId << messageId);
@ -621,6 +652,41 @@ void TDLibWrapper::toggleSupergroupIsAllHistoryAvailable(const QString &groupId,
this->sendRequest(requestObject); this->sendRequest(requestObject);
} }
void TDLibWrapper::setPollAnswer(const QString &chatId, const qlonglong &messageId, QVariantList optionIds)
{
LOG("Setting Poll Answer");
QVariantMap requestObject;
requestObject.insert(_TYPE, "setPollAnswer");
requestObject.insert("chat_id", chatId);
requestObject.insert("message_id", messageId);
requestObject.insert("option_ids", optionIds);
this->sendRequest(requestObject);
}
void TDLibWrapper::stopPoll(const QString &chatId, const qlonglong &messageId)
{
LOG("Stopping Poll");
QVariantMap requestObject;
requestObject.insert(_TYPE, "stopPoll");
requestObject.insert("chat_id", chatId);
requestObject.insert("message_id", messageId);
this->sendRequest(requestObject);
}
void TDLibWrapper::getPollVoters(const QString &chatId, const qlonglong &messageId, const int &optionId, const int &limit, const int &offset, const QString &extra)
{
LOG("Retrieving Poll Voters");
QVariantMap requestObject;
requestObject.insert(_TYPE, "getPollVoters");
requestObject.insert(_EXTRA, extra);
requestObject.insert("chat_id", chatId);
requestObject.insert("message_id", messageId);
requestObject.insert("option_id", optionId);
requestObject.insert("offset", offset);
requestObject.insert("limit", limit); //max 50
this->sendRequest(requestObject);
}
void TDLibWrapper::searchEmoji(const QString &queryString) void TDLibWrapper::searchEmoji(const QString &queryString)
{ {
LOG("Searching emoji" << queryString); LOG("Searching emoji" << queryString);

View file

@ -121,6 +121,7 @@ public:
Q_INVOKABLE void sendVideoMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0"); Q_INVOKABLE void sendVideoMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0");
Q_INVOKABLE void sendDocumentMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0"); Q_INVOKABLE void sendDocumentMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0");
Q_INVOKABLE void sendStickerMessage(const QString &chatId, const QString &fileId, const QString &replyToMessageId = "0"); Q_INVOKABLE void sendStickerMessage(const QString &chatId, const QString &fileId, const QString &replyToMessageId = "0");
Q_INVOKABLE void sendPollMessage(const QString &chatId, const QString &question, const QVariantList &options, const bool &anonymous, const int &correctOption, const bool &multiple, const QString &replyToMessageId = "0");
Q_INVOKABLE void getMessage(const QString &chatId, const QString &messageId); Q_INVOKABLE void getMessage(const QString &chatId, const QString &messageId);
Q_INVOKABLE void setOptionInteger(const QString &optionName, int optionValue); Q_INVOKABLE void setOptionInteger(const QString &optionName, int optionValue);
Q_INVOKABLE void setChatNotificationSettings(const QString &chatId, const QVariantMap &notificationSettings); Q_INVOKABLE void setChatNotificationSettings(const QString &chatId, const QVariantMap &notificationSettings);
@ -142,6 +143,9 @@ public:
Q_INVOKABLE void setChatTitle(const QString &chatId, const QString &title); Q_INVOKABLE void setChatTitle(const QString &chatId, const QString &title);
Q_INVOKABLE void setBio(const QString &bio); Q_INVOKABLE void setBio(const QString &bio);
Q_INVOKABLE void toggleSupergroupIsAllHistoryAvailable(const QString &groupId, bool isAllHistoryAvailable); Q_INVOKABLE void toggleSupergroupIsAllHistoryAvailable(const QString &groupId, bool isAllHistoryAvailable);
Q_INVOKABLE void setPollAnswer(const QString &chatId, const qlonglong &messageId, QVariantList optionIds);
Q_INVOKABLE void stopPoll(const QString &chatId, const qlonglong &messageId);
Q_INVOKABLE void getPollVoters(const QString &chatId, const qlonglong &messageId, const int &optionId, const int &limit, const int &offset, const QString &extra);
// Others (candidates for extraction ;)) // Others (candidates for extraction ;))
Q_INVOKABLE void searchEmoji(const QString &queryString); Q_INVOKABLE void searchEmoji(const QString &queryString);
@ -198,6 +202,7 @@ signals:
void userProfilePhotosReceived(const QString &extra, const QVariantList &photos, int totalPhotos); void userProfilePhotosReceived(const QString &extra, const QVariantList &photos, int totalPhotos);
void chatPermissionsUpdated(const QString &chatId, const QVariantMap &permissions); void chatPermissionsUpdated(const QString &chatId, const QVariantMap &permissions);
void chatTitleUpdated(const QString &chatId, const QString &title); void chatTitleUpdated(const QString &chatId, const QString &title);
void usersReceived(const QString &extra, const QVariantList &userIds, int totalUsers);
public slots: public slots:
void handleVersionDetected(const QString &version); void handleVersionDetected(const QString &version);

View file

@ -542,6 +542,24 @@
<source>changed the chat title</source> <source>changed the chat title</source>
<translation>hat den Chattitel geändert</translation> <translation>hat den Chattitel geändert</translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation>haben eine Umfrage geschickt</translation>
</message>
<message>
<source>sent a poll</source>
<translation>hat eine Umfrage geschickt</translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation>haben ein Quiz geschickt</translation>
</message>
<message>
<source>sent a quiz</source>
<translation>hat ein Quiz geschickt</translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -685,6 +703,178 @@
<translation>Sie haben noch keine Chats.</translation> <translation>Sie haben noch keine Chats.</translation>
</message> </message>
</context> </context>
<context>
<name>PollCreationPage</name>
<message>
<source>All answers have to contain 1-100 characters.</source>
<translation>Alle Antworten müssen 1-100 Zeichen beinhalten.</translation>
</message>
<message>
<source>To send a quiz, you have to specify the right answer.</source>
<translation>Um ein Quiz zu senden, müssen Sie die richtige Antwort auswählen.</translation>
</message>
<message>
<source>You have to enter a question.</source>
<translation>Sie müssen eine Frage eingeben.</translation>
</message>
<message>
<source>The question has to be shorter than 256 characters.</source>
<translation>Die Frage muss kürzer als 256 Zeichen sein.</translation>
</message>
<message>
<source>A poll requires 2-10 answers.</source>
<translation>Eine Umfrage benötigt 2-10 Antworten.</translation>
</message>
<message>
<source>Create a Poll</source>
<comment>Dialog Header</comment>
<translation>Erstellen Sie eine Umfrage</translation>
</message>
<message>
<source>in %1</source>
<comment>After dialog header Create a Poll in [group name]</comment>
<translation>in %1</translation>
</message>
<message>
<source>Enter your question here</source>
<translation>Geben Sie Ihre Frage ein</translation>
</message>
<message numerus="yes">
<source>Question (%n1 characters left)</source>
<translation>
<numerusform>Frage (%n1 Zeichen übrig)</numerusform>
<numerusform>Frage (%n1 Zeichen übrig)</numerusform>
</translation>
</message>
<message>
<source>Answers</source>
<comment>Section header</comment>
<translation>Antworten</translation>
</message>
<message>
<source>Enter an answer here</source>
<translation>Geben Sie eine Antwort ein</translation>
</message>
<message numerus="yes">
<source>Answer (%n1 characters left)</source>
<translation>
<numerusform>Antwort (%n1 Zeichen übrig)</numerusform>
<numerusform>Antwort (%n1 Zeichen übrig)</numerusform>
</translation>
</message>
<message>
<source>Add an answer</source>
<translation>Antwort hinzufügen</translation>
</message>
<message>
<source>Poll Options</source>
<comment>Section header</comment>
<translation>Umfrageoptionen</translation>
</message>
<message>
<source>Anonymous answers</source>
<translation>Anonyme Antworten</translation>
</message>
<message>
<source>Multiple answers allowed</source>
<translation>Mehrere Antworten erlaubt</translation>
</message>
<message>
<source>Quiz Mode</source>
<translation>Quizmodus</translation>
</message>
<message>
<source>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</source>
<translation>Quizze haben eine korrekte Antwort. Teilnehmer können ihre Antwort nicht zurückziehen.</translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation>%L1%</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>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%L1 Stimme insgesamt</numerusform>
<numerusform>%L1 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>
<source>Quiz Results</source>
<translation>Quizergebnis</translation>
</message>
<message>
<source>Poll Results</source>
<translation>Umfrageergebnis</translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation>
<numerusform>%L1 Stimme insgesamt</numerusform>
<numerusform>%L1 Stimmen insgesamt</numerusform>
</translation>
</message>
<message>
<source>Question</source>
<comment>section header</comment>
<translation>Frage</translation>
</message>
<message>
<source>Results</source>
<comment>section header</comment>
<translation>Ergebnis</translation>
</message>
<message numerus="yes">
<source>%L1 vote(s)</source>
<comment>number of votes for option</comment>
<translation>
<numerusform>%L1 Antwort</numerusform>
<numerusform>%L1 Antworten</numerusform>
</translation>
</message>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation>%L1%</translation>
</message>
<message>
<source>Chosen by:</source>
<comment>This answer has been chosen by the following users</comment>
<translation>Gewählt von:</translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation>
<numerusform>%L1 Antwort inklusive Ihrer</numerusform>
<numerusform>%L1 Antworten inklusive Ihrer</numerusform>
</translation>
</message>
</context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
<message> <message>
@ -964,5 +1154,41 @@
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<translation>hat den Chattitel zu %1 geändert</translation> <translation>hat den Chattitel zu %1 geändert</translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation>haben eine Umfrage gesendet</translation>
</message>
<message>
<source>sent a poll</source>
<translation>hat eine Umfrage gesendet</translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<comment>myself</comment>
<translation>haben ein anonymes Quiz gesendet</translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<translation>hat ein anonymes Quiz gesendet</translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation>haben ein Quiz gesendet</translation>
</message>
<message>
<source>sent a quiz</source>
<translation>hat ein Quiz gesendet</translation>
</message>
<message>
<source>sent an anonymous poll</source>
<comment>myself</comment>
<translation>haben eine anonyme Umfrage gesendet</translation>
</message>
<message>
<source>sent an anonymous poll</source>
<translation>hat eine anonyme Umfrage gesendet</translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -91,67 +91,67 @@
<name>ChatInformationPage</name> <name>ChatInformationPage</name>
<message> <message>
<source>Unmute Chat</source> <source>Unmute Chat</source>
<translation type="unfinished">habilitar notificación</translation> <translation>habilitar notificación</translation>
</message> </message>
<message> <message>
<source>Mute Chat</source> <source>Mute Chat</source>
<translation type="unfinished">deshabilitar notificación</translation> <translation>deshabilitar notificación</translation>
</message> </message>
<message> <message>
<source>Unknown</source> <source>Unknown</source>
<translation type="unfinished"></translation> <translation>Desconocido</translation>
</message> </message>
<message> <message>
<source>The Invite Link has been copied to the clipboard.</source> <source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished"></translation> <translation>El enlace de invitación se ha copiado en el portapapeles.</translation>
</message> </message>
<message> <message>
<source>%1 members, %2 online</source> <source>%1 members, %2 online</source>
<translation type="unfinished">%1 miembros, %2 en línea</translation> <translation>%1 miembros, %2 en línea</translation>
</message> </message>
<message> <message>
<source>%1 subscribers</source> <source>%1 subscribers</source>
<translation type="unfinished">%1 suscriptores</translation> <translation>%1 suscriptores</translation>
</message> </message>
<message> <message>
<source>%1 members</source> <source>%1 members</source>
<translation type="unfinished">%1 miembros</translation> <translation>%1 miembros</translation>
</message> </message>
<message> <message>
<source>Leave Group</source> <source>Leave Group</source>
<translation type="unfinished"></translation> <translation>Salir del grupo</translation>
</message> </message>
<message> <message>
<source>Leaving chat</source> <source>Leaving chat</source>
<translation type="unfinished"></translation> <translation>Saliendo de la charla</translation>
</message> </message>
<message> <message>
<source>Info</source> <source>Info</source>
<comment>group or user infotext header</comment> <comment>group or user infotext header</comment>
<translation type="unfinished"></translation> <translation>Detalles</translation>
</message> </message>
<message> <message>
<source>Phone Number</source> <source>Phone Number</source>
<comment>user phone number header</comment> <comment>user phone number header</comment>
<translation type="unfinished"></translation> <translation>Número de teléfono</translation>
</message> </message>
<message> <message>
<source>Invite Link</source> <source>Invite Link</source>
<comment>header</comment> <comment>header</comment>
<translation type="unfinished"></translation> <translation>Enlace de invitación</translation>
</message> </message>
<message> <message>
<source>There is no information text available, yet.</source> <source>There is no information text available, yet.</source>
<translation type="unfinished"></translation> <translation>Aún no hay texto de información disponible.</translation>
</message> </message>
<message> <message>
<source>Chat Title</source> <source>Chat Title</source>
<comment>group title header</comment> <comment>group title header</comment>
<translation type="unfinished"></translation> <translation>Título de charla</translation>
</message> </message>
<message> <message>
<source>Enter 1-128 characters</source> <source>Enter 1-128 characters</source>
<translation type="unfinished"></translation> <translation>Introducir 1-128 caracteres</translation>
</message> </message>
</context> </context>
<context> <context>
@ -159,37 +159,37 @@
<message> <message>
<source>Loading common chats</source> <source>Loading common chats</source>
<comment>chats you have in common with a user</comment> <comment>chats you have in common with a user</comment>
<translation type="unfinished"></translation> <translation>Cargando charlas comunes</translation>
</message> </message>
<message> <message>
<source>Unknown</source> <source>Unknown</source>
<translation type="unfinished"></translation> <translation>Desconocido</translation>
</message> </message>
<message> <message>
<source>Groups</source> <source>Groups</source>
<comment>Button: groups in common (short)</comment> <comment>Button: groups in common (short)</comment>
<translation type="unfinished"></translation> <translation>Grupos</translation>
</message> </message>
<message> <message>
<source>Members</source> <source>Members</source>
<comment>Button: Group Members</comment> <comment>Button: Group Members</comment>
<translation type="unfinished"></translation> <translation>Miembros</translation>
</message> </message>
<message> <message>
<source>Loading group members</source> <source>Loading group members</source>
<translation type="unfinished"></translation> <translation>Cargando miembros del grupo</translation>
</message> </message>
<message> <message>
<source>You</source> <source>You</source>
<translation type="unfinished"></translation> <translation>Usted</translation>
</message> </message>
<message> <message>
<source>You don&apos;t have any groups in common with this user.</source> <source>You don&apos;t have any groups in common with this user.</source>
<translation type="unfinished"></translation> <translation>No hay ningún grupo en común con este usuario.</translation>
</message> </message>
<message> <message>
<source>This group is empty.</source> <source>This group is empty.</source>
<translation type="unfinished"></translation> <translation>Este grupo está vacío.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -197,38 +197,38 @@
<message> <message>
<source>Settings</source> <source>Settings</source>
<comment>Button: Chat Settings</comment> <comment>Button: Chat Settings</comment>
<translation type="unfinished">Ajustes</translation> <translation>Ajustes</translation>
</message> </message>
</context> </context>
<context> <context>
<name>ChatListViewItem</name> <name>ChatListViewItem</name>
<message> <message>
<source>Unknown</source> <source>Unknown</source>
<translation type="unfinished"></translation> <translation>Desconocido</translation>
</message> </message>
<message> <message>
<source>You</source> <source>You</source>
<translation type="unfinished"></translation> <translation>Usted</translation>
</message> </message>
<message> <message>
<source>Unmute Chat</source> <source>Unmute Chat</source>
<translation type="unfinished">habilitar notificación</translation> <translation>habilitar notificación</translation>
</message> </message>
<message> <message>
<source>Mute Chat</source> <source>Mute Chat</source>
<translation type="unfinished">deshabilitar notificación</translation> <translation>deshabilitar notificación</translation>
</message> </message>
<message> <message>
<source>User Info</source> <source>User Info</source>
<translation type="unfinished"></translation> <translation>detalle de usuario</translation>
</message> </message>
<message> <message>
<source>Group Info</source> <source>Group Info</source>
<translation type="unfinished"></translation> <translation>Detalle de grupo</translation>
</message> </message>
<message> <message>
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation type="unfinished"></translation> <translation>Marcar todos los mensajes como leídos</translation>
</message> </message>
</context> </context>
<context> <context>
@ -239,7 +239,7 @@
</message> </message>
<message> <message>
<source>Your message</source> <source>Your message</source>
<translation>Escribir mensaje</translation> <translation>Introducir texto</translation>
</message> </message>
<message> <message>
<source>%1 members, %2 online</source> <source>%1 members, %2 online</source>
@ -255,7 +255,7 @@
</message> </message>
<message> <message>
<source>Reply to Message</source> <source>Reply to Message</source>
<translation>Responder mensaje</translation> <translation>Responder</translation>
</message> </message>
<message> <message>
<source>You</source> <source>You</source>
@ -275,7 +275,7 @@
</message> </message>
<message> <message>
<source>Edit Message</source> <source>Edit Message</source>
<translation>Editar mensaje</translation> <translation>Editar</translation>
</message> </message>
<message> <message>
<source>edited</source> <source>edited</source>
@ -287,7 +287,7 @@
</message> </message>
<message> <message>
<source>Delete Message</source> <source>Delete Message</source>
<translation>Borrar mensaje</translation> <translation>Borrar</translation>
</message> </message>
<message> <message>
<source>Uploading...</source> <source>Uploading...</source>
@ -299,7 +299,7 @@
</message> </message>
<message> <message>
<source>This chat is empty.</source> <source>This chat is empty.</source>
<translation type="unfinished"></translation> <translation>Esta charla está vacía.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -361,67 +361,67 @@
<message> <message>
<source>Group Member Permissions</source> <source>Group Member Permissions</source>
<comment>what can normal group members do</comment> <comment>what can normal group members do</comment>
<translation type="unfinished"></translation> <translation>Permisos de miembros del grupo</translation>
</message> </message>
<message> <message>
<source>Send Messages</source> <source>Send Messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Enviar mensage</translation>
</message> </message>
<message> <message>
<source>Send Media Messages</source> <source>Send Media Messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Enviar mensajes multimedia</translation>
</message> </message>
<message> <message>
<source>Send Other Messages</source> <source>Send Other Messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Enviar otros mensajes</translation>
</message> </message>
<message> <message>
<source>Add Web Page Previews</source> <source>Add Web Page Previews</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Agregar vistas previas de páginas web</translation>
</message> </message>
<message> <message>
<source>Change Chat Info</source> <source>Change Chat Info</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Cambiar detalle de la charla</translation>
</message> </message>
<message> <message>
<source>Invite Users</source> <source>Invite Users</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Invitar a usuarios</translation>
</message> </message>
<message> <message>
<source>Pin Messages</source> <source>Pin Messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Mensajes de PIN</translation>
</message> </message>
<message> <message>
<source>New Members</source> <source>New Members</source>
<comment>what can new group members do</comment> <comment>what can new group members do</comment>
<translation type="unfinished"></translation> <translation>Miembros nuevos</translation>
</message> </message>
<message> <message>
<source>New members can see older messages</source> <source>New members can see older messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Los miembros nuevos pueden ver mensajes antiguos</translation>
</message> </message>
</context> </context>
<context> <context>
<name>EditSuperGroupSlowModeColumn</name> <name>EditSuperGroupSlowModeColumn</name>
<message> <message>
<source>Slow Mode</source> <source>Slow Mode</source>
<translation type="unfinished"></translation> <translation>Modo lento</translation>
</message> </message>
<message> <message>
<source>Off</source> <source>Off</source>
<translation type="unfinished"></translation> <translation>apagado</translation>
</message> </message>
<message> <message>
<source>Set how long every chat member has to wait between Messages</source> <source>Set how long every chat member has to wait between Messages</source>
<translation type="unfinished"></translation> <translation>Establecer cuánto tiempo debe esperar cada miembro de la charla entre mensajes</translation>
</message> </message>
</context> </context>
<context> <context>
@ -536,10 +536,28 @@
<message> <message>
<source>changed the chat title</source> <source>changed the chat title</source>
<comment>myself</comment> <comment>myself</comment>
<translation type="unfinished"></translation> <translation>el título del charla se cambió</translation>
</message> </message>
<message> <message>
<source>changed the chat title</source> <source>changed the chat title</source>
<translation>el título del charla se cambió</translation>
</message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
@ -585,7 +603,7 @@
</message> </message>
<message> <message>
<source>Please enter the code that you received:</source> <source>Please enter the code that you received:</source>
<translation>Introducir código recibido:</translation> <translation>Introducir el código recibido:</translation>
</message> </message>
<message> <message>
<source>Loading...</source> <source>Loading...</source>
@ -625,7 +643,7 @@
</message> </message>
<message> <message>
<source>Use the international format, e.g. %1</source> <source>Use the international format, e.g. %1</source>
<translation type="unfinished"></translation> <translation>Usar el formato internacional, Ejemplo.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -685,6 +703,172 @@
<translation>No hay todavía ninguna charla.</translation> <translation>No hay todavía ninguna charla.</translation>
</message> </message>
</context> </context>
<context>
<name>PollCreationPage</name>
<message>
<source>All answers have to contain 1-100 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To send a quiz, you have to specify the right answer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You have to enter a question.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The question has to be shorter than 256 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A poll requires 2-10 answers.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create a Poll</source>
<comment>Dialog Header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>in %1</source>
<comment>After dialog header Create a Poll in [group name]</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter your question here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Question (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Answers</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an answer here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Answer (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Add an answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Options</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Anonymous answers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple answers allowed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quiz Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<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>%L1 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>
<source>Quiz Results</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Results</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Question</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Results</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s)</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chosen by:</source>
<comment>This answer has been chosen by the following users</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
</context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
<message> <message>
@ -713,11 +897,11 @@
</message> </message>
<message> <message>
<source>Show background for stickers and align them centrally like images</source> <source>Show background for stickers and align them centrally like images</source>
<translation>Mostrar fondo para pegatinas y alinearlas centralmente como imágenes</translation> <translation>Muestra el fondo para pegatinas y las alinea como imágenes</translation>
</message> </message>
<message> <message>
<source>Notification feedback</source> <source>Notification feedback</source>
<translation>Comentarios de notificación</translation> <translation>Notificaciones</translation>
</message> </message>
<message> <message>
<source>All events</source> <source>All events</source>
@ -865,32 +1049,32 @@
<message> <message>
<source>sent an animation</source> <source>sent an animation</source>
<comment>myself</comment> <comment>myself</comment>
<translation>envié una animación</translation> <translation>envió una animación</translation>
</message> </message>
<message> <message>
<source>sent an audio</source> <source>sent an audio</source>
<comment>myself</comment> <comment>myself</comment>
<translation>envié un audio</translation> <translation>envió un audio</translation>
</message> </message>
<message> <message>
<source>sent a voice note</source> <source>sent a voice note</source>
<comment>myself</comment> <comment>myself</comment>
<translation>envié una nota de voz</translation> <translation>envió una nota de voz</translation>
</message> </message>
<message> <message>
<source>sent a document</source> <source>sent a document</source>
<comment>myself</comment> <comment>myself</comment>
<translation>envié un documento</translation> <translation>envió un documento</translation>
</message> </message>
<message> <message>
<source>sent a location</source> <source>sent a location</source>
<comment>myself</comment> <comment>myself</comment>
<translation>envié una ubicación</translation> <translation>envió una ubicación</translation>
</message> </message>
<message> <message>
<source>sent a venue</source> <source>sent a venue</source>
<comment>myself</comment> <comment>myself</comment>
<translation>envié un lugar</translation> <translation>envió un lugar</translation>
</message> </message>
<message> <message>
<source>have registered with Telegram</source> <source>have registered with Telegram</source>
@ -913,55 +1097,91 @@
</message> </message>
<message> <message>
<source>was never online</source> <source>was never online</source>
<translation type="unfinished">nunca estuvo en línea</translation> <translation>nunca en línea</translation>
</message> </message>
<message> <message>
<source>offline, last online: last month</source> <source>offline, last online: last month</source>
<translation type="unfinished">sin línea, hace en línea: hace 1 mes</translation> <translation>sin línea, hace: hace 1 mes</translation>
</message> </message>
<message> <message>
<source>offline, last online: last week</source> <source>offline, last online: last week</source>
<translation type="unfinished">sin línea, hace en línea: hace 1 semana</translation> <translation>sin línea, hace: hace 1 semana</translation>
</message> </message>
<message> <message>
<source>offline, last online: %1</source> <source>offline, last online: %1</source>
<translation type="unfinished">sin línea, hace en línea: %1</translation> <translation>sin línea, hace: %1</translation>
</message> </message>
<message> <message>
<source>online</source> <source>online</source>
<translation type="unfinished">en línea</translation> <translation>en línea</translation>
</message> </message>
<message> <message>
<source>offline, was recently online</source> <source>offline, was recently online</source>
<translation type="unfinished">sin línea, estuvo en línea</translation> <translation>estuvo en línea</translation>
</message> </message>
<message> <message>
<source>Admin</source> <source>Admin</source>
<comment>channel user role</comment> <comment>channel user role</comment>
<translation type="unfinished"></translation> <translation>Administrador</translation>
</message> </message>
<message> <message>
<source>Banned</source> <source>Banned</source>
<comment>channel user role</comment> <comment>channel user role</comment>
<translation type="unfinished"></translation> <translation>Prohibido</translation>
</message> </message>
<message> <message>
<source>Creator</source> <source>Creator</source>
<comment>channel user role</comment> <comment>channel user role</comment>
<translation type="unfinished"></translation> <translation>Creador</translation>
</message> </message>
<message> <message>
<source>Restricted</source> <source>Restricted</source>
<comment>channel user role</comment> <comment>channel user role</comment>
<translation type="unfinished"></translation> <translation>Restringido</translation>
</message> </message>
<message> <message>
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<comment>myself</comment> <comment>myself</comment>
<translation type="unfinished"></translation> <translation>se cambió el título de la charla a %1</translation>
</message> </message>
<message> <message>
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<translation>se cambió el título de la charla a %1</translation>
</message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>

View file

@ -37,11 +37,11 @@
</message> </message>
<message> <message>
<source>This project uses the Telegram Database Library (TDLib). Thanks for making it available under the conditions of the Boost Software License 1.0!</source> <source>This project uses the Telegram Database Library (TDLib). Thanks for making it available under the conditions of the Boost Software License 1.0!</source>
<translation>Tämä projekti käyttää Telegram Database Library (TDLib) -kirjastoa. Kiitokset sen jakamisesta Boost Software License 1.0 -lisenssillä! </translation> <translation>Tämä projekti käyttää Telegram Database Library (TDLib) kirjastoa. Kiitokset sen jakamisesta Boost Software License 1.0 lisenssillä!</translation>
</message> </message>
<message> <message>
<source>Open Telegram Database Library on GitHub</source> <source>Open Telegram Database Library on GitHub</source>
<translation>Avaa Telegram Database -kirjasto GitHubissa</translation> <translation>Avaa Telegram Database kirjasto GitHubissa</translation>
</message> </message>
<message> <message>
<source>About Telegram</source> <source>About Telegram</source>
@ -49,7 +49,7 @@
</message> </message>
<message> <message>
<source>This product uses the Telegram API but is not endorsed or certified by Telegram.</source> <source>This product uses the Telegram API but is not endorsed or certified by Telegram.</source>
<translation>Tämä sovellus käyttää Telegram API:a, mutta ei ole Telegram:n hyväksymä tai varmentama.</translation> <translation>Tämä sovellus käyttää Telegram APIa, mutta ei ole Telegramin hyväksymä tai varmentama.</translation>
</message> </message>
<message> <message>
<source>TDLib version %1</source> <source>TDLib version %1</source>
@ -57,7 +57,7 @@
</message> </message>
<message> <message>
<source>Logged in as %1</source> <source>Logged in as %1</source>
<translation>Kirjautuneena sisään käyttäjänä %1</translation> <translation>Kirjautunut sisään käyttäjänä %1</translation>
</message> </message>
<message> <message>
<source>Phone number: +%1</source> <source>Phone number: +%1</source>
@ -65,7 +65,7 @@
</message> </message>
<message> <message>
<source>This project uses twemoji. Copyright 2018 Twitter, Inc. and other contributors. Thanks for making it available under the conditions of the MIT License (coding) and CC-BY 4.0 (graphics)!</source> <source>This project uses twemoji. Copyright 2018 Twitter, Inc. and other contributors. Thanks for making it available under the conditions of the MIT License (coding) and CC-BY 4.0 (graphics)!</source>
<translation>Tämä projekti käyttää twemojia. Tekijänoikeus 2018 Twitter, Inc. ja muut tekijät. Kiitokset sen julkaisusta MIT- (lähdekoodi) ja CC-BY 4.0- (grafiikat) lisensseillä! </translation> <translation>Tämä projekti käyttää twemojia. Tekijänoikeus 2018 Twitter, Inc. ja muut tekijät. Kiitokset sen julkaisusta MIT (lähdekoodi) ja CC-BY 4.0 (grafiikat) lisensseillä!</translation>
</message> </message>
<message> <message>
<source>Open twemoji on GitHub</source> <source>Open twemoji on GitHub</source>
@ -91,67 +91,67 @@
<name>ChatInformationPage</name> <name>ChatInformationPage</name>
<message> <message>
<source>Unmute Chat</source> <source>Unmute Chat</source>
<translation type="unfinished">Poista keskustelun vaimennus</translation> <translation>Poista keskustelun vaimennus</translation>
</message> </message>
<message> <message>
<source>Mute Chat</source> <source>Mute Chat</source>
<translation type="unfinished">Vaimenna keskustelu</translation> <translation>Vaimenna keskustelu</translation>
</message> </message>
<message> <message>
<source>Unknown</source> <source>Unknown</source>
<translation type="unfinished">Tuntematon</translation> <translation>Tuntematon</translation>
</message> </message>
<message> <message>
<source>The Invite Link has been copied to the clipboard.</source> <source>The Invite Link has been copied to the clipboard.</source>
<translation type="unfinished"></translation> <translation>Kutsulinkki on kopioitu leikepöydälle.</translation>
</message> </message>
<message> <message>
<source>%1 members, %2 online</source> <source>%1 members, %2 online</source>
<translation type="unfinished">%1 jäsentä, %2 paikalla</translation> <translation>%1 jäsentä, %2 paikalla</translation>
</message> </message>
<message> <message>
<source>%1 subscribers</source> <source>%1 subscribers</source>
<translation type="unfinished">%1 tilaajaa</translation> <translation>%1 tilaajaa</translation>
</message> </message>
<message> <message>
<source>%1 members</source> <source>%1 members</source>
<translation type="unfinished">%1 jäsentä</translation> <translation>%1 jäsentä</translation>
</message> </message>
<message> <message>
<source>Leave Group</source> <source>Leave Group</source>
<translation type="unfinished"></translation> <translation>Poistu ryhmästä</translation>
</message> </message>
<message> <message>
<source>Leaving chat</source> <source>Leaving chat</source>
<translation type="unfinished"></translation> <translation>Poistutaan keskustelusta</translation>
</message> </message>
<message> <message>
<source>Info</source> <source>Info</source>
<comment>group or user infotext header</comment> <comment>group or user infotext header</comment>
<translation type="unfinished"></translation> <translation>Tietoa</translation>
</message> </message>
<message> <message>
<source>Phone Number</source> <source>Phone Number</source>
<comment>user phone number header</comment> <comment>user phone number header</comment>
<translation type="unfinished"></translation> <translation>Puhelinnumero</translation>
</message> </message>
<message> <message>
<source>Invite Link</source> <source>Invite Link</source>
<comment>header</comment> <comment>header</comment>
<translation type="unfinished"></translation> <translation>Kutsulinkki</translation>
</message> </message>
<message> <message>
<source>There is no information text available, yet.</source> <source>There is no information text available, yet.</source>
<translation type="unfinished"></translation> <translation>Tietoa ei ole vielä saatavilla.</translation>
</message> </message>
<message> <message>
<source>Chat Title</source> <source>Chat Title</source>
<comment>group title header</comment> <comment>group title header</comment>
<translation type="unfinished"></translation> <translation>Keskustelun otsikko</translation>
</message> </message>
<message> <message>
<source>Enter 1-128 characters</source> <source>Enter 1-128 characters</source>
<translation type="unfinished"></translation> <translation>Syötä 1-128 merkkiä</translation>
</message> </message>
</context> </context>
<context> <context>
@ -159,37 +159,37 @@
<message> <message>
<source>Loading common chats</source> <source>Loading common chats</source>
<comment>chats you have in common with a user</comment> <comment>chats you have in common with a user</comment>
<translation type="unfinished"></translation> <translation>Ladataan yhteisiä keskusteluja...</translation>
</message> </message>
<message> <message>
<source>Unknown</source> <source>Unknown</source>
<translation type="unfinished">Tuntematon</translation> <translation>Tuntematon</translation>
</message> </message>
<message> <message>
<source>Groups</source> <source>Groups</source>
<comment>Button: groups in common (short)</comment> <comment>Button: groups in common (short)</comment>
<translation type="unfinished"></translation> <translation>Ryhmät</translation>
</message> </message>
<message> <message>
<source>Members</source> <source>Members</source>
<comment>Button: Group Members</comment> <comment>Button: Group Members</comment>
<translation type="unfinished"></translation> <translation>Jäsenet</translation>
</message> </message>
<message> <message>
<source>Loading group members</source> <source>Loading group members</source>
<translation type="unfinished"></translation> <translation>Ladataan ryhmän jäseniä...</translation>
</message> </message>
<message> <message>
<source>You</source> <source>You</source>
<translation type="unfinished">Sinä</translation> <translation>Sinä</translation>
</message> </message>
<message> <message>
<source>You don&apos;t have any groups in common with this user.</source> <source>You don&apos;t have any groups in common with this user.</source>
<translation type="unfinished"></translation> <translation>Sinulla ei ole yhteisiä ryhmiä tämän käyttäjän kanssa.</translation>
</message> </message>
<message> <message>
<source>This group is empty.</source> <source>This group is empty.</source>
<translation type="unfinished"></translation> <translation>Tämä ryhmä on tyhjä.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -197,38 +197,38 @@
<message> <message>
<source>Settings</source> <source>Settings</source>
<comment>Button: Chat Settings</comment> <comment>Button: Chat Settings</comment>
<translation type="unfinished">Asetukset</translation> <translation>Asetukset</translation>
</message> </message>
</context> </context>
<context> <context>
<name>ChatListViewItem</name> <name>ChatListViewItem</name>
<message> <message>
<source>Unknown</source> <source>Unknown</source>
<translation type="unfinished">Tuntematon</translation> <translation>Tuntematon</translation>
</message> </message>
<message> <message>
<source>You</source> <source>You</source>
<translation type="unfinished">Sinä</translation> <translation>Sinä</translation>
</message> </message>
<message> <message>
<source>Unmute Chat</source> <source>Unmute Chat</source>
<translation type="unfinished">Poista keskustelun vaimennus</translation> <translation>Poista keskustelun vaimennus</translation>
</message> </message>
<message> <message>
<source>Mute Chat</source> <source>Mute Chat</source>
<translation type="unfinished">Vaimenna keskustelu</translation> <translation>Vaimenna keskustelu</translation>
</message> </message>
<message> <message>
<source>User Info</source> <source>User Info</source>
<translation type="unfinished"></translation> <translation>Käyttäjän tiedot</translation>
</message> </message>
<message> <message>
<source>Group Info</source> <source>Group Info</source>
<translation type="unfinished"></translation> <translation>Ryhmän tiedot</translation>
</message> </message>
<message> <message>
<source>Mark all messages as read</source> <source>Mark all messages as read</source>
<translation type="unfinished"></translation> <translation>Merkitse kaikki viestit luetuiksi</translation>
</message> </message>
</context> </context>
<context> <context>
@ -295,11 +295,11 @@
</message> </message>
<message> <message>
<source>Forwarded Message</source> <source>Forwarded Message</source>
<translation type="unfinished"></translation> <translation>Välitetty viesti</translation>
</message> </message>
<message> <message>
<source>This chat is empty.</source> <source>This chat is empty.</source>
<translation type="unfinished"></translation> <translation>Tämä keskustelu on tyhjä.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -314,7 +314,8 @@
</message> </message>
<message> <message>
<source>in</source> <source>in</source>
<translation></translation> <translatorcomment>The preposition &apos;in&apos; is translated to Finnish using the inessive case (suffix -ssa/-ssä), so this string should be left empty in the translation. Unfortunately Qt will ignore empty translations, so let&apos;s use the character U+200B (zero width space) instead.</translatorcomment>
<translation></translation>
</message> </message>
<message> <message>
<source>Waiting for network...</source> <source>Waiting for network...</source>
@ -338,7 +339,7 @@
</message> </message>
<message> <message>
<source>chat</source> <source>chat</source>
<translation>keskustelu</translation> <translation>keskustelussa</translation>
</message> </message>
<message> <message>
<source>chats</source> <source>chats</source>
@ -361,67 +362,67 @@
<message> <message>
<source>Group Member Permissions</source> <source>Group Member Permissions</source>
<comment>what can normal group members do</comment> <comment>what can normal group members do</comment>
<translation type="unfinished"></translation> <translation>Ryhmän jäsenten käyttöoikeudet</translation>
</message> </message>
<message> <message>
<source>Send Messages</source> <source>Send Messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Lähettä viestejä</translation>
</message> </message>
<message> <message>
<source>Send Media Messages</source> <source>Send Media Messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Lähettää mediaviestejä</translation>
</message> </message>
<message> <message>
<source>Send Other Messages</source> <source>Send Other Messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Lähettää muita viestejä</translation>
</message> </message>
<message> <message>
<source>Add Web Page Previews</source> <source>Add Web Page Previews</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Lähettää verkkosivuesikatseluita</translation>
</message> </message>
<message> <message>
<source>Change Chat Info</source> <source>Change Chat Info</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Muuttaa keskustelun tietoja</translation>
</message> </message>
<message> <message>
<source>Invite Users</source> <source>Invite Users</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Kutsua jäseniä</translation>
</message> </message>
<message> <message>
<source>Pin Messages</source> <source>Pin Messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Kiinnittää viestejä</translation>
</message> </message>
<message> <message>
<source>New Members</source> <source>New Members</source>
<comment>what can new group members do</comment> <comment>what can new group members do</comment>
<translation type="unfinished"></translation> <translation>Uudet jäsenet</translation>
</message> </message>
<message> <message>
<source>New members can see older messages</source> <source>New members can see older messages</source>
<comment>member permission</comment> <comment>member permission</comment>
<translation type="unfinished"></translation> <translation>Uudet jäsenet voivat nähdä vanhoja viestejä</translation>
</message> </message>
</context> </context>
<context> <context>
<name>EditSuperGroupSlowModeColumn</name> <name>EditSuperGroupSlowModeColumn</name>
<message> <message>
<source>Slow Mode</source> <source>Slow Mode</source>
<translation type="unfinished"></translation> <translation>Hidas moodi</translation>
</message> </message>
<message> <message>
<source>Off</source> <source>Off</source>
<translation type="unfinished"></translation> <translation>Pois</translation>
</message> </message>
<message> <message>
<source>Set how long every chat member has to wait between Messages</source> <source>Set how long every chat member has to wait between Messages</source>
<translation type="unfinished"></translation> <translation>Aseta kuinka kauan jokaisen keskustelun jäsenen täytyy odottaa viestien välillä</translation>
</message> </message>
</context> </context>
<context> <context>
@ -536,10 +537,28 @@
<message> <message>
<source>changed the chat title</source> <source>changed the chat title</source>
<comment>myself</comment> <comment>myself</comment>
<translation type="unfinished"></translation> <translation>muutit keskustelun otsikkoa</translation>
</message> </message>
<message> <message>
<source>changed the chat title</source> <source>changed the chat title</source>
<translation>muutti keskustelun otsikkoa</translation>
</message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
@ -555,7 +574,7 @@
</message> </message>
<message> <message>
<source>Download failed.</source> <source>Download failed.</source>
<translation>Lataus epäonnistui</translation> <translation>Lataus epäonnistui.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -625,14 +644,14 @@
</message> </message>
<message> <message>
<source>Use the international format, e.g. %1</source> <source>Use the international format, e.g. %1</source>
<translation type="unfinished"></translation> <translation>Käytä kansainvälistä muotoa, esimerkiksi %1</translation>
</message> </message>
</context> </context>
<context> <context>
<name>LocationPreview</name> <name>LocationPreview</name>
<message> <message>
<source>Install Pure Maps to inspect this location.</source> <source>Install Pure Maps to inspect this location.</source>
<translation>Asenna Pure Maps tarkastellaksesi sijaintia</translation> <translation>Asenna Pure Maps tarkastellaksesi sijaintia.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -682,7 +701,179 @@
</message> </message>
<message> <message>
<source>You don&apos;t have any chats yet.</source> <source>You don&apos;t have any chats yet.</source>
<translation>Sinulla ei ole vielä keskusteluja</translation> <translation>Sinulla ei ole vielä keskusteluja.</translation>
</message>
</context>
<context>
<name>PollCreationPage</name>
<message>
<source>All answers have to contain 1-100 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To send a quiz, you have to specify the right answer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You have to enter a question.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The question has to be shorter than 256 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A poll requires 2-10 answers.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create a Poll</source>
<comment>Dialog Header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>in %1</source>
<comment>After dialog header Create a Poll in [group name]</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter your question here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Question (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Answers</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an answer here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Answer (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Add an answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Options</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Anonymous answers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple answers allowed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quiz Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<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>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<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>
<source>Quiz Results</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Results</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Question</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Results</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s)</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chosen by:</source>
<comment>This answer has been chosen by the following users</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message> </message>
</context> </context>
<context> <context>
@ -697,54 +888,54 @@
</message> </message>
<message> <message>
<source>Send message by enter</source> <source>Send message by enter</source>
<translation>Lähetä viesti palautusnäppäimellä</translation> <translation>Lähetä viesti rivinvaihdolla</translation>
</message> </message>
<message> <message>
<source>Send your message by pressing the enter key</source> <source>Send your message by pressing the enter key</source>
<translation>Lähetä viestisi painamalla palautusnäppäintä (enter)</translation> <translation>Lähetä viestisi painamalla rivinvaihtonäppäintä (enter)</translation>
</message> </message>
<message> <message>
<source>Appearance</source> <source>Appearance</source>
<translation type="unfinished"></translation> <translation>Ulkoasu</translation>
</message> </message>
<message> <message>
<source>Show stickers as images</source> <source>Show stickers as images</source>
<translation type="unfinished"></translation> <translation>Näytä tarrat kuvina</translation>
</message> </message>
<message> <message>
<source>Show background for stickers and align them centrally like images</source> <source>Show background for stickers and align them centrally like images</source>
<translation type="unfinished"></translation> <translation>Näytä tarroissa tausta ja keskitä ne kuten kuvat</translation>
</message> </message>
<message> <message>
<source>Notification feedback</source> <source>Notification feedback</source>
<translation type="unfinished"></translation> <translation>Ilmoitusten palaute</translation>
</message> </message>
<message> <message>
<source>All events</source> <source>All events</source>
<translation type="unfinished"></translation> <translation>Kaikki tapahtumat</translation>
</message> </message>
<message> <message>
<source>Only new events</source> <source>Only new events</source>
<translation type="unfinished"></translation> <translation>Vain uudet tapahtumat</translation>
</message> </message>
<message> <message>
<source>None</source> <source>None</source>
<translation type="unfinished"></translation> <translation>Ei mitään</translation>
</message> </message>
<message> <message>
<source>Use non-graphical feedback (sound, vibration) for notifications</source> <source>Use non-graphical feedback (sound, vibration) for notifications</source>
<translation type="unfinished"></translation> <translation>Käytä ei-graafista palautetta (ääni, värinä) ilmoituksille</translation>
</message> </message>
</context> </context>
<context> <context>
<name>StickerPicker</name> <name>StickerPicker</name>
<message> <message>
<source>Recently used</source> <source>Recently used</source>
<translation type="unfinished"></translation> <translation>Viimeksi käytetty</translation>
</message> </message>
<message> <message>
<source>Loading stickers...</source> <source>Loading stickers...</source>
<translation type="unfinished"></translation> <translation>Ladataan tarroja...</translation>
</message> </message>
</context> </context>
<context> <context>
@ -759,7 +950,7 @@
</message> </message>
<message> <message>
<source>Download failed.</source> <source>Download failed.</source>
<translation>Lataus epäonnistui</translation> <translation>Lataus epäonnistui.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -913,55 +1104,91 @@
</message> </message>
<message> <message>
<source>was never online</source> <source>was never online</source>
<translation type="unfinished">Ei ole ollut koskaan paikalla</translation> <translation>ei ole ollut koskaan paikalla</translation>
</message> </message>
<message> <message>
<source>offline, last online: last month</source> <source>offline, last online: last month</source>
<translation type="unfinished">Poissa. Nähty viimeksi: viime kuussa</translation> <translation>poissa. Nähty viimeksi: viime kuussa</translation>
</message> </message>
<message> <message>
<source>offline, last online: last week</source> <source>offline, last online: last week</source>
<translation type="unfinished">Poissa. Nähty viimeksi: viime viikolla</translation> <translation>poissa. Nähty viimeksi: viime viikolla</translation>
</message> </message>
<message> <message>
<source>offline, last online: %1</source> <source>offline, last online: %1</source>
<translation type="unfinished">Poissa. Nähty viimeksi: %1</translation> <translation>poissa. Nähty viimeksi: %1</translation>
</message> </message>
<message> <message>
<source>online</source> <source>online</source>
<translation type="unfinished">paikalla</translation> <translation>paikalla</translation>
</message> </message>
<message> <message>
<source>offline, was recently online</source> <source>offline, was recently online</source>
<translation type="unfinished">poissa, oli hetki sitten paikalla</translation> <translation>poissa, oli hetki sitten paikalla</translation>
</message> </message>
<message> <message>
<source>Admin</source> <source>Admin</source>
<comment>channel user role</comment> <comment>channel user role</comment>
<translation type="unfinished"></translation> <translation>Pääkäyttäjä</translation>
</message> </message>
<message> <message>
<source>Banned</source> <source>Banned</source>
<comment>channel user role</comment> <comment>channel user role</comment>
<translation type="unfinished"></translation> <translation>Estetty</translation>
</message> </message>
<message> <message>
<source>Creator</source> <source>Creator</source>
<comment>channel user role</comment> <comment>channel user role</comment>
<translation type="unfinished"></translation> <translation>Perustaja</translation>
</message> </message>
<message> <message>
<source>Restricted</source> <source>Restricted</source>
<comment>channel user role</comment> <comment>channel user role</comment>
<translation type="unfinished"></translation> <translation>Rajoitettu</translation>
</message> </message>
<message> <message>
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<comment>myself</comment> <comment>myself</comment>
<translation type="unfinished"></translation> <translation>vaihdoit keskustelun otsikoksi %1</translation>
</message> </message>
<message> <message>
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<translation>vaihtoi keskustelun otsikoksi %1</translation>
</message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>

View file

@ -542,6 +542,24 @@
<source>changed the chat title</source> <source>changed the chat title</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -685,6 +703,172 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>PollCreationPage</name>
<message>
<source>All answers have to contain 1-100 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To send a quiz, you have to specify the right answer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You have to enter a question.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The question has to be shorter than 256 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A poll requires 2-10 answers.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create a Poll</source>
<comment>Dialog Header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>in %1</source>
<comment>After dialog header Create a Poll in [group name]</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter your question here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Question (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Answers</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an answer here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Answer (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Add an answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Options</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Anonymous answers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple answers allowed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quiz Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<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>%L1 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>
<source>Quiz Results</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Results</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Question</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Results</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s)</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chosen by:</source>
<comment>This answer has been chosen by the following users</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
</context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
<message> <message>
@ -964,5 +1148,41 @@
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -542,6 +542,24 @@
<source>changed the chat title</source> <source>changed the chat title</source>
<translation>Ha modificato il titolo della chat</translation> <translation>Ha modificato il titolo della chat</translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -685,6 +703,178 @@
<translation>Non hai nessuna chat.</translation> <translation>Non hai nessuna chat.</translation>
</message> </message>
</context> </context>
<context>
<name>PollCreationPage</name>
<message>
<source>All answers have to contain 1-100 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To send a quiz, you have to specify the right answer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You have to enter a question.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The question has to be shorter than 256 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A poll requires 2-10 answers.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create a Poll</source>
<comment>Dialog Header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>in %1</source>
<comment>After dialog header Create a Poll in [group name]</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter your question here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Question (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Answers</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an answer here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Answer (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Add an answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Options</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Anonymous answers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple answers allowed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quiz Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<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>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<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>
<source>Quiz Results</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Results</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Question</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Results</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s)</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chosen by:</source>
<comment>This answer has been chosen by the following users</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
<message> <message>
@ -938,7 +1128,7 @@
<message> <message>
<source>Admin</source> <source>Admin</source>
<comment>channel user role</comment> <comment>channel user role</comment>
<translation><Amministratore/translation> <translation>Amministratore</translation>
</message> </message>
<message> <message>
<source>Banned</source> <source>Banned</source>
@ -964,5 +1154,41 @@
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<translation>ha modificato il titolo della chat in %1</translation> <translation>ha modificato il titolo della chat in %1</translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -542,6 +542,24 @@
<source>changed the chat title</source> <source>changed the chat title</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -685,6 +703,184 @@
<translation type="unfinished">Nie masz jeszcze żadnych czatów.</translation> <translation type="unfinished">Nie masz jeszcze żadnych czatów.</translation>
</message> </message>
</context> </context>
<context>
<name>PollCreationPage</name>
<message>
<source>All answers have to contain 1-100 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To send a quiz, you have to specify the right answer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You have to enter a question.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The question has to be shorter than 256 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A poll requires 2-10 answers.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create a Poll</source>
<comment>Dialog Header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>in %1</source>
<comment>After dialog header Create a Poll in [group name]</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter your question here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Question (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Answers</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an answer here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Answer (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Add an answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Options</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Anonymous answers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple answers allowed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quiz Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<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>%L1 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 type="unfinished"></translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>
<source>Quiz Results</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Results</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Question</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Results</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s)</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chosen by:</source>
<comment>This answer has been chosen by the following users</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
<message> <message>
@ -964,5 +1160,41 @@
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -542,6 +542,24 @@
<source>changed the chat title</source> <source>changed the chat title</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -685,6 +703,184 @@
<translation>Тут пока ничего нет</translation> <translation>Тут пока ничего нет</translation>
</message> </message>
</context> </context>
<context>
<name>PollCreationPage</name>
<message>
<source>All answers have to contain 1-100 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To send a quiz, you have to specify the right answer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You have to enter a question.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The question has to be shorter than 256 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A poll requires 2-10 answers.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create a Poll</source>
<comment>Dialog Header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>in %1</source>
<comment>After dialog header Create a Poll in [group name]</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter your question here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Question (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Answers</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an answer here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Answer (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Add an answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Options</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Anonymous answers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple answers allowed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quiz Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<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>%L1 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 type="unfinished"></translation>
</message>
<message>
<source>Reset Answer</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollResultsPage</name>
<message>
<source>Quiz Results</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Results</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Question</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Results</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s)</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chosen by:</source>
<comment>This answer has been chosen by the following users</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
<message> <message>
@ -964,5 +1160,41 @@
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -542,6 +542,24 @@
<source>changed the chat title</source> <source>changed the chat title</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -685,6 +703,172 @@
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context>
<name>PollCreationPage</name>
<message>
<source>All answers have to contain 1-100 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To send a quiz, you have to specify the right answer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You have to enter a question.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The question has to be shorter than 256 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A poll requires 2-10 answers.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create a Poll</source>
<comment>Dialog Header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>in %1</source>
<comment>After dialog header Create a Poll in [group name]</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter your question here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Question (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Answers</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an answer here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Answer (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Add an answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Options</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Anonymous answers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple answers allowed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quiz Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<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>%L1 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>
<source>Quiz Results</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Results</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Question</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Results</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s)</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chosen by:</source>
<comment>This answer has been chosen by the following users</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
</context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
<message> <message>
@ -964,5 +1148,41 @@
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

View file

@ -542,6 +542,24 @@
<source>changed the chat title</source> <source>changed the chat title</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ImagePage</name> <name>ImagePage</name>
@ -685,6 +703,172 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>PollCreationPage</name>
<message>
<source>All answers have to contain 1-100 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To send a quiz, you have to specify the right answer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>You have to enter a question.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The question has to be shorter than 256 characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>A poll requires 2-10 answers.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create a Poll</source>
<comment>Dialog Header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>in %1</source>
<comment>After dialog header Create a Poll in [group name]</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter your question here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Question (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Answers</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an answer here</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>Answer (%n1 characters left)</source>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Add an answer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Options</source>
<comment>Section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Anonymous answers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple answers allowed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quiz Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Quizzes have one correct answer. Participants can&apos;t revoke their responses.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PollPreview</name>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<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>%L1 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>
<source>Quiz Results</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Poll Results</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) total</source>
<comment>number of total votes</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Question</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Results</source>
<comment>section header</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s)</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<source>%L1%</source>
<comment>% of votes for option</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chosen by:</source>
<comment>This answer has been chosen by the following users</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>%L1 vote(s) including yours</source>
<comment>number of votes for option</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
</context>
<context> <context>
<name>SettingsPage</name> <name>SettingsPage</name>
<message> <message>
@ -964,5 +1148,41 @@
<source>changed the chat title to %1</source> <source>changed the chat title to %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>sent a poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a poll</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent a quiz</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<comment>myself</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>sent an anonymous poll</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>