diff options
| author | Andrew Branson <andrew.branson@jolla.com> | 2026-03-09 09:44:01 +0100 |
|---|---|---|
| committer | Andrew Branson <andrew.branson@jolla.com> | 2026-03-09 21:13:03 +0100 |
| commit | e93766b063432347bd1062aa59bbe122ee7a43f3 (patch) | |
| tree | 4b2f66a383400e8428f6c6388084685a915b2902 | |
| parent | 9182ffb1573c77367ad6b5e4b1f3e4f52b3c3ea4 (diff) | |
Localize settings text and refresh Mastodon docsrefactor
- Add QTranslator to notifications plugin
- Create own logging category now trace is gone
11 files changed, 240 insertions, 81 deletions
@@ -17,7 +17,8 @@ Sailfish OS account integration for Mastodon. - Translation source catalog: `/usr/share/translations/source/settings-accounts-mastodon.ts` - Provider/service metadata uses `<translations>/usr/share/translations/settings-accounts-mastodon</translations>` for metadata string translation paths. - Services: - - `mastodon-microblog`: sync service for posts and notifications. + - `mastodon-microblog`: sync service for posts. + - `mastodon-notifications`: sync service for notifications. - `mastodon-sharing`: Transfer Engine sharing service. ### `buteo-plugins/` @@ -65,7 +66,7 @@ Sailfish OS account integration for Mastodon. - Notifications sync starts from Mastodon server marker (`notifications.last_read_id`) and uses local cursor dedupe via per-account `LastFetchedNotificationId`. - Each unread Mastodon notification is published as a separate Sailfish system notification. - Mastodon marker (`last_read_id`) is updated only when no local Mastodon notifications remain for that account. -- Notification template profile dispatches per-account sync profiles on schedule (default every 30 minutes), not only at boot. +- Notification template profile dispatches per-account sync profiles on schedule (default every 15 minutes), not only at boot. ## Build Requirements diff --git a/buteo-plugins/buteo-sync-plugin-mastodon-notifications/buteo-sync-plugin-mastodon-notifications.pro b/buteo-plugins/buteo-sync-plugin-mastodon-notifications/buteo-sync-plugin-mastodon-notifications.pro index c14e878..0cf375c 100644 --- a/buteo-plugins/buteo-sync-plugin-mastodon-notifications/buteo-sync-plugin-mastodon-notifications.pro +++ b/buteo-plugins/buteo-sync-plugin-mastodon-notifications/buteo-sync-plugin-mastodon-notifications.pro @@ -4,6 +4,31 @@ QT -= gui include($$PWD/../../common/common.pri) +TS_FILE = $$OUT_PWD/lipstick-jolla-home-mastodon-notifications.ts +EE_QM = $$OUT_PWD/lipstick-jolla-home-mastodon-notifications_eng_en.qm + +ts.commands += lupdate $$PWD -ts $$TS_FILE +ts.CONFIG += no_check_exist no_link +ts.output = $$TS_FILE +ts.input = . + +ts_install.files = $$TS_FILE +ts_install.path = /usr/share/translations/source +ts_install.CONFIG += no_check_exist + +engineering_english.commands += lrelease -idbased $$TS_FILE -qm $$EE_QM +engineering_english.CONFIG += no_check_exist no_link +engineering_english.depends = ts +engineering_english.input = $$TS_FILE +engineering_english.output = $$EE_QM + +engineering_english_install.path = /usr/share/translations +engineering_english_install.files = $$EE_QM +engineering_english_install.CONFIG += no_check_exist + +QMAKE_EXTRA_TARGETS += ts engineering_english +PRE_TARGETDEPS += ts engineering_english + CONFIG += link_pkgconfig PKGCONFIG += \ buteosocialcommon \ @@ -40,4 +65,4 @@ sync.files = mastodon.Notifications.xml client.path = /etc/buteo/profiles/client client.files = mastodon-notifications.xml -INSTALLS += target sync client +INSTALLS += target sync client ts_install engineering_english_install diff --git a/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodondatatypesyncadaptor.cpp b/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodondatatypesyncadaptor.cpp index 295d7b9..14b3511 100644 --- a/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodondatatypesyncadaptor.cpp +++ b/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodondatatypesyncadaptor.cpp @@ -20,8 +20,8 @@ #include "mastodondatatypesyncadaptor.h" #include "mastodonauthutils.h" -#include "trace.h" +#include <QtCore/QLoggingCategory> #include <QtCore/QVariantMap> #include <QtNetwork/QNetworkRequest> @@ -36,6 +36,8 @@ #include <SignOn/AuthSession> #include <SignOn/SessionData> +Q_LOGGING_CATEGORY(lcMastodonNotificationsSync, "buteo.plugin.mastodon.notifications.sync", QtWarningMsg) + MastodonNotificationsDataTypeSyncAdaptor::MastodonNotificationsDataTypeSyncAdaptor( SocialNetworkSyncAdaptor::DataType dataType, QObject *parent) @@ -50,7 +52,7 @@ MastodonNotificationsDataTypeSyncAdaptor::~MastodonNotificationsDataTypeSyncAdap void MastodonNotificationsDataTypeSyncAdaptor::sync(const QString &dataTypeString, int accountId) { if (dataTypeString != SocialNetworkSyncAdaptor::dataTypeName(m_dataType)) { - qCWarning(lcSocialPlugin) << "Mastodon" << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) + qCWarning(lcMastodonNotificationsSync) << "Mastodon" << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) << "sync adaptor was asked to sync" << dataTypeString; setStatus(SocialNetworkSyncAdaptor::Error); return; @@ -58,14 +60,14 @@ void MastodonNotificationsDataTypeSyncAdaptor::sync(const QString &dataTypeStrin setStatus(SocialNetworkSyncAdaptor::Busy); updateDataForAccount(accountId); - qCDebug(lcSocialPlugin) << "successfully triggered sync with profile:" << m_accountSyncProfile->name(); + qCDebug(lcMastodonNotificationsSync) << "successfully triggered sync with profile:" << m_accountSyncProfile->name(); } void MastodonNotificationsDataTypeSyncAdaptor::updateDataForAccount(int accountId) { Accounts::Account *account = Accounts::Account::fromId(m_accountManager, accountId, this); if (!account) { - qCWarning(lcSocialPlugin) << "existing account with id" << accountId << "couldn't be retrieved"; + qCWarning(lcMastodonNotificationsSync) << "existing account with id" << accountId << "couldn't be retrieved"; setStatus(SocialNetworkSyncAdaptor::Error); return; } @@ -89,7 +91,7 @@ void MastodonNotificationsDataTypeSyncAdaptor::errorHandler(QNetworkReply::Netwo const int accountId = reply->property("accountId").toInt(); const int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - qCWarning(lcSocialPlugin) << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) + qCWarning(lcMastodonNotificationsSync) << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) << "request with account" << accountId << "experienced error:" << err << "HTTP:" << httpStatus; @@ -114,7 +116,7 @@ void MastodonNotificationsDataTypeSyncAdaptor::sslErrorsHandler(const QList<QSsl sslerrs.chop(2); } - qCWarning(lcSocialPlugin) << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) + qCWarning(lcMastodonNotificationsSync) << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) << "request with account" << sender()->property("accountId").toInt() << "experienced ssl errors:" << sslerrs; sender()->setProperty("isError", QVariant::fromValue<bool>(true)); @@ -122,7 +124,7 @@ void MastodonNotificationsDataTypeSyncAdaptor::sslErrorsHandler(const QList<QSsl void MastodonNotificationsDataTypeSyncAdaptor::setCredentialsNeedUpdate(Accounts::Account *account) { - qCInfo(lcSocialPlugin) << "sociald:Mastodon: setting CredentialsNeedUpdate to true for account:" << account->id(); + qCInfo(lcMastodonNotificationsSync) << "sociald:Mastodon: setting CredentialsNeedUpdate to true for account:" << account->id(); Accounts::Service srv(m_accountManager->service(syncServiceName())); account->selectService(srv); account->setValue(QStringLiteral("CredentialsNeedUpdate"), QVariant::fromValue<bool>(true)); @@ -145,7 +147,7 @@ void MastodonNotificationsDataTypeSyncAdaptor::signIn(Accounts::Account *account ? SignOn::Identity::existingIdentity(account->credentialsId()) : 0; if (!identity) { - qCWarning(lcSocialPlugin) << "account" << accountId << "has no valid credentials, cannot sign in"; + qCWarning(lcMastodonNotificationsSync) << "account" << accountId << "has no valid credentials, cannot sign in"; decrementSemaphore(accountId); return; } @@ -155,7 +157,7 @@ void MastodonNotificationsDataTypeSyncAdaptor::signIn(Accounts::Account *account const QString mechanism = accSrv.authData().mechanism(); SignOn::AuthSession *session = identity->createSession(method); if (!session) { - qCWarning(lcSocialPlugin) << "could not create signon session for account" << accountId; + qCWarning(lcMastodonNotificationsSync) << "could not create signon session for account" << accountId; identity->deleteLater(); decrementSemaphore(accountId); return; @@ -183,7 +185,7 @@ void MastodonNotificationsDataTypeSyncAdaptor::signOnError(const SignOn::Error & SignOn::Identity *identity = session->property("identity").value<SignOn::Identity*>(); const int accountId = account->id(); - qCWarning(lcSocialPlugin) << "credentials for account with id" << accountId + qCWarning(lcMastodonNotificationsSync) << "credentials for account with id" << accountId << "couldn't be retrieved:" << error.type() << error.message(); if (error.type() == SignOn::Error::UserInteraction) { @@ -211,7 +213,7 @@ void MastodonNotificationsDataTypeSyncAdaptor::signOnResponse(const SignOn::Sess accessToken = MastodonAuthUtils::accessToken(data); if (accessToken.isEmpty()) { - qCWarning(lcSocialPlugin) << "signon response for account with id" << accountId + qCWarning(lcMastodonNotificationsSync) << "signon response for account with id" << accountId << "contained no access token; keys:" << data.keys(); } diff --git a/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodonnotificationsplugin.cpp b/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodonnotificationsplugin.cpp index fe9f989..9dd3724 100644 --- a/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodonnotificationsplugin.cpp +++ b/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodonnotificationsplugin.cpp @@ -22,6 +22,52 @@ #include "mastodonnotificationssyncadaptor.h" #include "socialnetworksyncadaptor.h" +#include <QCoreApplication> +#include <QLocale> +#include <QTranslator> + +namespace { +class AppTranslator : public QTranslator +{ +public: + explicit AppTranslator(QObject *parent) + : QTranslator(parent) + { + qApp->installTranslator(this); + } + + ~AppTranslator() override + { + qApp->removeTranslator(this); + } +}; + +void ensureNotificationTranslations() +{ + static bool initialized = false; + if (initialized) { + return; + } + + QCoreApplication *app = QCoreApplication::instance(); + if (!app) { + return; + } + + AppTranslator *engineeringEnglish = new AppTranslator(app); + engineeringEnglish->load(QStringLiteral("lipstick-jolla-home-mastodon-notifications_eng_en"), + QStringLiteral("/usr/share/translations")); + + AppTranslator *translator = new AppTranslator(app); + translator->load(QLocale(), + QStringLiteral("lipstick-jolla-home-mastodon-notifications"), + QStringLiteral("-"), + QStringLiteral("/usr/share/translations")); + + initialized = true; +} +} + MastodonNotificationsPlugin::MastodonNotificationsPlugin(const QString& pluginName, const Buteo::SyncProfile& profile, Buteo::PluginCbInterface *callbackInterface) @@ -29,6 +75,7 @@ MastodonNotificationsPlugin::MastodonNotificationsPlugin(const QString& pluginNa QStringLiteral("mastodon"), SocialNetworkSyncAdaptor::dataTypeName(SocialNetworkSyncAdaptor::Notifications)) { + ensureNotificationTranslations(); } MastodonNotificationsPlugin::~MastodonNotificationsPlugin() diff --git a/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodonnotificationssyncadaptor.cpp b/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodonnotificationssyncadaptor.cpp index 05fd6e9..8a2c610 100644 --- a/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodonnotificationssyncadaptor.cpp +++ b/buteo-plugins/buteo-sync-plugin-mastodon-notifications/mastodonnotificationssyncadaptor.cpp @@ -19,9 +19,10 @@ ****************************************************************************/ #include "mastodonnotificationssyncadaptor.h" -#include "trace.h" #include "mastodontextutils.h" +#include <QtCore/QCoreApplication> +#include <QtCore/QLoggingCategory> #include <QtCore/QJsonArray> #include <QtCore/QJsonObject> #include <QtCore/QJsonValue> @@ -50,11 +51,79 @@ ) namespace { + Q_LOGGING_CATEGORY(lcMastodonNotifications, "buteo.plugin.mastodon.notifications", QtWarningMsg) + const char *const NotificationCategory = "x-nemo.social.mastodon.notification"; const char *const NotificationIdHint = "x-nemo.sociald.notification-id"; const char *const LastFetchedNotificationIdKey = "LastFetchedNotificationId"; const int NotificationsPageLimit = 80; + //% "mentioned you" + const char *const TrIdMentionedYou = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-mentioned_you"); + //% "boosted your post" + const char *const TrIdBoostedYourPost = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-boosted_your_post"); + //% "favourited your post" + const char *const TrIdFavouritedYourPost = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-favourited_your_post"); + //% "started following you" + const char *const TrIdStartedFollowingYou = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-started_following_you"); + //% "requested to follow you" + const char *const TrIdRequestedToFollowYou = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-requested_to_follow_you"); + //% "interacted with your poll" + const char *const TrIdInteractedWithYourPoll = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-interacted_with_your_poll"); + //% "posted" + const char *const TrIdPosted = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-posted"); + //% "updated a post" + const char *const TrIdUpdatedPost = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-updated_post"); + //% "signed up" + const char *const TrIdSignedUp = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-signed_up"); + //% "reported an account" + const char *const TrIdReportedAccount = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-reported_account"); + //% "received a moderation warning" + const char *const TrIdReceivedModerationWarning = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-received_moderation_warning"); + //% "quoted your post" + const char *const TrIdQuotedYourPost = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-quoted_your_post"); + //% "updated a post that quoted you" + const char *const TrIdUpdatedQuotedPost = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-updated_quoted_post"); + //% "sent you a notification" + const char *const TrIdSentNotification = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-sent_notification"); + + //% "An admin blocked an instance" + const char *const TrIdAdminBlockedInstance = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-admin_blocked_instance"); + //% "An admin blocked %1" + const char *const TrIdAdminBlockedTarget = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-admin_blocked_target"); + //% "You blocked an instance" + const char *const TrIdYouBlockedInstance = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-you_blocked_instance"); + //% "You blocked %1" + const char *const TrIdYouBlockedTarget = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-you_blocked_target"); + //% "An account was suspended" + const char *const TrIdAccountSuspended = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-account_suspended"); + //% "%1 was suspended" + const char *const TrIdTargetSuspended = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-target_suspended"); + //% "Some follow relationships were severed" + const char *const TrIdRelationshipsSevered = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-relationships_severed"); + //% "%1 (%2 followers, %3 following removed)" + const char *const TrIdRelationshipsSummary = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-relationships_summary"); + + //% "A moderator sent you a warning" + const char *const TrIdModeratorWarningNone = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-moderator_warning_none"); + //% "A moderator disabled your account" + const char *const TrIdModeratorWarningDisable = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-moderator_warning_disable"); + //% "A moderator marked specific posts as sensitive" + const char *const TrIdModeratorWarningSpecificSensitive = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-moderator_warning_specific_sensitive"); + //% "A moderator deleted specific posts" + const char *const TrIdModeratorWarningDeletePosts = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-moderator_warning_delete_posts"); + //% "A moderator marked all your posts as sensitive" + const char *const TrIdModeratorWarningAllSensitive = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-moderator_warning_all_sensitive"); + //% "A moderator limited your account" + const char *const TrIdModeratorWarningSilence = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-moderator_warning_silence"); + //% "A moderator suspended your account" + const char *const TrIdModeratorWarningSuspend = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-moderator_warning_suspend"); + + //% "Mastodon" + const char *const TrIdMastodon = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-mastodon"); + //% "New notification" + const char *const TrIdNewNotification = QT_TRID_NOOP("lipstick-jolla-home-la-mastodon-notification-new_notification"); + QString displayNameForAccount(const QJsonObject &account) { const QString displayName = account.value(QStringLiteral("display_name")).toString().trimmed(); @@ -73,34 +142,34 @@ namespace { QString actionText(const QString &type) { if (type == QLatin1String("mention")) { - return QStringLiteral("mentioned you"); + return qtTrId(TrIdMentionedYou); } else if (type == QLatin1String("reblog")) { - return QStringLiteral("boosted your post"); + return qtTrId(TrIdBoostedYourPost); } else if (type == QLatin1String("favourite")) { - return QStringLiteral("favourited your post"); + return qtTrId(TrIdFavouritedYourPost); } else if (type == QLatin1String("follow")) { - return QStringLiteral("started following you"); + return qtTrId(TrIdStartedFollowingYou); } else if (type == QLatin1String("follow_request")) { - return QStringLiteral("requested to follow you"); + return qtTrId(TrIdRequestedToFollowYou); } else if (type == QLatin1String("poll")) { - return QStringLiteral("interacted with your poll"); + return qtTrId(TrIdInteractedWithYourPoll); } else if (type == QLatin1String("status")) { - return QStringLiteral("posted"); + return qtTrId(TrIdPosted); } else if (type == QLatin1String("update")) { - return QStringLiteral("updated a post"); + return qtTrId(TrIdUpdatedPost); } else if (type == QLatin1String("admin.sign_up")) { - return QStringLiteral("signed up"); + return qtTrId(TrIdSignedUp); } else if (type == QLatin1String("admin.report")) { - return QStringLiteral("reported an account"); + return qtTrId(TrIdReportedAccount); } else if (type == QLatin1String("moderation_warning")) { - return QStringLiteral("received a moderation warning"); + return qtTrId(TrIdReceivedModerationWarning); } else if (type == QLatin1String("quote")) { - return QStringLiteral("quoted your post"); + return qtTrId(TrIdQuotedYourPost); } else if (type == QLatin1String("quoted_update")) { - return QStringLiteral("updated a post that quoted you"); + return qtTrId(TrIdUpdatedQuotedPost); } - return QStringLiteral("sent you a notification"); + return qtTrId(TrIdSentNotification); } bool useSystemSummary(const QString ¬ificationType) @@ -119,18 +188,18 @@ namespace { QString action; if (eventType == QLatin1String("domain_block")) { action = targetName.isEmpty() - ? QStringLiteral("An admin blocked an instance") - : QStringLiteral("An admin blocked %1").arg(targetName); + ? qtTrId(TrIdAdminBlockedInstance) + : qtTrId(TrIdAdminBlockedTarget).arg(targetName); } else if (eventType == QLatin1String("user_domain_block")) { action = targetName.isEmpty() - ? QStringLiteral("You blocked an instance") - : QStringLiteral("You blocked %1").arg(targetName); + ? qtTrId(TrIdYouBlockedInstance) + : qtTrId(TrIdYouBlockedTarget).arg(targetName); } else if (eventType == QLatin1String("account_suspension")) { action = targetName.isEmpty() - ? QStringLiteral("An account was suspended") - : QStringLiteral("%1 was suspended").arg(targetName); + ? qtTrId(TrIdAccountSuspended) + : qtTrId(TrIdTargetSuspended).arg(targetName); } else { - action = QStringLiteral("Some follow relationships were severed"); + action = qtTrId(TrIdRelationshipsSevered); } const int affectedCount = followersCount + followingCount; @@ -138,7 +207,7 @@ namespace { return action; } - return QStringLiteral("%1 (%2 followers, %3 following removed)") + return qtTrId(TrIdRelationshipsSummary) .arg(action) .arg(followersCount) .arg(followingCount); @@ -153,19 +222,19 @@ namespace { const QString action = warningObject.value(QStringLiteral("action")).toString(); if (action == QLatin1String("none")) { - return QStringLiteral("A moderator sent you a warning"); + return qtTrId(TrIdModeratorWarningNone); } else if (action == QLatin1String("disable")) { - return QStringLiteral("A moderator disabled your account"); + return qtTrId(TrIdModeratorWarningDisable); } else if (action == QLatin1String("mark_statuses_as_sensitive")) { - return QStringLiteral("A moderator marked specific posts as sensitive"); + return qtTrId(TrIdModeratorWarningSpecificSensitive); } else if (action == QLatin1String("delete_statuses")) { - return QStringLiteral("A moderator deleted specific posts"); + return qtTrId(TrIdModeratorWarningDeletePosts); } else if (action == QLatin1String("sensitive")) { - return QStringLiteral("A moderator marked all your posts as sensitive"); + return qtTrId(TrIdModeratorWarningAllSensitive); } else if (action == QLatin1String("silence")) { - return QStringLiteral("A moderator limited your account"); + return qtTrId(TrIdModeratorWarningSilence); } else if (action == QLatin1String("suspend")) { - return QStringLiteral("A moderator suspended your account"); + return qtTrId(TrIdModeratorWarningSuspend); } return QString(); @@ -252,7 +321,7 @@ void MastodonNotificationsSyncAdaptor::beginSync(int accountId, const QString &a void MastodonNotificationsSyncAdaptor::finalize(int accountId) { if (syncAborted()) { - qCInfo(lcSocialPlugin) << "sync aborted, won't update notifications"; + qCInfo(lcMastodonNotifications) << "sync aborted, won't update notifications"; } Q_UNUSED(accountId) @@ -348,7 +417,7 @@ void MastodonNotificationsSyncAdaptor::requestUnreadMarker(int accountId, const incrementSemaphore(accountId); setupReplyTimeout(accountId, reply); } else { - qCWarning(lcSocialPlugin) << "unable to request notifications marker from Mastodon account with id" << accountId; + qCWarning(lcMastodonNotifications) << "unable to request notifications marker from Mastodon account with id" << accountId; } } @@ -371,7 +440,7 @@ void MastodonNotificationsSyncAdaptor::finishedUnreadMarkerHandler() bool ok = false; const QJsonObject markerObject = parseJsonObjectReplyData(replyData, &ok); if (isError || !ok) { - qCWarning(lcSocialPlugin) << "unable to parse notifications marker data from request with account" + qCWarning(lcMastodonNotifications) << "unable to parse notifications marker data from request with account" << accountId << ", got:" << QString::fromUtf8(replyData); PendingSyncState fallbackState; fallbackState.accessToken = accessToken; @@ -435,7 +504,7 @@ void MastodonNotificationsSyncAdaptor::requestNotifications(int accountId, incrementSemaphore(accountId); setupReplyTimeout(accountId, reply); } else { - qCWarning(lcSocialPlugin) << "unable to request notifications from Mastodon account with id" << accountId; + qCWarning(lcMastodonNotifications) << "unable to request notifications from Mastodon account with id" << accountId; } } @@ -463,7 +532,7 @@ void MastodonNotificationsSyncAdaptor::requestMarkRead(int accountId, incrementSemaphore(accountId); setupReplyTimeout(accountId, reply); } else { - qCWarning(lcSocialPlugin) << "unable to update notifications marker for Mastodon account with id" << accountId; + qCWarning(lcMastodonNotifications) << "unable to update notifications marker for Mastodon account with id" << accountId; } } @@ -501,7 +570,7 @@ void MastodonNotificationsSyncAdaptor::finishedNotificationsHandler() const QJsonArray notifications = parseJsonArrayReplyData(replyData, &ok); if (!isError && ok) { if (!notifications.size()) { - qCDebug(lcSocialPlugin) << "no notifications received for account" << accountId; + qCDebug(lcMastodonNotifications) << "no notifications received for account" << accountId; m_pendingSyncStates.remove(accountId); decrementSemaphore(accountId); return; @@ -596,7 +665,7 @@ void MastodonNotificationsSyncAdaptor::finishedNotificationsHandler() PendingNotification pendingNotification; pendingNotification.notificationId = notificationId; pendingNotification.summary = useSystemSummary(notificationType) - ? QStringLiteral("Mastodon") + ? qtTrId(TrIdMastodon) : displayName; pendingNotification.body = body; pendingNotification.link = url; @@ -647,7 +716,7 @@ void MastodonNotificationsSyncAdaptor::finishedNotificationsHandler() requestMarkRead(accountId, state.accessToken, markerId); } } else { - qCWarning(lcSocialPlugin) << "unable to parse notifications data from request with account" << accountId + qCWarning(lcMastodonNotifications) << "unable to parse notifications data from request with account" << accountId << ", got:" << QString::fromUtf8(replyData); } @@ -679,7 +748,7 @@ void MastodonNotificationsSyncAdaptor::finishedMarkReadHandler() m_lastMarkedReadIds.insert(accountId, lastReadId); } } else { - qCWarning(lcSocialPlugin) << "unable to update notifications marker for account" << accountId + qCWarning(lcMastodonNotifications) << "unable to update notifications marker for account" << accountId << ", got:" << QString::fromUtf8(replyData); } @@ -695,10 +764,10 @@ void MastodonNotificationsSyncAdaptor::publishSystemNotification(int accountId, ? notificationData.timestamp : QDateTime::currentDateTimeUtc()); notification->setSummary(notificationData.summary.isEmpty() - ? QStringLiteral("Mastodon") + ? qtTrId(TrIdMastodon) : notificationData.summary); notification->setBody(notificationData.body.isEmpty() - ? QStringLiteral("New notification") + ? qtTrId(TrIdNewNotification) : notificationData.body); notification->setPreviewSummary(notificationData.summary); notification->setPreviewBody(notificationData.body); @@ -716,7 +785,7 @@ void MastodonNotificationsSyncAdaptor::publishSystemNotification(int accountId, notification->setRemoteAction(OPEN_URL_ACTION(authorizeInteractionUrl(apiHost(accountId), safeOpenUrl))); notification->publish(); if (notification->replacesId() == 0) { - qCWarning(lcSocialPlugin) << "failed to publish Mastodon notification" + qCWarning(lcMastodonNotifications) << "failed to publish Mastodon notification" << notificationData.notificationId; } } diff --git a/buteo-plugins/buteo-sync-plugin-mastodon-posts/mastodondatatypesyncadaptor.cpp b/buteo-plugins/buteo-sync-plugin-mastodon-posts/mastodondatatypesyncadaptor.cpp index 7b47fe8..577e185 100644 --- a/buteo-plugins/buteo-sync-plugin-mastodon-posts/mastodondatatypesyncadaptor.cpp +++ b/buteo-plugins/buteo-sync-plugin-mastodon-posts/mastodondatatypesyncadaptor.cpp @@ -20,8 +20,8 @@ #include "mastodondatatypesyncadaptor.h" #include "mastodonauthutils.h" -#include "trace.h" +#include <QtCore/QLoggingCategory> #include <QtCore/QVariantMap> #include <QtNetwork/QNetworkRequest> @@ -36,6 +36,8 @@ #include <SignOn/AuthSession> #include <SignOn/SessionData> +Q_LOGGING_CATEGORY(lcMastodonSync, "buteo.plugin.mastodon.sync", QtWarningMsg) + MastodonDataTypeSyncAdaptor::MastodonDataTypeSyncAdaptor( SocialNetworkSyncAdaptor::DataType dataType, QObject *parent) @@ -50,7 +52,7 @@ MastodonDataTypeSyncAdaptor::~MastodonDataTypeSyncAdaptor() void MastodonDataTypeSyncAdaptor::sync(const QString &dataTypeString, int accountId) { if (dataTypeString != SocialNetworkSyncAdaptor::dataTypeName(m_dataType)) { - qCWarning(lcSocialPlugin) << "Mastodon" << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) + qCWarning(lcMastodonSync) << "Mastodon" << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) << "sync adaptor was asked to sync" << dataTypeString; setStatus(SocialNetworkSyncAdaptor::Error); return; @@ -58,14 +60,14 @@ void MastodonDataTypeSyncAdaptor::sync(const QString &dataTypeString, int accoun setStatus(SocialNetworkSyncAdaptor::Busy); updateDataForAccount(accountId); - qCDebug(lcSocialPlugin) << "successfully triggered sync with profile:" << m_accountSyncProfile->name(); + qCDebug(lcMastodonSync) << "successfully triggered sync with profile:" << m_accountSyncProfile->name(); } void MastodonDataTypeSyncAdaptor::updateDataForAccount(int accountId) { Accounts::Account *account = Accounts::Account::fromId(m_accountManager, accountId, this); if (!account) { - qCWarning(lcSocialPlugin) << "existing account with id" << accountId << "couldn't be retrieved"; + qCWarning(lcMastodonSync) << "existing account with id" << accountId << "couldn't be retrieved"; setStatus(SocialNetworkSyncAdaptor::Error); return; } @@ -89,7 +91,7 @@ void MastodonDataTypeSyncAdaptor::errorHandler(QNetworkReply::NetworkError err) const int accountId = reply->property("accountId").toInt(); const int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - qCWarning(lcSocialPlugin) << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) + qCWarning(lcMastodonSync) << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) << "request with account" << accountId << "experienced error:" << err << "HTTP:" << httpStatus; @@ -114,7 +116,7 @@ void MastodonDataTypeSyncAdaptor::sslErrorsHandler(const QList<QSslError> &errs) sslerrs.chop(2); } - qCWarning(lcSocialPlugin) << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) + qCWarning(lcMastodonSync) << SocialNetworkSyncAdaptor::dataTypeName(m_dataType) << "request with account" << sender()->property("accountId").toInt() << "experienced ssl errors:" << sslerrs; sender()->setProperty("isError", QVariant::fromValue<bool>(true)); @@ -122,7 +124,7 @@ void MastodonDataTypeSyncAdaptor::sslErrorsHandler(const QList<QSslError> &errs) void MastodonDataTypeSyncAdaptor::setCredentialsNeedUpdate(Accounts::Account *account) { - qCInfo(lcSocialPlugin) << "sociald:Mastodon: setting CredentialsNeedUpdate to true for account:" << account->id(); + qCInfo(lcMastodonSync) << "sociald:Mastodon: setting CredentialsNeedUpdate to true for account:" << account->id(); Accounts::Service srv(m_accountManager->service(syncServiceName())); account->selectService(srv); account->setValue(QStringLiteral("CredentialsNeedUpdate"), QVariant::fromValue<bool>(true)); @@ -145,7 +147,7 @@ void MastodonDataTypeSyncAdaptor::signIn(Accounts::Account *account) ? SignOn::Identity::existingIdentity(account->credentialsId()) : 0; if (!identity) { - qCWarning(lcSocialPlugin) << "account" << accountId << "has no valid credentials, cannot sign in"; + qCWarning(lcMastodonSync) << "account" << accountId << "has no valid credentials, cannot sign in"; decrementSemaphore(accountId); return; } @@ -155,7 +157,7 @@ void MastodonDataTypeSyncAdaptor::signIn(Accounts::Account *account) const QString mechanism = accSrv.authData().mechanism(); SignOn::AuthSession *session = identity->createSession(method); if (!session) { - qCWarning(lcSocialPlugin) << "could not create signon session for account" << accountId; + qCWarning(lcMastodonSync) << "could not create signon session for account" << accountId; identity->deleteLater(); decrementSemaphore(accountId); return; @@ -183,7 +185,7 @@ void MastodonDataTypeSyncAdaptor::signOnError(const SignOn::Error &error) SignOn::Identity *identity = session->property("identity").value<SignOn::Identity*>(); const int accountId = account->id(); - qCWarning(lcSocialPlugin) << "credentials for account with id" << accountId + qCWarning(lcMastodonSync) << "credentials for account with id" << accountId << "couldn't be retrieved:" << error.type() << error.message(); if (error.type() == SignOn::Error::UserInteraction) { @@ -211,7 +213,7 @@ void MastodonDataTypeSyncAdaptor::signOnResponse(const SignOn::SessionData &resp accessToken = MastodonAuthUtils::accessToken(data); if (accessToken.isEmpty()) { - qCWarning(lcSocialPlugin) << "signon response for account with id" << accountId + qCWarning(lcMastodonSync) << "signon response for account with id" << accountId << "contained no access token; keys:" << data.keys(); } diff --git a/buteo-plugins/buteo-sync-plugin-mastodon-posts/mastodonpostssyncadaptor.cpp b/buteo-plugins/buteo-sync-plugin-mastodon-posts/mastodonpostssyncadaptor.cpp index 160d6cc..6c9a280 100644 --- a/buteo-plugins/buteo-sync-plugin-mastodon-posts/mastodonpostssyncadaptor.cpp +++ b/buteo-plugins/buteo-sync-plugin-mastodon-posts/mastodonpostssyncadaptor.cpp @@ -19,9 +19,9 @@ ****************************************************************************/ #include "mastodonpostssyncadaptor.h" -#include "trace.h" #include "mastodontextutils.h" +#include <QtCore/QLoggingCategory> #include <QtCore/QJsonArray> #include <QtCore/QJsonObject> #include <QtCore/QJsonValue> @@ -30,6 +30,8 @@ #include <QtNetwork/QNetworkRequest> namespace { + Q_LOGGING_CATEGORY(lcMastodonPostsSync, "buteo.plugin.mastodon.posts.sync", QtWarningMsg) + QString displayNameForAccount(const QJsonObject &account) { const QString displayName = account.value(QStringLiteral("display_name")).toString().trimmed(); @@ -80,7 +82,7 @@ void MastodonPostsSyncAdaptor::beginSync(int accountId, const QString &accessTok void MastodonPostsSyncAdaptor::finalize(int accountId) { if (syncAborted()) { - qCInfo(lcSocialPlugin) << "sync aborted, won't commit database changes"; + qCInfo(lcMastodonPostsSync) << "sync aborted, won't commit database changes"; } else { m_db.commit(); m_db.wait(); @@ -121,7 +123,7 @@ void MastodonPostsSyncAdaptor::requestPosts(int accountId, const QString &access incrementSemaphore(accountId); setupReplyTimeout(accountId, reply); } else { - qCWarning(lcSocialPlugin) << "unable to request home timeline posts from Mastodon account with id" << accountId; + qCWarning(lcMastodonPostsSync) << "unable to request home timeline posts from Mastodon account with id" << accountId; } } @@ -146,7 +148,7 @@ void MastodonPostsSyncAdaptor::finishedPostsHandler() m_db.removePosts(accountId); if (!statuses.size()) { - qCDebug(lcSocialPlugin) << "no feed posts received for account" << accountId; + qCDebug(lcMastodonPostsSync) << "no feed posts received for account" << accountId; decrementSemaphore(accountId); return; } @@ -249,7 +251,7 @@ void MastodonPostsSyncAdaptor::finishedPostsHandler() accountId); } } else { - qCWarning(lcSocialPlugin) << "unable to parse event feed data from request with account" << accountId + qCWarning(lcMastodonPostsSync) << "unable to parse event feed data from request with account" << accountId << ", got:" << QString::fromUtf8(replyData); } diff --git a/rpm/sailfish-account-mastodon.spec b/rpm/sailfish-account-mastodon.spec index b1063ff..7ed70f1 100644 --- a/rpm/sailfish-account-mastodon.spec +++ b/rpm/sailfish-account-mastodon.spec @@ -92,6 +92,7 @@ fi %{_datadir}/lipstick/eventfeed/mastodon-delegate.qml %{_datadir}/lipstick/eventfeed/MastodonFeedItem.qml %{_datadir}/translations/lipstick-jolla-home-mastodon_eng_en.qm +%{_datadir}/translations/lipstick-jolla-home-mastodon-notifications_eng_en.qm %{_libdir}/nemo-transferengine/plugins/sharing/libmastodonshareplugin.so %{_libdir}/nemo-transferengine/plugins/transfer/libmastodontransferplugin.so @@ -100,3 +101,4 @@ fi %files -n sailfish-account-mastodon-ts-devel %{_datadir}/translations/source/settings-accounts-mastodon.ts %{_datadir}/translations/source/lipstick-jolla-home-mastodon.ts +%{_datadir}/translations/source/lipstick-jolla-home-mastodon-notifications.ts diff --git a/settings/accounts/ui/MastodonSettingsDisplay.qml b/settings/accounts/ui/MastodonSettingsDisplay.qml index ece9a41..c03221a 100644 --- a/settings/accounts/ui/MastodonSettingsDisplay.qml +++ b/settings/accounts/ui/MastodonSettingsDisplay.qml @@ -37,7 +37,8 @@ StandardAccountSettingsDisplay { var providerDisplayName = root.accountProvider && root.accountProvider.displayName ? root.accountProvider.displayName.toString().trim() : "" - return providerDisplayName.length > 0 ? providerDisplayName : "Mastodon" + //% "Mastodon" + return providerDisplayName.length > 0 ? providerDisplayName : qsTrId("settings-accounts-mastodon-la-provider_name") } onAboutToSaveAccount: { @@ -107,14 +108,18 @@ StandardAccountSettingsDisplay { TextSwitch { checked: model.enabled text: model.serviceName === "mastodon-microblog" - ? "Posts" + //% "Posts" + ? qsTrId("settings-accounts-mastodon-la-service_posts") : (model.serviceName === "mastodon-notifications" - ? "Notifications" + //% "Notifications" + ? qsTrId("settings-accounts-mastodon-la-service_notifications") : model.displayName) description: model.serviceName === "mastodon-microblog" - ? "Show Mastodon posts in the Events view." + //% "Show Mastodon posts in the Events view." + ? qsTrId("settings-accounts-mastodon-la-service_posts_description") : (model.serviceName === "mastodon-notifications" - ? "Show Mastodon notifications." + //% "Show Mastodon notifications." + ? qsTrId("settings-accounts-mastodon-la-service_notifications_description") : "") visible: text.length > 0 onCheckedChanged: { @@ -130,8 +135,10 @@ StandardAccountSettingsDisplay { TextSwitch { id: eventsSyncSwitch - text: "Sync Mastodon feed automatically" - description: "Fetch new posts periodically when browsing Events Mastodon feed." + //% "Sync Mastodon feed automatically" + text: qsTrId("settings-accounts-mastodon-la-auto_sync_feed") + //% "Fetch new posts periodically when browsing Events Mastodon feed." + description: qsTrId("settings-accounts-mastodon-la-auto_sync_feed_description") onCheckedChanged: { autoSyncConf.value = checked diff --git a/settings/accounts/ui/mastodon-update.qml b/settings/accounts/ui/mastodon-update.qml index 98dba8c..75c043d 100644 --- a/settings/accounts/ui/mastodon-update.qml +++ b/settings/accounts/ui/mastodon-update.qml @@ -175,7 +175,8 @@ AccountCredentialsAgent { var clientId = _valueFromServiceConfig(config, "auth/oauth2/web_server/ClientId") var clientSecret = _valueFromServiceConfig(config, "auth/oauth2/web_server/ClientSecret") if (clientId.length === 0 || clientSecret.length === 0) { - credentialsUpdateError("Missing Mastodon OAuth client credentials") + //% "Missing Mastodon OAuth client credentials" + credentialsUpdateError(qsTrId("settings-accounts-mastodon-la-missing_client_credentials")) return } diff --git a/settings/accounts/ui/mastodon.qml b/settings/accounts/ui/mastodon.qml index b899b51..a32f336 100644 --- a/settings/accounts/ui/mastodon.qml +++ b/settings/accounts/ui/mastodon.qml @@ -371,7 +371,8 @@ AccountCreationAgent { ? root.accountProvider.displayName.toString().trim() : "" if (providerDisplayName.length === 0) { - providerDisplayName = "Mastodon" + //% "Mastodon" + providerDisplayName = qsTrId("settings-accounts-mastodon-la-provider_name") } newAccount.displayName = providerDisplayName |
