diff --git a/qml/components/InlineQuery.qml b/qml/components/InlineQuery.qml index 1ad7cb3..5f97fb2 100644 --- a/qml/components/InlineQuery.qml +++ b/qml/components/InlineQuery.qml @@ -40,7 +40,7 @@ Loader { property string chatId property string userName - property bool userNameIsValid: userName !== "" && inlineBotInformation && userName.toLowerCase() === inlineBotInformation.username.toLowerCase() + property bool userNameIsValid: userName !== "" && inlineBotInformation && userName.toLowerCase() === inlineBotInformation.usernames.editable_username.toLowerCase() property string query property int currentOffset: 0 property string responseExtra: chatId+"|"+userName+"|"+query+"|"+currentOffset diff --git a/qml/components/MessageListViewItem.qml b/qml/components/MessageListViewItem.qml index d62808e..d8a4944 100644 --- a/qml/components/MessageListViewItem.qml +++ b/qml/components/MessageListViewItem.qml @@ -687,7 +687,7 @@ ListItem { Image { id: emojiPicture source: Emoji.getEmojiPath(modelData) - width: Theme.fontSizeLarge + width: status === Image.Ready ? Theme.fontSizeLarge : 0 height: Theme.fontSizeLarge } diff --git a/qml/components/MessageViaLabel.qml b/qml/components/MessageViaLabel.qml index b76619e..b0d34d3 100644 --- a/qml/components/MessageViaLabel.qml +++ b/qml/components/MessageViaLabel.qml @@ -31,12 +31,12 @@ Loader { property var botUserInformation: tdLibWrapper.getUserInformation(message.via_bot_user_id) color: Theme.secondaryColor font.pixelSize: Theme.fontSizeExtraSmall - text: qsTr("via %1", "message posted via bot user").arg("@" + Emoji.emojify(botUserInformation.username, font.pixelSize)+"") + text: qsTr("via %1", "message posted via bot user").arg("@" + Emoji.emojify(botUserInformation.usernames.editable_username, font.pixelSize)+"") textFormat: Text.RichText truncationMode: TruncationMode.Fade onLinkActivated: { if(link === "userId://" + message.via_bot_user_id && botUserInformation.type.is_inline) { - newMessageTextField.text = "@"+botUserInformation.username+" " + newMessageTextField.text = "@"+botUserInformation.usernames.editable_username+" " newMessageTextField.cursorPosition = newMessageTextField.text.length lostFocusTimer.start(); } diff --git a/qml/components/ReplyMarkupButtons.qml b/qml/components/ReplyMarkupButtons.qml index de2cd2c..99efe97 100644 --- a/qml/components/ReplyMarkupButtons.qml +++ b/qml/components/ReplyMarkupButtons.qml @@ -60,12 +60,12 @@ Column { }, inlineKeyboardButtonTypeSwitchInline: function() { if(modelData.type.in_current_chat) { - chatPage.setMessageText("@" + userInformation.username + " "+(modelData.type.query || "")) + chatPage.setMessageText("@" + userInformation.usernames.editable_username + " "+(modelData.type.query || "")) } else { pageStack.push(Qt.resolvedUrl("../pages/ChatSelectionPage.qml"), { myUserId: chatPage.myUserId, - payload: { neededPermissions: ["can_send_other_messages"], text:"@" + userInformation.username + " "+(modelData.type.query || "")}, + payload: { neededPermissions: ["can_send_other_messages"], text:"@" + userInformation.usernames.editable_username + " "+(modelData.type.query || "")}, state: "fillTextArea" }) } diff --git a/qml/components/chatInformationPage/ChatInformationPageContent.qml b/qml/components/chatInformationPage/ChatInformationPageContent.qml index 511bc38..bbd1992 100644 --- a/qml/components/chatInformationPage/ChatInformationPageContent.qml +++ b/qml/components/chatInformationPage/ChatInformationPageContent.qml @@ -300,8 +300,8 @@ SilicaFlickable { } leftMargin: imageContainer.getEased((imageContainer.minDimension + Theme.paddingMedium), 0, imageContainer.tweenFactor) + Theme.horizontalPageMargin title: chatInformationPage.chatInformation.title !== "" ? Emoji.emojify(chatInformationPage.chatInformation.title, Theme.fontSizeLarge) : qsTr("Unknown") - description: ((chatInformationPage.isPrivateChat || chatInformationPage.isSecretChat) && chatInformationPage.privateChatUserInformation.username) - ? ("@"+chatInformationPage.privateChatUserInformation.username) : "" + description: ((chatInformationPage.isPrivateChat || chatInformationPage.isSecretChat) && chatInformationPage.privateChatUserInformation.usernames.editable_username) + ? ("@"+chatInformationPage.privateChatUserInformation.usernames.editable_username) : "" } SilicaFlickable { diff --git a/qml/components/messageContent/MessageSticker.qml b/qml/components/messageContent/MessageSticker.qml index ce499f8..fb9f02d 100644 --- a/qml/components/messageContent/MessageSticker.qml +++ b/qml/components/messageContent/MessageSticker.qml @@ -27,7 +27,7 @@ MessageContentBase { property var stickerData: messageListItem ? messageListItem.myMessage.content.sticker : overlayFlickable.overlayMessage.content.sticker; readonly property bool asEmoji: appSettings.showStickersAsEmojis - readonly property bool animated: stickerData.type["@type"] === "stickerTypeAnimated" && appSettings.animateStickers + readonly property bool animated: stickerData.format["@type"] === "stickerFormatTgs" && appSettings.animateStickers readonly property bool stickerVisible: staticStickerLoader.item ? staticStickerLoader.item.visible : animatedStickerLoader.item ? animatedStickerLoader.item.visible : false readonly property bool isOwnSticker : messageListItem ? messageListItem.isOwnMessage : overlayFlickable.isOwnMessage diff --git a/qml/components/settingsPage/SettingsSession.qml b/qml/components/settingsPage/SettingsSession.qml index 9f5a9b6..cb65cf8 100644 --- a/qml/components/settingsPage/SettingsSession.qml +++ b/qml/components/settingsPage/SettingsSession.qml @@ -30,141 +30,182 @@ AccordionItem { Column { id: activeSessionsItem bottomPadding: Theme.paddingMedium - property variant activeSessions; - property bool loaded : false; + property variant activeSessions + property int inactiveSessionsTtlDays Component.onCompleted: { if (!activeSessions) { tdLibWrapper.getActiveSessions(); - } else { - activeSessionsItem.loaded = true; } } Connections { target: tdLibWrapper onSessionsReceived: { - activeSessionsItem.activeSessions = sessions; - activeSessionsItem.loaded = true; + activeSessionsItem.activeSessions = sessions + activeSessionsItem.inactiveSessionsTtlDays = inactive_session_ttl_days } onOkReceived: { if (request === "terminateSession") { appNotification.show(qsTr("Session was terminated")); - activeSessionsItem.loaded = false; tdLibWrapper.getActiveSessions(); } } } Loader { - id: sessionInformationLoader active: tdLibWrapper.authorizationState === TelegramAPI.AuthorizationReady width: parent.width sourceComponent: Component { - SilicaListView { - id: activeSessionsListView - width: parent.width - height: contentHeight - model: activeSessionsItem.activeSessions - headerPositioning: ListView.OverlayHeader - header: Separator { - width: parent.width - color: Theme.primaryColor - horizontalAlignment: Qt.AlignHCenter + Column { + BusyIndicator { + anchors.horizontalCenter: parent.horizontalCenter + running: !activeSessionsListView.count && !activeSessionsItem.inactiveSessionsTtlDays + size: BusyIndicatorSize.Medium + visible: opacity > 0 + height: running ? implicitHeight : 0 } - delegate: ListItem { - id: activeSessionListItem + + SilicaListView { + id: activeSessionsListView width: parent.width - contentHeight: activeSessionColumn.height + ( 2 * Theme.paddingMedium ) - - menu: ContextMenu { - hasContent: !modelData.is_current - onHeightChanged: { - if (parent && flickable) { - // Make sure we are inside the screen area - var bottom = parent.mapToItem(flickable, x, y).y + height - if (bottom > flickable.height) { - flickable.contentY += bottom - flickable.height - } - } - } - MenuItem { - onClicked: { - var sessionId = modelData.id; - Remorse.itemAction(activeSessionListItem, qsTr("Terminating session"), function() { tdLibWrapper.terminateSession(sessionId); }); - } - text: qsTr("Terminate Session") - } - } - - Column { - id: activeSessionColumn - width: parent.width - ( 2 * Theme.horizontalPageMargin ) - spacing: Theme.paddingSmall - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - - Label { - width: parent.width - text: qsTr("This app") - font.pixelSize: Theme.fontSizeMedium - font.bold: true - visible: modelData.is_current - color: Theme.highlightColor - anchors { - horizontalCenter: parent.horizontalCenter - } - } - - Label { - width: parent.width - text: modelData.application_name + " " + modelData.application_version - font.pixelSize: Theme.fontSizeMedium - font.bold: true - color: Theme.primaryColor - maximumLineCount: 1 - elide: Text.ElideRight - anchors { - horizontalCenter: parent.horizontalCenter - } - } - - Label { - width: parent.width - text: modelData.device_model + ", " + (modelData.platform + " " + modelData.system_version).trim() - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - maximumLineCount: 1 - truncationMode: TruncationMode.Fade - anchors { - horizontalCenter: parent.horizontalCenter - } - } - - Label { - width: parent.width - text: qsTr("Active since: %1, last online: %2").arg(Functions.getDateTimeTimepoint(modelData.log_in_date)).arg(Functions.getDateTimeElapsed(modelData.last_active_date)) - font.pixelSize: Theme.fontSizeExtraSmall - color: Theme.primaryColor - maximumLineCount: 1 - truncationMode: TruncationMode.Fade - anchors { - horizontalCenter: parent.horizontalCenter - } - } - } - - Separator { - id: separator - anchors { - bottom: parent.bottom - } - + height: contentHeight + model: activeSessionsItem.activeSessions + headerPositioning: ListView.OverlayHeader + header: Separator { width: parent.width color: Theme.primaryColor horizontalAlignment: Qt.AlignHCenter + visible: activeSessionsListView.count > 0 + } + delegate: ListItem { + id: activeSessionListItem + width: parent.width + contentHeight: activeSessionColumn.height + ( 2 * Theme.paddingMedium ) + + menu: ContextMenu { + hasContent: !modelData.is_current + onHeightChanged: { + if (parent && flickable) { + // Make sure we are inside the screen area + var bottom = parent.mapToItem(flickable, x, y).y + height + if (bottom > flickable.height) { + flickable.contentY += bottom - flickable.height + } + } + } + MenuItem { + onClicked: { + var sessionId = modelData.id; + Remorse.itemAction(activeSessionListItem, qsTr("Terminating session"), function() { tdLibWrapper.terminateSession(sessionId); }); + } + text: qsTr("Terminate Session") + } + } + + Column { + id: activeSessionColumn + width: parent.width - ( 2 * Theme.horizontalPageMargin ) + spacing: Theme.paddingSmall + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + + Label { + width: parent.width + text: qsTr("This app") + font.pixelSize: Theme.fontSizeMedium + font.bold: true + visible: modelData.is_current + color: Theme.highlightColor + } + + Label { + width: parent.width + text: modelData.application_name + " " + modelData.application_version + font.pixelSize: Theme.fontSizeMedium + font.bold: true + maximumLineCount: 1 + elide: Text.ElideRight + } + + Label { + width: parent.width + text: modelData.device_model + ", " + (modelData.platform + " " + modelData.system_version).trim() + font.pixelSize: Theme.fontSizeSmall + maximumLineCount: 1 + truncationMode: TruncationMode.Fade + } + + Label { + width: parent.width + text: qsTr("Active since: %1, last online: %2").arg(Functions.getDateTimeTimepoint(modelData.log_in_date)).arg(Functions.getDateTimeElapsed(modelData.last_active_date)) + font.pixelSize: Theme.fontSizeExtraSmall + maximumLineCount: 1 + truncationMode: TruncationMode.Fade + } + } + + Separator { + anchors { + bottom: parent.bottom + } + + width: parent.width + color: Theme.primaryColor + horizontalAlignment: Qt.AlignHCenter + } + } + } + + ComboBox { + readonly property int ttl: activeSessionsItem.inactiveSessionsTtlDays + label: qsTr("Terminate old sessions if inactive for") + value: (currentItem && currentItem.text) ? currentItem.text : qsTr("%1 day(s)", "", ttl).arg(ttl) + visible: ttl > 0 + menu: ContextMenu { + id: ttlMenu + MenuItem { + readonly property int days: 7 + text: qsTr("1 week") + onClicked: tdLibWrapper.setInactiveSessionTtl(days) + } + MenuItem { + readonly property int days: 30 + text: qsTr("1 month") + onClicked: tdLibWrapper.setInactiveSessionTtl(days) + } + MenuItem { + readonly property int days: 90 + text: qsTr("3 months") + onClicked: tdLibWrapper.setInactiveSessionTtl(days) + } + MenuItem { + readonly property int days: 180 + text: qsTr("6 months") + onClicked: tdLibWrapper.setInactiveSessionTtl(days) + } + MenuItem { + readonly property int days: 365 + text: qsTr("1 year") + onClicked: tdLibWrapper.setInactiveSessionTtl(days) + } } + Component.onCompleted: updateSelection() + + onTtlChanged: updateSelection() + + function updateSelection() { + var menuItems = ttlMenu.children + var n = menuItems.length + for (var i = 0; i < n; i++) { + if (menuItems[i].days === ttl) { + currentIndex = i + return + } + } + currentIndex = -1 + } } } } diff --git a/rpm/harbour-fernschreiber.spec b/rpm/harbour-fernschreiber.spec index 4bb0e4f..5cdd4cf 100644 --- a/rpm/harbour-fernschreiber.spec +++ b/rpm/harbour-fernschreiber.spec @@ -12,7 +12,7 @@ Name: harbour-fernschreiber Summary: Fernschreiber is a Telegram client for Aurora OS Version: 0.17 -Release: 4 +Release: 5 Group: Qt/Qt License: LICENSE URL: http://werkwolf.eu/ diff --git a/src/knownusersmodel.cpp b/src/knownusersmodel.cpp index 50fdbd2..243cfeb 100644 --- a/src/knownusersmodel.cpp +++ b/src/knownusersmodel.cpp @@ -56,10 +56,10 @@ QVariant KnownUsersModel::data(const QModelIndex &index, int role) const case KnownUserRole::RoleDisplay: return requestedUser; case KnownUserRole::RoleUserId: return requestedUser.value("id"); case KnownUserRole::RoleTitle: return QString(requestedUser.value("first_name").toString() + " " + requestedUser.value("last_name").toString()).trimmed(); - case KnownUserRole::RoleUsername: return requestedUser.value("username"); - case KnownUserRole::RoleUserHandle: return QString("@" + (requestedUser.value("username").toString().isEmpty() ? requestedUser.value("id").toString() : requestedUser.value("username").toString())); + case KnownUserRole::RoleUsername: return requestedUser.value("usernames").toMap().value("editable_username").toString(); + case KnownUserRole::RoleUserHandle: return QString("@" + (requestedUser.value("usernames").toMap().value("editable_username").toString().isEmpty() ? requestedUser.value("id").toString() : requestedUser.value("usernames").toMap().value("editable_username").toString())); case KnownUserRole::RolePhotoSmall: return requestedUser.value("profile_photo").toMap().value("small"); - case KnownUserRole::RoleFilter: return QString(requestedUser.value("first_name").toString() + " " + requestedUser.value("last_name").toString() + " " + requestedUser.value("username").toString()).trimmed(); + case KnownUserRole::RoleFilter: return QString(requestedUser.value("first_name").toString() + " " + requestedUser.value("last_name").toString() + " " + requestedUser.value("usernames").toMap().value("editable_username").toString()).trimmed(); } } return QVariant(); diff --git a/src/tdlibreceiver.cpp b/src/tdlibreceiver.cpp index 11a46dc..f14eeeb 100644 --- a/src/tdlibreceiver.cpp +++ b/src/tdlibreceiver.cpp @@ -712,8 +712,9 @@ void TDLibReceiver::processUpdateMessageInteractionInfo(const QVariantMap &recei void TDLibReceiver::processSessions(const QVariantMap &receivedInformation) { + int inactive_session_ttl_days = receivedInformation.value("inactive_session_ttl_days").toInt(); QVariantList sessions = receivedInformation.value("sessions").toList(); - emit sessionsReceived(sessions); + emit sessionsReceived(inactive_session_ttl_days, sessions); } void TDLibReceiver::processAvailableReactions(const QVariantMap &receivedInformation) diff --git a/src/tdlibreceiver.h b/src/tdlibreceiver.h index a13ae04..cf6558c 100644 --- a/src/tdlibreceiver.h +++ b/src/tdlibreceiver.h @@ -101,7 +101,7 @@ signals: void userPrivacySettingRulesUpdated(const QVariantMap &updatedRules); void messageInteractionInfoUpdated(qlonglong chatId, qlonglong messageId, const QVariantMap &updatedInfo); void okReceived(const QString &request); - void sessionsReceived(const QVariantList &sessions); + void sessionsReceived(int inactive_session_ttl_days, const QVariantList &sessions); void availableReactionsReceived(qlonglong messageId, const QStringList &reactions); void chatUnreadMentionCountUpdated(qlonglong chatId, int unreadMentionCount); void chatUnreadReactionCountUpdated(qlonglong chatId, int unreadReactionCount); diff --git a/src/tdlibwrapper.cpp b/src/tdlibwrapper.cpp index 509e7cc..f815ccf 100644 --- a/src/tdlibwrapper.cpp +++ b/src/tdlibwrapper.cpp @@ -48,6 +48,8 @@ namespace { const QString LAST_NAME("last_name"); const QString FIRST_NAME("first_name"); const QString USERNAME("username"); + const QString USERNAMES("usernames"); + const QString EDITABLE_USERNAME("editable_username"); const QString THREAD_ID("thread_id"); const QString VALUE("value"); const QString CHAT_LIST_TYPE("chat_list_type"); @@ -185,7 +187,7 @@ void TDLibWrapper::initializeTDLibReceiver() { connect(this->tdLibReceiver, SIGNAL(userPrivacySettingRulesUpdated(QVariantMap)), this, SLOT(handleUpdatedUserPrivacySettingRules(QVariantMap))); connect(this->tdLibReceiver, SIGNAL(messageInteractionInfoUpdated(qlonglong, qlonglong, QVariantMap)), this, SIGNAL(messageInteractionInfoUpdated(qlonglong, qlonglong, QVariantMap))); connect(this->tdLibReceiver, SIGNAL(okReceived(QString)), this, SIGNAL(okReceived(QString))); - connect(this->tdLibReceiver, SIGNAL(sessionsReceived(QVariantList)), this, SIGNAL(sessionsReceived(QVariantList))); + connect(this->tdLibReceiver, SIGNAL(sessionsReceived(int, QVariantList)), this, SIGNAL(sessionsReceived(int, QVariantList))); connect(this->tdLibReceiver, SIGNAL(availableReactionsReceived(qlonglong, QStringList)), this, SIGNAL(availableReactionsReceived(qlonglong, QStringList))); connect(this->tdLibReceiver, SIGNAL(chatUnreadMentionCountUpdated(qlonglong, int)), this, SIGNAL(chatUnreadMentionCountUpdated(qlonglong, int))); connect(this->tdLibReceiver, SIGNAL(chatUnreadReactionCountUpdated(qlonglong, int)), this, SIGNAL(chatUnreadReactionCountUpdated(qlonglong, int))); @@ -411,19 +413,10 @@ QVariantMap TDLibWrapper::newSendMessageRequest(qlonglong chatId, qlonglong repl request.insert(_TYPE, "sendMessage"); request.insert(CHAT_ID, chatId); if (replyToMessageId) { - if (versionNumber > VERSION_NUMBER(1,8,14)) { - QVariantMap replyTo; - if (versionNumber > VERSION_NUMBER(1,8,20)) { - replyTo.insert(_TYPE, TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE); - } else { - replyTo.insert(_TYPE, TYPE_MESSAGE_REPLY_TO_MESSAGE); - } - replyTo.insert(CHAT_ID, chatId); - replyTo.insert(MESSAGE_ID, replyToMessageId); - request.insert(REPLY_TO, replyTo); - } else { - request.insert(REPLY_TO_MESSAGE_ID, replyToMessageId); - } + QVariantMap replyTo; + replyTo.insert(_TYPE, TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE); + replyTo.insert(MESSAGE_ID, replyToMessageId); + request.insert(REPLY_TO, replyTo); } return request; } @@ -1527,6 +1520,14 @@ void TDLibWrapper::setNetworkType(NetworkType networkType) this->sendRequest(requestObject); } +void TDLibWrapper::setInactiveSessionTtl(int days) +{ + QVariantMap requestObject; + requestObject.insert(_TYPE, "setInactiveSessionTtl"); + requestObject.insert("inactive_session_ttl_days", days); + this->sendRequest(requestObject); +} + void TDLibWrapper::searchEmoji(const QString &queryString) { LOG("Searching emoji" << queryString); @@ -1838,9 +1839,9 @@ void TDLibWrapper::handleUserUpdated(const QVariantMap &userInformation) this->userInformation = userInformation; emit ownUserUpdated(userInformation); } - LOG("User information updated:" << userInformation.value(USERNAME).toString() << userInformation.value(FIRST_NAME).toString() << userInformation.value(LAST_NAME).toString()); + LOG("User information updated:" << userInformation.value(USERNAMES).toMap().value(EDITABLE_USERNAME).toString() << userInformation.value(FIRST_NAME).toString() << userInformation.value(LAST_NAME).toString()); this->allUsers.insert(updatedUserId, userInformation); - this->allUserNames.insert(userInformation.value(USERNAME).toString(), userInformation); + this->allUserNames.insert(userInformation.value(USERNAMES).toMap().value(EDITABLE_USERNAME).toString(), userInformation); emit userUpdated(updatedUserId, userInformation); } @@ -1854,7 +1855,7 @@ void TDLibWrapper::handleUserStatusUpdated(const QString &userId, const QVariant QVariantMap updatedUserInformation = this->allUsers.value(userId).toMap(); updatedUserInformation.insert(STATUS, userStatusInformation); this->allUsers.insert(userId, updatedUserInformation); - this->allUserNames.insert(userInformation.value(USERNAME).toString(), userInformation); + this->allUserNames.insert(userInformation.value(USERNAMES).toMap().value(EDITABLE_USERNAME).toString(), userInformation); emit userUpdated(userId, updatedUserInformation); } diff --git a/src/tdlibwrapper.h b/src/tdlibwrapper.h index 33e29b4..17a0896 100644 --- a/src/tdlibwrapper.h +++ b/src/tdlibwrapper.h @@ -251,6 +251,7 @@ public: Q_INVOKABLE void getPageSource(const QString &address); Q_INVOKABLE void setMessageReaction(qlonglong chatId, qlonglong messageId, const QString &reaction); Q_INVOKABLE void setNetworkType(NetworkType networkType); + Q_INVOKABLE void setInactiveSessionTtl(int days); // Others (candidates for extraction ;)) Q_INVOKABLE void searchEmoji(const QString &queryString); @@ -331,7 +332,7 @@ signals: void userPrivacySettingUpdated(UserPrivacySetting setting, UserPrivacySettingRule rule); void messageInteractionInfoUpdated(qlonglong chatId, qlonglong messageId, const QVariantMap &updatedInfo); void okReceived(const QString &request); - void sessionsReceived(const QVariantList &sessions); + void sessionsReceived(int inactive_session_ttl_days, const QVariantList &sessions); void openFileExternally(const QString &filePath); void availableReactionsReceived(qlonglong messageId, const QStringList &reactions); void chatUnreadMentionCountUpdated(qlonglong chatId, int unreadMentionCount); diff --git a/translations/harbour-fernschreiber-de.ts b/translations/harbour-fernschreiber-de.ts index e701ecb..4359431 100644 --- a/translations/harbour-fernschreiber-de.ts +++ b/translations/harbour-fernschreiber-de.ts @@ -1704,6 +1704,37 @@ Sessions Sitzungen + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-en.ts b/translations/harbour-fernschreiber-en.ts index f746fae..fd4880b 100644 --- a/translations/harbour-fernschreiber-en.ts +++ b/translations/harbour-fernschreiber-en.ts @@ -1706,6 +1706,37 @@ messages Active since: %1, last online: %2 Active since: %1, last online: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-es.ts b/translations/harbour-fernschreiber-es.ts index 13edb64..b342d05 100644 --- a/translations/harbour-fernschreiber-es.ts +++ b/translations/harbour-fernschreiber-es.ts @@ -1704,6 +1704,37 @@ Active since: %1, last online: %2 Activo desde: %1, último en línea: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-fi.ts b/translations/harbour-fernschreiber-fi.ts index 0a8fed4..86538d5 100644 --- a/translations/harbour-fernschreiber-fi.ts +++ b/translations/harbour-fernschreiber-fi.ts @@ -1705,6 +1705,37 @@ Active since: %1, last online: %2 Aktiivinen %1 alkaen, viimeksi paikalla: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-fr.ts b/translations/harbour-fernschreiber-fr.ts index 3c6b609..71bdeb8 100644 --- a/translations/harbour-fernschreiber-fr.ts +++ b/translations/harbour-fernschreiber-fr.ts @@ -1704,6 +1704,37 @@ Active since: %1, last online: %2 Actif depuis : %1, en ligne : %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-hu.ts b/translations/harbour-fernschreiber-hu.ts index 2f3e0e8..3cb6616 100644 --- a/translations/harbour-fernschreiber-hu.ts +++ b/translations/harbour-fernschreiber-hu.ts @@ -1677,6 +1677,36 @@ Active since: %1, last online: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-it.ts b/translations/harbour-fernschreiber-it.ts index 23ca0ec..b68a0d0 100644 --- a/translations/harbour-fernschreiber-it.ts +++ b/translations/harbour-fernschreiber-it.ts @@ -1704,6 +1704,37 @@ Active since: %1, last online: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-pl.ts b/translations/harbour-fernschreiber-pl.ts index 8dacef3..d4a1cf9 100644 --- a/translations/harbour-fernschreiber-pl.ts +++ b/translations/harbour-fernschreiber-pl.ts @@ -1731,6 +1731,38 @@ Active since: %1, last online: %2 Aktywny od: %1, ostatnio aktywny: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-ru.ts b/translations/harbour-fernschreiber-ru.ts index ecc4a97..125ba7c 100644 --- a/translations/harbour-fernschreiber-ru.ts +++ b/translations/harbour-fernschreiber-ru.ts @@ -1734,6 +1734,38 @@ Active since: %1, last online: %2 Активен с: %1, был онлайн: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-sk.ts b/translations/harbour-fernschreiber-sk.ts index 3c8b4ac..1a97fe2 100644 --- a/translations/harbour-fernschreiber-sk.ts +++ b/translations/harbour-fernschreiber-sk.ts @@ -1731,6 +1731,38 @@ Active since: %1, last online: %2 Aktívna od: %1, naposledy pripojená: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-sv.ts b/translations/harbour-fernschreiber-sv.ts index 10b0e60..705125b 100644 --- a/translations/harbour-fernschreiber-sv.ts +++ b/translations/harbour-fernschreiber-sv.ts @@ -1704,6 +1704,37 @@ Active since: %1, last online: %2 Aktiv sedan: %1, senast online: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber-zh_CN.ts b/translations/harbour-fernschreiber-zh_CN.ts index 8837c24..d5fa60d 100644 --- a/translations/harbour-fernschreiber-zh_CN.ts +++ b/translations/harbour-fernschreiber-zh_CN.ts @@ -1678,6 +1678,36 @@ Active since: %1, last online: %2 活跃时间: %1, 上次在线: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage diff --git a/translations/harbour-fernschreiber.ts b/translations/harbour-fernschreiber.ts index 1423125..69001f7 100644 --- a/translations/harbour-fernschreiber.ts +++ b/translations/harbour-fernschreiber.ts @@ -1704,6 +1704,37 @@ Active since: %1, last online: %2 + + Terminate old sessions if inactive for + + + + %1 day(s) + + + + + + + 1 week + + + + 1 month + + + + 3 months + + + + 6 months + + + + 1 year + + SettingsStorage