[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1110062: unblock: kclock/25.04.3-1



Package: release.debian.org
Severity: normal
X-Debbugs-Cc: kclock@packages.debian.org, Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Control: affects -1 + src:kclock
User: release.debian.org@packages.debian.org
Usertags: unblock

Dear Release Team,

please unblock package kclock.

[ Reason ]
It contains the following changes:
* New upstream release (25.04.3).
  - Add X-Plasma-API-Minimum-Version to applet metadata. (kde#505837)
  - Use KPackageStructure instead of ServiceTypes in metadata.json.
  (#505837)
  - Timers: Fix preset creation and usage (25.04). (kde#505636)
  - Fix alarm form overflowing on larger screens. (kde#505695)
* Backport upstream commit:
  - Correctly honor configured sound theme for default alarm sound.
  [8c656dc4]

The complete debdiff is huge with translation fixes so I’m attaching a
simple diff trimmed of these for your convinience :
    diff -ur --exclude=po --exclude=*.desktop kclock-25.04.[03]

[ Tests ]
Tested stopwatch, timer, adding clock for another timezone.

[ Risks ]
Only contains the latest upstream point release for the 25.04 Gear
branch. Further fixes can easily be backported or the changes reverted.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing


Thanks !


unblock kclock/25.04.3-1

Attachment: kclock_25.04.0-1.dsc_kclock_25.04.3-1.dsc.debdiff.gz
Description: application/gzip

diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/CMakeLists.txt kclock-25.04.3/CMakeLists.txt
--- kclock-25.04.0/CMakeLists.txt	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/CMakeLists.txt	2025-06-30 18:54:48.000000000 +0200
@@ -11,7 +11,7 @@
 # KDE Applications version, managed by release script.
 set(RELEASE_SERVICE_VERSION_MAJOR "25")
 set(RELEASE_SERVICE_VERSION_MINOR "04")
-set(RELEASE_SERVICE_VERSION_MICRO "0")
+set(RELEASE_SERVICE_VERSION_MICRO "3")
 set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 
 project(kclock VERSION ${RELEASE_SERVICE_VERSION})
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/debian/changelog kclock-25.04.3/debian/changelog
--- kclock-25.04.0/debian/changelog	2025-04-17 18:59:13.000000000 +0200
+++ kclock-25.04.3/debian/changelog	2025-07-23 18:01:27.000000000 +0200
@@ -1,3 +1,20 @@
+kclock (25.04.3-1) unstable; urgency=medium
+
+  * Team upload.
+
+  [ Aurélien COUDERC ]
+  * New upstream release (25.04.3).
+    - Add X-Plasma-API-Minimum-Version to applet metadata. (kde#505837)
+    - Use KPackageStructure instead of ServiceTypes in metadata.json.
+    (#505837)
+    - Timers: Fix preset creation and usage (25.04). (kde#505636)
+    - Fix alarm form overflowing on larger screens. (kde#505695)
+  * Backport upstream commit:
+    - Correctly honor configured sound theme for default alarm sound.
+    [8c656dc4]
+
+ -- Aurélien COUDERC <coucouf@debian.org>  Wed, 23 Jul 2025 18:01:27 +0200
+
 kclock (25.04.0-1) unstable; urgency=medium
 
   * Team upload.
Seulement dans kclock-25.04.3/debian: patches
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/org.kde.kclock.appdata.xml kclock-25.04.3/org.kde.kclock.appdata.xml
--- kclock-25.04.0/org.kde.kclock.appdata.xml	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/org.kde.kclock.appdata.xml	2025-06-30 18:54:48.000000000 +0200
@@ -77,6 +77,7 @@
   <summary xml:lang="lt">Sekti laiką ir nusistatyti žadintuvus</summary>
   <summary xml:lang="lv">Sekojiet laikam un lieciet modinātājus</summary>
   <summary xml:lang="nl">Tijd bijhouden en wekkers zetten</summary>
+  <summary xml:lang="nn">Vis klokka og still inn alarmar</summary>
   <summary xml:lang="pl">Pilnuj czasu i ustawiaj alarmy</summary>
   <summary xml:lang="pt-BR">Manter o horário e configurar os alarmes</summary>
   <summary xml:lang="ru">Просмотр времени и установка напоминаний</summary>
@@ -115,6 +116,7 @@
     <p xml:lang="lt">Universali laikrodžio programa, skirta kompiuteriams ir mobiliesiems įrenginiams. Laikrodis leidžia nustatyti daug žadintuvų bei laikmačių, be to, jame yra chronometras ir pasaulio laikrodžiai.</p>
     <p xml:lang="lv">Universāla pulksteņa lietotne datoram un viedierīcēm. Pulkstenis satur hronometru un pasaules pulksteni, kā arī ļauj uzlikt dažādus modinātājus un taimerus.</p>
     <p xml:lang="nl">Een universele kloktoepassing voor bureaublad en mobiel. Kclock omvat een stopwatch en een wereldklok en biedt u het zetten meerdere wekkers en timers.</p>
+    <p xml:lang="nn">Eit universelt klokkeprogram for skrivebord og mobil. Inneheld stoppeklokke og verdsklokke, og lèt deg stilla inn fleire alarmar og nedteljarar.</p>
     <p xml:lang="pl">Wszechstronny zegar na urządzenia przenośne i biurkowe. Zegar zawiera stoper oraz zegar światowy. Umożliwia ustawienie wielu alarmów i minutników.</p>
     <p xml:lang="pt-BR">Um aplicativo de relógio universal para desktop e celular. O relógio inclui um cronômetro e um relógio mundial, e permite que você defina vários alarmes e timers.</p>
     <p xml:lang="ru">Универсальные часы для стационарных компьютеров и мобильных устройств. В программе есть секундомер и мировые часы, поддерживается установка напоминаний и таймеров.</p>
@@ -457,6 +459,9 @@
   <url type="donation">https://www.kde.org/community/donations/?app=kclock&amp;source=appdata</url>
   <url type="vcs-browser">https://invent.kde.org/utilities/kclock</url>
   <releases>
+    <release version="25.04.3" date="2025-07-03"/>
+    <release version="25.04.2" date="2025-06-05"/>
+    <release version="25.04.1" date="2025-05-08"/>
     <release version="25.04.0" date="2025-04-17"/>
     <release version="24.12.3" date="2025-03-06"/>
     <release version="24.12.2" date="2025-02-06"/>
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/.pc/applied-patches kclock-25.04.3/.pc/applied-patches
--- kclock-25.04.0/.pc/applied-patches	2025-07-27 13:27:32.636652284 +0200
+++ kclock-25.04.3/.pc/applied-patches	2025-07-27 13:27:32.780641035 +0200
@@ -0,0 +1 @@
+upstream_8c656dc4_Honor-configured-sound-theme-for-default-alarm-sound.patch
Seulement dans kclock-25.04.3/.pc: upstream_8c656dc4_Honor-configured-sound-theme-for-default-alarm-sound.patch
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclock/qml/alarm/AlarmForm.qml kclock-25.04.3/src/kclock/qml/alarm/AlarmForm.qml
--- kclock-25.04.0/src/kclock/qml/alarm/AlarmForm.qml	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/kclock/qml/alarm/AlarmForm.qml	2025-06-30 18:54:48.000000000 +0200
@@ -82,6 +82,7 @@
     // repeat day picker
     DialogComboBox {
         implicitWidth: root.width
+        Layout.maximumWidth: 540
 
         Kirigami.FormData.label: i18n("Days to repeat:")
         text: FormatUtil.getRepeatFormat(root.formDaysOfWeek)
@@ -117,6 +118,7 @@
     DialogComboBox {
         id: ringDurationPicker
         implicitWidth: root.width
+        Layout.maximumWidth: 540
 
         Kirigami.FormData.label: i18n("Ring Duration:")
         text: {
@@ -160,6 +162,7 @@
     DialogComboBox {
         id: snoozeLengthPicker
         implicitWidth: root.width
+        Layout.maximumWidth: 540
 
         Kirigami.FormData.label: i18n("Snooze Length:")
         title: i18n("Select Snooze Length")
@@ -194,6 +197,7 @@
         id: audioPathField
         implicitWidth: root.width
         width: root.width
+        Layout.maximumWidth: 540
 
         Kirigami.FormData.label: i18n("Ring Sound:")
 
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclock/qml/timer/TimerFormDialog.qml kclock-25.04.3/src/kclock/qml/timer/TimerFormDialog.qml
--- kclock-25.04.0/src/kclock/qml/timer/TimerFormDialog.qml	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/kclock/qml/timer/TimerFormDialog.qml	2025-06-30 18:54:48.000000000 +0200
@@ -16,10 +16,6 @@
 Kirigami.Dialog {
     id: root
 
-    function createTimer(duration, label, commandTimeout) {
-        TimerModel.addNew(duration, label, commandTimeout);
-    }
-
     property bool showPresets: false
     property bool showDelete: false
 
@@ -37,20 +33,6 @@
             id: timerForm
             Layout.fillWidth: true
         }
-        Flow {
-            spacing: Kirigami.Units.smallSpacing
-            visible: showPresets
-            Layout.fillWidth: true
-
-            Repeater {
-                model: TimerPresetModel
-
-                Button {
-                    text: showDelete ? "Delete" : preset.presetName
-                    onClicked: showDelete ? TimerPresetModel.deletePreset(index) : root.createTimer(timerForm.getDuration(), timerForm.name) & close();
-                }
-            }
-        }
     }
 
     customFooterActions: [
@@ -70,7 +52,7 @@
             icon.name: "dialog-ok"
             text: i18n("Done")
             onTriggered: {
-                root.createTimer(timerForm.getDuration(), timerForm.name, timerForm.commandTimeout);
+                TimerModel.addNew(timerForm.getDuration(), timerForm.name, timerForm.commandTimeout);
                 close();
             }
         }
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclock/qml/timer/TimerForm.qml kclock-25.04.3/src/kclock/qml/timer/TimerForm.qml
--- kclock-25.04.0/src/kclock/qml/timer/TimerForm.qml	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/kclock/qml/timer/TimerForm.qml	2025-06-30 18:54:48.000000000 +0200
@@ -19,6 +19,8 @@
     property alias name: label.text
     property alias commandTimeout: commandTimeoutField.text
 
+    signal closeFormRequested()
+
     function setDuration(duration) {
         hours = duration / 60 / 60;
         minutes = duration % (60 * 60) / 60;
@@ -39,7 +41,7 @@
                 text: i18n("1 m")
                 hours: 0
                 minutes: 1
-                hoursSpinBox: spinBoxHours 
+                hoursSpinBox: spinBoxHours
                 minutesSpinBox: spinBoxMinutes
                 secondsSpinBox: spinBoxSeconds
             }
@@ -47,7 +49,7 @@
                 text: i18n("5 m")
                 hours: 0
                 minutes: 5
-                hoursSpinBox: spinBoxHours 
+                hoursSpinBox: spinBoxHours
                 minutesSpinBox: spinBoxMinutes
                 secondsSpinBox: spinBoxSeconds
             }
@@ -55,7 +57,7 @@
                 text: i18n("10 m")
                 hours: 0
                 minutes: 10
-                hoursSpinBox: spinBoxHours 
+                hoursSpinBox: spinBoxHours
                 minutesSpinBox: spinBoxMinutes
                 secondsSpinBox: spinBoxSeconds
             }
@@ -67,7 +69,7 @@
                 text: i18n("15 m")
                 hours: 0
                 minutes: 15
-                hoursSpinBox: spinBoxHours 
+                hoursSpinBox: spinBoxHours
                 minutesSpinBox: spinBoxMinutes
                 secondsSpinBox: spinBoxSeconds
             }
@@ -75,7 +77,7 @@
                 text: i18n("30 m")
                 hours: 0
                 minutes: 30
-                hoursSpinBox: spinBoxHours 
+                hoursSpinBox: spinBoxHours
                 minutesSpinBox: spinBoxMinutes
                 secondsSpinBox: spinBoxSeconds
             }
@@ -83,7 +85,7 @@
                 text: i18n("1 h")
                 hours: 1
                 minutes: 0
-                hoursSpinBox: spinBoxHours 
+                hoursSpinBox: spinBoxHours
                 minutesSpinBox: spinBoxMinutes
                 secondsSpinBox: spinBoxSeconds
             }
@@ -151,7 +153,7 @@
                 showPresets = true;
             }
         }
-        
+
         Button {
             id: presetButton
             text: showPresets ? i18n("Hide Presets") : i18n("Show Presets")
@@ -168,7 +170,7 @@
     }
     Flow {
         spacing: Kirigami.Units.smallSpacing
-        visible: showPresets && Kirigami.Settings.isMobile && repeater.count > 0
+        visible: showPresets && repeater.count > 0
         Layout.fillWidth: true
 
         Repeater {
@@ -177,8 +179,14 @@
 
             Button {
                 text: showDelete ? "Delete" : preset.presetName
-                onClicked: showDelete ? TimerPresetModel.deletePreset(index) : loader.createTimer(timerForm.getDuration(), timerForm.name, timerForm.commandTimeout) & close();
-
+                onClicked: {
+                    if (showDelete) {
+                        TimerPresetModel.deletePreset(index);
+                    } else {
+                        TimerModel.addNew(preset.presetDuration, preset.presetName, timerForm.commandTimeout);
+                        root.closeFormRequested();
+                    }
+                }
             }
         }
     }
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/alarm.cpp kclock-25.04.3/src/kclockd/alarm.cpp
--- kclock-25.04.0/src/kclockd/alarm.cpp	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/kclockd/alarm.cpp	2025-07-27 13:27:32.000000000 +0200
@@ -305,7 +305,8 @@
 
     // play sound (it will loop)
     qDebug() << "Alarm sound: " << m_audioPath;
-    AlarmPlayer::instance().setSource(m_audioPath);
+    // TODO clean up usage of audio path as URL.
+    AlarmPlayer::instance().setSource(m_audioPath.toLocalFile());
     AlarmPlayer::instance().play();
     setRinging(true);
 
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/alarmplayer.cpp kclock-25.04.3/src/kclockd/alarmplayer.cpp
--- kclock-25.04.0/src/kclockd/alarmplayer.cpp	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/kclockd/alarmplayer.cpp	2025-07-27 13:27:32.000000000 +0200
@@ -9,8 +9,14 @@
 
 #include <QDateTime>
 #include <QFile>
+#include <QFileInfo>
 #include <QStandardPaths>
 
+#include <KConfigGroup>
+#include <KSharedConfig>
+
+using namespace Qt::Literals::StringLiterals;
+
 AlarmPlayer &AlarmPlayer::instance()
 {
     static AlarmPlayer singleton;
@@ -21,6 +27,7 @@
     : QObject{parent}
     , m_player(new QMediaPlayer(this))
     , m_audio(new QAudioOutput)
+    , m_soundThemeWatcher(KConfigWatcher::create(KSharedConfig::openConfig(QStringLiteral("kdeglobals"))))
 {
     m_player->setAudioOutput(m_audio);
     connect(m_player, &QMediaPlayer::playbackStateChanged, this, &AlarmPlayer::loopAudio);
@@ -60,16 +67,37 @@
     Q_EMIT volumeChanged();
 }
 
-void AlarmPlayer::setSource(const QUrl &path)
+void AlarmPlayer::setSource(const QString &path)
 {
-    // if user set a invalid audio path or doesn't even specified a path, resort to default
-    if (!path.isValid() || !QFile::exists(path.toLocalFile())) {
-        const QUrl url = QUrl::fromLocalFile(
-            QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("sounds/freedesktop/stereo/alarm-clock-elapsed.oga")));
-        m_player->setSource(url);
+    if (path.isEmpty() || !QFileInfo::exists(path)) {
+        m_player->setSource(QUrl::fromLocalFile(defaultAlarmSoundPath()));
     } else {
-        m_player->setSource(path);
+        m_player->setSource(QUrl::fromLocalFile(path));
     }
 }
 
+QString AlarmPlayer::soundThemeName() const
+{
+    const KConfigGroup soundGroup = m_soundThemeWatcher->config()->group(QStringLiteral("Sounds"));
+    const QString themeName = soundGroup.readEntry(QStringLiteral("Theme"), QStringLiteral("ocean"));
+    return themeName;
+}
+
+QString AlarmPlayer::defaultAlarmSoundPath() const
+{
+    const QString soundPath = QStringLiteral("sounds/%1/stereo/alarm-clock-elapsed.%2");
+
+    for (const QString &theme : {soundThemeName(), u"freedesktop"_s}) {
+        for (const QLatin1String extension : {"wav"_L1, "oga"_L1, "ogg"_L1}) {
+            const QString path = QStandardPaths::locate(QStandardPaths::GenericDataLocation, soundPath.arg(theme, extension));
+            if (!path.isEmpty()) {
+                return path;
+            }
+        }
+    }
+
+    qCritical() << "Failed to find any alarm clock sound!";
+    return QString();
+}
+
 #include "moc_alarmplayer.cpp"
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/alarmplayer.h kclock-25.04.3/src/kclockd/alarmplayer.h
--- kclock-25.04.0/src/kclockd/alarmplayer.h	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/kclockd/alarmplayer.h	2025-07-27 13:27:32.000000000 +0200
@@ -12,6 +12,8 @@
 
 #include <QAudioOutput>
 
+#include <KConfigWatcher>
+
 class AlarmPlayer : public QObject
 {
     Q_OBJECT
@@ -22,10 +24,13 @@
 
     int volume();
     Q_INVOKABLE void setVolume(int volume);
-    Q_INVOKABLE void setSource(const QUrl &path);
+    Q_INVOKABLE void setSource(const QString &path);
     Q_INVOKABLE void play();
     Q_INVOKABLE void stop();
 
+    QString soundThemeName() const;
+    QString defaultAlarmSoundPath() const;
+
 Q_SIGNALS:
     void volumeChanged();
 
@@ -35,6 +40,7 @@
 private:
     QMediaPlayer *m_player;
     QAudioOutput *m_audio;
+    KConfigWatcher::Ptr m_soundThemeWatcher;
 
     bool m_userStop = false; // indicate if user asks to stop
 
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/timer.cpp kclock-25.04.3/src/kclockd/timer.cpp
--- kclock-25.04.0/src/kclockd/timer.cpp	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/kclockd/timer.cpp	2025-07-27 13:27:32.000000000 +0200
@@ -263,7 +263,7 @@
 
     Utilities::pauseMprisSources();
 
-    AlarmPlayer::instance().setSource(findRingSoundLocation());
+    AlarmPlayer::instance().setSource(QString()); // use default.
     AlarmPlayer::instance().play();
 
     m_ringing = true;
@@ -290,18 +290,4 @@
     }
 }
 
-QUrl Timer::findRingSoundLocation()
-{
-    const auto locations = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
-    const QString path = QStringLiteral("/sounds/freedesktop/stereo/alarm-clock-elapsed.oga");
-    QString alarmSoundPath;
-
-    for (const auto &directory : locations) {
-        if (QFile(directory + path).exists()) {
-            return QUrl(directory + path);
-        }
-    }
-
-    return QUrl();
-}
 #include "moc_timer.cpp"
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/timer.h kclock-25.04.3/src/kclockd/timer.h
--- kclock-25.04.0/src/kclockd/timer.h	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/kclockd/timer.h	2025-07-27 13:27:32.000000000 +0200
@@ -81,7 +81,6 @@
     void reschedule();
 
 private:
-    QUrl findRingSoundLocation();
     void setRunning(bool running);
     void ring();
 
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/plasmoid/KClock_1x2/package/metadata.json kclock-25.04.3/src/plasmoid/KClock_1x2/package/metadata.json
--- kclock-25.04.0/src/plasmoid/KClock_1x2/package/metadata.json	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/plasmoid/KClock_1x2/package/metadata.json	2025-06-30 18:54:48.000000000 +0200
@@ -1,4 +1,5 @@
 {
+    "KPackageStructure": "Plasma/Applet",
     "KPlugin": {
         "Authors": [
             {
@@ -26,6 +27,7 @@
                 "Name[lt]": "HanY",
                 "Name[lv]": "HanY",
                 "Name[nl]": "HanY",
+                "Name[nn]": "HanY",
                 "Name[pa]": "ਹਾਂਯੇ",
                 "Name[pl]": "HanY",
                 "Name[pt]": "HanY",
@@ -66,6 +68,7 @@
         "Description[lt]": "KClock valdiklis (1x2)",
         "Description[lv]": "„KClock“ logdaļa (1×2)",
         "Description[nl]": "KClock-widget (1x2)",
+        "Description[nn]": "KClock-element (1 × 2)",
         "Description[pa]": "ਕੇ-ਘੜੀ ਵਿਜੈਟ (1x2)",
         "Description[pl]": "Element interfejsu KClock (1x2)",
         "Description[pt]": "Elemento do KClock (1x2)",
@@ -112,6 +115,7 @@
         "Name[lt]": "KClock_1x2",
         "Name[lv]": "KClock_1x2",
         "Name[nl]": "KClock_1x2",
+        "Name[nn]": "KClock_1x2",
         "Name[pa]": "ਕੇ-ਘੜੀ_1x2",
         "Name[pl]": "KClock_1x2",
         "Name[pt]": "KClock_1x2",
@@ -126,13 +130,11 @@
         "Name[x-test]": "xxKClock_1x2xx",
         "Name[zh_CN]": "KClock_1x2",
         "Name[zh_TW]": "KClock_1x2",
-        "ServiceTypes": [
-            "Plasma/Applet"
-        ],
         "Version": "1.0",
         "Website": "https://apps.kde.org/kclock";
     },
     "X-Plasma-API": "declarativeappletscript",
+    "X-Plasma-API-Minimum-Version": "6.0",
     "X-Plasma-DBusActivationService": "org.kde.kclock.*",
     "X-Plasma-MainScript": "ui/main.qml",
     "X-Plasma-NotificationArea": "true",
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/plasmoid/KClock_KWeather_3x3/package/metadata.json kclock-25.04.3/src/plasmoid/KClock_KWeather_3x3/package/metadata.json
--- kclock-25.04.0/src/plasmoid/KClock_KWeather_3x3/package/metadata.json	2025-04-11 05:12:02.000000000 +0200
+++ kclock-25.04.3/src/plasmoid/KClock_KWeather_3x3/package/metadata.json	2025-06-30 18:54:48.000000000 +0200
@@ -1,4 +1,5 @@
 {
+    "KPackageStructure": "Plasma/Applet",
     "KPlugin": {
         "Authors": [
             {
@@ -26,6 +27,7 @@
                 "Name[lt]": "HanY",
                 "Name[lv]": "HanY",
                 "Name[nl]": "HanY",
+                "Name[nn]": "HanY",
                 "Name[pa]": "ਹਾਂਯੇ",
                 "Name[pl]": "HanY",
                 "Name[pt]": "HanY",
@@ -66,6 +68,7 @@
         "Description[lt]": "KClock valdiklis (3x3 su informacija apie orus)",
         "Description[lv]": "„KCloc“k logdaļa (3×3 ar laikapstākļu informāciju)",
         "Description[nl]": "KClock-widget (3x3 met weerinformatie)",
+        "Description[nn]": "KClock-element (3 × 3 med vêrmelding)",
         "Description[pa]": "ਕੇ-ਘੜੀ ਵਿਜੈਟ (ਮੌਸਮੀ ਜਾਣਕਾਰੀ ਸਮੇਤ 3x3)",
         "Description[pl]": "Element interfejsu (3x3 z danymi pogodowymi)",
         "Description[pt]": "Elemento do KClock (3x3 com Dados Meteorológicos)",
@@ -107,6 +110,7 @@
         "Name[lt]": "KClock_KWeather_3x3",
         "Name[lv]": "KClock_KWeather_3x3",
         "Name[nl]": "KClock_KWeather_3x3",
+        "Name[nn]": "KClock_KWeather_3x3",
         "Name[pa]": "ਕੇ-ਘੜੀ_ਕੇ-ਮੌਸਮ_3x3",
         "Name[pl]": "KClock_KWeather_3x3",
         "Name[pt]": "KClock_KWeather_3x3",
@@ -121,9 +125,6 @@
         "Name[x-test]": "xxKClock_KWeather_3x3xx",
         "Name[zh_CN]": "KClock_KWeather_3x3",
         "Name[zh_TW]": "KClock_KWeather_3x3",
-        "ServiceTypes": [
-            "Plasma/Applet"
-        ],
         "Version": "1.0",
         "Website": "https://apps.kde.org/kclock";
     },

Reply to: