diff -pruN 24.12.3-1/.clang-format 25.11.80-0ubuntu1/.clang-format
--- 24.12.3-1/.clang-format	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/.clang-format	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,122 @@
+---
+# SPDX-FileCopyrightText: 2019 Christoph Cullmann <cullmann@kde.org>
+# SPDX-FileCopyrightText: 2019 Gernot Gebhard <gebhard@absint.com>
+#
+# SPDX-License-Identifier: MIT
+
+# See https://clang.llvm.org/docs/ClangFormatStyleOptions.html for the config options
+# and https://community.kde.org/Policies/Frameworks_Coding_Style#Clang-format_automatic_code_formatting
+# for clang-format tips & tricks
+---
+Language: JavaScript
+DisableFormat: true
+---
+Language: Json
+BasedOnStyle: WebKit
+---
+
+# Style for C++
+Language: Cpp
+
+# base is WebKit coding style: https://webkit.org/code-style-guidelines/
+# below are only things set that diverge from this style!
+BasedOnStyle: WebKit
+
+# enforce C++11 (e.g. for std::vector<std::vector<lala>>
+Standard: Cpp11
+
+# 4 spaces indent
+TabWidth: 4
+
+# 2 * 80 wide lines
+#KDevelop overrides ColumnLimit: 160
+ColumnLimit: 120
+
+# sort includes inside line separated groups
+#TODO: set back to true just before reformatting all KDevelop sources.
+SortIncludes: false
+
+# break before braces on function, namespace and class definitions.
+#KDevelop overrides BreakBeforeBraces: Linux
+BreakBeforeBraces: Custom
+BraceWrapping:
+    AfterCaseLabel: false
+    AfterClass: true
+    AfterControlStatement: false
+    AfterEnum: false
+    AfterFunction: true
+    AfterNamespace: false
+    AfterStruct: true
+    AfterUnion: false
+    AfterExternBlock: false
+    BeforeCatch: false
+    BeforeElse: false
+    IndentBraces: false
+    SplitEmptyFunction: true
+    SplitEmptyRecord: true
+    SplitEmptyNamespace: true
+
+# CrlInstruction *a;
+#KDevelop overrides PointerAlignment: Right
+PointerAlignment: Left
+
+# horizontally aligns arguments after an open bracket.
+AlignAfterOpenBracket: Align
+
+# don't move all parameters to new line
+AllowAllParametersOfDeclarationOnNextLine: false
+
+# no single line functions
+AllowShortFunctionsOnASingleLine: None
+
+# no single line enums
+AllowShortEnumsOnASingleLine: false
+
+# always break before you encounter multi line strings
+AlwaysBreakBeforeMultilineStrings: true
+
+# don't move arguments to own lines if they are not all on the same
+#KDevelop overrides BinPackArguments: false
+BinPackArguments: true
+
+# don't move parameters to own lines if they are not all on the same
+#KDevelop overrides BinPackParameters: false
+BinPackParameters: true
+
+# In case we have an if statement with multiple lines the operator should be at the beginning of the line
+# but we do not want to break assignments
+BreakBeforeBinaryOperators: NonAssignment
+
+# format C++11 braced lists like function calls
+Cpp11BracedListStyle: true
+
+# do not put a space before C++11 braced lists
+SpaceBeforeCpp11BracedList: false
+
+# remove empty lines
+KeepEmptyLinesAtTheStartOfBlocks: false
+
+# no namespace indentation to keep indent level low
+NamespaceIndentation: None
+
+# we use template< without space.
+SpaceAfterTemplateKeyword: false
+
+# Always break after template declaration
+AlwaysBreakTemplateDeclarations: true
+
+# macros for which the opening brace stays attached.
+#KDevelop prepends FOREACH_FUNCTION and FOREACH_FUNCTION_STATIC:
+ForEachMacros: [ FOREACH_FUNCTION, FOREACH_FUNCTION_STATIC, foreach, Q_FOREACH, BOOST_FOREACH, forever, Q_FOREVER, QBENCHMARK, QBENCHMARK_ONCE , wl_resource_for_each, wl_resource_for_each_safe ]
+
+# keep lambda formatting multi-line if not empty
+AllowShortLambdasOnASingleLine: Empty
+
+# We do not want clang-format to put all arguments on a new line
+AllowAllArgumentsOnNextLine: false
+
+#KDevelop adds:
+
+# Prevent clang-format from inserting a space after `//`. There are plenty of comments like
+# `//comment` in KDevelop code. We don't want to change them all just to insert this space.
+CommentPragmas: '^[^ ]'
diff -pruN 24.12.3-1/.gitlab-ci.yml 25.11.80-0ubuntu1/.gitlab-ci.yml
--- 24.12.3-1/.gitlab-ci.yml	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/.gitlab-ci.yml	2025-11-09 03:41:22.000000000 +0000
@@ -5,4 +5,5 @@ include:
   - project: sysadmin/ci-utilities
     file:
       - /gitlab-templates/linux-qt6.yml
+      - /gitlab-templates/linux-qt6-next.yml
       - /gitlab-templates/freebsd-qt6.yml
diff -pruN 24.12.3-1/.kde-ci.yml 25.11.80-0ubuntu1/.kde-ci.yml
--- 24.12.3-1/.kde-ci.yml	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/.kde-ci.yml	2025-11-09 03:41:22.000000000 +0000
@@ -15,3 +15,6 @@ Dependencies:
     'frameworks/kxmlgui': '@latest-kf6'
     'frameworks/threadweaver': '@latest-kf6'
     'kdevelop/kdevelop': '@same'
+
+Options:
+  require-passing-tests-on: ['@all']
diff -pruN 24.12.3-1/CMakeLists.txt 25.11.80-0ubuntu1/CMakeLists.txt
--- 24.12.3-1/CMakeLists.txt	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/CMakeLists.txt	2025-11-09 03:41:22.000000000 +0000
@@ -1,9 +1,9 @@
 cmake_minimum_required(VERSION 3.19)
 
 # KDE Gear version, managed by release service script
-set(RELEASE_SERVICE_VERSION_MAJOR "24")
-set(RELEASE_SERVICE_VERSION_MINOR "12")
-set(RELEASE_SERVICE_VERSION_MICRO "3")
+set(RELEASE_SERVICE_VERSION_MAJOR "25")
+set(RELEASE_SERVICE_VERSION_MINOR "11")
+set(RELEASE_SERVICE_VERSION_MICRO "80")
 
 # generate patch level from release service version
 set(_micro ${RELEASE_SERVICE_VERSION_MICRO})
diff -pruN 24.12.3-1/app_templates/django_project/django_project.kdevtemplate 25.11.80-0ubuntu1/app_templates/django_project/django_project.kdevtemplate
--- 24.12.3-1/app_templates/django_project/django_project.kdevtemplate	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/app_templates/django_project/django_project.kdevtemplate	2025-11-09 03:41:22.000000000 +0000
@@ -1,6 +1,7 @@
 # KDE Config File
 [General]
 Name=Django 1.11
+Name[ar]=جانغو1.11
 Name[ca]=Django 1.11
 Name[ca@valencia]=Django 1.11
 Name[cs]=Django 1.11
@@ -15,6 +16,7 @@ Name[fi]=Django 1.11
 Name[fr]=Django 1.11
 Name[gl]=Django 1.11
 Name[he]=Django 1.11
+Name[hi]=डेन्जो 1.11
 Name[ia]=Django 1.11
 Name[it]=Django 1.11
 Name[ka]=Django 1.11
@@ -25,16 +27,17 @@ Name[pl]=Django 1.11
 Name[pt]=Django 1.11
 Name[pt_BR]=Django 1.11
 Name[ru]=Django 1.11
+Name[sa]=ड्जङ्गो १.११
 Name[sk]=Django 1.11
 Name[sl]=Django 1.11
 Name[sv]=Django 1.11
 Name[tr]=Django 1.11
 Name[uk]=Django 1.11
-Name[x-test]=xxDjango 1.11xx
 Name[zh_CN]=Django 1.11
 Name[zh_TW]=Django 1.11
 Category=Python
 Comment=A Django project with one application
+Comment[ar]=مشروع جانغو بتطبيق واحد
 Comment[ca]=Un projecte de Django amb una aplicació
 Comment[ca@valencia]=Un projecte de Django amb una aplicació
 Comment[de]=Ein Django-Projekt mit einer Anwendung
@@ -48,6 +51,7 @@ Comment[fi]=Yhden sovelluksen Django-pro
 Comment[fr]=Un projet Django avec une application
 Comment[gl]=Un proxecto de Django cunha aplicación
 Comment[he]=מיזם Django עם יישום אחד
+Comment[hi]=एक अनुप्रयोग के साथ एक Django परियोजना
 Comment[ia]=Un projecto Django con un application
 Comment[it]=Un progetto Django con un'applicazione
 Comment[ka]=Django-ის პროექტი ერთი აპლიკაციით
@@ -58,12 +62,12 @@ Comment[pl]=Projekt Django wewnątrz jed
 Comment[pt]=um projecto de Django com uma aplicação
 Comment[pt_BR]=Um projeto de Django com um aplicativo
 Comment[ru]=Проект Django с одной программой
+Comment[sa]=एकेन अनुप्रयोगेन सह एकः Django परियोजना
 Comment[sk]=Django project s jednou aplikáciou
 Comment[sl]=Projekt Django z enim programom
 Comment[sv]=Ett Django-projekt med ett program
 Comment[tr]=Uygulama ile birlikte bir Django projesi
 Comment[uk]=Проєкт Django із однією програмою
-Comment[x-test]=xxA Django project with one applicationxx
 Comment[zh_CN]=有一个应用的 Django 项目
 Comment[zh_TW]=包含一個應用程式的 Django 專案
 ShowFilesAfterGeneration=%{PROJECTDIR}/%{APPNAMELC}/urls.py
diff -pruN 24.12.3-1/app_templates/qtdesigner_app/qtdesigner_app.kdevtemplate 25.11.80-0ubuntu1/app_templates/qtdesigner_app/qtdesigner_app.kdevtemplate
--- 24.12.3-1/app_templates/qtdesigner_app/qtdesigner_app.kdevtemplate	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/app_templates/qtdesigner_app/qtdesigner_app.kdevtemplate	2025-11-09 03:41:22.000000000 +0000
@@ -1,6 +1,7 @@
 # KDE Config File
 [General]
 Name=Simple Qt GUI application using Designer
+Name[ar]=تطبيق Qt رسومي مبدئي يستخدم المصمم
 Name[ca]=Aplicació senzilla amb IGU de les Qt que usa el Designer
 Name[ca@valencia]=Aplicació senzilla amb IGU de les Qt que utilitza Designer
 Name[cs]=Jednoduchá aplikace Qt GUI pomocí Designeru
@@ -15,6 +16,7 @@ Name[fi]=Yksinkertainen Qt:n graafinen s
 Name[fr]=Simple application graphique avec Qt en utilisant Designer
 Name[gl]=Aplicación simple con interface gráfica feita en Qt usando Designer
 Name[he]=יישום ממשק משתמש פשוט עם Qt באמצעות Deisgner
+Name[hi]=डिज़ाइनर का उपयोग करके सरल Qt GUI अनुप्रयोग
 Name[it]=Semplice applicazione grafica Qt che usa Designer
 Name[ka]=Designer-ით შექმნილი მარტივი Qt GUI აპლიკაცია
 Name[ko]=Designer를 사용하는 간단한 Qt GUI 앱
@@ -24,19 +26,20 @@ Name[pl]=Prosta aplikacja z interfejsem
 Name[pt]=Aplicação gráfica simples o Qt que usa o Designer
 Name[pt_BR]=Aplicativo gráfico simples em Qt usando o Designer
 Name[ru]=Простая программа с графическим интерфейсом Qt, созданным с помощью Designer
+Name[sa]=Designer इत्यस्य उपयोगेन सरलं Qt GUI अनुप्रयोगम्
 Name[sk]=Jednoduchá Qt GUI aplikácia používajúca Designer
 Name[sl]=Preprost Qt program z grafičnim vmesnikom z uporabo Snovalnika
 Name[sv]=Enkelt Qt-program med grafiskt användargränssnitt som använder Designer
-Name[tr]=Designer kullanarak Basit Bir QT GUI uygulaması
+Name[tr]=Designer Kullanan Basit Bir Qt GUI Uygulaması
 Name[uk]=Проста програма з графічним інтерфейсом Qt, створеним за допомогою Designer
-Name[x-test]=xxSimple Qt GUI application using Designerxx
 Name[zh_CN]=使用 Designer 的简单的 Qt 图形界面程序
 Name[zh_TW]=使用 Designer 製作簡單的 Qt GUI 應用程式
 Category=Python
 Comment=An example application using Qt Designer. If you edit mainwindow.ui, regenerate mainwindow.py by calling pyuic5.
+Comment[ar]=تطبيق مثال يستخدم مصمم Qt. إذا حرّرت mainwindow.ui، أعِد توليد mainwindow.py بالنداء لـ pyuic5.
 Comment[ca]=Un exemple d'aplicació que usa el Designer de les Qt. Si editeu el «mainwindow.ui», regenereu el «mainwindow.py» invocant el «pyuic5».
 Comment[ca@valencia]=Un exemple d'aplicació que utilitza Designer de les Qt. Si editeu el «mainwindow.ui», regenereu el «mainwindow.py» invocant «pyuic5».
-Comment[de]=Ein Beispiel-Anwendung mit Qt Designer. Wenn Sie die Datei mainwindow.ui bearbeiten, erzeugen Sie die Datei mainwindow.py mit dem Befehl pyuic5 neu.
+Comment[de]=Eine Beispielanwendung mit Qt Designer. Wenn Sie die Datei „mainwindow.ui“ bearbeiten, erzeugen Sie die Datei „mainwindow.py“ mit dem Befehl „pyuic5“ neu.
 Comment[el]=Μια εφαρμογή παράδειγμα με χρήση του Qt Designer. Αν ανοίξετε το mainwindow.ui για επεξεργασία, παραγάγετε ξανά το mainwindow.py καλώντας το pyuic5.
 Comment[en_GB]=An example application using Qt Designer. If you edit mainwindow.ui, regenerate mainwindow.py by calling pyuic5.
 Comment[eo]=Ekzempla aplikaĵo uzante Qt Designer. Se vi redaktas mainwindow.ui, regeneru mainwindow.py perl lanĉo de pyuic5.
@@ -47,6 +50,7 @@ Comment[fi]=Qt Designeria käyttävä es
 Comment[fr]=Une application d'exemple en utilisant Qt Designer. Si vous éditez « mainwindow.ui », générez à nouveau « mainwindow.py » en appelant « pyuic5 ».
 Comment[gl]=Unha aplicación de exemplo usando Qt Designer. Se edita mainwindow.ui, xere de novo mainwindow.py executando pyuic5.
 Comment[he]=יישום לדוגמה בעזרת Qt Designer. אם בחרת לערוך את mainwindow.ui, יש לייצר את mainwindow.py מחדש על ידי קריאה ל־pyuic5.
+Comment[hi]=Qt Designer का उपयोग करने वाला एक उदाहरण अनुप्रयोग। यदि आप mainwindow.ui संपादित करते हैं, तो pyuic5 को कॉल करके mainwindow.py को पुनः उत्पन्न करें।
 Comment[it]=Un'applicazione di esempio che usa Qt Designer. Se modifichi mainwindow.ui, rigenera mainwindow.py eseguendo pyuic5.
 Comment[ka]=სამაგალითო აპლიკაცია Qt Designer-ის გამოყენებით. თუ ჩაასწორებთ ფაილს mainwindow.ui, manwindow.py ფაილის თავიდან გენერაცია pyuic5-ის გაშვებით შეგიძლიათ.
 Comment[ko]=Qt Designer를 사용하는 간단한 앱입니다. mainwindow.ui 파일을 편집했다면 pyuic5를 실행하여 mainwindow.py를 다시 생성하십시오.
@@ -56,12 +60,12 @@ Comment[pl]=Przykładowa aplikacja wykor
 Comment[pt]=Uma aplicação de exemplo que usa o Qt Designer. Se editar o 'mainwindow.ui', volte a gerar o 'mainwindow.py' ao invocar o 'pyuic5'.
 Comment[pt_BR]=Um aplicativo de exemplo que usa o Qt Designer. Se editar o 'mainwindow.ui', gere novamente o 'mainwindow.py' ao chamar o 'pyuic5'.
 Comment[ru]=Пример программы с использованием Qt Designer. После редактирования mainwindow.ui следует создать mainwindow.py с помощью вызова pyuic5.
+Comment[sa]=Qt Designer इत्यस्य उपयोगेन एकः उदाहरणम् अनुप्रयोगः । यदि भवान् mainwindow.ui सम्पादयति तर्हि pyuic5 इति आह्वयित्वा mainwindow.py पुनः उत्पन्नं कुर्वन्तु ।
 Comment[sk]=Ukážková aplikácia používajúca Qt Designer. Ak upravíte mainwindow.ui, pregenerujte mainwindow.py volaním pyuic5.
 Comment[sl]=Preprost Qt program z grafičnim vmesnikom z uporabo Snovalnika. Če boste urejali mainwindow.ui, znova ustvarite mainwindow.py s klicem pyuic5.
 Comment[sv]=Ett exempelprogram som använder Qt-designer. Om du redigerar mainwindo.ui, skapa om mainwindow.py genom att anropa pyuic5.
-Comment[tr]=Qt Designer kullanan örnek bir uygulama. mainwindow.ui dosyasını düzenlerseniz pyuic5'i çağırarak mainwindow.py dosyasını yeniden üretin.
+Comment[tr]=Qt Designer kullanan örnek bir uygulama. mainwindow.ui dosyasını düzenlerseniz pyuic5’i çağırarak mainwindow.py dosyasını yeniden üretin.
 Comment[uk]=Приклад програми із використанням Qt Designer. Після редагування mainwindow.ui вам слід повторно створити mainwindow.py за допомогою виклику pyuic5.
-Comment[x-test]=xxAn example application using Qt Designer. If you edit mainwindow.ui, regenerate mainwindow.py by calling pyuic5.xx
 Comment[zh_CN]=一个使用 Qt Designer 的简单应用程序。如果您编辑了 mainwindow.ui，调用 pyuic5 来重新生成 mainwindow.py。
 Comment[zh_TW]=使用 Qt Designer 建立一個範例應用程式，假若您編輯 mainwindow.ui，將透過呼叫 pyuic5 重新生成 mainwindow.py。
 ShowFilesAfterGeneration=%{APPNAME}.py
diff -pruN 24.12.3-1/app_templates/simple_pythonapp/simple_pythonapp.kdevtemplate 25.11.80-0ubuntu1/app_templates/simple_pythonapp/simple_pythonapp.kdevtemplate
--- 24.12.3-1/app_templates/simple_pythonapp/simple_pythonapp.kdevtemplate	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/app_templates/simple_pythonapp/simple_pythonapp.kdevtemplate	2025-11-09 03:41:22.000000000 +0000
@@ -1,6 +1,7 @@
 # KDE Config File
 [General]
 Name=Simple Python Application
+Name[ar]=تطبيق بايثون مبدئي
 Name[ca]=Una aplicació senzilla en Python
 Name[ca@valencia]=Una aplicació senzilla en Python
 Name[cs]=Jednoduchá aplikace v Pythonu
@@ -15,6 +16,7 @@ Name[fi]=Yksinkertainen Python-sovellus
 Name[fr]=Simple application en Python
 Name[gl]=Aplicación simple en Python
 Name[he]=יישום Python פשוט
+Name[hi]=सरल पायथन अनुप्रयोग
 Name[it]=Semplice applicazione Python
 Name[ka]=Python-ის მარტივი აპლიკაცია
 Name[ko]=간단한 파이썬 앱
@@ -24,16 +26,17 @@ Name[pl]=Prosta aplikacja Pythona
 Name[pt]=Aplicação Simples de Python
 Name[pt_BR]=Aplicativo simples em Python
 Name[ru]=Простая программа на языке Python
+Name[sa]=सरल पायथन अनुप्रयोग
 Name[sk]=Jednoduchá Python aplikácia
 Name[sl]=Preprost program v Python-u
 Name[sv]=Enkelt Python-program
 Name[tr]=Basit Python Uygulaması
 Name[uk]=Проста програма мовою Python
-Name[x-test]=xxSimple Python Applicationxx
 Name[zh_CN]=简单的 Python 应用程序
 Name[zh_TW]=簡單的 Python 應用程式
 Category=Python
 Comment=Generate filestructure to start a Python application
+Comment[ar]=ولِّد بنية ملفات لبدء تطبيق بايثون
 Comment[ca]=Genera l'estructura de fitxers per a començar una aplicació en Python
 Comment[ca@valencia]=Genera l'estructura de fitxers per a començar una aplicació en Python
 Comment[cs]=Vygenerovat strukturu souborů pro započetí aplikace v Pythonu
@@ -48,6 +51,7 @@ Comment[fi]=Aloita Python-sovellus luoma
 Comment[fr]=Générer la structure de fichier pour démarrer une application en Python
 Comment[gl]=Xera a estrutura de ficheiros para comezar unha aplicación en Python
 Comment[he]=יצירת מבנה קבצים להתחלת יישום Python
+Comment[hi]=पायथन अनुप्रयोग शुरू करने के लिए फ़ाइल संरचना उत्पन्न करें
 Comment[ia]=Genera structura de file per initiar un application de Python
 Comment[it]=Genera una struttura file per avviare un'applicazione in Python
 Comment[ka]=ფაილური სტრუქტურის გენერაცია Python აპლიკაციის გასაშვებად
@@ -58,12 +62,12 @@ Comment[pl]=Tworzy strukturę plików do
 Comment[pt]=Gerar a estrutura de ficheiros para iniciar uma aplicação em Python
 Comment[pt_BR]=Gera a estrutura de arquivos para iniciar um aplicativo Python
 Comment[ru]=Создание файловой структуры для запуска программы на языке Python
+Comment[sa]=पायथन् अनुप्रयोगं आरभ्य सञ्चिकासंरचनां जनयन्तु
 Comment[sk]=Vygenerovať štruktúru súborov na spustenie aplikácie Python
 Comment[sl]=Ustvari datotečno zgradbo za začetek programa v Python-u
 Comment[sv]=Skapa filstruktur för att påbörja ett Python-program
 Comment[tr]=Bir Python uygulaması başlatmak için dosya yapısını oluştur
 Comment[uk]=Створити початкову файлову структуру програми мовою Python
-Comment[x-test]=xxGenerate filestructure to start a Python applicationxx
 Comment[zh_CN]=生成开始开发 Python 应用程序的文件结构
 Comment[zh_TW]=產生檔案建構體來開始一個 Python 應用程式
 ShowFilesAfterGeneration=%{APPNAME}.py
diff -pruN 24.12.3-1/debian/changelog 25.11.80-0ubuntu1/debian/changelog
--- 24.12.3-1/debian/changelog	2025-03-24 05:41:46.000000000 +0000
+++ 25.11.80-0ubuntu1/debian/changelog	2025-11-16 09:22:32.000000000 +0000
@@ -1,3 +1,82 @@
+kdevelop-python (25.11.80-0ubuntu1) resolute; urgency=high
+
+  * New upstream (beta) release (25.11.80)
+
+ -- Rik Mills <rikmills@kde.org>  Sun, 16 Nov 2025 09:22:32 +0000
+
+kdevelop-python (25.08.3-0ubuntu1) resolute; urgency=medium
+
+  * New upstream release (25.08.3)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 06 Nov 2025 15:23:03 +0000
+
+kdevelop-python (25.08.2-0ubuntu1) resolute; urgency=medium
+
+  * New upstream release (25.08.2)
+  * d/rules: Bump KDEV_PLUGIN_VERSION to 64.
+
+ -- Rik Mills <rikmills@kde.org>  Fri, 17 Oct 2025 11:44:33 +0100
+
+kdevelop-python (25.08.1-0ubuntu1) questing; urgency=medium
+
+  * New upstream release (25.08.1)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 11 Sep 2025 07:07:26 +0100
+
+kdevelop-python (25.08.0-0ubuntu1) questing; urgency=medium
+
+  * New upstream release (25.08.0)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 14 Aug 2025 11:51:54 +0100
+
+kdevelop-python (25.07.90-0ubuntu1) questing; urgency=medium
+
+  * New upstream (RC) release (25.07.90)
+
+ -- Rik Mills <rikmills@kde.org>  Fri, 25 Jul 2025 17:44:25 +0100
+
+kdevelop-python (25.07.80-0ubuntu1) questing; urgency=medium
+
+  * New upstream (beta) release (25.07.80)
+  * d/rules: Bump KDEV_PLUGIN_VERSION to 63.
+
+ -- Rik Mills <rikmills@kde.org>  Sun, 13 Jul 2025 13:24:18 +0100
+
+kdevelop-python (25.04.3-0ubuntu1) questing; urgency=medium
+
+  * New upstream release (25.04.3)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 03 Jul 2025 07:42:16 +0100
+
+kdevelop-python (25.04.2-0ubuntu1) questing; urgency=medium
+
+  * New upstream release (25.04.2)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 05 Jun 2025 11:44:14 +0100
+
+kdevelop-python (25.04.1-0ubuntu1) questing; urgency=medium
+
+  * New upstream release (25.04.1)
+
+ -- Rik Mills <rikmills@kde.org>  Wed, 07 May 2025 22:05:44 +0100
+
+kdevelop-python (25.04.0-0ubuntu1) questing; urgency=medium
+
+  * New upstream release (25.04.0)
+  * d/rules: Bump KDEV_PLUGIN_VERSION to 62
+
+ -- Rik Mills <rikmills@kde.org>  Wed, 30 Apr 2025 19:48:27 +0100
+
+kdevelop-python (24.12.3-1ubuntu1) plucky; urgency=medium
+
+  * Merge from Debian unstable. Remaining changes:
+    - Kubuntu Vcs and maintainer fields.
+    - Build depend and depend on python3-defaults meta packages instead
+      of specific versions.
+    - Limit build to architectures where kdevelop-dev is available.
+
+ -- Rik Mills <rikmills@kde.org>  Mon, 24 Mar 2025 09:45:26 +0000
+
 kdevelop-python (24.12.3-1) unstable; urgency=medium
 
   * New upstream release.
@@ -8,6 +87,18 @@ kdevelop-python (24.12.3-1) unstable; ur
 
  -- Pino Toscano <pino@debian.org>  Mon, 24 Mar 2025 06:41:46 +0100
 
+kdevelop-python (24.12.3-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (24.12.3)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 06 Mar 2025 08:40:59 +0000
+
+kdevelop-python (24.12.2-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (24.12.2)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 06 Feb 2025 14:15:34 +0000
+
 kdevelop-python (24.12.1-1) unstable; urgency=medium
 
   [ Stuart Prescott ]
@@ -25,6 +116,96 @@ kdevelop-python (24.12.1-1) unstable; ur
 
  -- Aurélien COUDERC <coucouf@debian.org>  Wed, 22 Jan 2025 23:59:29 +0100
 
+kdevelop-python (24.12.1-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (24.12.1)
+  * Limit build to architectures where kdevelop-dev is available.
+
+ -- Rik Mills <rikmills@kde.org>  Sat, 11 Jan 2025 14:30:10 +0000
+
+kdevelop-python (24.12.0-0ubuntu4) plucky; urgency=medium
+
+  * Build depend and depend on python3-defaults meta packages instead of
+    specific versions.
+
+ -- Rik Mills <rikmills@kde.org>  Sun, 05 Jan 2025 11:40:51 +0000
+
+kdevelop-python (24.12.0-0ubuntu3) plucky; urgency=medium
+
+  * Fix build with python 3.13 as default.
+
+ -- Rik Mills <rikmills@kde.org>  Sat, 04 Jan 2025 14:53:46 +0000
+
+kdevelop-python (24.12.0-0ubuntu2) plucky; urgency=medium
+
+  * No-change rebuild for Python 3.13 as the default.
+
+ -- Matthias Klose <doko@ubuntu.com>  Fri, 03 Jan 2025 12:05:39 +0100
+
+kdevelop-python (24.12.0-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (24.12.0)
+  * Update build deps and build system for Qt6/KF6.
+  * Bump KDEV_PLUGIN_VERSION to 61, according to upstream.
+  * Update install files.
+  * Bump stardards to 4.7.0, no changes required.
+
+ -- Rik Mills <rikmills@kde.org>  Mon, 30 Dec 2024 03:22:38 +0000
+
+kdevelop-python (23.08.5-0ubuntu4) noble; urgency=medium
+
+  * No-change rebuild for CVE-2024-3094
+
+ -- William Grant <wgrant@ubuntu.com>  Mon, 01 Apr 2024 17:02:15 +1100
+
+kdevelop-python (23.08.5-0ubuntu3) noble; urgency=medium
+
+  * No-change rebuild against libqt5core5t64
+
+ -- Steve Langasek <steve.langasek@ubuntu.com>  Fri, 15 Mar 2024 04:53:09 +0000
+
+kdevelop-python (23.08.5-0ubuntu2) noble; urgency=medium
+
+  * No-change rebuild for python3.12 t64.
+
+ -- Matthias Klose <doko@ubuntu.com>  Sat, 02 Mar 2024 21:10:18 +0100
+
+kdevelop-python (23.08.5-0ubuntu1) noble; urgency=medium
+
+  * New upstream release (23.08.5)
+
+ -- Scarlett Moore <sgmoore@debian.org>  Thu, 22 Feb 2024 09:44:37 -0700
+
+kdevelop-python (23.08.4-0ubuntu3) noble; urgency=medium
+
+  * Switch python build and runtime dependencies from 3.11 to 3.12.
+
+ -- Rik Mills <rikmills@kde.org>  Mon, 22 Jan 2024 06:52:04 +0000
+
+kdevelop-python (23.08.4-0ubuntu2) noble; urgency=medium
+
+  * No-change rebuild with Python 3.12 as default
+
+ -- Graham Inggs <ginggs@ubuntu.com>  Fri, 19 Jan 2024 19:43:06 +0000
+
+kdevelop-python (23.08.4-0ubuntu1) noble; urgency=medium
+
+  * New upstream release (23.08.4)
+
+ -- José Manuel Santamaría Lema <panfaust@gmail.com>  Wed, 13 Dec 2023 10:14:41 +0000
+
+kdevelop-python (23.08.3-0ubuntu1) noble; urgency=medium
+
+  * New upstream release (23.08.3)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 09 Nov 2023 11:34:14 +0000
+
+kdevelop-python (23.08.2-0ubuntu1) noble; urgency=medium
+
+  * New upstream release (23.08.2)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 26 Oct 2023 12:30:31 +0100
+
 kdevelop-python (23.08.1-2) unstable; urgency=medium
 
   * Team upload.
@@ -42,6 +223,46 @@ kdevelop-python (23.08.1-1) unstable; ur
 
  -- Pino Toscano <pino@debian.org>  Sun, 24 Sep 2023 17:22:33 +0200
 
+kdevelop-python (23.08.1-0ubuntu1) mantic; urgency=medium
+
+  * New upstream release (23.08.1)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 14 Sep 2023 11:58:33 +0100
+
+kdevelop-python (23.08.0-0ubuntu1) mantic; urgency=medium
+
+  * New upstream release (23.08.0)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 24 Aug 2023 12:53:27 +0100
+
+kdevelop-python (23.07.90-0ubuntu1) mantic; urgency=medium
+
+  * New upstream (beta) release (23.07.80)
+  * Bump KDEV_PLUGIN_VERSION to 512, according to upstream.
+  * New upstream (RC) release (23.07.90)
+
+ -- Rik Mills <rikmills@kde.org>  Tue, 15 Aug 2023 02:33:18 +0100
+
+kdevelop-python (23.04.3-0ubuntu1) mantic; urgency=medium
+
+  * New upstream release (23.04.3)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 06 Jul 2023 14:46:03 +0100
+
+kdevelop-python (23.04.2-0ubuntu1) mantic; urgency=medium
+
+  * New upstream release (23.04.1)
+  * Adjust KDEV_PLUGIN_VERSION=511 in debian/rules
+  * New upstream release (23.04.2)
+
+ -- José Manuel Santamaría Lema <panfaust@gmail.com>  Sat, 10 Jun 2023 11:56:23 +0100
+
+kdevelop-python (22.12.3-0ubuntu1) lunar; urgency=medium
+
+  * New upstream release (22.12.3)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 02 Mar 2023 00:37:26 +0000
+
 kdevelop-python (22.12.2-1) unstable; urgency=medium
 
   * New upstream release.
@@ -53,6 +274,26 @@ kdevelop-python (22.12.2-1) unstable; ur
 
  -- Pino Toscano <pino@debian.org>  Sun, 05 Feb 2023 12:59:51 +0100
 
+kdevelop-python (22.12.2-0ubuntu1) lunar; urgency=medium
+
+  * New upstream release (22.12.2)
+  * Remove reverse-applicable upstream patch.
+
+ -- Simon Quigley <tsimonq2@kubuntu.org>  Sat, 11 Feb 2023 14:15:48 -0600
+
+kdevelop-python (22.12.1-0ubuntu1) lunar; urgency=medium
+
+  * New upstream release (22.12.1)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 05 Jan 2023 11:14:16 +0000
+
+kdevelop-python (22.12.0-3ubuntu1) lunar; urgency=medium
+
+  * Merge from debian unstable. Remaining changes:
+    - Kubuntu Vcs and maintainer fields.
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 05 Jan 2023 10:00:34 +0000
+
 kdevelop-python (22.12.0-3) unstable; urgency=medium
 
   * Drop upstream_support-for-the-most-basic-cases-of-python-3.10-s-ma.patch:
diff -pruN 24.12.3-1/debian/control 25.11.80-0ubuntu1/debian/control
--- 24.12.3-1/debian/control	2025-03-23 19:05:24.000000000 +0000
+++ 25.11.80-0ubuntu1/debian/control	2025-11-16 09:22:26.000000000 +0000
@@ -1,15 +1,16 @@
 Source: kdevelop-python
 Section: devel
 Priority: optional
-Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
+Maintainer: Kubuntu Developers <kubuntu-devel@lists.ubuntu.com>
+XSBC-Original-Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
 Uploaders: Aurélien COUDERC <coucouf@debian.org>,
            Pino Toscano <pino@debian.org>,
-Build-Depends: debhelper-compat (= 13),
+Build-Depends: cmake (>= 3.19~),
+               debhelper-compat (= 13),
                dh-sequence-kf6,
-               cmake (>= 3.19~),
                extra-cmake-modules (>= 6.0.0~),
                gettext,
-               kdevelop-dev (>= 4:24.12.3~),
+               kdevelop-dev (>= 4:25.11.80~),
                libkf6config-dev (>= 6.0.0~),
                libkf6coreaddons-dev (>= 6.0.0~),
                libkf6i18n-dev (>= 6.0.0~),
@@ -19,20 +20,20 @@ Build-Depends: debhelper-compat (= 13),
                libkf6threadweaver-dev (>= 6.0.0~),
                libkf6widgetsaddons-dev (>= 6.0.0~),
                libkf6xmlgui-dev (>= 6.0.0~),
-               libpython3.13-dev,
-               python3.13:any,
+               libpython3-dev,
+               python3,
                qt6-5compat-dev (>= 6.5.0~),
                qt6-base-dev (>= 6.5.0~),
 Standards-Version: 4.7.2
 Rules-Requires-Root: no
 Homepage: https://www.kdevelop.org/
-Vcs-Browser: https://salsa.debian.org/qt-kde-team/kde/kdevelop-python
-Vcs-Git: https://salsa.debian.org/qt-kde-team/kde/kdevelop-python.git
+Vcs-Browser: https://code.launchpad.net/~kubuntu-packagers/kubuntu-packaging/+git/kdev-python
+Vcs-Git: https://git.launchpad.net/~kubuntu-packagers/kubuntu-packaging/+git/kdev-python
 
 Package: kdevelop-python
-Architecture: any
+Architecture: amd64 arm64 armhf
 Depends: kdevelop-python-data (>= ${source:Version}),
-         python3.13,
+         python3,
          ${misc:Depends},
          ${shlibs:Depends},
 Recommends: kdevelop, pycodestyle, python3-autopep8,
diff -pruN 24.12.3-1/debian/rules 25.11.80-0ubuntu1/debian/rules
--- 24.12.3-1/debian/rules	2025-03-03 06:16:43.000000000 +0000
+++ 25.11.80-0ubuntu1/debian/rules	2025-11-16 09:22:26.000000000 +0000
@@ -3,7 +3,7 @@
 export DEB_BUILD_MAINT_OPTIONS = hardening=+all
 
 # from kdevelop
-export KDEV_PLUGIN_VERSION=61
+export KDEV_PLUGIN_VERSION=64
 
 %:
 	dh $@
diff -pruN 24.12.3-1/debugger/CMakeLists.txt 25.11.80-0ubuntu1/debugger/CMakeLists.txt
--- 24.12.3-1/debugger/CMakeLists.txt	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/CMakeLists.txt	2025-11-09 03:41:22.000000000 +0000
@@ -7,6 +7,9 @@ set(kdevpdb_PART_SRCS
     debugjob.cpp
     debugsession.cpp
     pdbdebuggerplugin.cpp
+    pdbprocess.cpp
+    pdbinterrupt.cpp
+    pdbdebuggerinstance.cpp
 )
 ecm_qt_declare_logging_category(kdevpdb_PART_SRCS
     HEADER debuggerdebug.h
@@ -16,6 +19,16 @@ ecm_qt_declare_logging_category(kdevpdb_
     EXPORT KDEVPYTHON
 )
 
+# Declare a separate category for VariableController so that the noise
+# from KDEV_PYTHON_DEBUGGER can be ignored.
+ecm_qt_declare_logging_category(kdevpdb_PART_SRCS
+    HEADER variabledebug.h
+    IDENTIFIER KDEV_PYTHON_VARIABLECONTROLLER
+    CATEGORY_NAME "kdevelop.plugins.python.debugger.variablecontroller"
+    DESCRIPTION "KDevelop plugin: Python language support - debugger variable support"
+    EXPORT KDEVPYTHON
+)
+
 kdevplatform_add_plugin(kdevpdb JSON kdevpdb.json SOURCES ${kdevpdb_PART_SRCS})
 
 generate_export_header(kdevpdb EXPORT_MACRO_NAME KDEVPYTHONDEBUG_EXPORT)
@@ -31,5 +44,8 @@ target_link_libraries(kdevpdb
     KF6::TextEditor
 )
 
-install(FILES __kdevpython_debugger_utils.py DESTINATION ${KDE_INSTALL_DATADIR}/kdevpythonsupport/debugger)
 install(FILES kdevpdb.py DESTINATION ${KDE_INSTALL_DATADIR}/kdevpythonsupport/debugger)
+install(FILES kdevpdbcore.py DESTINATION ${KDE_INSTALL_DATADIR}/kdevpythonsupport/debugger)
+install(FILES kdevpdbconn.py DESTINATION ${KDE_INSTALL_DATADIR}/kdevpythonsupport/debugger)
+install(FILES asmskip.py DESTINATION ${KDE_INSTALL_DATADIR}/kdevpythonsupport/debugger)
+install(FILES kdevpdbvariablesupport.py DESTINATION ${KDE_INSTALL_DATADIR}/kdevpythonsupport/debugger)
diff -pruN 24.12.3-1/debugger/__kdevpython_debugger_utils.py 25.11.80-0ubuntu1/debugger/__kdevpython_debugger_utils.py
--- 24.12.3-1/debugger/__kdevpython_debugger_utils.py	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/__kdevpython_debugger_utils.py	1970-01-01 00:00:00.000000000 +0000
@@ -1,69 +0,0 @@
-# This file is imported from within the debugger
-
-# SPDX-FileCopyrightText: 2014 Sven Brauch <svenbrauch@gmail.com>
-# SPDX-License-Identifier: GPL-2.0-or-later
-
-from kdevpdb import kdevOutputFormatter
-
-import sys
-
-__kdevpython_builtin_locals = locals
-
-try:
-    from numpy import ndarray
-except:
-    class ndarray: pass
-
-# TODO: weakref those, but python can't in general :(
-objectTable = {}
-
-def cleanup():
-    objectTable.clear()
-
-def obj_to_string(value):
-    if type(value) == ndarray:
-        value = "numpy.array, shape={0}".format(value.shape)
-    value = str(value).replace('\n', r'\n')
-    if len(value) > 120:
-        value = value[:120] + "..."
-    return value
-
-def format_locals(locals_):
-    '''Print local variables in a machine-readable format'''
-    cleanup()
-    for key, value in locals_.items():
-        if key == '__kdevpython_debugger_utils':
-            continue
-        value = obj_to_string(value)
-        print("%s => %s" % (key, value))
-
-def format_ptr_children(ptr):
-    try:
-        expr = objectTable[ptr]
-    except KeyError:
-        print("Address of object not in memory any more")
-        return
-    format_object_children(expr)
-
-def format_object_children(expr):
-    if type(expr) == set:
-        expr = list(expr)
-
-    output = []
-    if type(expr) == list or type(expr) == ndarray:
-        for i in range(len(expr)):
-            identifier = id(expr[i])
-            obj = expr[i]
-            output.append('ptr:<%s> [%s] => %s' % (identifier, i, obj_to_string(obj)))
-            objectTable[identifier] = obj
-    elif type(expr) == dict:
-        for k, v in expr.items():
-            output.append('ptr:<%s> [%s] => %s' % (id(v), obj_to_string(k), obj_to_string(v)))
-            objectTable[id(v)] = v
-    else:
-        for i in dir(expr):
-            obj = getattr(expr, i)
-            output.append('ptr:<%s> .%s => %s' % (id(obj), i, obj_to_string(obj)))
-            objectTable[id(obj)] = obj
-    print('\n'.join(output))
-
diff -pruN 24.12.3-1/debugger/asmskip.py 25.11.80-0ubuntu1/debugger/asmskip.py
--- 24.12.3-1/debugger/asmskip.py	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/asmskip.py	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,184 @@
+# SPDX-FileCopyrightText: 2025 Jarmo Tiitto <jarmo.tiitto@gmail.com>
+# SPDX-License-Identifier: GPL-2.0-or-later
+"""Accurate skipping past and out of conditional code blocks."""
+import dis
+from collections import namedtuple
+
+# pylint disable=R1710, R0915
+
+_asmskip_opcode_cache = {}
+
+def disassemble(f_code):
+    '''Disassemble a code object, with jump info.
+       * Instruction columns are resolved to a minimum column of the originating source line.
+         'RESUME' instruction is ignored for the code object's minimum column.
+       * Any instructions part of an source line that does a jump are marked as "jumping".
+       * Returns a AsmInstr list and the code object's minimum column.
+    '''
+    # A simple associative cache.
+    entry = _asmskip_opcode_cache.get(f_code, None)
+    if entry:
+        return entry
+    # Later ins part of a lineno can change already appended AsmInstr(s):
+    # A proxy list objects are used to allow updating the past AsmInstr(s).
+    AsmInstr = namedtuple(
+        'AsmInstr', [
+            'opcode',
+            'opname',
+            'oparg',
+            'lineno',
+            'offset',
+            'jump_target',
+            'column',
+            'jumping'
+        ])
+    asm_list = []
+    lineno_info = {}
+    min_column = -1
+    for ins in dis.get_instructions(f_code):
+        lineno = -1 if ins.line_number is None else ins.line_number
+        column = -1 if ins.positions.col_offset is None else ins.positions.col_offset
+        if ins.opcode != dis.opmap['RESUME']:
+            if min_column == -1:
+                min_column = column
+            min_column = min(min_column, column)
+        if lineno not in lineno_info:
+            lineno_info[lineno] = [[column], [False]]
+        if lineno_info[lineno][0][0] > column:
+            lineno_info[lineno][0][0] = column
+        if ins.jump_target is not None:
+            lineno_info[lineno][1][0] = True
+        asm_list.append(AsmInstr(
+            ins.opcode,
+            ins.opname,
+            ins.argrepr,
+            lineno,
+            ins.offset,
+            ins.jump_target,
+            lineno_info[lineno][0],
+            lineno_info[lineno][1]))
+    asm_list = [AsmInstr(x[0], x[1], x[2], x[3], x[4], x[5], x[6][0], x[7][0]) for x in asm_list]
+    _asmskip_opcode_cache[f_code] = (asm_list, min_column)
+    return asm_list, min_column
+
+
+_asmskip_stepout_cache = {}
+
+def stepout_lineno(f_code, curr_lineno):
+    '''Look ahead in the code object and find a source line past curr_line such that:
+       1. Skip past a single block if it starts at the curr_lineno source line.
+       2. Step out from "for", "while" and "if" blocks:
+          Blocks contained in the curr_lineno source line's block and after it line are skipped.
+       3. Else, return -1.
+    '''
+    jump_targets = {} # set of the forward jump instr offsets
+    forend_lineno = -1
+    ins = None # current AsmInstr (updated in the for-loop)
+    # The code is arranged into inner functions.
+    process_goal = None
+    def past_endfor():
+        if forend_lineno < ins.lineno:
+            return ins.lineno
+        return None
+
+    def maybe_reached_jump_target():
+        if ins.opcode != dis.opmap['END_FOR']:
+            return ins.lineno
+        # Find next ins with greater than ins.lineno:
+        nonlocal forend_lineno
+        forend_lineno = ins.lineno
+        nonlocal process_goal
+        process_goal = past_endfor
+        return None
+
+    # Jump target updating.
+    jump_filter = None
+
+    def want_all_jumps():
+        if ins.jump_target is not None and ins.jump_target > ins.offset:
+            nonlocal jump_targets
+            jump_targets[ins.jump_target] = False
+
+    def want_no_jumps():
+        return
+
+    def want_next_jump():
+        if ins.jump_target is not None and ins.jump_target > ins.offset:
+            nonlocal jump_targets
+            # discard all earlier jump targets, only ins.jump_target is wanted.
+            jump_targets.clear()
+            jump_targets[ins.jump_target] = False
+            nonlocal jump_filter
+            jump_filter = want_no_jumps
+
+    def past_single_jump():
+        nonlocal process_goal
+        nonlocal jump_targets
+        nonlocal jump_filter
+        if jump_targets.pop(ins.offset, False):
+            jump_filter = want_no_jumps
+            ret = maybe_reached_jump_target()
+            if ret is not None:
+                return ret
+        return None
+
+    # seek_to_curr_lineno() requires min_column
+    asm_list, min_column = disassemble(f_code)
+
+    def seek_to_curr_lineno():
+        '''find first ins of curr_lineno source line.'''
+        nonlocal jump_targets
+        if ins.lineno < curr_lineno:
+            # Discard reached jump targets while seeking to first ins of curr_lineno.
+            jump_targets.pop(ins.offset, None)
+            return None
+        # Reached first ins of curr_lineno.
+        # ins can be a target of earlier jump. We want to go past it, so discard it.
+        jump_targets.pop(ins.offset, None)
+        nonlocal process_goal
+        nonlocal jump_filter
+        if ins.jumping:
+            # Find a target past of this starting single block.
+            process_goal = past_single_jump
+            # Accept the soon following jump target.
+            jump_filter = want_next_jump
+            return None
+        if ins.column <= min_column or not jump_targets:
+            # No pending jump targets exist, or the starting ins.column is <= min_column.
+            return -1
+        # Find a target past of the current block.
+        # New jump targets are ignored.
+        process_goal = past_single_jump
+        jump_filter = want_no_jumps
+        return None
+
+    # get cached starting index.
+    cache = _asmskip_stepout_cache.setdefault(id(f_code), {})
+    if curr_lineno in cache:
+        index = cache[curr_lineno]
+    else:
+        # (binary search would be nice, except asm_list is not sorted by lineno.)
+        index = 0
+        for index, ins in enumerate(asm_list):
+            if ins.lineno >= curr_lineno:
+                break
+        until_index = index
+        while index > 0:
+            if asm_list[index].column <= min_column:
+                break
+            index -= 1
+        for i in range(index, until_index):
+            cache[asm_list[i].lineno] = index
+
+    # Process loop.
+    process_goal = seek_to_curr_lineno
+    jump_filter = want_all_jumps
+    for ins in asm_list[index:]:
+        # track forward jump targets.
+        jump_filter()
+        if ins.offset in jump_targets:
+            jump_targets[ins.offset] = True
+        ret = process_goal()
+        if ret is not None:
+            return ret
+    return -1
diff -pruN 24.12.3-1/debugger/breakpointcontroller.cpp 25.11.80-0ubuntu1/debugger/breakpointcontroller.cpp
--- 24.12.3-1/debugger/breakpointcontroller.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/breakpointcontroller.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
@@ -10,12 +11,19 @@
 #include <QDebug>
 #include "debuggerdebug.h"
 
+#include <algorithm>
+
+using namespace KDevelop;
+
 namespace Python {
-    
-BreakpointController::BreakpointController(IDebugSession* parent): IBreakpointController(parent)
+
+BreakpointController::BreakpointController(IDebugSession* parent)
+    : IBreakpointController(parent)
 {
     qCDebug(KDEV_PYTHON_DEBUGGER) << "constructing breakpoint controller";
-    connect(debugSession(), SIGNAL(event(IDebugSession::event_t)), this, SLOT(slotEvent(IDebugSession::event_t)));
+    connect(debugSession(), qOverload<KDevelop::IDebugSession::event_t>(&IDebugSession::event), this,
+            &BreakpointController::slotEvent);
+    connect(session(), &DebugSession::programStopped, this, &BreakpointController::programStopped);
 }
 
 DebugSession* BreakpointController::session()
@@ -23,31 +31,349 @@ DebugSession* BreakpointController::sess
     return static_cast<DebugSession*>(parent());
 }
 
-void BreakpointController::slotEvent(IDebugSession::event_t evt)
+void BreakpointController::slotEvent(KDevelop::IDebugSession::event_t evt)
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << evt;
-    if ( evt == IDebugSession::connected_to_program ) {
-        const auto breakpoints = breakpointModel()->breakpoints();
-        for (Breakpoint* bp : breakpoints) {
-            if ( bp->deleted() ) {
-                continue;
-            }
-            session()->addBreakpoint(bp);
+    const auto breakpoints = breakpointModel()->breakpoints();
+
+    if (evt == IDebugSession::debugger_exited) {
+        // Reset breakpoint states.
+        for (Breakpoint* const bp : breakpoints) {
+            bp->setState(Breakpoint::NotStartedState);
         }
+        return;
+    }
+    if (evt != IDebugSession::connected_to_program) {
+        return;
+    }
+
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "insert" << breakpoints.size() << "model breakpoints";
+
+    for (Breakpoint* const bp : breakpoints) {
+        addBreakpoint(bp);
     }
 }
 
-void BreakpointController::sendMaybe(KDevelop::Breakpoint* breakpoint)
+void BreakpointController::programStopped(const ResponseData& data)
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "sending breakpoint: " << breakpoint << "( deleted:" << breakpoint->deleted() << ")";
-    if ( breakpoint->deleted() ) {
-        session()->removeBreakpoint(breakpoint);
+    const auto bphit = responseObject(data, QStringLiteral("bphit"));
+    if (bphit.isEmpty())
+        return;
+
+    const auto id = bphit.value(QStringLiteral("id")).toInt();
+    const auto file = bphit.value(QStringLiteral("filename")).toString();
+    const int line = bphit.value(QStringLiteral("line")).toInt();
+    const int hits = bphit.value(QStringLiteral("hits")).toInt();
+
+    if (m_temporaryBreakpoint && m_temporaryBreakpoint->breakpointId == id) {
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "temporary breakpoint location" << file << "at line" << line << "was reached";
+        return;
     }
-    else {
-        session()->addBreakpoint(breakpoint);
+
+    for (const auto& brk : m_breakpoints) {
+        if (!brk->breakpointId || brk->breakpointId != id || !brk->modelBreakpoint) {
+            continue;
+        }
+        // Update hit count. (by-pass IBreakpointController::updateHitCount() which does the same thing.)
+        brk->modelBreakpoint->setHitCount(hits);
+
+        // FIXME: BreakpointWidget only guarantees a update of the BreakpointDetails for columns up to ConditionColumn.
+        //        Strobe the status column as work-around to force updating of the BreakpointDetails.
+        auto state = brk->modelBreakpoint->state();
+        brk->modelBreakpoint->setState(Breakpoint::DirtyState);
+        brk->modelBreakpoint->setState(state);
+
+        // Notify.
+        int row = breakpointModel()->breakpoints().indexOf(brk->modelBreakpoint);
+        notifyHit(row, QString());
+        return;
     }
 }
 
+void BreakpointController::breakpointAdded(int row)
+{
+    auto* modelBreakpoint = breakpointModel()->breakpoint(row);
+    addBreakpoint(modelBreakpoint);
+}
+
+void BreakpointController::breakpointModelChanged(int row, BreakpointModel::ColumnFlags columns)
+{
+    columns &= BreakpointModel::LocationColumnFlag | BreakpointModel::EnableColumnFlag;
+    if (!columns) {
+        return;
+    }
+
+    auto* const modelBreakpoint = breakpointModel()->breakpoint(row);
+    updateBreakpoint(modelBreakpoint);
+
+    // TODO: - implement breakpoint ignore hits.
+    //       - implement breakpoint condition.
+}
+
+void BreakpointController::breakpointAboutToBeDeleted(int row)
+{
+    auto* modelBreakpoint = breakpointModel()->breakpoint(row);
+    removeBreakpoint(modelBreakpoint);
+}
+
+bool BreakpointController::isSupportedBreakpoint(Breakpoint* bp)
+{
+    static const QRegularExpression pyfiles(QStringLiteral(".*\\.py.*$"), QRegularExpression::CaseInsensitiveOption);
+
+    if (bp->url().isEmpty() || bp->savedLine() == -1) {
+        return false;
+    } else if (!pyfiles.match(bp->url().path()).hasMatch()) {
+        return false;
+    } else if (bp->kind() != KDevelop::Breakpoint::CodeBreakpoint || !bp->expression().isEmpty()) {
+        // No support for expressions... of any kind.
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "Implement me: kdevpdb has no support for expression breakpoints";
+        return false;
+    }
+
+    return true;
+}
+
+std::pair<QString, int> BreakpointController::locationForBreakpoint(Breakpoint* bp)
+{
+    /*
+     * Breakpoint::savedLine() is used for the location since it should match the document's state on disk.
+     * This also makes the debugger ignore unsaved modifications of the document, which allows the
+     * user to minimally *modify* the document while debugging. (E.g. comment the code)
+     */
+    return std::make_pair(bp->url().path(), bp->savedLine() + 1);
+}
+
+std::vector<BreakpointDataPtr>::iterator BreakpointController::lookupBreakpointData(Breakpoint* bp)
+{
+    return std::find_if(m_breakpoints.begin(), m_breakpoints.end(), [bp](const BreakpointDataPtr& brk) -> bool {
+        return brk->modelBreakpoint == bp;
+    });
+}
+
+void BreakpointController::addBreakpoint(Breakpoint* bp)
+{
+    // We have not added this breakpoint yet, right?
+    if (lookupBreakpointData(bp) != m_breakpoints.end()) {
+        qCWarning(KDEV_PYTHON_DEBUGGER) << "model breakpoint" << bp << "already registered";
+        return;
+    }
+
+    // Add entry for the model breakpoint.
+    const auto& brk = m_breakpoints.emplace_back(BreakpointDataPtr::create(bp));
+    const auto location = locationForBreakpoint(bp);
+
+    if (!isSupportedBreakpoint(bp)) {
+        // updateBreakpoint() inserts the breakpoint once it changes to something valid.
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "breakpoint " << bp << "location" << location.first << ':' << location.second
+                                      << "rejected";
+        bp->setState(Breakpoint::DirtyState);
+        return;
+    }
+
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "inserting breakpoint" << bp << location.first << ':' << location.second;
+
+    bp->setState(Breakpoint::PendingState);
+
+    // (try) insert the PDB breakpoint.
+    brk->breakpointId = m_debuggerBreakpointId++;
+    brk->location = location;
+    brk->enabled = bp->enabled();
+    session()->debugger()->request({CMD_BREAK, location.first, location.second, !brk->enabled},
+        [this, brk](const ResponseData& d) {
+        addHandler(d, brk);
+    });
+    session()->flushCommands();
+}
+
+void BreakpointController::addHandler(const ResponseData& data, const BreakpointDataPtr& brk)
+{
+    const auto result = responseValue(data, QStringLiteral("error"));
+    if (result.isUndefined()) {
+        // Insertion succeeded.
+        if (brk->modelBreakpoint) {
+            brk->modelBreakpoint->setHitCount(0);
+            brk->modelBreakpoint->setState(Breakpoint::CleanState);
+        }
+        return;
+    }
+
+    if (brk->modelBreakpoint) {
+        brk->modelBreakpoint->setState(Breakpoint::DirtyState);
+    }
+
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "breakpoint insertion failed:" << brk->breakpointId.value() << result.toString();
+
+    // The breakpoint's location was rejected, and therefore the server didn't use the brk->breakpointId.
+    --m_debuggerBreakpointId;
+    const int invalidId = brk->breakpointId.value();
+    // Cancel a possible already queued removeHandler()
+    brk->breakpointId.reset();
+    brk->location.first.clear();
+    brk->location.second = -1;
+    // Subtract one from all PDB ids greater than invalidId to correct them.
+    for (const auto& breakpoint : m_breakpoints) {
+        if (breakpoint->breakpointId.value_or(-1) < invalidId) {
+            continue;
+        }
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "fix-up pending id:" << breakpoint->breakpointId.value() << "as"
+                                      << breakpoint->breakpointId.value() - 1;
+        breakpoint->breakpointId.value()--;
+    }
+}
+
+void BreakpointController::removeBreakpoint(Breakpoint* bp)
+{
+    auto itr = lookupBreakpointData(bp);
+    if (itr == m_breakpoints.end()) {
+        // No breakpoint inserted for bp currently?
+        qCWarning(KDEV_PYTHON_DEBUGGER) << "no BreakpointData found for" << bp;
+        return;
+    }
+
+    // Erase from m_breakpoints. (swap-and-pop-back)
+    BreakpointDataPtr brk(std::move(*itr));
+    itr->swap(m_breakpoints.back());
+    m_breakpoints.pop_back();
+    // Cancel all on-going insertions of this model breakpoint by updateHandler().
+    brk->modelBreakpoint = nullptr;
+
+    session()->debugger()->defer([this, brk](const ResponseData&) {
+        if (removeHandler(brk)) {
+            session()->flushCommands();
+        }
+    });
+    session()->flushCommands();
+}
+
+bool BreakpointController::removeHandler(const BreakpointDataPtr& brk)
+{
+    if (!brk->breakpointId) {
+        // No PDB breakpoint available to clear.
+        return false;
+    }
+    int delId = brk->breakpointId.value();
+    brk->breakpointId.reset();
+    brk->location.first.clear();
+    brk->location.second = -1;
+    session()->debugger()->request({CMD_CLEAR, delId});
+    return true;
+}
+
+void BreakpointController::updateBreakpoint(Breakpoint* bp)
+{
+    auto itr = lookupBreakpointData(bp);
+    if (itr == m_breakpoints.end()) {
+        // No breakpoint inserted for bp currently?
+        qCWarning(KDEV_PYTHON_DEBUGGER) << "no BreakpointData found for" << bp;
+        return;
+    }
+
+    BreakpointDataPtr brk = *itr;
+    const auto location = locationForBreakpoint(bp);
+
+    if (!isSupportedBreakpoint(bp)) {
+        // Rejected.
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "updated breakpoint " << bp << "location" << location << "rejected";
+        bp->setState(Breakpoint::DirtyState);
+
+        session()->debugger()->defer([this, brk](const ResponseData&) {
+            if (removeHandler(brk)) {
+                session()->flushCommands();
+            }
+        });
+        session()->flushCommands();
+        return;
+    }
+
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "updated breakpoint " << bp << "location" << location << "accepted";
+
+    bp->setState(Breakpoint::PendingState);
+
+    // Queue a update of the breakpoint.
+    session()->debugger()->defer([this, brk, location](const ResponseData&) {
+        updateHandler(brk, location);
+    });
+    session()->flushCommands();
+}
+
+void BreakpointController::updateHandler(const BreakpointDataPtr& brk, std::pair<QString, int> location)
+{
+    // Update just the enabled/disabled state if location is up-to-date.
+    if (brk->modelBreakpoint && brk->breakpointId && brk->location == location) {
+        brk->modelBreakpoint->setState(Breakpoint::CleanState);
+        if (brk->modelBreakpoint->enabled() == brk->enabled) {
+            // No change to location or enabled state, nothing to do.
+            return;
+        }
+        // Just the enabled state changed.
+        brk->enabled = brk->modelBreakpoint->enabled();
+        if (brk->enabled) {
+            qCDebug(KDEV_PYTHON_DEBUGGER) << "enabling breakpoint" << brk->modelBreakpoint;
+            session()->debugger()->request({CMD_ENABLE, brk->breakpointId.value()});
+        } else {
+            qCDebug(KDEV_PYTHON_DEBUGGER) << "disabling breakpoint" << brk->modelBreakpoint;
+            session()->debugger()->request({CMD_DISABLE, brk->breakpointId.value()});
+        }
+        session()->flushCommands();
+        return;
+    }
+
+    // Only way to change the location is to create a new PDB breakpoint,
+    // so erase the old PDB breakpoint first, if it exist.
+    bool flush = removeHandler(brk);
+    // Insert only if the model breakpoint has not been deleted yet.
+    if (brk->modelBreakpoint) {
+        brk->breakpointId = m_debuggerBreakpointId++;
+        brk->enabled = brk->modelBreakpoint->enabled();
+        session()->debugger()->request({CMD_BREAK, location.first, location.second, !brk->enabled},
+        [this, brk](const ResponseData& d) {
+            addHandler(d, brk);
+        });
+        flush = true;
+    }
+    if (flush) {
+        session()->flushCommands();
+    }
+}
+
+void BreakpointController::runToLocation(const QUrl& fileName, int line, PdbDebuggerInstance::CmdCallback callback,
+                                         bool excludeOthers)
+{
+    // Create a free-standing breakpoint detached from the model.
+    auto bp = std::make_unique<KDevelop::Breakpoint>(nullptr, Breakpoint::CodeBreakpoint);
+    bp->setLocation(fileName, line);
+
+    const auto location = locationForBreakpoint(bp.get());
+
+    if (!isSupportedBreakpoint(bp.get())) {
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "temporary breakpoint location" << location << "ignored";
+        return;
+    }
+
+    m_temporaryBreakpoint = BreakpointDataPtr::create(bp.release());
+    m_temporaryBreakpoint->breakpointId = m_debuggerBreakpointId++;
+    m_temporaryBreakpoint->location = location;
+
+    session()->debugger()->request({QStringLiteral("runtolocation"), location.first, location.second, excludeOthers},
+    [this, callback](const ResponseData& d) {
+        runToLocationHandler(d, callback);
+    });
+}
+
+void BreakpointController::runToLocationHandler(const ResponseData& data, PdbDebuggerInstance::CmdCallback callback)
+{
+    Q_ASSERT(m_temporaryBreakpoint);
+
+    // Handle the program stop.
+    callback(data);
+
+    // call addHandler() for the temporary breakpoint to possibly
+    // fix-up other pending added/updated breakpoint ids if runToLocation() failed.
+    addHandler(data, m_temporaryBreakpoint);
+
+    delete m_temporaryBreakpoint->modelBreakpoint;
+    m_temporaryBreakpoint->modelBreakpoint = nullptr;
+    m_temporaryBreakpoint.reset();
+}
 }
 
 #include "moc_breakpointcontroller.cpp"
diff -pruN 24.12.3-1/debugger/breakpointcontroller.h 25.11.80-0ubuntu1/debugger/breakpointcontroller.h
--- 24.12.3-1/debugger/breakpointcontroller.h	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/breakpointcontroller.h	2025-11-09 03:41:22.000000000 +0000
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
@@ -7,18 +8,68 @@
 #ifndef BREAKPOINTCONTROLLER_H
 #define BREAKPOINTCONTROLLER_H
 
+#include <QSharedPointer>
+#include <QString>
+
 #include <debugger/interfaces/ibreakpointcontroller.h>
 #include "debugsession.h"
+#include "pdbdebuggerinstance.h"
 
-using namespace KDevelop;
+#include <optional>
+#include <utility>
+#include <vector>
 
 namespace Python {
 
+struct BreakpointData
+{
+    /// PDB breakpoint id. No value, if no breakpoint is inserted in PDB.
+    std::optional<int> breakpointId;
+    /// The model breakpoint associated with the PDB breakpoint.
+    KDevelop::Breakpoint* modelBreakpoint = nullptr;
+    std::pair<QString, int> location;
+    bool enabled = true;
+
+    Q_DISABLE_COPY_MOVE(BreakpointData)
+
+    BreakpointData(KDevelop::Breakpoint* bp)
+        : modelBreakpoint(bp)
+    {
+    }
+};
+
+using BreakpointDataPtr = QSharedPointer<BreakpointData>;
+
 class BreakpointController : public KDevelop::IBreakpointController
 {
 Q_OBJECT
 public:
-    BreakpointController(IDebugSession* parent);
+    BreakpointController(KDevelop::IDebugSession* parent);
+
+    void breakpointAdded(int row) override;
+
+    void breakpointModelChanged(int row, KDevelop::BreakpointModel::ColumnFlags columns) override;
+
+    void breakpointAboutToBeDeleted(int row) override;
+
+    /**
+     * Note: this method exists to ease the API transition; it should be removed at once
+     *       when this method is no longer called by KDevelop. We don't want KDevelop's
+     *       debuggerStateChanged() default implementation to override the breakpoint states that
+     *       we have setup.
+     **/
+    void debuggerStateChanged(KDevelop::IDebugSession::DebuggerState state) override
+    {
+        Q_UNUSED(state);
+    }
+
+    /**
+     * Create a temporary breakpoint, disable all other breakpoints if @p excludeOthers is true and run
+     * the program if the breakpoint creation succeeded. The temporary breakpoint is automatically
+     * cleaned up.
+     */
+    void runToLocation(const QUrl& fileName, int line, PdbDebuggerInstance::CmdCallback callback, bool excludeOthers);
+
 public Q_SLOTS:
     /**
      * @brief Handles events in the debug session.
@@ -27,17 +78,76 @@ public Q_SLOTS:
      * 
      * @param evt passed by kdevplatform, specifies the type of the event.
      **/
-    void slotEvent(IDebugSession::event_t evt);
+    void slotEvent(KDevelop::IDebugSession::event_t evt);
+
+    /**
+     * Report a location at where the program has stopped.
+     */
+    void programStopped(const Python::ResponseData& data);
+
 protected:
     /**
-     * @brief Notify the debugger about a breakpoint update.
-     * This is triggered if the user clicks the breakpoint bar.
-     * Deleting breakpoints is also handled here.
-     * 
-     * @param breakpoint The breakpoint to update.
+     * Note: this method exists solely to full fill KDevelop::IBreakpointController
+     *       interface to ease the API transition; it should be removed at once
+     *       when KDevelop::IBreakpointController no longer requires the override.
      **/
-    void sendMaybe(KDevelop::Breakpoint* breakpoint) override;
+    void sendMaybe(KDevelop::Breakpoint* breakpoint) override
+    {
+        Q_UNUSED(breakpoint);
+    }
     DebugSession* session();
+
+private:
+    /// Registered model breakpoints, unordered.
+    std::vector<BreakpointDataPtr> m_breakpoints;
+    /*
+     * What PDB breakpoint Id would be created next. PDB breakpoint ids start from 1 and are never
+     * reused in the same session. Must be incremented *before* queuing a CMD_BREAK.
+     */
+    int m_debuggerBreakpointId = 1;
+
+    BreakpointDataPtr m_temporaryBreakpoint;
+
+    static inline const auto CMD_BREAK = QStringLiteral("break");
+    static inline const auto CMD_CLEAR = QStringLiteral("clear");
+    static inline const auto CMD_ENABLE = QStringLiteral("enable");
+    static inline const auto CMD_DISABLE = QStringLiteral("disable");
+
+    static bool isSupportedBreakpoint(KDevelop::Breakpoint* bp);
+    static std::pair<QString, int> locationForBreakpoint(KDevelop::Breakpoint* bp);
+
+    /**
+     * Find the BreakpointData for a model breakpoint.
+     */
+    std::vector<BreakpointDataPtr>::iterator lookupBreakpointData(KDevelop::Breakpoint* bp);
+
+    /**
+     * Add a given model breakpoint to the debugger.
+     * @param bp The breakpoint to add
+     **/
+    void addBreakpoint(KDevelop::Breakpoint* bp);
+    void addHandler(const ResponseData& data, const BreakpointDataPtr& brk);
+
+    /**
+     * Queue commands to remove a given model breakpoint from the debugger.
+     * @param bp The breakpoint to remove
+     **/
+    void removeBreakpoint(KDevelop::Breakpoint* bp);
+
+    /**
+     * Queue a PDB clear command if possible.
+     * @return true if flushCommands() is required afterwards.
+     */
+    bool removeHandler(const BreakpointDataPtr& brk);
+
+    /**
+     * Queue commands to update a given model breakpoint in the debugger.
+     * @param bp The breakpoint to update
+     **/
+    void updateBreakpoint(KDevelop::Breakpoint* bp);
+    void updateHandler(const BreakpointDataPtr& brk, std::pair<QString, int> location);
+
+    void runToLocationHandler(const ResponseData& data, PdbDebuggerInstance::CmdCallback callback);
 };
 
 }
diff -pruN 24.12.3-1/debugger/debugjob.cpp 25.11.80-0ubuntu1/debugger/debugjob.cpp
--- 24.12.3-1/debugger/debugjob.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/debugjob.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -1,22 +1,22 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2025 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
 
 #include "debugjob.h"
-
-
+#include "debugsession.h"
 
 #include <interfaces/idebugcontroller.h>
 #include <interfaces/icore.h>
 #include <interfaces/iplugincontroller.h>
+#include <outputview/outputmodel.h>
 
 #include <sublime/view.h>
 #include <util/processlinemaker.h>
 
 #include <QDebug>
-#include <QStandardPaths>
 #include "debuggerdebug.h"
 
 namespace Python {
@@ -24,55 +24,27 @@ namespace Python {
 
 void DebugJob::start()
 {
-    QStringList program;
-    QString debuggerUrl = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kdevpythonsupport/debugger"), QStandardPaths::LocateDirectory) + QStringLiteral("/kdevpdb.py");
-    program << m_interpreter << QStringLiteral("-u") << debuggerUrl << m_scriptUrl.toLocalFile() << m_args;
     // Inject environment
-    m_session = new DebugSession(program, m_workingDirectory, m_envProfileName);
-    
+    m_session = new DebugSession();
+
     setStandardToolView(KDevelop::IOutputView::DebugView);
     setBehaviours(KDevelop::IOutputView::Behaviours(KDevelop::IOutputView::AllowUserClose) | KDevelop::IOutputView::AutoScroll);
-    OutputModel* pyOutputModel = new KDevelop::OutputModel();
-    pyOutputModel->setFilteringStrategy(OutputModel::ScriptErrorFilter);
+    KDevelop::OutputModel* pyOutputModel = new KDevelop::OutputModel();
+    pyOutputModel->setFilteringStrategy(KDevelop::OutputModel::ScriptErrorFilter);
     setModel(pyOutputModel);
-    setTitle(m_interpreter + m_scriptUrl.toLocalFile());
-
-    setModel(new KDevelop::OutputModel(nullptr));
 
     startOutput();
-    
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "connecting standardOutputReceived";
-    connect(m_session, &DebugSession::realDataReceived, this, &DebugJob::standardOutputReceived);
-    connect(m_session, &DebugSession::stderrReceived, this, &DebugJob::standardErrorReceived);
-    connect(m_session, &KDevelop::IDebugSession::finished, this, &DebugJob::sessionFinished);
-    KDevelop::ICore::self()->debugController()->addSession(m_session);
-    m_session->start();
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "starting program:" << program;
-}
-
-void DebugJob::sessionFinished()
-{
-    emitResult();
-}
 
-void DebugJob::standardErrorReceived(QStringList lines)
-{
-    if ( OutputModel* m = outputModel() ) {
-        m->appendLines(lines);
-    }
-}
-
-void DebugJob::standardOutputReceived(QStringList lines)
-{
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "standard output received:" << lines << outputModel();
-    if ( OutputModel* m = outputModel() ) {
-        m->appendLines(lines);
-    }
-}
-
-OutputModel* DebugJob::outputModel()
-{
-    return dynamic_cast<OutputModel*>(model());
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "connecting DebugSession to OutputModel";
+    connect(m_session, &DebugSession::realDataReceived, pyOutputModel, &KDevelop::OutputModel::appendLines);
+    connect(m_session, &DebugSession::stderrReceived, pyOutputModel, &KDevelop::OutputModel::appendLines);
+    connect(m_session, &DebugSession::stateChanged, this, [this](KDevelop::IDebugSession::DebuggerState state) {
+        if (state == KDevelop::IDebugSession::EndedState) {
+            emitResult();
+        }
+    });
+    KDevelop::ICore::self()->debugController()->addSession(m_session);
+    m_session->start(m_data);
 }
 
 bool DebugJob::doKill()
@@ -82,9 +54,10 @@ bool DebugJob::doKill()
     return true;
 }
 
-DebugJob::DebugJob()
+DebugJob::DebugJob(const StartupInfo& info)
+    : m_data(info)
 {
-
+    setCapabilities(Killable);
 }
 
 DebugJob::~DebugJob()
diff -pruN 24.12.3-1/debugger/debugjob.h 25.11.80-0ubuntu1/debugger/debugjob.h
--- 24.12.3-1/debugger/debugjob.h	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/debugjob.h	2025-11-09 03:41:22.000000000 +0000
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2025 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
@@ -8,16 +9,17 @@
 #define PDBDEBUGJOB_H
 
 #include <outputview/outputjob.h>
-#include <outputview/outputmodel.h>
-#include "debugsession.h"
+#include "startupinfo.h"
 
 namespace Python {
 
+class DebugSession;
+
 class DebugJob : public KDevelop::OutputJob
 {
 Q_OBJECT
 public:
-    DebugJob();
+    explicit DebugJob(const StartupInfo& info);
     ~DebugJob() override;
     
     /**
@@ -25,22 +27,10 @@ public:
      **/
     void start() override;
     bool doKill() override;
-    
-    QUrl m_scriptUrl;
-    QString m_interpreter;
-    QStringList m_args;
-    QUrl m_workingDirectory;
-    QString m_envProfileName;
-
-private Q_SLOTS:
-    void standardOutputReceived(QStringList lines);
-    void standardErrorReceived(QStringList lines);
 
 private:
-    OutputModel* outputModel();
+    const StartupInfo m_data;
     DebugSession* m_session;
-public Q_SLOTS:
-    void sessionFinished();
 };
 
 }
diff -pruN 24.12.3-1/debugger/debugsession.cpp 25.11.80-0ubuntu1/debugger/debugsession.cpp
--- 24.12.3-1/debugger/debugsession.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/debugsession.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
@@ -8,58 +9,43 @@
 #include <QApplication>
 
 #include <KLocalizedString>
-#include <signal.h>
 
 #include <debugger/framestack/framestackmodel.h>
 #include <interfaces/icore.h>
 #include <interfaces/idocumentcontroller.h>
-#include <util/environmentprofilelist.h>
 
 #include "debugsession.h"
+#include "breakpointcontroller.h"
 #include "pdbframestackmodel.h"
 #include "variablecontroller.h"
-#include "variable.h"
-#include "breakpointcontroller.h"
+#include "pdbprocess.h"
 
 #include <QDebug>
 #include <QRegularExpression>
-#include <QStandardPaths>
 
 #include "debuggerdebug.h"
 
-#ifdef Q_OS_WIN
-#include <windows.h>
-#define INTERRUPT_DEBUGGER GenerateConsoleCtrlEvent(CTRL_C_EVENT, m_debuggerProcess->processId())
-#else
-#define INTERRUPT_DEBUGGER kill(m_debuggerProcess->processId(), SIGINT)
-#endif
-
-namespace {
-static const QByteArray debuggerPrompt = "__KDEVPYTHON_DEBUGGER_PROMPT";
-static const QByteArray debuggerOutputBegin = "__KDEVPYTHON_BEGIN_DEBUGGER_OUTPUT>>>";
-static const QByteArray debuggerOutputEnd = "<<<__KDEVPYTHON_END___DEBUGGER_OUTPUT";
-}
-
 using namespace KDevelop;
 
 namespace Python {
 
-DebugSession::DebugSession(QStringList program, const QUrl &workingDirectory,
-    const QString& envProfileName) :
-    IDebugSession()
+DebugSession::DebugSession()
+    : IDebugSession()
     , m_breakpointController(nullptr)
     , m_variableController(nullptr)
     , m_frameStackModel(nullptr)
-    , m_workingDirectory(workingDirectory)
-    , m_envProfileName(envProfileName)
-    , m_nextNotifyMethod(nullptr)
-    , m_inDebuggerData(0)
+    , m_resumingFinished([this](const ResponseData& d) {
+        resumingFinished(d);
+    })
 {
     qCDebug(KDEV_PYTHON_DEBUGGER) << "creating debug session";
-    m_program = program;
-    m_breakpointController = new Python::BreakpointController(this);
-    m_variableController = new VariableController(this);
+    auto* const breakpointController = new Python::BreakpointController(this);
+    m_breakpointController = breakpointController;
     m_frameStackModel = new PdbFrameStackModel(this);
+    m_variableController = new VariableController(this);
+    m_debugger = new PdbDebuggerInstance(this);
+
+    connect(&m_killTimer, &QTimer::timeout, this, &DebugSession::killDebuggerNow);
 }
 
 IBreakpointController* DebugSession::breakpointController() const
@@ -77,45 +63,47 @@ IFrameStackModel* DebugSession::frameSta
     return m_frameStackModel;
 }
 
-void DebugSession::start()
+PdbDebuggerInstance* DebugSession::debugger() const
 {
-    setState(StartingState);
-    m_debuggerProcess = new KProcess(this);
-    m_debuggerProcess->setProgram(m_program);
-    m_debuggerProcess->setOutputChannelMode(KProcess::SeparateChannels);
-    m_debuggerProcess->blockSignals(true);
-    m_debuggerProcess->setWorkingDirectory(m_workingDirectory.path());
-
-    const KDevelop::EnvironmentProfileList environmentProfiles(KSharedConfig::openConfig());
-    const auto environment = environmentProfiles.variables(m_envProfileName);
-
-    QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
-    for(auto i = environment.cbegin(); i != environment.cend(); i++ )
-    {
-        env.insert(i.key(), i.value());
-    }
-    m_debuggerProcess->setProcessEnvironment(env);
-
-    connect(m_debuggerProcess, &QProcess::readyReadStandardOutput, this, &DebugSession::dataAvailable);
-    connect(m_debuggerProcess, SIGNAL(finished(int)), this, SLOT(debuggerQuit(int)));
-    connect(this, &DebugSession::debuggerReady, this, &DebugSession::checkCommandQueue);
-    connect(this, &DebugSession::commandAdded, this, &DebugSession::checkCommandQueue);
-    m_debuggerProcess->start();
-    m_debuggerProcess->waitForStarted();
-    auto dir = QStandardPaths::locate(QStandardPaths::GenericDataLocation,
-                                      QStringLiteral("kdevpythonsupport/debugger/"), QStandardPaths::LocateDirectory);
-    InternalPdbCommand* path = new InternalPdbCommand(nullptr, nullptr,
-        QStringLiteral("import sys; sys.path.append('") + dir + QStringLiteral("')\n"));
-    InternalPdbCommand* cmd = new InternalPdbCommand(nullptr, nullptr, QStringLiteral("import __kdevpython_debugger_utils\n"));
-    addCommand(path);
-    addCommand(cmd);
-    updateLocation();
-    m_debuggerProcess->blockSignals(false);
+    // start() must have been invoked once before this method!
+    Q_ASSERT(m_debugger);
+    Q_ASSERT(m_debugger->instance());
+    Q_ASSERT(m_debugger->instance()->process());
+    return m_debugger;
 }
 
-void DebugSession::debuggerQuit(int )
+void DebugSession::start(const StartupInfo& info)
 {
-    setState(EndedState);
+    m_state = StartingState;
+    // Disable UI controls, so the user cannot try e.g. run() until we are ready.
+    raiseEvent(debugger_busy);
+    Q_EMIT stateChanged(m_state);
+
+    // Connect lower-level PdbProcess signals to our slots:
+    auto* const debugger = m_debugger->instance();
+    connect(debugger, &PdbProcess::ready, this, &DebugSession::debuggerInit);
+    connect(debugger, &PdbProcess::running, this, &DebugSession::debuggerBusy);
+    connect(debugger, &PdbProcess::suspended, this, &DebugSession::inferiorSuspended);
+    connect(debugger, &PdbProcess::finished, this, &DebugSession::finalizeState);
+    connect(debugger, &PdbProcess::stdoutAvailable, this, &DebugSession::stdoutData, Qt::QueuedConnection);
+    connect(debugger, &PdbProcess::stderrAvailable, this, &DebugSession::stderrData, Qt::QueuedConnection);
+
+    // The debugger sends a "frames" response when it has initialized.
+    m_debugger->setMethod(m_debugger->currentSeqnro(), m_resumingFinished);
+
+    // Launch the process.
+    debugger->start(info);
+}
+
+void DebugSession::debuggerInit()
+{
+    // Successfully connected to the debugger.
+    // debuggerBusy() slot was skipped since we haven't actually sent any commands
+    // yet. Thus, set up the states such that inferiorSuspended() brings us into
+    // PausedState, once the initial response is processed after this slot.
+    m_resumingRequest = RunAction::Unspecified;
+    m_state = ActiveState;
+    Q_EMIT stateChanged(m_state);
 }
 
 QStringList byteArrayToStringList(const QByteArray& r) {
@@ -130,388 +118,309 @@ QStringList byteArrayToStringList(const
     return items;
 }
 
-void DebugSession::dataAvailable()
+void DebugSession::stdoutData(QByteArray data)
 {
-    QByteArray data = m_debuggerProcess->readAllStandardOutput();
-    qCDebug(KDEV_PYTHON_DEBUGGER) << data.length() << "bytes of data available";
-    
-    // remove pointless state changes
-   // data.replace(debuggerOutputBegin + debuggerOutputEnd, "");
-   // data.replace(debuggerOutputEnd + debuggerOutputBegin, "");
-    
-    bool endsWithPrompt = false;
-    if ( data.endsWith(debuggerPrompt) ) {
-        endsWithPrompt = true;
-        // remove the prompt
-        data = data.mid(0, data.length() - debuggerPrompt.length());
-    }
-    
-    // scan the data, and separate program output from debugger output
-    int len = data.length();
-    int delimiterSkip = debuggerOutputEnd.length();
-    int i = 0;
-    QByteArray realData;
-    while ( i < len ) {
-        int nextChangeAt = data.indexOf(m_inDebuggerData ? debuggerOutputEnd : debuggerOutputBegin, i);
-        bool atLastChange = nextChangeAt == -1;
-        nextChangeAt = atLastChange ? len : qMin(nextChangeAt, len);
-
-        
-        qCDebug(KDEV_PYTHON_DEBUGGER) << data;
-        Q_ASSERT(m_inDebuggerData == 0 || m_inDebuggerData == 1);
-        
-        if ( m_inDebuggerData == 1 ) {
-            m_buffer.append(data.mid(i, nextChangeAt - i));
-            if ( data.indexOf("Uncaught exception. Entering post mortem debugging") != -1 ) {
-                Q_EMIT realDataReceived(QStringList() << QStringLiteral("*****")
-                                                    << QStringLiteral("  ") + i18n("The program being debugged raised an uncaught exception.")
-                                                    << QStringLiteral("  ") + i18n("You can now inspect the status of the program after it exited.")
-                                                    << QStringLiteral("  ") + i18n("The debugger will silently stop when the next command is triggered.")
-                                                    << QStringLiteral("*****"));
-                InternalPdbCommand* cmd = new InternalPdbCommand(nullptr, nullptr, QStringLiteral("import __kdevpython_debugger_utils\n"));
-                addCommand(cmd);
-            }
-        }
-        else if ( m_inDebuggerData == 0 ) {
-            QByteArray d = data.mid(i, nextChangeAt - i);
-            if ( d.length() > 0 ) {
-                realData.append(d);
-            }
-        }
-        
-        i = nextChangeAt + delimiterSkip;
-        if ( m_inDebuggerData != 1 ) m_inDebuggerData = 1;
-        else m_inDebuggerData = 0;
-        
-        if ( atLastChange ) {
-            break;
-        }
-    }
-    
-    while (int index = realData.indexOf(debuggerPrompt) != -1 ) {
-        realData.remove(index-1, debuggerPrompt.length());
-    }
-    if ( ! realData.isEmpty() ) {
-        // FIXME this is not very elegant.
-        QStringList items = byteArrayToStringList(realData);
-        Q_EMIT realDataReceived(items);
-    }
-    
-    // Although unbuffered, it seems guaranteed that the debugger prompt is written at once.
-    // I don't think a python statement like print "FooBar" will ever break the output into two parts.
-    // TODO find explicit documentation for this somewhere.
-    if ( endsWithPrompt ) {
-        if ( state() == StartingState ) {
-            setState(PausedState);
-            raiseEvent(connected_to_program);
-        }
-        else {
-            notifyNext();
-            if ( m_commandQueue.isEmpty() ) {
-                qCDebug(KDEV_PYTHON_DEBUGGER) << "Changing state to PausedState";
-                setState(PausedState);
-            }
-        }
-        m_processBusy = false;
-        Q_EMIT debuggerReady();
-    }
-    
-    data = m_debuggerProcess->readAllStandardError();
-    if ( ! data.isEmpty() ) {
-        Q_EMIT stderrReceived(byteArrayToStringList(data));
-    }
+    // Forward the data.
+    Q_EMIT realDataReceived(byteArrayToStringList(data));
 }
 
-void DebugSession::setNotifyNext(QPointer<QObject> object, const char* method)
+void DebugSession::stderrData(QByteArray data)
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "set notify next:" << object << method;
-    m_nextNotifyObject = object;
-    m_nextNotifyMethod = method;
+    // Forward the data.
+    Q_EMIT stderrReceived(byteArrayToStringList(data));
 }
 
-void DebugSession::notifyNext()
+void DebugSession::debuggerBusy()
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "notify next:" << m_nextNotifyObject << this;
-    if ( m_nextNotifyMethod && m_nextNotifyObject ) {
-        QMetaObject::invokeMethod(m_nextNotifyObject.data(), m_nextNotifyMethod,
-                                  Qt::DirectConnection, Q_ARG(QByteArray, m_buffer));
+    // Switch to active state if we are running user commands. Such commands are those
+    // that would resume running the inferior's code. Other commands shouldn't switch
+    // between the PausedState or ActiveState.
+    if (m_resumingRequest == RunAction::None || m_state != PausedState) {
+        return;
     }
-    else {
-        qCDebug(KDEV_PYTHON_DEBUGGER) << "notify called, but nothing to notify!";
+    m_state = ActiveState;
+    qCDebug(KDEV_PYTHON_DEBUGGER) << PausedState << "==>" << m_state;
+
+    if (!m_flushInProgress) {
+        raiseEvent(debugger_busy);
+        raiseEvent(program_running);
     }
-    m_buffer.clear();
-    m_nextNotifyMethod = nullptr;
-    m_nextNotifyObject.clear();
+    Q_EMIT stateChanged(m_state);
 }
 
-void DebugSession::processNextCommand()
+void DebugSession::inferiorSuspended()
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "processing next debugger command in queue";
-    if ( m_processBusy || m_state == EndedState ) {
-        qCDebug(KDEV_PYTHON_DEBUGGER) << "process is busy or ended, aborting";
+    if (m_resumingRequest == RunAction::None || m_state != ActiveState) {
         return;
     }
-    m_processBusy = true;
-    PdbCommand* cmd = m_commandQueue.first();
-    Q_ASSERT(cmd->type() != PdbCommand::InvalidType);
-    if ( cmd->type() == PdbCommand::UserType ) {
-        setState(ActiveState);
-    }
-    m_commandQueue.removeFirst();
-    setNotifyNext(cmd->notifyObject(), cmd->notifyMethod());
-    cmd->run(this);
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "command executed, deleting it.";
-    delete cmd;
-    if ( ! m_commandQueue.isEmpty() ) {
-        processNextCommand();
-    }
-}
+    qCDebug(KDEV_PYTHON_DEBUGGER) << m_state << "==>" << PausedState;
 
-void DebugSession::setState(DebuggerState state)
-{
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "Setting state to" << state;
-    
-    if ( state == m_state ) {
-        return;
-    }
-    m_state = state;
-    if ( m_state == EndedState ) {
-        raiseEvent(debugger_exited);
-        Q_EMIT finished();
-    }
-    else if ( m_state == ActiveState || m_state == StartingState || m_state == StoppingState ) {
-        raiseEvent(debugger_busy);
+    if (!m_sessionStarted) {
+        m_sessionStarted = true;
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "debugger initialized successfully!";
+        // run() cannot be invoked from this method as this would interfere
+        // with the PausedState <==> ActiveState switching.
+        QMetaObject::invokeMethod(this, &DebugSession::runOnStart, Qt::QueuedConnection);
+
+        raiseEvent(connected_to_program);
     }
-    else if ( m_state == PausedState ) {
+
+    m_state = PausedState;
+    Q_EMIT stateChanged(m_state);
+
+    // Don't raise debugger_ready nor program_state_changed, or reset m_resumingRequest
+    // if flushCommands() is in progress.
+    if (!m_flushInProgress) {
+        m_resumingRequest = RunAction::None;
         raiseEvent(debugger_ready);
-        if ( currentUrl().isValid() ) {
-            Q_EMIT showStepInSource(currentUrl(), currentLine(), currentAddr());
-        }
+        // Program state has changed.
+        raiseEvent(program_state_changed);
     }
-    
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "debugger state changed to" << m_state;
-    raiseEvent(program_state_changed);
-    Q_EMIT stateChanged(m_state);
 }
 
-void DebugSession::write(const QByteArray& cmd)
+void DebugSession::runOnStart()
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << " >>> WRITE:" << cmd;
-    m_debuggerProcess->write(cmd);
+    if (debugger()->instance()->isBusy()) {
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "DebugSession is not idle yet";
+
+        // Retry to after all currently queued commands.
+        debugger()->defer([this](const ResponseData&) {
+            QMetaObject::invokeMethod(this, &DebugSession::runOnStart, Qt::QueuedConnection);
+        });
+        return;
+    }
+
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "DebugSession::run()";
+    run();
 }
 
 void DebugSession::stepOut()
 {
-    // TODO this only steps out of functions; use temporary breakpoints for loops maybe?
-    addSimpleUserCommand(QStringLiteral("return"));
+    m_resumingRequest = RunAction::StepOut;
+    m_debugger->request({QStringLiteral("stepout")}, m_resumingFinished);
 }
 
 void DebugSession::stepOverInstruction()
 {
-    addSimpleUserCommand(QStringLiteral("next"));
+    m_resumingRequest = RunAction::StepOverInstruction;
+    m_debugger->request({QStringLiteral("steppast")}, m_resumingFinished);
 }
 
 void DebugSession::stepInto()
 {
-    addSimpleUserCommand(QStringLiteral("step"));
+    m_resumingRequest = RunAction::StepInto;
+    m_debugger->request({QStringLiteral("step")}, m_resumingFinished);
 }
 
 void DebugSession::stepIntoInstruction()
 {
-    addSimpleUserCommand(QStringLiteral("step"));
+    m_resumingRequest = RunAction::StepIntoInstruction;
+    m_debugger->request({QStringLiteral("step")}, m_resumingFinished);
 }
 
 void DebugSession::stepOver()
 {
-    addSimpleUserCommand(QStringLiteral("next"));
+    m_resumingRequest = RunAction::StepOver;
+    m_debugger->request({QStringLiteral("next")}, m_resumingFinished);
 }
 
 void DebugSession::jumpToCursor()
 {
+    m_resumingRequest = RunAction::JumpToCursor;
     if (KDevelop::IDocument* doc = KDevelop::ICore::self()->documentController()->activeDocument()) {
         KTextEditor::Cursor cursor = doc->cursorPosition();
         if ( cursor.isValid() ) {
-            // TODO disable all other breakpoints
-            addSimpleUserCommand(QString(QStringLiteral("jump ") + QString::number(cursor.line() + 1)));
+            // TODO: consider a specialized handler, since "jump" can refuse to do anything.
+            m_debugger->request({QStringLiteral("jump"), cursor.line() + 1}, m_resumingFinished);
         }
     }
 }
 
 void DebugSession::runToCursor()
 {
+    m_resumingRequest = RunAction::RunToCursor;
     if (KDevelop::IDocument* doc = KDevelop::ICore::self()->documentController()->activeDocument()) {
         KTextEditor::Cursor cursor = doc->cursorPosition();
         if ( cursor.isValid() ) {
-            // TODO disable all other breakpoints
-            QString temporaryBreakpointLocation = doc->url().path() + QLatin1Char(':') + QString::number(cursor.line() + 1);
-            InternalPdbCommand* temporaryBreakpointCmd = new InternalPdbCommand(nullptr, nullptr, QStringLiteral("tbreak ") + temporaryBreakpointLocation + QLatin1Char('\n'));
-            addCommand(temporaryBreakpointCmd);
-            addSimpleInternalCommand(QStringLiteral("continue"));
-            updateLocation();
+            m_runToUrl = doc->url();
+            m_runToLine = cursor.line();
+            qobject_cast<Python::BreakpointController*>(m_breakpointController)
+                ->runToLocation(m_runToUrl, m_runToLine, m_resumingFinished, true);
         }
     }
 }
 
 void DebugSession::run()
 {
-    addSimpleUserCommand(QStringLiteral("continue"));
+    // The m_resumingRequest is set here (and this applies to other such stepping commands also)
+    // to trigger entering into ActiveState. debuggerBusy() then disables the debugger UI controls,
+    // and thus prevents the user from trying again until we reach PausedState.
+    m_resumingRequest = RunAction::Run;
+    m_debugger->request({QStringLiteral("continue")}, m_resumingFinished);
 }
 
 void DebugSession::interruptDebugger()
 {
-    INTERRUPT_DEBUGGER;
-    updateLocation();
-    setState(PausedState);
+    m_debugger->instance()->tryInterrupt();
 }
 
-void DebugSession::addCommand(PdbCommand* cmd)
+void DebugSession::flushCommands()
 {
-    if ( m_state == EndedState || m_state == StoppingState ) {
+    if (m_resumingRequest == RunAction::None) {
         return;
     }
-    qCDebug(KDEV_PYTHON_DEBUGGER) << " +++  adding command to queue:" << cmd;
-    m_commandQueue.append(cmd);
-    if ( cmd->type() == PdbCommand::UserType ) {
-        // this is queued and will run after the command is executed.
-        updateLocation();
+
+    if (m_flushInProgress) {
+        // A flush is already in progress.
+        // Cancel our handler from the last time flushCommands() was issued.
+        m_debugger->setMethod(m_flushSeqNro, {});
+    } else {
+        // Switch silently to PausedState, if we actually do interrupt the debugger.
+        m_flushInProgress = true;
+        if (!m_debugger->instance()->tryInterrupt()) {
+            m_flushInProgress = false;
+            return;
+        }
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "starting immediate flushing of commands";
+    }
+
+    // Queue a no-op with a handler that resumes the interrupted operation.
+    auto action = m_resumingRequest;
+    m_flushSeqNro = m_debugger->currentSeqnro();
+    m_debugger->defer([this, action](const ResponseData&) {
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "immediate flushing completed, resuming last action";
+        m_flushInProgress = false;
+        m_flushSeqNro = -1;
+        // Re-issue the interrupted action's command.
+        resumeAction(action);
+    });
+}
+
+void DebugSession::resumeAction(RunAction action)
+{
+    switch (action) {
+    case RunAction::Run:
+        run();
+        break;
+    case RunAction::StepInto:
+    case RunAction::StepIntoInstruction:
+        stepInto();
+        break;
+    case RunAction::StepOver:
+        stepOver();
+        break;
+    case RunAction::StepOverInstruction:
+        stepOverInstruction();
+        break;
+    case RunAction::StepOut:
+        stepOut();
+        break;
+    case RunAction::RunToCursor:
+        qobject_cast<Python::BreakpointController*>(m_breakpointController)
+            ->runToLocation(m_runToUrl, m_runToLine, m_resumingFinished, false);
+        break;
+    default:
+        break;
     }
-    Q_EMIT commandAdded();
 }
 
-void DebugSession::checkCommandQueue()
-{
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "items in queue:" << m_commandQueue.length();
-    if ( m_commandQueue.isEmpty() ) {
+void DebugSession::resumingFinished(const ResponseData& data)
+{
+    // Update execution location.
+    // This handler is invoked by any of the resuming actions, and
+    // the "frames" field contains just the most recent frame. (this response is guaranteed)
+
+    if (m_flushInProgress) {
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "not updating position due to flushCommands() in progress";
         return;
     }
-    processNextCommand();
-}
 
-void DebugSession::clearObjectTable()
-{
-    addSimpleInternalCommand(QStringLiteral("__kdevpython_debugger_utils.cleanup()"));
-}
+    const auto frame = responseArray(data, QStringLiteral("frames")).at(0).toObject();
+    const auto file = frame.value(QStringLiteral("filename")).toString();
+    const int line = frame.value(QStringLiteral("line")).toInt();
+    const int addr = frame.value(QStringLiteral("address")).toInt();
 
-void DebugSession::addSimpleUserCommand(const QString& cmd)
-{
-    clearObjectTable();
-    UserPdbCommand* cmdObject = new UserPdbCommand(nullptr, nullptr, cmd + QLatin1Char('\n'));
-    Q_ASSERT(cmdObject->type() == PdbCommand::UserType);
-    addCommand(cmdObject);
-}
+    setCurrentPosition(QUrl::fromLocalFile(file), line - 1, QString::number(addr));
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "New position: " << file << line - 1;
 
-void DebugSession::addSimpleInternalCommand(const QString& cmd)
-{
-    Q_ASSERT( ! cmd.endsWith(QLatin1Char('\n')) );
-    InternalPdbCommand* cmdObject = new InternalPdbCommand(nullptr, nullptr, cmd + QLatin1Char('\n'));
-    addCommand(cmdObject);
+    Q_EMIT programStopped(data);
 }
 
-void DebugSession::runImmediately(const QString& cmd)
+void DebugSession::stopDebugger()
 {
-    Q_ASSERT(cmd.endsWith(QLatin1Char('\n')));
-    if ( state() == ActiveState ) {
-        m_nextNotifyMethod = nullptr;
-        m_nextNotifyObject.clear(); // TODO is this correct?
-        qCDebug(KDEV_PYTHON_DEBUGGER) << "interrupting debugger";
-        INTERRUPT_DEBUGGER;
-        write(cmd.toUtf8());
-        write("continue\n");
-        updateLocation();
+    if (m_state >= StoppingState || m_state == NotStartedState) {
+        return;
     }
-    else {
-        addCommand(new InternalPdbCommand(nullptr, nullptr, cmd));
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "stopping debugger";
+    m_state = StoppingState;
+    Q_EMIT stateChanged(m_state);
+
+    if (!m_debugger || !m_debugger->instance()) {
+        return;
     }
+    // Tell the server to quit eventually.
+    m_debugger->instance()->sendControlCommand(PdbProcess::ControlCommand::Terminate);
+    m_debugger->instance()->tryInterrupt();
+
+    // Ensure we won't wait forever for the process to die.
+    m_killTimer.setSingleShot(true);
+    m_killTimer.setInterval(5000);
+    m_killTimer.start();
 }
 
-void DebugSession::addBreakpoint(Breakpoint* bp)
+void DebugSession::killDebuggerNow()
 {
-    QString location = bp->url().path() + QLatin1Char(':') + QString::number(bp->line() + 1);
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "adding breakpoint" << location;
-    runImmediately(QStringLiteral("break ") + location + QLatin1Char('\n'));
+    killDebugger();
 }
 
-void DebugSession::removeBreakpoint(Breakpoint* bp)
+void DebugSession::finalizeState()
 {
-    QString location = bp->url().path() + QLatin1Char(':') + QString::number(bp->line() + 1);
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "deleting breakpoint" << location;
-    runImmediately(QStringLiteral("clear ") + location + QLatin1Char('\n'));
-}
+    // Disarm the kill timer, the process exited.
+    m_killTimer.stop();
 
-void DebugSession::createVariable(Python::Variable* variable, QObject* callback, const char* callbackMethod)
-{
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "asked to create variable";
-    auto text = QString(QStringLiteral("print(__kdevpython_debugger_utils.obj_to_string(") + variable->expression() + QStringLiteral("))\n"));
-    auto cmd = new InternalPdbCommand(variable, "dataFetched", text);
-    variable->m_notifyCreated = callback;
-    variable->m_notifyCreatedMethod = callbackMethod;
-    addCommand(cmd);
-}
+    if (m_state == EndedState) {
+        // finalizeState() already invoked.
+        return;
+    } else if (m_state < StoppingState) {
+        // Normal exit of the inferior. (we skipped the StoppingState.)
+        raiseEvent(program_exited);
+    }
 
-void DebugSession::clearOutputBuffer()
-{
-    m_buffer.clear();
+    m_state = EndedState;
+    raiseEvent(debugger_exited);
+    Q_EMIT stateChanged(m_state);
 }
 
-void DebugSession::updateLocation()
+void DebugSession::killDebugger()
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "updating location";
-    InternalPdbCommand* cmd = new InternalPdbCommand(this, "locationUpdateReady", QStringLiteral("where\n"));
-    addCommand(cmd);
-}
-
-void DebugSession::locationUpdateReady(QByteArray data) {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "Got where information: " << data;
-    QList<QByteArray> lines = data.split('\n');
-    if ( lines.length() >= 3 ) {
-        lines.removeLast(); // prompt
-        lines.removeLast(); // source line
-        QString where = QString::fromUtf8(lines.last());
-        // > /bar/baz/foo.py(123)<module>()
-        static QRegularExpression m(QRegularExpression::anchoredPattern(QStringLiteral("^> (/.*\\.py)\\((\\d*)\\).*$")),
-                                    QRegularExpression::InvertedGreedinessOption);
-        auto match = m.match(where);
-        setCurrentPosition(QUrl::fromLocalFile(match.captured(1)), match.captured(2).toInt() - 1 , QStringLiteral("<unknown>"));
-        qCDebug(KDEV_PYTHON_DEBUGGER) << "New position: " << match.captured(1) << match.captured(2).toInt() - 1 << match.capturedTexts() << where;
+    if (m_state == EndedState || m_state == NotStartedState) {
+        return;
+    }
+    // Kill timer expired or must stop in a hurry.
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "killing debugger now";
+    if (m_state < StoppingState) {
+        m_state = StoppingState;
+        Q_EMIT stateChanged(m_state);
     }
-}
 
-void DebugSession::stopDebugger()
-{
-    m_commandQueue.clear();
-    InternalPdbCommand* cmd = new InternalPdbCommand(nullptr, nullptr, QStringLiteral("quit\nquit\n"));
-    addCommand(cmd);
-    setState(StoppingState);
-    if ( ! m_debuggerProcess->waitForFinished(200) ) {
-        m_debuggerProcess->kill();
+    if (m_debugger && m_debugger->instance()) {
+        // Disarm the kill timer to not repeatedly invoke us.
+        m_killTimer.stop();
+        // Be gone!
+        m_debugger->instance()->killNow();
     }
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "stopped debugger";
-    finalizeState();
-}
 
-void DebugSession::killDebuggerNow()
-{
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "killing debugger now";
-    m_debuggerProcess->kill();
     finalizeState();
 }
 
-void DebugSession::finalizeState()
-{
-    m_commandQueue.clear();
-    m_nextNotifyMethod = nullptr;
-    m_nextNotifyObject.clear();
-    setState(IDebugSession::EndedState);
-}
-
 DebugSession::~DebugSession()
 {
-    m_debuggerProcess->kill();
+    killDebugger();
 }
 
 void DebugSession::restartDebugger()
 {
-    addSimpleUserCommand(QStringLiteral("run"));
+    // Not implemented. There seems to be no user action for this in KDevelop?
 }
 
 bool DebugSession::restartAvaliable() const
diff -pruN 24.12.3-1/debugger/debugsession.h 25.11.80-0ubuntu1/debugger/debugsession.h
--- 24.12.3-1/debugger/debugsession.h	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/debugsession.h	2025-11-09 03:41:22.000000000 +0000
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2025 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
@@ -7,93 +8,49 @@
 #ifndef PDBDEBUGSESSION_H
 #define PDBDEBUGSESSION_H
 
-#include <KProcess>
-#include <QMutexLocker>
-#include <QPointer>
-
+#include <QTimer>
 #include <QDebug>
 #include "debuggerdebug.h"
 
 #include <debugger/interfaces/idebugsession.h>
 #include <debugger/interfaces/ivariablecontroller.h>
 #include <debugger/interfaces/ibreakpointcontroller.h>
-#include "variable.h"
-
-using namespace KDevelop;
+#include "pdbdebuggerinstance.h"
 
 namespace Python {
 
-struct PdbCommand;
-    
+struct StartupInfo;
+
 class DebugSession : public KDevelop::IDebugSession
 {
     Q_OBJECT
 public:
-    DebugSession(QStringList program, const QUrl& workingDirectory,
-                 const QString& envProfileName);
+    DebugSession();
     ~DebugSession() override;
 
-    IBreakpointController* breakpointController() const override;
-    IFrameStackModel* frameStackModel() const override;
+    KDevelop::IBreakpointController* breakpointController() const override;
+    KDevelop::IFrameStackModel* frameStackModel() const override;
 
     /**
      * @brief Start the debugger.
      **/
-    void start();
-    
-    /**
-     * @brief Adds a command to the queue.
-     * Commands are processed in the same order they're added.
-     * If the type of the command added is UserType, automatic updates
-     * (of local variables, location, ...) will be triggered.
-     *
-     * @param cmd The command to enqeue.
-     **/
-    void addCommand(PdbCommand* cmd);
-    
-    /**
-     * @brief Convenience function, constructs a new UserPdbCommand and enqueues it.
-     * Use this to enqueue simple commands invoked by user clicks ("next" etc.)
-     *
-     * @param cmd What you would type at the debugger command line.
-     **/
-    void addSimpleUserCommand(const QString& cmd);
-    
-    /**
-     * @brief Convencience function, constructs a new InternalPdbCommand and enqueues it.
-     * Use this to enqueue simple commands which are needed internally ("where", ...)
-     *
-     * @param cmd What you would type at the debugger command line.
-     **/
-    void addSimpleInternalCommand(const QString& cmd);
-    
-    /**
-     * @brief Interrupt the running program with SIGINT and immediately run the specified command.
-     * This will also trigger a location update. Program execution will continue immediately after
-     * the given command has been run!
-     *
-     * @param cmd What you would type at the debugger command line, terminated by \n.
-     **/
-    void runImmediately(const QString& cmd);
-    
+    void start(const StartupInfo& info);
+
     /**
-     * @brief Constructs commands to add the given breakpoint to the debugger.
-     *
-     * @param bp The breakpoint to add
-     **/
-    void addBreakpoint(Breakpoint* bp);
-    
+     * @brief Get the PdbDebuggerInstance i.e. the debugger.
+     */
+    PdbDebuggerInstance* debugger() const;
+
     /**
-     * @brief Constructs commands to remove the given breakpoint from the debugger.
-     *
-     * @param bp The breakpoint to remove
-     **/
-    void removeBreakpoint(Breakpoint* bp);
-    
+     * flushCommands() interrupts the debugger, so any requests queued up to this point can be processed
+     * immediately, after which the interrupted user action is re-issued.
+     */
+    void flushCommands();
+
     /**
      * @brief Access this session's variable controller
      **/
-    IVariableController* variableController() const override;
+    KDevelop::IVariableController* variableController() const override;
     
     /// Those functions just execute the basic debugger commands. They're used when the user
     /// clicks the appropriate button.
@@ -122,10 +79,10 @@ public:
     void stopDebugger() override;
 
     /**
-     * @brief Kill the debugger process synchronously
+     * @brief Kill the debugger process synchronously.
      **/
     void killDebuggerNow() override;
-    
+
     /**
      * @brief Gives the debugger state.
      * The two main states are "ActiveState" and "PausedState"; the former is given
@@ -134,212 +91,83 @@ public:
      * @return :IDebugSession::DebuggerState the current state the debugger is in
      **/
     IDebugSession::DebuggerState state() const override;
-    
-    /**
-     * @brief Change the debugger state, and trigger various events depending on the previous and new state.
-     * WARNING: Do *not* switch to ActiveState for running internal commands: If
-     * the location is being updated by "where", no state switching should occur.
-     * Otherwise, various endless loops might occur because kdevplatform tries auto-
-     * update various things (like the location, ...)
-     * State changes should only occur when starting up, shutting down, or on explicit user interaction.
-     * 
-     * @param state The state to change to.
-     **/
-    void setState(IDebugSession::DebuggerState state);
-    
-    /**
-     * @brief Enqueue a command which updates the location.
-     * Run this whenever you enqueue a command which might change the location in the source code
-     * (like "next" or similar). This is queued, so you can do addSimpleUserCommand("next"); updateLocation();
-     * without problems.
-     **/
-    void updateLocation();
-    
-    /**
-     * @brief Clears the table of object IDs stored in the debugger script
-     **/
-    void clearObjectTable();
-    
-    /**
-     * @brief Write raw data to the debugger process' stdin.
-     * Remember that you have to terminate your input by "\n" for the debugger to process it.
-     * 
-     * @param cmd data to write to stdin
-     **/
-    void write(const QByteArray& cmd);
+
+    enum class RunAction {
+        None,
+        Unspecified,
+        StepOut,
+        StepOverInstruction,
+        StepInto,
+        StepIntoInstruction,
+        StepOver,
+        JumpToCursor,
+        RunToCursor,
+        Run
+    };
+    /**
+     * Resume execution of the inferior's code.
+     */
+    void resumeAction(RunAction action);
 
 public Q_SLOTS:
+    void debuggerInit();
+
     /**
      * @brief Emitted when new data has been received from the debugger process (via stdout)
      **/
-    void dataAvailable();
-    /**
-     * @brief Fetch the given variable's value and assign it, and when done call the given callback method.
-     *
-     * @param variable Variable object to fetch data for
-     * @param callback object to call callbackMethod on
-     * @param callbackMethod method to call when done
-     **/
-    void createVariable(Python::Variable* variable, QObject* callback, const char* callbackMethod);
-    
-    /**
-     * @brief Check the command queue, and run the next command if it's not empty.
-     **/
-    void checkCommandQueue();
-    
-    /**
-     * @brief Performs a location update.
-     * This is used by updateLocation().
-     **/
-    void locationUpdateReady(QByteArray data);
-    void debuggerQuit(int);
-
-Q_SIGNALS:
-    /// Emitted when the debugger becomes ready to process a new command, i.e. shows its prompt
-    void debuggerReady();
-    /// Emitted when a new command is added to the queue
-    void commandAdded();
-    /// Emitted when real data from the program is received (needs improvement)
-    void realDataReceived(QStringList);
-    void stderrReceived(QStringList);
+    void stdoutData(QByteArray data);
+    void stderrData(QByteArray data);
 
-private:
-    IBreakpointController* m_breakpointController;
-    IVariableController* m_variableController;
-    IFrameStackModel* m_frameStackModel;
-    KProcess* m_debuggerProcess;
-    IDebugSession::DebuggerState m_state;
-    QByteArray m_buffer;
-    QStringList m_program;
-    QList<PdbCommand*> m_commandQueue;
-    const QUrl& m_workingDirectory;
-    const QString m_envProfileName;
-private:
-    /// objects to notify next
-    QPointer<QObject> m_nextNotifyObject;
-    const char* m_nextNotifyMethod;
-    /// whether the process is busy processing an internal command
-    bool m_processBusy;
-    
-    /**
-     * @brief Set the object to notify when the next command is done processing
-     **/
-    void setNotifyNext(QPointer<QObject> object, const char* method);
-    
     /**
-     * @brief Invoke the method given by setNotifyNext, and clear it
-     **/
-    void notifyNext();
-    
-    /**
-     * @brief Process the next command in the queue.
-     * WARNING: The queue must be non-empty when this is called.
-     * If the process is busy doing something else, returns and does nothing.
-     **/
-    void processNextCommand();
-    
+     * @brief Emitted once each time the debugger has started running commands.
+     */
+    void debuggerBusy();
+
     /**
-     * @brief Clear the data accumulated in m_buffer.
-     **/
-    void clearOutputBuffer();
+     * @brief Emitted once each time when the debugger has run out of commands to process.
+     */
+    void inferiorSuspended();
+
+    void runOnStart();
 
     /**
-     * @brief Clean up and switch to EndedState after stopping/killing the debugger
-     **/
+     * @brief Called once when the debugger process has exited.
+     */
     void finalizeState();
-    
-    /// stores whether the data currently received comes from the debugger
-    /// or the debuggee.
-    int m_inDebuggerData;
-};
 
-/**
- * @brief Base class for all Pdb command objects. Those are enqueued in the debug session.
- **/
-struct PdbCommand {
-public:
-    /// notifyMethod must have a QByteArray argument, which is the 
-    /// output produced by the command.
-    PdbCommand(QObject* notifyObject, const char* notifyMethod) :
-      m_notifyObject(notifyObject)
-    , m_notifyMethod(notifyMethod)
-    , m_output(QByteArray()) {};
-    
     /**
-     * @brief Implement this method in your sub-class to execute the command in the given session.
-     * WARNING: The process is already locked and ready when this is called.
-     * Don't acquire or release any locks or do fancy checking here, just do your business (write data
-     * to the process, ...). Everything else is handled from outside.
-     * @param session the debug session to run the command in
-     **/
-    virtual void run(DebugSession* session) = 0;
-    virtual ~PdbCommand() {};
-    void setOutput(QByteArray output) {
-        m_output = output;
-    };
-    QPointer<QObject> notifyObject() {
-        return m_notifyObject;
-    };
-    const char* notifyMethod() {
-        return m_notifyMethod;
-    };
-    
-    enum Type {
-        InvalidType,
-        InternalType,
-        UserType
-    };
-    
-    inline Type type() const {
-        return m_type;
-    };
+     * Straight up kill the debugger process.
+     */
+    void killDebugger();
 
-protected:
-    Type m_type;
-    QPointer<QObject> m_notifyObject;
-    const char* m_notifyMethod;
-    QByteArray m_output;
-};
+Q_SIGNALS:
+    /// Emitted when real data from the program is received
+    void realDataReceived(QStringList);
+    void stderrReceived(QStringList);
 
-/**
- * @brief Base-class for commands which just write a simple piece of text to the debugger command line and read its output.
- **/
-struct SimplePdbCommand : public PdbCommand {
-public:
-    SimplePdbCommand(QObject* notifyObject, const char* notifyMethod, const QString& command) :
-      PdbCommand(notifyObject, notifyMethod)
-    , m_command(command) {
-        m_type = InvalidType;
-    };
-    void run(DebugSession* session) override {
-        Q_ASSERT(m_command.endsWith(QLatin1Char('\n')) && "command must end with a newline");
-        qCDebug(KDEV_PYTHON_DEBUGGER) << "running command:" << m_command<< m_notifyMethod;
-        session->write(m_command.toUtf8());
-    }
-private:
-    QString m_command;
-};
+    /// Emitted when the program has stopped. (for any reason)
+    void programStopped(const Python::ResponseData& data);
 
-/**
- * @brief Represents a command which is invoked by kdevelop to obtain information to display in the UI.
- **/
-struct InternalPdbCommand : public SimplePdbCommand {
-public:
-    InternalPdbCommand(QObject* notifyObject, const char* notifyMethod, const QString& command) :
-      SimplePdbCommand(notifyObject, notifyMethod, command) {
-        m_type = InternalType;
-    } ;
-};
+private:
+    KDevelop::IBreakpointController* m_breakpointController;
+    KDevelop::IVariableController* m_variableController;
+    KDevelop::IFrameStackModel* m_frameStackModel;
+    DebuggerState m_state = DebuggerState::NotStartedState;
+    PdbDebuggerInstance* m_debugger = nullptr;
+    QTimer m_killTimer;
+    bool m_sessionStarted = false;
+    const PdbDebuggerInstance::CmdCallback m_resumingFinished;
+    /// Must be set before running a command that would resume running the inferior's code.
+    RunAction m_resumingRequest = RunAction::None;
+    bool m_flushInProgress = false;
+    int m_flushSeqNro = -1;
+    QUrl m_runToUrl;
+    int m_runToLine = -1;
 
-/**
- * @brief Represents a command which is invoked by the user by clicking a button.
- **/
-struct UserPdbCommand : public SimplePdbCommand {
-public:
-    UserPdbCommand(QObject* notifyObject, const char* notifyMethod, const QString& command) :
-      SimplePdbCommand(notifyObject, notifyMethod, command) {
-          m_type = UserType;
-    } ;
+    /**
+     * @brief Handler for debugger requests, which continued to execute inferior's code.
+     **/
+    void resumingFinished(const ResponseData& data);
 };
 
 }
diff -pruN 24.12.3-1/debugger/kdevpdb.json 25.11.80-0ubuntu1/debugger/kdevpdb.json
--- 24.12.3-1/debugger/kdevpdb.json	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/kdevpdb.json	2025-11-09 03:41:22.000000000 +0000
@@ -4,6 +4,7 @@
             {
                 "Email": "svenbrauch@googlemail.com",
                 "Name": "Sven Brauch",
+                "Name[ar]": "سفين بروش",
                 "Name[ca@valencia]": "Sven Brauch",
                 "Name[ca]": "Sven Brauch",
                 "Name[cs]": "Sven Brauch",
@@ -18,6 +19,7 @@
                 "Name[fr]": "Sven Brauch",
                 "Name[gl]": "Sven Brauch",
                 "Name[he]": "סוון בראוך",
+                "Name[hi]": "स्वेन कस्टम",
                 "Name[ia]": "Sven Brauch",
                 "Name[it]": "Sven Brauch",
                 "Name[ka]": "Sven Brauch",
@@ -28,83 +30,81 @@
                 "Name[pt]": "Sven Brauch",
                 "Name[pt_BR]": "Sven Brauch",
                 "Name[ru]": "Sven Brauch",
+                "Name[sa]": "स्वेन् प्रथा",
                 "Name[sk]": "Sven Brauch",
                 "Name[sl]": "Sven Brauch",
                 "Name[sv]": "Sven Brauch",
                 "Name[tr]": "Sven Brauch",
                 "Name[uk]": "Sven Brauch",
-                "Name[x-test]": "xxSven Brauchxx",
                 "Name[zh_CN]": "Sven Brauch",
                 "Name[zh_TW]": "Sven Brauch"
+            },
+            {
+                "Email": "jarmo.tiitto@gmail.com",
+                "Name": "Jarmo Tiitto",
+                "Name[ar]": "جارمو تيتو",
+                "Name[ca@valencia]": "Jarmo Tiitto",
+                "Name[ca]": "Jarmo Tiitto",
+                "Name[es]": "Jarmo Tiitto",
+                "Name[eu]": "Jarmo Tiitto",
+                "Name[fr]": "Jarmo Tiitto",
+                "Name[he]": "ג׳ארמו טיטו",
+                "Name[it]": "Jarmo Tiitto",
+                "Name[ka]": "Jarmo Tiitto",
+                "Name[ko]": "Jarmo Tiitto",
+                "Name[nl]": "Jarmo Tiitto",
+                "Name[pl]": "Jarmo Tiitto",
+                "Name[pt_BR]": "Jarmo Tiitto",
+                "Name[sl]": "Jarmo Tiitto",
+                "Name[sv]": "Jarmo Tiitto",
+                "Name[tr]": "Jarmo Tiitto",
+                "Name[uk]": "Jarmo Tiitto",
+                "Name[zh_TW]": "Jarmo Tiitto"
             }
         ],
         "Category": "Debugging",
-        "Description": "This plugin provides a frontend for PDB",
-        "Description[ca@valencia]": "Este connector proveïx d'un frontal per al PDB",
-        "Description[ca]": "Aquest connector proveeix d'un frontal per al PDB",
-        "Description[cs]": "Tento modul poskytuje rozhraní pro PDB",
-        "Description[de]": "Dieses Modul stellt eine Oberfläche für PDB zur Verfügung.",
-        "Description[el]": "Αυτό το πρόσθετο παρέχει ένα περιβάλλον χρήσης για το PDB",
-        "Description[en_GB]": "This plugin provides a frontend for PDB",
-        "Description[eo]": "Ĉi tiu kromprogramo provizas fasadon por PDB",
-        "Description[es]": "Este complemento proporciona una interfaz para PDB",
-        "Description[et]": "See plugin pakub PDB kasutajaliidest",
-        "Description[eu]": "Plugin honek PDBren bitarteko bat hornitzen du",
-        "Description[fi]": "Tämä liitännäinen tarjoaa PDB-käyttöliittymän",
-        "Description[fr]": "Ce module externe fournit une interface pour le débogueur Python (pdb)",
-        "Description[gl]": "Este complemento fornece unha interface para PDB.",
-        "Description[he]": "התוסף מספק ממשק חזותי ל־PDB",
-        "Description[it]": "Questa estensione fornisce un'interfaccia per PDB",
-        "Description[ka]": "ეს დამატება PDB-ის წინაბოლოს წარმოადგენს",
-        "Description[ko]": "이 플러그인은 PDB 프론트엔드를 제공합니다",
-        "Description[nl]": "Deze plug-in levert een frontend voor PDB",
-        "Description[nn]": "Dette programtillegget gjev ei brukarflate for PDB",
-        "Description[pl]": "Wtyczka ta zapewnia nakładkę graficzną dla PDB",
-        "Description[pt]": "Este 'plugin' oferece uma interface para o PDB",
-        "Description[pt_BR]": "Este plugin fornece uma interface para o PDB",
-        "Description[ru]": "Этот модуль предоставляет интерфейс к PDB",
-        "Description[sk]": "Tento plugin poskytuje rozhranie pre PDB",
-        "Description[sl]": "Ta vstavek ponuja začelje za PDB",
-        "Description[sv]": "Insticksprogrammet tillhandahåller ett gränssnitt för PDB",
-        "Description[tr]": "Bu eklenti PDB için bir ön uç sağlar",
-        "Description[uk]": "Цей додаток є графічною оболонкою до PDB",
-        "Description[x-test]": "xxThis plugin provides a frontend for PDBxx",
-        "Description[zh_CN]": "插件提供了 PDB 前端",
-        "Description[zh_TW]": "此外掛程式提供了 PDB 的前端",
+        "Description": "This plugin provides a graphical frontend for debugging python programs",
+        "Description[ar]": "أرسل هذا الملحق واجهة مرئية لتصحيح أخطاء برامج بيثون",
+        "Description[ca@valencia]": "Este connector proporciona un frontal gràfic per a depurar programes en Python",
+        "Description[ca]": "Aquest connector proporciona un frontal gràfic per a depurar programes Python",
+        "Description[es]": "Este complemento proporciona una interfaz gráfica para depurar programas Python",
+        "Description[eu]": "Plugin honek python programak arazteko bitarteko grafiko bat eskaintzen du",
+        "Description[fr]": "Ce module externe fournit une interface graphique pour le déboguage de programmes en Python",
+        "Description[he]": "התוסף מספק ממשק חזותי לניפוי שגיאות בתוכניות python",
+        "Description[it]": "Questa estensione fornisce un'interfaccia grafica per effettuare il debug di programmi Python",
+        "Description[ka]": "ეს დამატება მოგაწვდით გრაფიკულ წინაბოლოს Python-ის პროგრამების გამართვისთვის",
+        "Description[ko]": "이 플러그인은 파이썬 프로그램을 디버그하는 그래픽 프론트엔드를 제공합니다",
+        "Description[nl]": "Deze plug-in levert een grafische frontend voor het debuggen van python programma's",
+        "Description[pl]": "Wtyczka ta zapewnia nakładkę graficzną do diagnozowania aplikacji Pythona",
+        "Description[pt_BR]": "Este plugin fornece um frontend gráfico para depuração de programas Python",
+        "Description[sl]": "Ta vtičnik ponuja grafični vmesnik za odpravljanje napak v programih Python",
+        "Description[sv]": "Insticksprogrammet tillhandahåller ett grafiskt gränssnitt för avlusning av Python-program",
+        "Description[tr]": "Bu eklenti, Python programlarında hata ayıklamak için grafiksel bir ön yüz sağlar",
+        "Description[uk]": "Цей додаток є графічною оболонкою для діагностування програм мовою Python",
+        "Description[zh_CN]": "该插件为 Python 程序调试提供图形化前端。",
+        "Description[zh_TW]": "此外掛程式提供用來偵錯 Python 程式的圖形前端",
         "Icon": "text-x-python",
         "License": "GPL",
-        "Name": "Python Debugger (PDB) support",
-        "Name[ca@valencia]": "Implementació del depurador de Python (PDB)",
-        "Name[ca]": "Implementació del depurador de Python (PDB)",
-        "Name[cs]": "Podpora ladění pro Python (PDB)",
-        "Name[de]": "Unterstützung für Python Debugger (PDB)",
-        "Name[el]": "Υποστήριξη διορθωτή σφαλμάτων Python (PDB)",
-        "Name[en_GB]": "Python Debugger (PDB) support",
-        "Name[eo]": "Subteno por Python-sencimigilo (PDB)",
-        "Name[es]": "Implementación del depurador Python (PDB)",
-        "Name[et]": "Pythoni siluri (PDB) toetus",
-        "Name[eu]": "Python araztailearen (PDB) euskarria",
-        "Name[fi]": "Python-virheenpaikannustuki (PDB)",
-        "Name[fr]": "Prise en charge du débogueur Python (pdb)",
-        "Name[gl]": "Compatibilidade co depurador de Python (PDB)",
-        "Name[he]": "תמיכה במנפה שגיאות של Python‏ (PDB)",
-        "Name[it]": "Supporto al debugger di Python (PDB)",
-        "Name[ka]": "Python-ს გამმართველის (PDB) მხარდაჭერა",
-        "Name[ko]": "파이썬 디버거(PDB) 지원",
+        "Name": "Python Debugger support",
+        "Name[ar]": "دعم مصحح أخطاء بيثون",
+        "Name[ca@valencia]": "Implementació del depurador de Python",
+        "Name[ca]": "Implementació del depurador de Python",
+        "Name[es]": "Implementación del depurador Python",
+        "Name[eu]": "Python araztailearen euskarria",
+        "Name[fr]": "Prise en charge du débogueur Python",
+        "Name[he]": "תמיכה במנפה שגיאות של Python‏",
+        "Name[it]": "Supporto al debugger di Python",
+        "Name[ka]": "Python-ის გამმართველის მხარდაჭერა",
+        "Name[ko]": "파이썬 디버거 지원",
         "Name[nl]": "Ondersteuning voor Python-debugger",
-        "Name[nn]": "Støtte for Python Debugger (PDB)",
-        "Name[pl]": "Obsługa diagnostyki Pythona (PDB)",
-        "Name[pt]": "Suporte para o Depurador de Python (PDB)",
-        "Name[pt_BR]": "Suporte ao Python Debugger (PDB)",
-        "Name[ru]": "Поддержка отладчика Python (PDB)",
-        "Name[sk]": "Podpora Python Debugger-a (PDB)",
-        "Name[sl]": "Podpora razhroščevalniku za Python (PDB)",
-        "Name[sv]": "Stöd för Python-avlusare (PDB)",
-        "Name[tr]": "Python Hata Ayıklayıcı (PDB) desteği",
-        "Name[uk]": "Підтримка засобу діагностики Python (PDB)",
-        "Name[x-test]": "xxPython Debugger (PDB) supportxx",
-        "Name[zh_CN]": "Python 调试器 (PDB) 支持",
-        "Name[zh_TW]": "Python 偵錯器 (PDB) 支援",
+        "Name[pl]": "Obsługa diagnostyki Pythona",
+        "Name[pt_BR]": "Suporte ao Python Debugger",
+        "Name[sl]": "Podpora razhroščevalniku za Python",
+        "Name[sv]": "Python-avlusarstöd",
+        "Name[tr]": "Python Hata Ayıklayıcısı Desteği",
+        "Name[uk]": "Підтримка засобу діагностики Python",
+        "Name[zh_CN]": "Python Debugger 支持",
+        "Name[zh_TW]": "Python 偵錯器支援",
         "ServiceTypes": [
             "KDevelop/Plugin"
         ]
diff -pruN 24.12.3-1/debugger/kdevpdb.py 25.11.80-0ubuntu1/debugger/kdevpdb.py
--- 24.12.3-1/debugger/kdevpdb.py	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/kdevpdb.py	2025-11-09 03:41:22.000000000 +0000
@@ -1,46 +1,506 @@
 # SPDX-FileCopyrightText: 2014 Sven Brauch <svenbrauch@gmail.com>
+# SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 # SPDX-License-Identifier: GPL-2.0-or-later
 
-from pdb import *
+''' KDevelop python debugger (kdevPdb)
+        A few points:
+        * kdevPdb normally doesn't output anything into stdout or stderr. message()
+          and error() are used to output messages, except for fatal errors like
+          uncaught exceptions which are printed to stderr.
+        * kdevPdb does out-of-band communication via a stream socket using
+          the kdevPdbConnection helper module.
+'''
 
 import sys
+import json
+import getopt
+import traceback
+from pdb import _ModuleTarget, _ScriptTarget, _ZipTarget
+from bdb import Breakpoint
+import kdevpdbcore
+import kdevpdbconn
+import kdevpdbvariablesupport
 
+# pylint: disable=C0103, R0903
 
-class kdevOutputFormatter():
-    def __init__(self):
-        from sys import stdout as __stdout
-        self.__stdout = __stdout
-    def write(self, data):
-        self.__stdout.write("__KDEVPYTHON_BEGIN_DEBUGGER_OUTPUT>>>" + str(data) + "<<<__KDEVPYTHON_END___DEBUGGER_OUTPUT")
-
-class kdevPdb(Pdb):
-    def __init__(self):
-        Pdb.__init__(self)
-        self.stdout = kdevOutputFormatter()
-        self.prompt = "__KDEVPYTHON_DEBUGGER_PROMPT"
-        # hack to make the debugger *not* restart the program in any case
-        self.only_once = False
-    
-    def debug_trace(self, *args):
-        '''Set a tracepoint in the Python debugger that works with Qt'''
+
+class kdevPdb(kdevpdbcore.kdevDbgCore, kdevpdbvariablesupport.kdevExprValueMapper):
+    def __init__(self, socketpath="/tmp/"):
+        kdevpdbcore.kdevDbgCore.__init__(self)
+        # Connect to a client.
+        self.pdbsrv = kdevpdbconn.kdevPdbConnection()
+        self.pdbsrv.dataframes.append(json.dumps({"seq": -1}).encode())
+        # Connect to a client.
+        self.pdbsrv.establish(socketpath)
+        # The command's output is associated with it by the command sequence number.
+        # The seqnro begins from the preinit response -1.
+        self.command_seqnro = -1
+        self.responses = {}
+        # The kdevPdb responds with {"seq":-1} once the client has connected
+        # and the program is successfully started.
+        self.debugger_initialized = False
+        self.deleted_breaks = set()
+        self.currentbp = 0
+        # The user selected active stack-frame.
+        self.activeindex = -1
+        # Init the variable tracker.
+        kdevpdbvariablesupport.kdevExprValueMapper.__init__(self)
+
+    def append_response(self, obj):
+        assert isinstance(obj, dict)
+        # TODO: Check that the data-frame size does not grow past WARN_TOO_BIG_FRAMESIZE.
+        #       We should consider an mechanism to report a such event as an error to the client.
+        self.responses.setdefault(self.command_seqnro, []).append(obj)
+
+    def send_response(self):
+        '''Send the current response to KDevelop'''
+        resp = self.responses.pop(self.command_seqnro, [])
+        fmt = {"seq": self.command_seqnro, "data": resp}
+        self.pdbsrv.sendDataFrame(json.dumps(fmt).encode())
+
+    def message(self, msg, lnend='\n'):
+        '''Log an output message.
+           JSON: "message" : str()
+        '''
+        self.append_response({"message": msg + lnend})
+
+    def error(self, msg, lnend='\n'):
+        '''Log an error message.
+           JSON: "error" : str()
+        '''
+        self.append_response({"error": msg + lnend})
+
+    def postloop(self):
+        '''Prepare resuming the inferior.'''
+        # Prune deleted breakpoints.
+        for bpnum in self.deleted_breaks:
+            self.clear_bpbynumber(bpnum)
+        self.deleted_breaks.clear()
+        self.currentbp = 0
+        # About to return from enter_debugger(), thus allow the client to
+        # interrupt the current operation.
+        self.pdbsrv.sendCmdFrame(kdevpdbconn.Cmd.InterruptAllowed)
+        # No need to hold onto the captured state.
+        self.forget_caught_values()
+
+    def preloop(self):
+        '''Handle suspension of inferior.'''
+        # Disallow interrupting.
+        self.pdbsrv.sendCmdFrame(kdevpdbconn.Cmd.InterruptDisallowed)
+
+        if not self.debugger_initialized:
+            # Complete the preinit handshake with the client.
+            _, self.debugger_initialized = self.get_next_request()
+            if not self.debugger_initialized:
+                return
+            self.message("The program started successfully.")
+            self.debugger_initialized = True
+        # Reset the active frame to top most.
+        self.activeindex = self.topindex
+        # Send a "frames" response of the top-most inferior frame.
+        # JSON: "frames" : [{}]
+        self.append_response({"frames": [self.make_frame_entry(self.stack[self.topindex])]})
+
+        # Send a "bphit" response if a breakpoint got hit.
+        if self.currentbp:
+            try:
+                bp = self.get_bpbynumber(self.currentbp)
+                self.append_response({'bphit': {"id": int(self.currentbp)
+                                                , "filename": bp.file, "line": bp.line
+                                                , "hits": bp.hits}})
+            except ValueError:
+                pass
+
+        if hasattr(self, 'restore_brks'):
+            # Re-enable breakpoints that runtolocation() disabled.
+            for bpnum in self.restore_brks[1:]:
+                self.get_bpbynumber(bpnum).enable()
+            # Ensure self.restore_brks[0] is deleted even if it wasn't hit.
+            self.clear_bpbynumber(self.restore_brks[0])
+            del self.restore_brks
+
+    def get_next_request(self):
+        '''Wait for a request.'''
+        try:
+            request = json.loads(self.pdbsrv.getDataFrame().decode())
+            assert isinstance(request, dict)
+            assert "seq" in request
+            self.command_seqnro = int(request["seq"])
+            return request, True
+        except kdevpdbconn.Stop:
+            self.pdbsrv.stop()
+            self.set_quit()
+            return {}, False
+
+    def enter_debugger(self):
+        self.preloop()
+        while True:
+            # Send a response.
+            self.send_response()
+            # Wait for a request.
+            request, ok = self.get_next_request()
+            if not ok:
+                return
+            if "input" not in request:
+                # A no-op request: send back the seqnro.
+                continue
+            cmd_and_args = request["input"]
+            assert isinstance(cmd_and_args, list)
+            assert len(cmd_and_args) > 0
+            method_name = cmd_and_args[0]
+            try:
+                # dispatch a call to 'do_' method.
+                cmd_dispatch = getattr(self, 'do_' + method_name)
+                method_args = tuple(cmd_and_args[1:])
+                if cmd_dispatch(*method_args):
+                    # The command needs to resume the inferior.
+                    self.postloop()
+                    return
+            except (AttributeError, TypeError):
+                self.error(f"Invalid command: '{cmd_and_args}'")
+                raise
+
+    def make_frame_entry(self, frameinfo):
+        '''Make a JSON response from a FrameInfo.'''
+        return {"current": (frameinfo.frame is self.curframe),
+                "filename": str(frameinfo.filename),
+                "line": int(frameinfo.lineno),
+                "address": int(frameinfo.frame.f_lasti),
+                "function": str(frameinfo.fn)}
+
+    def do_where(self):
+        '''where(): Report a full stack trace, with the most recent frame
+           at the front of the list.
+           JSON: "frames" : [{},...]
+        '''
+        # Dump the inferior frame info.
+        framelist = reversed([self.make_frame_entry(f) for f in self.get_inferior_stack()])
+        self.append_response({"frames": list(framelist)})
+
+    def do_selectframe(self, whichframe):
+        '''Select the active stack-frame.
+           JSON: "activeframe" : <int>
+        '''
+        # KDevelop expects most recent frame to be at index zero,
+        # which is reversed to what we have in self.stack.
+        kdevframe = max(min(int(whichframe), len(self.get_inferior_stack()) - 1), 0)
+        self.activeindex = min(max(self.bottomindex, self.topindex - kdevframe), self.topindex)
+        self.append_response({"activeframe": kdevframe})
+
+    def do_continue(self):
+        '''Resume the inferior.'''
+        self.set_continue()
+        return 1
+
+    def do_step(self):
+        '''Step into called code.'''
+        self.set_step()
+        return 1
+
+    def do_next(self):
+        '''Step over to next line.'''
+        self.set_next(self.curframe)
+        return 1
+
+    def do_stepout(self):
+        '''Step-out of a frame.'''
+        if self.topindex > self.bottomindex:
+            # Stop immediately after exiting from the frame.
+            self.set_return(self.curframe)
+        else:
+            # No outer frames left, single step.
+            self.set_next(self.curframe)
+        return 1
+
+    def do_steppast(self):
+        '''Step-out of a function or past a conditional block of code.'''
+        self.set_stepout()
+        return 1
+
+    def do_quit(self):
+        '''Quit.'''
+        self.set_quit()
+        return 1
+
+    def do_jump(self, lineno):
+        '''Set the next line to be executed.'''
+        try:
+            self.curframe.f_lineno = int(lineno)
+        except ValueError:
+            self.error(f"Jump to location '{self.stack[self.topindex].filename}:{lineno}' failed!")
+        finally:
+            self.switch_namespaces()
+            self.setup_frames()
+            self.switch_namespaces()
+            self.append_response({"frames": [self.make_frame_entry(self.stack[self.topindex])]})
+
+    def do_break(self, filename, lineno, disabled):
+        '''Try set a breakpoint at filename:lineno location and possibly disable it by default.
+           JSON: "breakpoints": [{}] (single item) breakpoint details.
+        '''
+        if self.is_runnable_srcline(filename, int(lineno)) < 0:
+            return
+        bpnum = Breakpoint.next
+        notok = self.set_break(filename, int(lineno))
+        if notok:
+            self.error(notok)
+            return
+        if disabled:
+            self.get_bpbynumber(bpnum).disable()
+        self.append_response({"breakpoints": [{"id": bpnum, "filename": filename, "line": lineno}]})
+
+    def do_tbreak(self, filename, lineno):
+        '''Try set a temporary breakpoint at filename:lineno location.'''
+        if self.is_runnable_srcline(filename, int(lineno)) < 0:
+            return
+        bpnum = Breakpoint.next
+        notok = self.set_break(filename, int(lineno), True)
+        if notok:
+            self.error(notok)
+        else:
+            self.append_response({"breakpoints": [{"id": bpnum, "filename": filename, "line": lineno}]})
+
+    def do_runtolocation(self, filename, lineno, disable):
+        '''Try set a temporary breakpoint at filename:lineno location.
+           If successful, disable all other breakpoints if disable is set and then resume the inferior.
+           Later, when the (temporary) breakpoint is reached or the debugger is interrupted,
+           the enabled state of the modified breakpoints is restored.
+        '''
+        if self.is_runnable_srcline(filename, int(lineno)) < 0:
+            self.append_response({"frames": [self.make_frame_entry(self.stack[self.topindex])]})
+            return 0
+        bpnum = Breakpoint.next
+        notok = self.set_break(filename, int(lineno), True)
+        if notok:
+            self.error(notok)
+            self.append_response({"frames": [self.make_frame_entry(self.stack[self.topindex])]})
+            return 0
+        # Ok.
+        self.append_response({"breakpoints": [{"id": bpnum, "filename": filename, "line": lineno}]})
+        restore_brks = [bpnum]
+        if disable:
+            for bp in Breakpoint.bpbynumber:
+                if bp and bp.enabled and bp.number != bpnum:
+                    restore_brks.append(bp.number)
+                    bp.disable()
+        setattr(self, 'restore_brks', restore_brks)
+        self.set_continue()
+        return 1
+
+    def do_enable(self, bpnum):
+        '''Enable a breakpoint'''
+        try:
+            bp = self.get_bpbynumber(int(bpnum))
+            bp.enable()
+        except ValueError as e:
+            self.error(str(e))
+
+    def do_disable(self, bpnum):
+        '''Disable a breakpoint'''
         try:
-            from PyQt4.QtCore import pyqtRemoveInputHook
-            pyqtRemoveInputHook()
-        except ImportError:
-            pass
-        self.set_trace(sys._getframe().f_back)
-    
-    def _runscript(self, filename):
-        import signal
-        import os
-        self._user_requested_quit = 1
-        if self.only_once:
-            os._exit(0)
-        self.only_once = True
-        signal.signal(signal.SIGINT, self.debug_trace)
-        Pdb._runscript(self, filename)
+            bp = self.get_bpbynumber(int(bpnum))
+            bp.disable()
+        except ValueError as e:
+            self.error(str(e))
+
+    def do_clear(self, arg):
+        '''Implement Bdb's do_clear()'''
+        # We cannot simply delete the breakpoint here. This would make preloop()
+        # unable to report hit temporary breakpoints. Because of this,
+        # the deletion is deferred into postloop().
+        try:
+            bp = self.get_bpbynumber(arg)
+            self.deleted_breaks.add(bp.number)
+        except ValueError as e:
+            self.error(str(e))
+
+    def get_topindex(self):
+        return self.topindex
+
+    def do_cleanupobjects(self):
+        '''Cleanup invalidated state after pausing'''
+        response = self.cleanupobjects()
+        self.append_response({'released': response})
+
+    def do_enumeratevariables(self, parentid, ns_id, num):
+        '''JSON: 'variables': [{'expression': str(<name>), 'ptr': int() }
+           OR None, ...]
+        '''
+        # Required parameters are:
+        # parentid:   The object's handle to enumerate.
+        # ns_id:      A namespace id. (If the parentid is an namespace handle the ns_id is ignored.)
+        # num:        Count of handles to report.
+        parentid, ns_id, num = int(parentid), int(ns_id), int(num)
+        report = []
+        for _ in range(num):
+            result = self.enumerateHandle(parentid, ns_id)
+            report.append(result)
+            if result is None:
+                # The enumeration was exhausted.
+                break
+        # Report.
+        self.append_response({'variables': report})
+
+    def do_inspectvalue(self, handle, ns_id):
+        ''' Determine the variable's value and the number of children items, if any.
+            JSON: 'inspect': inspectvalue()
+        '''
+        handle, ns_id = int(handle), int(ns_id)
+        response = self.inspectvalue(handle, ns_id)
+        self.append_response({"inspect": response})
+
+    def do_framelocals(self):
+        '''Begin enumerating local variables from the active stack frame.'''
+        frame_id = self.activeindex
+        # The self.bottomindex frame object .f_locals has some weirdness going on:
+        # for x in range(2):
+        #     print(x) # <== .f_locals['x'] is zero on the *second iteration of the loop* on this line.
+        # Since there is no difference to .f_globals in this frame, except that it gives
+        # us the right result, it is used in place of .f_locals.
+        if frame_id <= self.bottomindex:
+            ref_locals = self.stack[frame_id].f_globals
+        else:
+            ref_locals = self.stack[frame_id].f_locals
+        frame_locals = list(ref_locals.items())
+        # The "longname" must stay associated with the same frame object in a event
+        # the count of stack frames grows, so use frame_id to make it unique.
+        count, objid = self.updateNamespace(frame_locals, frame_id, f"__kdevpdbframeobject{frame_id}")
+        self.append_response({'locals': {'count': count, 'ptr': objid, 'namespace': frame_id}})
+
+    def do_globalobjects(self):
+        '''Begin enumerating global variables.'''
+        globals_ns_id = -1
+        globalvars = list(self.stack[self.bottomindex].f_globals.items())
+        count, objid = self.updateNamespace(globalvars, globals_ns_id, "__kdevpdbglobals")
+        self.append_response({'globals': {'count': count, 'ptr': objid,
+                                          'namespace': globals_ns_id}})
+
+    def do_getreturninfo(self):
+        '''Begin enumerating program return info'''
+        # Synthesize a namespace for:
+        # - The return value from the last function/method call.
+        # - Exception from the last function/method call.
+        returninfo = []
+        if self.ret_value is not None:
+            returninfo.append(('Return', self.ret_value[0]))
+        if self.exc_info is not None:
+            # The exception type works as the variable name and when expanded gives:
+            # - The parameter(s) passed into the exception's __init__
+            # - A stack-frame listing allowing to pin point where the exception was raised.
+            exc_type, exc_value, exc_traceback = self.exc_info[0]
+            frames = []
+            t = exc_traceback
+            while t is not None:
+                f = t.tb_frame
+                filename = self.canonic(f.f_code.co_filename)
+                fn = "<lambda>" if not f.f_code.co_name else f.f_code.co_name
+                frames.append(f'{filename}:{t.tb_lineno} in {fn}()')
+                t = t.tb_next
+            exception = {}
+            exception[exc_type] = kdevpdbvariablesupport.ExceptionNode(exc_value, frames)
+            returninfo.append(('Exception', kdevpdbvariablesupport.Exceptions(exception.values())))
+        # Update the namespace.
+        count, objid = self.updateNamespace(returninfo, -2, '__kdevpdbreturninfo')
+        self.append_response({'returninfo': {'count': count, 'ptr': objid, 'namespace': -2}})
+
+    def do_dropnamespace(self, ns_id):
+        '''Discard a namespace id'''
+        self.dropNamespace(int(ns_id))
+
+    def do_evalexpression(self, arg, ns_id):
+        '''Evaluate an expression in a context of the active stack-frame.
+           If it is possible to evaluate the expression the result is attached into a namespace.
+           If ns_id != -1, the first argument is ignored and the expression of the namespace id is used.
+           Any reported namespace id must be later cleaned up with dropnamespace() command.
+           JSON: 'evaluate': {'namespace': <namespace id> or None, 'inscope': bool, 'ptr': <namespace handle>, 'count':1},
+                 'variable':{'expression': str(), 'ptr': <expression's handle>}
+                 'inspect': inspectvalue()}
+        '''
+        expr = str(arg)
+        if len(expr) <= 2:
+            self.append_response({'evaluate': {'namespace': None}})
+            return
+        ns_id = int(ns_id)
+        frameindex = self.activeindex if self.activeindex != -1 else self.topindex
+        if ns_id != -1:
+            if ns_id not in self.objectsByNamespace:
+                # Invalid. This happens when a variable gets carried over to a new session.
+                self.append_response({'evaluate': {'namespace': ns_id, 'inscope': False}})
+                return
+            # Get the variable details
+            details = self.objectsByNamespace[ns_id].label.split('/')
+            frameindex = int(details[2])
+            if frameindex > self.topindex:
+                self.append_response({'evaluate': {'namespace': ns_id, 'inscope': False}})
+                return
+            expr = details[3]
+        expr = expr[1:-1]
+        # Evaluate.
+        evalresult = self.evalexpression(expr, self.stack[frameindex])
+        if evalresult['error']:
+            if ns_id == -1:
+                self.append_response({'evaluate': {'namespace': None}})
+            else:
+                self.append_response({'evaluate': {'namespace': ns_id, 'inscope': False}})
+            return
+        if ns_id == -1:
+            # create an new namespace id
+            ns_id, self.variableNsids = self.variableNsids, self.variableNsids - 1
+        # Attach the (new) value to the namespace.
+        # The namespace label contains the originating frame and the quoted expression.
+        label = f"__kdevpdbvariable/{ns_id}/{frameindex}/'{expr}'"
+        _, ns_handle = self.updateNamespace([(expr, evalresult['value'])], ns_id, label)
+        # Enumerate the namespace so the client can skip this.
+        result = self.enumerateHandle(ns_handle, ns_id)
+        # Also inspect the handle.
+        inspect = self.inspectvalue(result['ptr'], ns_id)
+        self.append_response({'evaluate': {'namespace': ns_id, 'inscope': True, 'ptr': ns_handle, 'count': 1},
+                              'variable': result,
+                              'inspect': inspect})
+
+
+def main():
+    """Kdevelop python debugger main."""
+    # Target command line is expected after the first '--'.
+    split = [i for i in range(len(sys.argv)) if sys.argv[i] == '--']
+    if not split or split[0] + 1 >= len(sys.argv):
+        sys.exit(2)
+
+    split = split[0]
+    opts, args = getopt.getopt(sys.argv[1:split], 's:m:')
+
+    if len(opts) < 1 or args:
+        sys.exit(2)
+
+    socketpath = [optarg for opt, optarg in opts if opt == '-s'][0]
+    args = sys.argv[split+1:]
+
+    if any(opt in ['-m'] for opt, optarg in opts):
+        cls = _ModuleTarget
+    elif args[0].endswith('.pyz'):
+        cls = _ZipTarget
+    else:
+        cls = _ScriptTarget
+
+    target = cls(args[0])
+    sys.argv[:] = args      # Hide "kdevpdb.py" and kdevpdb options from argument list.
+    debugger = kdevPdb(socketpath)
+    exitcode = 0
+    try:
+        debugger.run_target(target)
+    except SystemExit as e:
+        # In most cases SystemExit does not warrant a post-mortem session.
+        print("The program exited via sys.exit(). Exit status:", end=' ')
+        print(e)
+    except SyntaxError:
+        print("Syntax error:")
+        traceback.print_exc()
+        exitcode = 1
+    except BaseException as e:
+        debugger.enter(e)
+        exitcode = 1
+    debugger.pdbsrv.stop()
+    sys.exit(exitcode)
 
 if __name__ == '__main__':
-    import pdb
-    pdb.Pdb = kdevPdb
-    pdb.main()
+    main()
diff -pruN 24.12.3-1/debugger/kdevpdbconn.py 25.11.80-0ubuntu1/debugger/kdevpdbconn.py
--- 24.12.3-1/debugger/kdevpdbconn.py	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/kdevpdbconn.py	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,186 @@
+# SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
+# SPDX-License-Identifier: GPL-2.0-or-later
+import socket
+import threading
+import struct
+import os
+import sys
+from enum import IntEnum
+
+# This module provides a few things:
+# - kdevPdbConnection.establish() Wait for a client to connect up and initialize
+# - kdevPdbConnection.sendDataFrame() Write a data frame to a peer.
+# - kdevPdbConnection.getDataFrame()  Get/Wait for a data frame from a peer.
+# - The received data frames are appended to a queue by the I/O thread that runs the
+#   socket recv() system calls. The receive threading guarantees forward progress in
+#   the case both peers send data simultaneously.
+# - Sending a data frame blocks the caller until the full frame is sent.
+
+
+class Stop(BaseException):
+    pass
+
+
+# Currently defined data-frame protocol escape codes.
+class Cmd(IntEnum):
+    DoNothing = 0
+    Terminate = -1
+    InterruptDisallowed = -2
+    InterruptAllowed = -3
+
+
+class kdevPdbConnection:
+
+    def __init__(self):
+        # queue of received bytes() data-frames.
+        self.dataframes = []
+        self.condvar = threading.Condition(threading.Lock())
+        # Has recv() side of the socket been closed?
+        self.stop_read = False
+        # Has send() side of the socket been closed? (not guarded by condvar)
+        self.stop_write = False
+        self.recv_thread = None
+        self.server_address = None
+        self.socket = None
+
+    def establish(self, socketpath="/tmp/"):
+        """Become a server listening for a client"""
+        # Initialize the IO.
+        socket_addr = socketpath + "kdevpdb.socket"
+        if os.path.exists(socket_addr):
+            os.unlink(socket_addr)
+        listensocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+        if hasattr(socket, "SO_REUSEADDR"):
+            listensocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        listensocket.bind(socket_addr)
+        self.server_address = listensocket.getsockname()
+        listensocket.listen(0)
+        # Print the socket file to stdout.
+        # The host process must wait for "socket:" line to be printed, and discard this line.
+        sys.stdout.write("socket:"+self.server_address+"\n")
+        sys.stdout.flush()
+        self.socket, _ = listensocket.accept()
+        listensocket.close()
+        self.recv_thread = threading.Thread(target=self._recv)
+        self.recv_thread.start()
+
+    def _shutdown(self, shutread, shutwrite):
+        '''Shutdown the connection.
+           The shutdown is done such that we send CmdTerminate first if we are fully open.
+           This gives the remote peer a chance to also cleanly shutdown the connection.
+        '''
+        if shutwrite and not self.stop_write:
+            with self.condvar:
+                if not self.stop_read:
+                    # the connection is fully open. Try make the remote peer shutdown cleanly.
+                    self.sendCmdFrame(Cmd.Terminate)
+                self.stop_write = True
+                if shutread:
+                    # Full shutdown, the reader side is already or will be dead.
+                    self.stop_read = True
+                    self.socket.shutdown(socket.SHUT_RDWR)
+                    self.condvar.notify()
+                    # the socket is *dead*.
+                    self.socket.close()
+                    self.socket = None
+                    return
+                # Shutdown only writer side.
+                self.socket.shutdown(socket.SHUT_WR)
+        elif shutread:
+            # Shutdown the reader side only.
+            with self.condvar:
+                if not self.stop_read:
+                    self.stop_read = True
+                    self.socket.shutdown(socket.SHUT_RD)
+                    self.condvar.notify()
+                    if self.stop_write:
+                        self.socket.close()
+                        self.socket = None
+
+    def _recv(self):
+        '''A receiver thread that shovels data frames from the socket into the queue'''
+        try:
+            while True:
+                blob = self._recvDataFrame()
+                with self.condvar:
+                    self.dataframes.append(blob)
+                    self.condvar.notify()
+        except Stop:
+            pass
+        except BaseException as e:
+            print(e)
+        # Close the receiving side of the socket.
+        self._shutdown(True, False)
+
+    def getDataFrame(self):
+        with self.condvar:
+            while not self.dataframes:
+                if self.stop_read:
+                    raise Stop()
+                self.condvar.wait()
+            return self.dataframes.pop(0)
+
+    def stop(self):
+        '''request shutdown of receiver thread and connection'''
+        if self.socket is not None:
+            self._shutdown(True, True)
+        if self.recv_thread is not None:
+            self.recv_thread.join()
+
+    def sendCmdFrame(self, code):
+        '''Send a escape code only frame'''
+        assert not self.stop_write
+        sendbuf = struct.pack('<i', code)
+        try:
+            self.socket.sendall(sendbuf)
+        finally:
+            pass
+
+    def sendDataFrame(self, src):
+        '''Send a frame of data'''
+        sendbuf = bytearray(struct.pack('<i', len(src)) + src)
+        nbytes = 0
+        if self.stop_write:
+            raise Stop()
+        while nbytes < len(sendbuf):
+            # TODO: handle any errors that we should recover from and try sending again.
+            numbytes = self.socket.send(sendbuf[nbytes:])
+            if numbytes > 0:
+                nbytes += numbytes
+            else:
+                # failed to send anything, close the sending side and abort.
+                self._shutdown(False, True)
+                raise Stop()
+
+    def _recvDataFrame(self):
+        '''Receive a frame of data or None'''
+        recv = struct.calcsize('<i')  # max length of data to receive
+        # the receive buffer. Most of the frames can fit into the 4096 bytes.
+        recvbuf = bytearray(4096)
+        datablob = bytearray()
+        bloblen = -1
+        while recv > 0:
+            numbytes = self.socket.recv_into(recvbuf, recv)
+            if bloblen == -1 and numbytes == recv:
+                # 1. got the blob length (which can be less than one for special events)
+                bloblen = struct.unpack_from('<i', recvbuf, 0)[0]
+                if bloblen == Cmd.DoNothing:
+                    # A empty blob.
+                    return None
+                if bloblen == Cmd.Terminate:
+                    # End the connection now.
+                    raise Stop()
+                if bloblen > len(recvbuf):
+                    # reserve a big enough buffer..
+                    recvbuf = bytearray(bloblen)
+                # Ok, start receiving the payload.
+                recv = bloblen
+            elif bloblen > 0 and numbytes > 0:
+                # 2. got some data
+                datablob += recvbuf[:numbytes]
+                recv -= numbytes
+            else:
+                # Error.
+                raise Stop()
+        # successfully received a data frame
+        return datablob
diff -pruN 24.12.3-1/debugger/kdevpdbcore.py 25.11.80-0ubuntu1/debugger/kdevpdbcore.py
--- 24.12.3-1/debugger/kdevpdbcore.py	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/kdevpdbcore.py	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,367 @@
+# SPDX-FileCopyrightText: 2025 Jarmo Tiitto <jarmo.tiitto@gmail.com>
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import bdb
+import linecache
+import signal
+import sys
+import traceback
+from collections import namedtuple
+# Only needed to implement our run_target()
+from pdb import _ExecutableTarget
+import asmskip
+
+# pylint: disable=R0902
+
+__all__ = ["kdevDbgCore", "FrameInfo"]
+
+# Decomposed frame object.
+FrameInfo = namedtuple('FrameInfo',
+                       ['frame',
+                        'filename',
+                        'lineno',
+                        'fn',
+                        'f_code',
+                        'f_globals',
+                        'f_locals',
+                        'evaluate'])
+
+
+class kdevDbgCore(bdb.Bdb):
+    '''Debugger core class on top of Bdb.
+       kdevDbgCore handles low-level tracing functions, isolation
+       of the inferior's __main__ namespace from the debugger and
+       provides the stack frame list.
+    '''
+
+    def __init__(self, skip=None):
+        bdb.Bdb.__init__(self, skip=skip)
+        # Override Bdb's trace_dispatch()
+        self.__trace_dispatch, self.trace_dispatch = self.trace_dispatch, self._trace_dispatch
+        # Avoid triggering __getattr__ auditing events when  .__code__ is accessed.
+        self.topcode = (self._sigint_handler.__code__, self.trace_dispatch.__code__)
+        self.bottomcode = self.run_target.__code__
+        # setup_frames() expects inferior_ns_active to be True for efficiency reasons,
+        # and setup_frames_from_exc() also requires this. Therefore, FrameInfo, sys
+        # and traceback are pinned as instance attributes.
+        # to guarantee access to these.
+        self._frameinfo = FrameInfo
+        self._sys = sys
+        self._traceback = traceback
+        # switch_namespaces()
+        self.saved_namespace = None
+        self.saved_main = None
+        self.inferior_ns_active = False
+        # The stack
+        self.stack = []
+        self.curframe = None
+        self.topindex = -1
+        self.bottomindex = -1
+        # Caught values.
+        self.exc_info = None
+        self.ret_value = None
+        self.call_args = None
+        # Zero: inferior is running and can be interrupted.
+        # One: inferior is in progress of being interrupted.
+        # Two: debugger cannot be interrupted, inferior is not running.
+        self.running = 0
+        self.mainpyfile = None
+        signal.signal(signal.SIGINT, self._sigint_handler)
+
+    def run_target(self, target: _ExecutableTarget):
+        '''Debug a target executed via the exec() function.'''
+        self.mainpyfile = self.canonic(target.filename)
+        # The target has to run in __main__ namespace (or imports from __main__ will break).
+        # Clear __main__ and replace with the target namespace.
+        # Since want to keep the debugger  __main__ namespace intact, the __main__.__dict__
+        # contents is stashed into self.saved_namespace, while the inferior is running.
+        # pylint: disable=C0415, W0122
+        import __main__
+        self.saved_main = __main__
+        self.saved_namespace = {}
+        self.saved_namespace.update(__main__.__dict__)
+        self.inferior_ns_active = True
+        _bdb_Quit = bdb.BdbQuit
+        __main__.__dict__.clear()
+        __main__.__dict__.update(target.namespace)
+        _globals = __main__.__dict__
+        _locals = _globals
+        self.reset()
+        _code = target.code
+        assert isinstance(_code, str)
+        cmd = compile(_code, "<string>", "exec")
+        self._sys.settrace(self.trace_dispatch)
+        try:
+            exec(cmd, _globals, _locals)
+        except _bdb_Quit:
+            pass
+        finally:
+            self.set_quit()
+            # Restore debugger __main__.
+            self.switch_namespaces()
+
+    def switch_namespaces(self):
+        '''Swap between the inferior and the debugger __main__ namespace.'''
+        ns_swap = {}
+        ns_swap.update(self.saved_main.__dict__)
+        self.saved_main.__dict__.clear()
+        self.saved_main.__dict__.update(self.saved_namespace)
+        self.saved_namespace = ns_swap
+        self.inferior_ns_active = not self.inferior_ns_active
+
+    def _sigint_handler(self, signum, frame):
+        '''Regain debugger control and suspend the inferior.'''
+        # NOTE: this runs with the inferior __main__!
+        if self.running >= 1:
+            return
+        self.running += 1
+        # need up-to-date self.curframe
+        assert self.inferior_ns_active
+        self.setup_frames()
+        self.set_trace(self.curframe)
+
+    def _trace_dispatch(self, frame, event, arg):
+        '''The trace dispatch trampoline method.'''
+        # NOTE: All methods that Bdb invokes run with
+        #       the inferior's __main__ namespace, until self.enter() does the switch.
+        return self.__trace_dispatch(frame, event, arg)
+
+    def user_call(self, frame, argument_list):
+        '''This method is called when there is the remote possibility
+           that we ever need to stop in this function.'''
+        if self.stop_here(frame):
+            # fixme: argument_list provides no useful information.
+            self.call_args = (argument_list,)
+            self.enter()
+
+    def user_line(self, frame):
+        '''This function is called when we stop or break at this line.'''
+        self.enter()
+
+    def user_return(self, frame, return_value):
+        if self.ret_value is not None:
+            # enter_debugger() has not consumed the previous
+            # return value yet so stop here.
+            self.enter()
+        self.ret_value = (return_value,)
+
+    def user_exception(self, frame, exc_info):
+        '''This function is called if an exception occurs,
+           but only if we are to stop at or just below this level.'''
+        self.exc_info = (exc_info,)
+
+    def forget_frames(self):
+        '''Clear stack state.'''
+        self.stack = []
+        self.curframe = None
+        self.topindex = -1
+        self.bottomindex = -1
+
+    def forget_caught_values(self):
+        '''Drop all captured values.'''
+        self.exc_info = None
+        self.ret_value = None
+        self.call_args = None
+
+    def update_tracing(self):
+        '''Ensure only the inferior's frames are being traced.'''
+        for i, f in enumerate(self.stack):
+            if self.topindex >= i >= self.bottomindex:
+                f.frame.f_trace = self.trace_dispatch
+            else:
+                f.frame.f_trace = None
+
+    def make_frameinfo(self, f, lineno):
+        '''Construct a FrameInfo from a Frame object.'''
+        # NOTE: f.f_code triggers an auditing event, so it is retrieved once
+        #       here and stored as part of the FrameInfo.
+        f_code = f.f_code
+        filename = self.canonic(f_code.co_filename)
+        fn = "<lambda>" if not f_code.co_name else f_code.co_name
+        # capture the f_globals and f_locals dictionaries.
+        f_globals = {}
+        f_globals.update(f.f_globals)
+        f_locals = {}
+        f_locals.update(f.f_locals)
+        # Make an evaluator for the frame.
+        # The f_locals dict is unpacked as local variables in a __evaluate() function.
+        # The expression, a globals dict and locals() are then passed to the eval() call.
+        code = "def __evaluate(__kdevpdb_eval_expr, __kdevpdb_eval_frame_globals, __kdevpdb_eval_frame_locals):\n"
+        for name in f_locals:
+            code += f"    {name} = __kdevpdb_eval_frame_locals['{name}']\n"
+        code += "    del __kdevpdb_eval_frame_locals\n"
+        code += "    return eval(__kdevpdb_eval_expr, __kdevpdb_eval_frame_globals, locals())\n"
+        func = {}
+        exec(compile(code, "<string>", "exec"), {}, func)
+        return self._frameinfo(f, filename, lineno, fn, f_code, f_globals, f_locals, func['__evaluate'])
+
+    def setup_frames(self):
+        '''Update the debugger stack state and Bdb.botframe.'''
+        # pylint: disable=W0212,W0201
+        assert self.inferior_ns_active
+        self.forget_frames()
+        f = self._sys._getframe().f_back
+        # Ignore frames until self.trace_dispatch or self._sigint_handler
+        while f is not None:
+            if f.f_code in self.topcode:
+                break
+            f = f.f_back
+        while f is not None:
+            self.stack.append(self.make_frameinfo(f, f.f_lineno))
+            self.botframe = f
+            f = f.f_back
+        # Reverse, to make indexes into the list stable when frames are added/removed.
+        self.stack.reverse()
+        self.update_stack_state()
+        self.update_tracing()
+
+    def update_stack_state(self):
+        '''Update self.bottomindex, self.topindex and self.curframe.'''
+        # The inferior's frames are wedged between a frame after run_target() call,
+        # and either before a _sigint_handler() or  a _trace_dispatch() frame.
+        for i, f in enumerate(self.stack):
+            if f.f_code in self.topcode:
+                self.topindex = i - 1
+                break
+            if f.f_code is self.bottomcode:
+                self.bottomindex = i + 1
+        if self.topindex == -1:
+            self.topindex = len(self.stack) - 1
+        # Don't trace the exec() frame (which filename is "<string>")
+        # after an actual inferior frame becomes available.
+        self.bottomindex = min(self.bottomindex + 1, self.topindex)
+        self.curframe = self.stack[self.topindex].frame
+
+    def setup_frames_from_exc(self, exc):
+        '''Update the debugger stack state from exception's traceback object.'''
+        assert self.inferior_ns_active
+        if not isinstance(exc, BaseException):
+            self.error("No traceback available!")
+            return
+
+        print("Uncaught exception:", file=self._sys.stderr)
+        self._traceback.print_exception(type(exc), exc, exc.__traceback__, file=self._sys.stderr)
+        print("Entering post mortem debugging - continuing will terminate the inferior.", file=self._sys.stderr)
+
+        # Decompose frames from the traceback.
+        self.forget_frames()
+        t = exc.__traceback__
+        while t is not None:
+            f = t.tb_frame
+            self.stack.append(self.make_frameinfo(f, t.tb_lineno))
+            t = t.tb_next
+        self.update_stack_state()
+
+    def get_inferior_stack(self):
+        '''Get all inferior stack frames. (a subset of self.stack[])'''
+        return [f for i, f in enumerate(self.stack) if self.topindex >= i >= self.bottomindex]
+
+    def message(self, msg, lnend='\n'):
+        '''Output an informal message.'''
+        print(msg, end=lnend, file=self._sys.stdout)
+
+    def error(self, msg, lnend='\n'):
+        '''Ouput an error message.'''
+        print(msg, end=lnend, file=self._sys.stderr)
+
+    def __enter__(self):
+        '''Prepare calling debugger methods.'''
+        assert self.inferior_ns_active
+        # Restore debugger __main__.
+        self.switch_namespaces()
+
+    def __exit__(self, exc_type, exc, tb):
+        '''Prepare resuming the inferior.'''
+        if exc is not None:
+            print("Internal kdevPdb error:", file=self._sys.stderr)
+            self._traceback.print_exception(exc_type, exc, tb, file=self._sys.stderr)
+            # clear the possible stop condition and terminate instead.
+            self.reset()
+            self.set_quit()
+        # Restore inferior __main__.
+        self.switch_namespaces()
+
+        self.forget_frames()
+        self.running = 0
+        return True  # Eat the exception, if any.
+
+    def enter(self, exc=None):
+        '''This function is called when the inferior is suspended.'''
+        if self.running == 1:
+            # The signal handler has enabled a stop condition:
+            # A _sigint_handler() frame exists at this point due to the self.set_trace(),
+            # and we *must* get rid of it by resuming execution.
+            self.running = 2
+            return
+        self.running = 2
+        # Update stack state.
+        self.reset()
+        if exc:
+            # Setting up post-mortem debugging.
+            # run_target() has switched back to the debugger __main__ due to the escaped exc.
+            # setup_frames_from_exc() needs the inferior __main__, so do the switch now.
+            self.switch_namespaces()
+            self.setup_frames_from_exc(exc)
+        else:
+            self.setup_frames()
+        # All code within this block has debugger top-level __main__ imports and types available.
+        with self:
+            if getattr(self, 'mainpyfile', False):
+                # Resume until mainpyfile appears in the inferior stack.
+                stack = self.get_inferior_stack()
+                if self.mainpyfile not in [x.filename for x in stack]:
+                    return
+                if stack[-1].lineno < 0:
+                    # There is no actual inferior frame at this point,
+                    # so step over to get to the first actual source line.
+                    self.set_next(self.curframe)
+                    return
+                # start up done.
+                del self.mainpyfile
+            if self.curframe.f_code is self.bottomcode:
+                # no actual inferior frames?
+                # (Inferior has likely raised an unhandled exception)
+                return
+            self.enter_debugger()
+        if exc:
+            # Restore debugger __main__, we are about to quit.
+            self.switch_namespaces()
+
+    def enter_debugger(self):
+        '''By returning from this method the inferior resumes its execution,
+           or the debugger quits if post mortem debugging is ongoing.
+           If self.quitting is set, this causes Bdb to throw BdbQuit terminating the inferior.
+        '''
+        raise NotImplementedError("subclass of kdevDbgCore must implement enter_debugger()")
+
+    def set_stepout(self):
+        """Step-out of a function or past a conditional block of code."""
+        lineno = asmskip.stepout_lineno(self.curframe.f_code, self.curframe.f_lineno)
+        if lineno >= self.curframe.f_lineno:
+            # Can step out of this block of code.
+            self.set_until(self.curframe, lineno)
+        elif self.topindex > self.bottomindex:
+            # Stop immediately after exiting from the frame.
+            self.set_return(self.curframe)
+        else:
+            # No outer frames left, single step.
+            self.set_next(self.curframe)
+        return 1
+
+    def is_runnable_srcline(self, filename, lineno):
+        '''Check if source line contains executable code.'''
+        line = linecache.getline(filename, lineno, self.curframe.f_globals)
+        if not line:
+            self.error(f"Invalid location {filename}:{lineno} (end-of-file)")
+            return -1
+        line = line.strip()
+        if not line:
+            self.error(f"Invalid location {filename}:{lineno} (blank)")
+            return -2
+        if line[0] == '#':
+            self.error(f"Invalid location {filename}:{lineno} (comment)")
+            return -3
+        if line[:3] in ('"""', "'''"):
+            self.error(f"Invalid location {filename}:{lineno} (doc-string)")
+            return -4
+        return lineno
diff -pruN 24.12.3-1/debugger/kdevpdbvariablesupport.py 25.11.80-0ubuntu1/debugger/kdevpdbvariablesupport.py
--- 24.12.3-1/debugger/kdevpdbvariablesupport.py	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/kdevpdbvariablesupport.py	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,578 @@
+# SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import sys
+import types
+import math
+import copy
+
+# pylint: disable=C0103, R0903, C0115, R1710
+# This module implements the kdevPdb's variable machinery and other helpers.
+
+
+class enumeratorBase():
+    '''Enumerate a list of things.
+       Sub classes must compute the sequence length for super().__init__(...).
+    '''
+    def __init__(self, ref, size):
+        self.objectref = ref
+        self.size = size
+
+    def __len__(self):
+        return self.size
+
+    def next(self):
+        '''Sub classes must override this method,
+           and set self.objectref = None once completed.'''
+        self.objectref = None
+
+
+class namespaceEnumerator(enumeratorBase):
+    '''Enumerate a namespace object.'''
+    def __init__(self, obj):
+        # filter out some uninteresting python internals.
+        filtter = ('__builtins__', '__file__', '__name__', '__spec__')
+        obj = [(x, y) for x, y in obj if x not in filtter]
+        super().__init__(obj, len(obj))
+
+    def next(self):
+        for x, y in self.objectref:
+            assert isinstance(x, str)
+            yield (x, y)
+        self.objectref = None
+
+
+class UnknownType():
+    '''Helper type to differentiate getattr() returning NoneType'''
+
+
+class attributeEnumerator(enumeratorBase):
+    '''Enumerate an object attributes with dir() builtin.'''
+    def __init__(self, obj):
+        # Sort, although KDevelop will sort the generated set differently.
+        # The ordering however does help the user to obtain the attributes in
+        # a much nicer order if all of the attributes aren't immediately enumerated.
+        g = [[], [], [], [], [], []]
+        for x in dir(obj):
+            try:
+                attr = getattr(obj, x, UnknownType)
+                if attr is UnknownType:
+                    continue
+            except Exception:
+                continue
+            # order callable attributes after non-callable.
+            iscallable = callable(attr)
+            if len(x) >= 2 and x[:2] == '__':
+                g[4 + iscallable].append(x)
+            elif x[0] == '_':
+                g[2 + iscallable].append(x)
+            else:
+                g[0 + iscallable].append(x)
+        self.attribs = [x for l in g for x in l]
+        hint = len(g[0]) + len(g[1])
+        self.expandhint = min(10, len(self.attribs)) if hint == 0 else hint
+        super().__init__(obj, len(self.attribs))
+
+    def next(self):
+        for x in self.attribs:
+            yield (x, getattr(self.objectref, x))
+        self.objectref = None
+
+
+class listEnumerator(enumeratorBase):
+    '''Enumerate an list() like sequence with enumerate().'''
+    def __init__(self, obj):
+        super().__init__(obj, len(obj))
+
+    def next(self):
+        for i, x in enumerate(self.objectref):
+            yield (f'[{i}]', x)
+        self.objectref = None
+
+
+class dictEnumerator(enumeratorBase):
+    '''Enumerate an dict() like object.'''
+    def __init__(self, obj):
+        super().__init__(obj, len(obj) * 2)
+
+    def next(self):
+        try:
+            for i, x in enumerate(self.objectref.items()):
+                yield (f'[{i}].key', x[0])
+                yield (f'[{i}].value', x[1])
+        except Exception:
+            pass
+        self.objectref = None
+
+
+class chunkEnumerator(enumeratorBase):
+    '''Enumerate a string like object in MAX_LEN length chunks'''
+    MAX_LEN = 100
+
+    def __init__(self, obj):
+        super().__init__(obj, math.ceil(len(obj) / chunkEnumerator.MAX_LEN))
+
+    def next(self):
+        for i in range(0, len(self.objectref), chunkEnumerator.MAX_LEN):
+            chunk = self.objectref[i:i + chunkEnumerator.MAX_LEN]
+            yield (f'[{i}..{i + len(chunk) - 1}]', chunk)
+        self.objectref = None
+
+
+class ExceptionInfo():
+    '''Hold user viewable exception info'''
+    def __init__(self, _exc, _traceback):
+        self.exc = _exc
+        self.traceback = _traceback
+
+
+class ExceptionNode():
+    def __init__(self, _exc, _traceback):
+        self.exc_type = _exc.__class__.__qualname__
+        self.exc_value = ExceptionInfo(_exc, _traceback)
+
+
+class Exceptions():
+    '''Hold a list of ExceptionNodes'''
+    def __init__(self, _data):
+        self.data = _data
+
+
+class excInfoEnumerator(enumeratorBase):
+    def __init__(self, exc):
+        super().__init__(exc, 2)
+
+    def next(self):
+        yield 'args', self.objectref.exc.args
+        yield 'from', self.objectref.traceback
+        self.objectref = None
+
+
+class excNodeEnumerator(enumeratorBase):
+    def __init__(self, nodes):
+        super().__init__(nodes, len(nodes))
+
+    def next(self):
+        for x in self.objectref:
+            yield (x.exc_type, x.exc_value)
+        self.objectref = None
+
+
+class Namespace():
+    def __init__(self):
+        self.label = ""    # namespace's label inserted in handles
+        self.names = {}    # mapping of handles into their longnames in self.handles[]
+        self.handles = {}  # mapping of longname into the current and old handle
+        self.inited = set()  # set of enumerated longnames.
+
+
+# Reduced set of immutable types. (see copy._copy_immutable())
+_skip_shallowcopy = {types.NoneType, int, float, bool, complex, str,
+                     type, range, slice, property,
+                     types.BuiltinFunctionType, types.EllipsisType,
+                     types.NotImplementedType, types.FunctionType, types.CodeType}
+
+
+def _shallowcopy(value):
+    '''Return a shallow copy of a value if possible or identity'''
+    cls = type(value)
+    if cls in _skip_shallowcopy:
+        return value
+    # Check for __setstate__ method as such object is likely not safe to copy.
+    if hasattr(value, '__setstate__'):
+        _skip_shallowcopy.add(cls)
+        return value
+    try:
+        return copy.copy(value)
+    except Exception:
+        # Not copy-able: add the type to the ignored set of types,
+        # to skip handling the exception again.
+        _skip_shallowcopy.add(cls)
+        return value
+
+
+def compareValues(a, b):
+    '''General non-equal comparison of two values'''
+    try:
+        changed = a != b
+        if isinstance(changed, bool):
+            return changed
+    except Exception:
+        pass
+
+
+try:
+    import numpy
+    numpy.set_printoptions(threshold=numpy.inf)
+
+    class ndarrayEnumerator(enumeratorBase):
+        '''Decompose numpy.ndarray into a list of sub dimensions'''
+        def __init__(self, obj):
+            assert isinstance(obj, numpy.ndarray)
+            data = [obj[i] for i in range(obj.shape[0])]
+            super().__init__(data, len(data))
+
+        def next(self):
+            for i, x in enumerate(self.objectref):
+                yield (f'[{i}]', x)
+            self.objectref = None
+
+    def inspectNumpyArray(obj, gens, handle):
+        '''Inspect numpy.ndarray.'''
+        if not isinstance(obj, numpy.ndarray):
+            return None
+        if len(obj.shape) == 1:
+            return {'count': 0, 'data': f"{obj}"}
+        if len(obj.shape) > 1:
+            # peel dimensions off:
+            g = ndarrayEnumerator(obj)
+            gens[handle] = g.next()
+            return {'count': len(g), 'data': f"shape={obj.shape}", 'expandhint': len(g)}
+        return {'count': 0, 'data': '<invalid>'}
+
+    def compareNumpyArrays(a, b):
+        '''Compare ndarrays'''
+        try:
+            return not numpy.array_equal(a, b)
+        except Exception:
+            pass
+except ImportError:
+    pass
+
+
+def inspectSimpleValue(obj, *_):
+    '''Inspect a simple value with no children'''
+    if isinstance(obj, (types.NoneType, int, bool, float)):
+        return {'count': 0, 'data': str(obj)}
+
+
+def inspectMethodOrFunction(obj, *_):
+    '''Inspect a method or function type.'''
+    try:
+        code = obj.__func__.__code__
+        if code:
+            # Instance method
+            return {'count': 0, 'data': f'{obj.__qualname__}'}
+    except Exception:
+        pass
+    try:
+        code = obj.__code__
+        if code:
+            # Function
+            return {'count': 0, 'data': f'{obj.__qualname__}'}
+    except Exception:
+        pass
+
+
+def inspectExceptions(obj, gens, handle):
+    '''Inspect getreturninfo() exception list.'''
+    if not isinstance(obj, Exceptions):
+        return None
+    # This is synthesized by getreturninfo()
+    g = excNodeEnumerator(obj.data)
+    gens[handle] = g.next()
+    return {'count': len(g), 'type': ''}
+
+
+def inspectExceptionInfo(obj, gens, handle):
+    '''Inspect getreturninfo() exception node.'''
+    if not isinstance(obj, ExceptionInfo):
+        return None
+    g = excInfoEnumerator(obj)
+    gens[handle] = g.next()
+    return {'count': len(g), 'type': '', 'expandhint': 2}
+
+
+def inspectClass(obj, gens, handle):
+    '''Inspect a class type.'''
+    try:
+        if obj.__class__ is type:
+            report = inspectAttributes(obj, gens, handle)
+            report['data'] = f'class {obj.__qualname__}'
+            return report
+    except AttributeError:
+        pass
+
+
+def inspectCallable(obj, *_):
+    '''Inspect a callable type.'''
+    if callable(obj):
+        return {'count': 0, 'data': '<callable>'}
+
+
+def inspectModuleType(obj, gens, handle):
+    '''Inspect a module.'''
+    if not isinstance(obj, types.ModuleType):
+        return None
+    report = inspectAttributes(obj, gens, handle)
+    report['data'] = f"module '{obj.__name__}'"
+    return report
+
+
+def inspectDataString(obj, gens, handle):
+    '''Inspect a string like data.'''
+    if not isinstance(obj, (str, bytes, bytearray, memoryview)):
+        return None
+    # For shorter than chunkEnumerator.MAX_LEN chars, report a direct value with 'len'.
+    # Otherwise, report in chunks as the sequence may be *very* long.
+    # (megabytes perhaps even..)
+    try:
+        report = {'len': len(obj)}
+    except TypeError:
+        report = {'len': 0}
+    if report['len'] > chunkEnumerator.MAX_LEN:
+        g = chunkEnumerator(obj)
+        gens[handle] = g.next()
+        report['count'] = len(g)
+        return report
+    report['count'] = 0
+    if isinstance(obj, (memoryview, bytearray)):
+        # repr() doesn't work well for these types.
+        report['data'] = repr(bytes(obj))
+        return report
+    report['data'] = repr(obj)
+    return report
+
+
+def inspectSequence(obj, gens, handle):
+    '''Inspect a sequence.'''
+    if not isinstance(obj, (list, tuple, set, frozenset)):
+        return None
+    g = listEnumerator(obj)
+    gens[handle] = g.next()
+    return {'count': len(g), 'len': len(obj), 'expandhint': 3}
+
+
+def inspectDict(obj, gens, handle):
+    '''Inspect a dictionary.'''
+    if not isinstance(obj, dict):
+        return None
+    g = dictEnumerator(obj)
+    gens[handle] = g.next()
+    return {'count': len(g), 'len': len(obj), 'expandhint': 2}
+
+
+def inspectAttributes(obj, gens, handle):
+    '''Inspect attributes of obj.'''
+    # This works on all nearly object types, if we have no better way to represent the value.
+    g = attributeEnumerator(obj)
+    gens[handle] = g.next()
+    return {'count': len(g), 'expandhint': g.expandhint}
+
+
+class kdevExprValueMapper():
+    def __init__(self):
+        self.handleCounter = 0
+        # Mapping of handles into the pinned values.
+        self.objectsByHandle = {}
+        # Mapping of handles into generators.
+        self.objectEnumerators = {}
+        # All namespace objects.
+        self.objectsByNamespace = {}
+        self.droppedNamespaces = set()
+        self.variableNsids = -3
+        # List of inspect() functions.
+        # The order is critical, the first that doesn't return None wins.
+        self.detectors = [
+            inspectSimpleValue,
+            inspectMethodOrFunction,
+            inspectExceptions,
+            inspectExceptionInfo,
+            inspectClass,
+            inspectCallable,
+            inspectModuleType,
+            inspectDataString,
+            inspectSequence,
+            inspectDict,
+            inspectAttributes]
+        # List of compare() functions.
+        self.comparators = [compareValues]
+
+        # Numpy support is optional.
+        if getattr(sys.modules[__name__], 'inspectNumpyArray', None):
+            self.detectors.insert(1, inspectNumpyArray)
+            self.comparators.append(compareNumpyArrays)
+
+    def makeHandle(self):
+        '''Make a variable handle.'''
+        self.handleCounter += 1
+        return self.handleCounter
+
+    def error(self, msg, lnend='\n'):
+        raise NotImplementedError("subclass must implement this method.")
+
+    def get_topindex(self):
+        raise NotImplementedError("subclass must implement this method.")
+
+    def dropNamespace(self, ns_id):
+        '''Cleanup a namespace id'''
+        self.droppedNamespaces.add(ns_id)
+
+    def cleanupobjects(self):
+        '''Cleanup invalidated state after pausing'''
+        self.objectEnumerators.clear()
+        # Purge unavailable namespaces.
+        for ns_id in self.objectsByNamespace:
+            if ns_id > self.get_topindex():
+                self.dropNamespace(ns_id)
+        # Coarse purge handles (and longnames) that are now unreachable
+        # from the possible namespaces.
+        reachable = set()
+        unreachable = set()
+        for ns_id, ns in list(self.objectsByNamespace.items()):
+            if ns_id in self.droppedNamespaces:
+                unreachable.update(ns.names)
+                # Drop the entire namespace object.
+                del self.objectsByNamespace[ns_id]
+            else:
+                reachable.update(ns.names)
+        self.droppedNamespaces.clear()
+        # Drop handles which are not in reachable.
+        unreachable -= reachable
+        num_purged = len(unreachable)
+        for ptr in unreachable:
+            del self.objectsByHandle[ptr]
+        # Purge all longnames which have not been initialized/used.
+        pinned = len(self.objectsByHandle)
+        for ns in self.objectsByNamespace.values():
+            for longname, handles in list(ns.handles.items()):
+                if longname in ns.inited:
+                    continue
+                ns.handles.pop(longname, None)
+                ns.names.pop(handles[0], None)
+                ns.names.pop(handles[1], None)
+                self.objectsByHandle.pop(handles[0], None)
+                self.objectsByHandle.pop(handles[1], None)
+            ns.inited.clear()
+        num_purged += pinned - len(self.objectsByHandle)
+        return {'purged': num_purged, 'pinned': len(self.objectsByHandle)}
+
+    def updateNamespace(self, items, ns_id, ns_label):
+        '''Create a new namespace handle from a list of tuples'''
+        ns = self.objectsByNamespace.setdefault(ns_id, Namespace())
+        if ns_label in ns.handles:
+            handle = ns.handles[ns_label][0]
+        else:
+            handle = self.makeHandle()
+            # Link the handle inside its own namespace.
+            ns.handles[ns_label] = [handle, 0]
+        ns.label = ns_label
+        ns.names[handle] = ns_label
+        ns.inited.add(ns_label)
+        self.objectsByHandle[handle] = (ns_id, True)
+        g = namespaceEnumerator(items)
+        self.objectEnumerators[handle] = g.next()
+        return len(g), handle
+
+    def enumerateHandle(self, handle, ns_id, do_copy=True):
+        '''Enumerate next variable of a handle.'''
+        try:
+            # try generate the next item.
+            objname, value = next(self.objectEnumerators[handle])
+        except StopIteration:
+            # the generator was exhausted, remove it.
+            self.objectEnumerators.pop(handle, None)
+            return None
+        except KeyError:
+            # No generator was set up.
+            # (the client likely made an mistake)
+            return None
+
+        parent = self.objectsByHandle[handle]
+        if len(parent) == 2:
+            # The handle refers to a namespace.
+            ns = self.objectsByNamespace[parent[0]]
+            longname = objname
+        else:
+            # Build the current longname for value
+            assert ns_id in self.objectsByNamespace
+            ns = self.objectsByNamespace[ns_id]
+            # '/' is used to join child name to the parent name rather than '.' because
+            # this makes it possible later to split the longname into its components.
+            longname = ns.names[handle] + '/' + objname
+
+        if longname in ns.inited:
+            # Already initialized this longname.
+            return {'expression': objname, 'ptr': ns.handles[longname][0]}
+
+        handles = ns.handles.get(longname)
+        if handles is None:
+            # Make a new pair handles.
+            # Initially, the other handle will have no pinned value in objectsByHandle.
+            handles = [self.makeHandle(), self.makeHandle()]
+            ns.handles[longname] = handles
+        # Swap the current and previous handles.
+        handles[0], handles[1] = handles[1], handles[0]
+        # Update the handles[0]'s pinned value with a shallow copy of the value
+        # when possible or reference the value as-is.
+        newvalue = _shallowcopy(value) if do_copy else value
+        self.objectsByHandle[handles[0]] = (newvalue,)
+        # Associate the handle[0] with a longname.
+        # Although ns.names[handles[1]] is technically able to refer to a different
+        # longname than ns.names[handles[0]], I have never observed this happening.
+        # Hence the assert:
+        assert handles[1] not in ns.names or ns.names[handles[1]] == longname
+        ns.names[handles[0]] = longname
+        # Mark the longname as initialized.
+        ns.inited.add(longname)
+        return {'expression': objname, 'ptr': handles[0]}
+
+    def inspectvalue(self, handle, ns_id):
+        ''' Determine the variable's value and other details:
+            - The 'count' number of children items, if any, and 'type'.
+              These fields must exist.
+            Optional fields (can be omitted from the response):
+            - 'data' provides the displayed value of the variable.
+            - 'len' is displayed in place of 'data' as "len=...",
+               or as prefix "len=..., " if both are provided.
+            - 'expandhint' is how many children, at minimum, the client should enumerate.
+               If not reported, this is min(1,count)
+            return: {'count': int(), 'type': str(), 'data': str(),
+                     'len': int(), 'expandhint': int()}
+        '''
+        try:
+            obj = self.objectsByHandle[handle][0]
+        except KeyError:
+            # Not found in the table. Respond with "None" to tell the given handle no longer exists.
+            return None
+
+        # Compute the changed state.
+        changed = False
+        if ns_id is not None:
+            ns = self.objectsByNamespace[ns_id]
+            handles = ns.handles[ns.names[handle]]
+            changed = True
+            if handles[1] in self.objectsByHandle:
+                for cmp in self.comparators:
+                    changed = cmp(obj, self.objectsByHandle[handles[1]][0])
+                    if changed is not None:
+                        break
+
+        for proc in self.detectors:
+            ret = proc(obj, self.objectEnumerators, handle)
+            if ret is not None:
+                ret.setdefault('changed', changed)
+                ret.setdefault('type', obj.__class__.__qualname__)
+                return ret
+        return None
+
+    def evalexpression(self, expr, frame):
+        '''Attempts to evaluate an expression in the context of a stack-frame.'''
+        # confine the frame.f_globals.__builtins__ a bit.
+        fglobals = {}
+        fglobals.update(frame.f_globals)
+        fbuiltins = {}
+        fbuiltins.update(fglobals['__builtins__'])
+        del fbuiltins['print']
+        del fbuiltins['__import__']
+        del fbuiltins['eval']
+        del fbuiltins['exec']
+        del fbuiltins['compile']
+        fglobals['__builtins__'] = fbuiltins
+        try:
+            evaluate_result = frame.evaluate(expr, fglobals, frame.f_locals)
+            return {'value': evaluate_result, 'error': False}
+        except Exception as e:
+            # Log the error.
+            self.error(f"{e}")
+        return {'error': True}
diff -pruN 24.12.3-1/debugger/pdbdebuggerinstance.cpp 25.11.80-0ubuntu1/debugger/pdbdebuggerinstance.cpp
--- 24.12.3-1/debugger/pdbdebuggerinstance.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/pdbdebuggerinstance.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,185 @@
+/*
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
+
+    SPDX-License-Identifier: GPL-2.0-or-later
+*/
+#include <QMetaObject>
+#include <QMetaMethod>
+
+#include "pdbdebuggerinstance.h"
+#include "pdbprocess.h"
+#include "debuggerdebug.h"
+
+namespace Python {
+
+PdbDebuggerInstance::PdbDebuggerInstance(QObject* parent)
+    : QObject(parent)
+    , m_instance(new PdbProcess(this))
+    , m_currentSeqnro(-PdbProcess::FRAMES_BEFORE_READY)
+{
+    connect(m_instance, &PdbProcess::dataReceived, this, &PdbDebuggerInstance::decodeResponse);
+}
+
+PdbDebuggerInstance::~PdbDebuggerInstance()
+{
+}
+
+int PdbDebuggerInstance::currentSeqnro() const
+{
+    return m_currentSeqnro;
+}
+
+void PdbDebuggerInstance::setMethod(int seqnro, CmdCallback callback)
+{
+    if (callback) {
+        m_callbacks.emplace(seqnro).value() = std::move(callback);
+    } else {
+        // Try erase instead of inserting.
+        auto itr = m_callbacks.find(seqnro);
+        if (itr != m_callbacks.end()) {
+            m_callbacks.erase(itr);
+        }
+    }
+}
+
+void PdbDebuggerInstance::request(std::initializer_list<QJsonValue> command_and_args, CmdCallback callback)
+{
+    // Assemble the request body.
+    QJsonObject cmd;
+    cmd.insert(QStringLiteral("seq"), QJsonValue(m_currentSeqnro));
+    const auto itr = cmd.insert(QStringLiteral("input"), QJsonArray(command_and_args));
+
+    // Register the callback object.
+    setMethod(m_currentSeqnro, callback);
+    qCDebug(KDEV_PYTHON_DEBUGGER).noquote()
+        << "seqnro" << m_currentSeqnro << "assigned for request(" << itr.value() << ")";
+    ++m_currentSeqnro;
+
+    // Encode and send.
+    m_instance->sendCommand(QJsonDocument(cmd).toJson(QJsonDocument::JsonFormat::Compact));
+}
+
+void PdbDebuggerInstance::defer(CmdCallback callback)
+{
+    Q_ASSERT(callback);
+
+    // Assemble a request body without "input".
+    QJsonObject cmd{std::make_pair(QStringLiteral("seq"), QJsonValue(m_currentSeqnro))};
+
+    // Register the callback object.
+    m_callbacks.emplace(m_currentSeqnro).value() = std::move(callback);
+    qCDebug(KDEV_PYTHON_DEBUGGER).noquote() << "seqnro" << m_currentSeqnro << "assigned for defer()";
+    ++m_currentSeqnro;
+
+    // Encode and send.
+    m_instance->sendCommand(QJsonDocument(cmd).toJson(QJsonDocument::JsonFormat::Compact));
+}
+
+void PdbDebuggerInstance::decodeResponse(const QByteArray& data)
+{
+    QJsonParseError error;
+    const auto body = QJsonDocument::fromJson(data, &error);
+    if (error.error != QJsonParseError::NoError) {
+        // Malformed JSON response.
+        qCCritical(KDEV_PYTHON_DEBUGGER) << "Received bad response data-frame! Error:" << error.errorString();
+        return;
+    }
+
+    // Decode the response up to the individual fields it can contain.
+    if (!body.isObject()) {
+        qCCritical(KDEV_PYTHON_DEBUGGER) << "Received an invalid response! (not an object)!";
+        return;
+    }
+    const auto obj = body.object();
+    const int responseSeqnro = obj.value(QStringLiteral("seq")).toInt(-1);
+    // Ensure next request has a greater seqnro than this response's seqnro.
+    m_currentSeqnro = std::max(m_currentSeqnro, responseSeqnro + 1);
+
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "seqnro" << responseSeqnro << "completed";
+
+    /*
+     * Defer rest of the work to a later point, so we don't hog the main thread for too long. The
+     * debugger process can also send a responses before the all of the handlers have been invoked,
+     * which improves parallelization.
+     */
+    m_queue.emplace_back(Response{obj.value(QStringLiteral("data")).toArray(), responseSeqnro});
+    QMetaObject::invokeMethod(this, &PdbDebuggerInstance::process, Qt::QueuedConnection);
+}
+
+void PdbDebuggerInstance::process()
+{
+    Q_ASSERT(!m_queue.empty());
+    const auto& item = m_queue.front();
+
+    // TODO: item.fields should perhaps be transformed into a list of pair<QString, QJsonValue>?
+    ResponseData response;
+    static const auto messageKey = QStringLiteral("message");
+    static const auto errorKey = QStringLiteral("error");
+
+    for (const auto& item : item.fields) {
+        const auto& obj = response.emplace_back(item.toObject());
+        // Log "message" and "error" response fields, if they exist.
+        if (obj.contains(messageKey)) {
+            qCDebug(KDEV_PYTHON_DEBUGGER) << "message:" << obj.value(messageKey).toString();
+        } else if (obj.contains(errorKey)) {
+            // Log as an warning, since this usually means the request failed.
+            qCWarning(KDEV_PYTHON_DEBUGGER) << "error:" << obj.value(errorKey).toString();
+        }
+    }
+
+    // Forward the data into the callback currently assigned for the seqnro, or ignore the response.
+    CmdCallback handler;
+    auto itr = m_callbacks.find(item.seqnro);
+    if (itr != m_callbacks.end()) {
+        handler = std::move(itr.value());
+        m_callbacks.erase(itr);
+    }
+
+    if (handler) {
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "invoking seqnro" << item.seqnro << "handler with:" << response;
+        // Invoke the method.
+        handler(std::as_const(response));
+    } else {
+        // No callback was assigned.
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "discarding seqnro" << item.seqnro << "result:" << response;
+    }
+
+    m_queue.pop_front();
+    if (m_queue.empty()) {
+        m_instance->signalSuspended();
+    }
+}
+
+QJsonValue responseValue(const ResponseData& data, QStringView field)
+{
+    for (const auto& item : data) {
+        if (item.contains(field)) {
+            return item.value(field);
+        }
+    }
+    return QJsonValue(QJsonValue::Undefined);
+}
+
+QJsonObject responseObject(const ResponseData& data, QStringView field)
+{
+    auto value = responseValue(data, field);
+    if (value.isObject()) {
+        return value.toObject();
+    } else {
+        return QJsonObject();
+    }
+}
+
+QJsonArray responseArray(const ResponseData& data, QStringView field)
+{
+    auto value = responseValue(data, field);
+    if (value.isArray()) {
+        return value.toArray();
+    } else {
+        return QJsonArray();
+    }
+}
+
+}
+
+#include "moc_pdbdebuggerinstance.cpp"
diff -pruN 24.12.3-1/debugger/pdbdebuggerinstance.h 25.11.80-0ubuntu1/debugger/pdbdebuggerinstance.h
--- 24.12.3-1/debugger/pdbdebuggerinstance.h	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/pdbdebuggerinstance.h	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,120 @@
+/*
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
+
+    SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+#ifndef KDEVPDBINSTANCE_H
+#define KDEVPDBINSTANCE_H
+
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QObject>
+#include <QPointer>
+#include <QString>
+#include <QList>
+
+#include <deque>
+#include <functional>
+
+namespace Python {
+
+class PdbProcess;
+
+using ResponseData = QList<QJsonObject>;
+
+/**
+ * Find a response field and return it as an value.
+ * @return a JSON value or QJsonValue(Undefined) if the field did not exist.
+ */
+QJsonValue responseValue(const ResponseData& data, QStringView field);
+
+/**
+ * Find a response field and return it as an object.
+ * @return a non-empty JSON object if the field was found.
+ */
+QJsonObject responseObject(const ResponseData& data, QStringView field);
+
+/**
+ * Find a response field and return it as an array.
+ * @return a non-empty JSON array if the field was found.
+ */
+QJsonArray responseArray(const ResponseData& data, QStringView field);
+
+/**
+ * Provides the high-level request - response interface for the PdbProcess class.
+ */
+class PdbDebuggerInstance : public QObject
+{
+    Q_OBJECT
+public:
+    using CmdCallback = std::function<void(const ResponseData&)>;
+
+    /**
+     * Construct a PdbProcess instance.
+     * @note PdbDebuggerInstance only handles the PdbProcess::dataReceived() signal,
+     *       and leaves further configuration of the PdbProcess to the caller.
+     */
+    PdbDebuggerInstance(QObject* parent = nullptr);
+    ~PdbDebuggerInstance();
+
+    /**
+     * Get the underlying PdbProcess.
+     */
+    PdbProcess* instance() const
+    {
+        return m_instance;
+    }
+
+    /**
+     * Get the command sequence number that request() would use next.
+     */
+    int currentSeqnro() const;
+
+    /**
+     * Replace existing or assign a new callback for an sequence number.
+     */
+    void setMethod(int seqnro, CmdCallback callback);
+
+    /**
+     * Send a request to the Pdb debugger process.
+     * @param command_and_args a command followed by its arguments.
+     * @brief
+     *   The @p callback is invoked if it has a target, when
+     *   the response JSON data has been received and decoded.
+     */
+    void request(std::initializer_list<QJsonValue> command_and_args, CmdCallback callback = {});
+
+    /**
+     * Queue a callback.
+     * @brief
+     *   The callback is queued and it is invoked once all earlier request handlers have run.
+     *   The response JSON data is always empty.
+     *   The @p callback to be invoked. It must have a target.
+     */
+    void defer(CmdCallback callback);
+
+private Q_SLOTS:
+    /// Internal slot to handle responses from the debugger.
+    void decodeResponse(const QByteArray& data);
+
+private:
+    PdbProcess* m_instance = nullptr;
+
+    QHash<int, CmdCallback> m_callbacks;
+    int m_currentSeqnro;
+
+    struct Response
+    {
+        QJsonArray fields;
+        int seqnro;
+    };
+    std::deque<Response> m_queue;
+
+    void process();
+};
+
+}
+
+#endif
\ No newline at end of file
diff -pruN 24.12.3-1/debugger/pdbframestackmodel.cpp 25.11.80-0ubuntu1/debugger/pdbframestackmodel.cpp
--- 24.12.3-1/debugger/pdbframestackmodel.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/pdbframestackmodel.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -1,12 +1,12 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
 
 #include "pdbframestackmodel.h"
 #include "debugsession.h"
-#include <QRegularExpression>
 
 #include <QDebug>
 #include "debuggerdebug.h"
@@ -14,10 +14,11 @@
 using namespace KDevelop;
 
 namespace Python {
-    
-PdbFrameStackModel::PdbFrameStackModel(IDebugSession* session): FrameStackModel(session), m_debuggerAtFrame(0)
+
+PdbFrameStackModel::PdbFrameStackModel(IDebugSession* session)
+    : FrameStackModel(session)
 {
-    
+    connect(this, &IFrameStackModel::currentFrameChanged, this, &PdbFrameStackModel::setDebuggerAtFrame);
 }
 
 int PdbFrameStackModel::debuggerAtFrame() const
@@ -27,62 +28,56 @@ int PdbFrameStackModel::debuggerAtFrame(
 
 void PdbFrameStackModel::setDebuggerAtFrame(int newFrame)
 {
-//     Q_ASSERT(newFrame >= 0);
-    m_debuggerAtFrame = newFrame;
+    // Stack-frame selection needs a round trip to the server to be reliable.
+    auto* const debugger = static_cast<DebugSession*>(QObject::parent())->debugger();
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "selecting stack-frame" << newFrame;
+    debugger->request({QStringLiteral("selectframe"), newFrame}, [this](const ResponseData& d) {
+        frameSelected(d);
+    });
 }
 
-void PdbFrameStackModel::framesFetched(QByteArray framelist)
+void PdbFrameStackModel::frameSelected(const ResponseData& data)
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "frames fetched:" << framelist;
-    QStringList lines = QString::fromLatin1(framelist).split(QLatin1Char('\n'));
+    m_debuggerAtFrame = responseValue(data, QStringLiteral("activeframe")).toInt();
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "active stack-frame:" << m_debuggerAtFrame;
+}
+
+void PdbFrameStackModel::framesFetched(const ResponseData& data)
+{
+    const auto framelist = responseArray(data, QStringLiteral("frames"));
+
     QList<FrameItem> frames;
-    bool parsingLocation = false;
-    FrameItem* currentFrame = nullptr;
-    int framesCount = 0;
-    for (const QString& line : std::as_const(lines)) {
-        if ( line.startsWith(QStringLiteral("-> ")) ) {
-            parsingLocation = true;
-            if ( currentFrame ) {
-                frames << *currentFrame;
-            }
-            currentFrame = new FrameItem();
-            currentFrame->nr = framesCount;
-            framesCount++;
+
+    // The most recent frame is first, but it's not necessarily the current one.
+    for (const auto& obj : framelist) {
+        const auto frame = obj.toObject();
+        if (frame.value(QStringLiteral("current")).toBool()) {
+            m_debuggerAtFrame = frames.size();
         }
-        else if ( parsingLocation ) {
-            static QRegularExpression location(QStringLiteral("(\\>?)\\s*(.*)\\(([0-9]+)\\)(.*)"));
-            // version 1 has some *really* weird "greedy" ruleset which makes no sense at all for me
-            //location.setPatternSyntax(QRegExp::RegExp2);
-            const auto match = location.match(line);
-            if ( match.hasMatch() ) {
-                qCDebug(KDEV_PYTHON_DEBUGGER) << match.capturedView();
-                if ( ! match.captured(1).isEmpty() ) {
-                    m_debuggerAtFrame = framesCount;
-                }
-                currentFrame->file = QUrl::fromLocalFile(match.captured(2));
-                currentFrame->line = match.captured(3).toInt() - 1;
-                currentFrame->name = match.captured(4);
-            }
-            else {
-                qCDebug(KDEV_PYTHON_DEBUGGER) << "regular expression mismatches" << line;
-            }
+
+        const auto file = frame.value(QStringLiteral("filename")).toString();
+        if (file == QStringLiteral("<string>")) {
+            // End of frames. "<string>" originates from the server doing
+            // a "exec(compile(,"<string>"))" while starting the inferior.
+            // (the debugger stopped too early.)
+            break;
         }
+
+        auto& item = frames.emplace_back();
+        item.nr = frames.size() - 1;
+        item.file = QUrl::fromLocalFile(file);
+        item.line = frame.value(QStringLiteral("line")).toInt() - 1;
+        item.name = frame.value(QStringLiteral("function")).toString();
     }
-    m_debuggerAtFrame = framesCount - m_debuggerAtFrame - 1;
+
     qCDebug(KDEV_PYTHON_DEBUGGER) << "at frame:" << m_debuggerAtFrame;
-    QVector<FrameItem> framesReversed;
-    framesReversed.reserve(frames.length());
-    for ( int i = frames.length() - 1; i >= 0; i-- ) {
-        framesReversed.append(frames.at(i));
-        framesReversed.last().nr = framesCount - i - 2;
-    }
-    setFrames(0, framesReversed);
+    setFrames(0, frames);
 }
 
-void PdbFrameStackModel::threadsFetched(QByteArray threadsData)
+void PdbFrameStackModel::threadsFetched()
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "threads fetched" << threadsData;
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "Implement me: Thread debugging is not supported by pdb.";
+    // TODO: Implement me: Thread debugging is not supported by pdb.
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "threads fetched";
     QVector<ThreadItem> threads;
     ThreadItem mainThread;
     mainThread.nr = 0;
@@ -95,16 +90,20 @@ void PdbFrameStackModel::threadsFetched(
 void PdbFrameStackModel::fetchFrames(int /*threadNumber*/, int /*from*/, int /*to*/)
 {
     qCDebug(KDEV_PYTHON_DEBUGGER) << "frames requested";
-    InternalPdbCommand* cmd = new InternalPdbCommand(this, "framesFetched", QStringLiteral("where\n"));
-    static_cast<DebugSession*>(session())->addCommand(cmd);
+    auto* const debugger = static_cast<DebugSession*>(QObject::parent())->debugger();
+    debugger->request({QStringLiteral("where")}, [this](const ResponseData& d) {
+        framesFetched(d);
+    });
 }
 
 void PdbFrameStackModel::fetchThreads()
 {
     qCDebug(KDEV_PYTHON_DEBUGGER) << "threads requested";
-    // pdb doesn't support threads.
-    InternalPdbCommand* cmd = new InternalPdbCommand(this, "threadsFetched", QStringLiteral("pass\n"));
-    static_cast<DebugSession*>(session())->addCommand(cmd);
+    // TODO: pdb doesn't support threads, so no point doing a round-trip to the server yet.
+    // However, the invocation of threadsFetched() must be queued here to solve two issues:
+    // 1. Prevent nesting of PdbFrameStackModel::handleEvent() invocations.
+    // 2. Allow VariableController to handle program_state_changed before framesFetched() runs.
+    QMetaObject::invokeMethod(this, &PdbFrameStackModel::threadsFetched, Qt::QueuedConnection);
 }
 
 }
diff -pruN 24.12.3-1/debugger/pdbframestackmodel.h 25.11.80-0ubuntu1/debugger/pdbframestackmodel.h
--- 24.12.3-1/debugger/pdbframestackmodel.h	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/pdbframestackmodel.h	2025-11-09 03:41:22.000000000 +0000
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2025 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
@@ -9,10 +10,12 @@
 
 #include <debugger/framestack/framestackmodel.h>
 
-using namespace KDevelop;
+#include "pdbdebuggerinstance.h"
 
 namespace Python {
 
+class DebugSession;
+
 /**
 * @brief The Frame Stack Model, which contains and controls the frame stack ("backtrace").
 **/
@@ -20,19 +23,19 @@ class PdbFrameStackModel : public KDevel
 {
 Q_OBJECT
 public:
-    PdbFrameStackModel(IDebugSession* session);
+    PdbFrameStackModel(KDevelop::IDebugSession* session);
     void fetchFrames(int threadNumber, int from, int to) override;
     void fetchThreads() override;
-    
-    /// pdb does not support "select-frame n", so we have to use "up" and "down" repeatedly
-    /// to select frames. Those two functions tell at which frame the debugger is internally.
+
     int debuggerAtFrame() const;
     void setDebuggerAtFrame(int newFrame);
-public Q_SLOTS:
-    void framesFetched(QByteArray frames);
-    void threadsFetched(QByteArray threads);
+
 private:
-    int m_debuggerAtFrame;
+    int m_debuggerAtFrame = 0;
+
+    void framesFetched(const ResponseData& frames);
+    void threadsFetched();
+    void frameSelected(const ResponseData& data);
 };
 
 }
diff -pruN 24.12.3-1/debugger/pdbinterrupt.cpp 25.11.80-0ubuntu1/debugger/pdbinterrupt.cpp
--- 24.12.3-1/debugger/pdbinterrupt.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/pdbinterrupt.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,30 @@
+/*
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
+
+    SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+/**
+ * Implement platform specific void interruptProcess(KProcess * process)
+ * required to interrupt a long running debugger command.
+ */
+#include <KProcess>
+
+#ifdef Q_OS_WIN
+#include <windows.h>
+namespace Python {
+void interruptProcess(KProcess* process)
+{
+    GenerateConsoleCtrlEvent(CTRL_C_EVENT, process->processId());
+}
+}
+#else
+#include <signal.h>
+namespace Python {
+void interruptProcess(KProcess* process)
+{
+    kill(process->processId(), SIGINT);
+}
+}
+
+#endif
diff -pruN 24.12.3-1/debugger/pdblauncher.cpp 25.11.80-0ubuntu1/debugger/pdblauncher.cpp
--- 24.12.3-1/debugger/pdblauncher.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/pdblauncher.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2025 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
@@ -8,12 +9,10 @@
 #include <interfaces/idocumentcontroller.h>
 #include "debugjob.h"
 
-#include <util/executecompositejob.h>
 #include <executescript/iexecutescriptplugin.h>
 #include <interfaces/launchconfigurationpage.h>
 #include <interfaces/ilaunchconfiguration.h>
 #include <interfaces/iplugincontroller.h>
-#include <interfaces/iruncontroller.h>
 #include <interfaces/icore.h>
 #include <interfaces/iuicontroller.h>
 
@@ -22,6 +21,7 @@
 #include <KParts/MainWindow>
 #include <KConfigGroup>
 #include <QFileInfo>
+#include <QStandardPaths>
 
 #include <QDebug>
 #include "debuggerdebug.h"
@@ -63,19 +63,28 @@ KJob* PdbLauncher::start(const QString&
                                       ->pluginForExtension(QStringLiteral("org.kdevelop.IExecuteScriptPlugin"))->extension<IExecuteScriptPlugin>();
         Q_ASSERT(iface);
         QString err;
-        QString interpreter = iface->interpreter(cfg, err);
-        
+        StartupInfo data;
+
+        data.interpreter = iface->interpreter(cfg, err);
+        // TODO: replace this minimal safety check with proper ILaunchConfiguration
+        //       error handling like that in ScriptAppJob from the executescript plugin
+        if (data.interpreter.empty()) {
+            return nullptr;
+        }
+
         // check the interpreter
         QProcess p;
         p.setProcessChannelMode(QProcess::MergedChannels);
-        p.start(interpreter, QStringList() << QStringLiteral("--version"));
+        // Do not pass the interpreter command line arguments to the interpreter version check command,
+        // because the arguments are more likely to break the check than to improve version detection accuracy.
+        p.start(data.interpreter.constFirst(), {QStringLiteral("--version")});
         p.waitForFinished(500);
         QByteArray version = p.readAll();
         qCDebug(KDEV_PYTHON_DEBUGGER) << "interpreter version:" << version;
         if ( ! version.startsWith("Python 3.") ) {
-            KMessageBox::error(ICore::self()->uiController()->activeMainWindow(),
-                            i18n("Sorry, debugging is only supported for Python 3.x applications."),
-                            i18n("Unsupported interpreter"));
+            KMessageBox::error(KDevelop::ICore::self()->uiController()->activeMainWindow(),
+                               i18n("Sorry, debugging is only supported for Python 3.x applications."),
+                               i18n("Unsupported interpreter"));
             return nullptr;
         }
 
@@ -91,18 +100,23 @@ KJob* PdbLauncher::start(const QString&
         else {
             scriptUrl = iface->script(cfg, err);
         }
+        data.scriptPath = scriptUrl.toLocalFile();
+
+        data.workingDirectory = iface->workingDirectory(cfg);
+        if (!data.workingDirectory.isValid() || data.workingDirectory.isEmpty()) {
+            data.workingDirectory = QUrl::fromLocalFile(QFileInfo{data.scriptPath}.absolutePath());
+        }
 
-        auto wd = iface->workingDirectory(cfg);
-        if( !wd.isValid() || wd.isEmpty() )
-        {
-            wd = QUrl::fromLocalFile( QFileInfo( scriptUrl.toLocalFile() ).absolutePath() );
+        // Locate the kdevpdb.py debugger script.
+        data.debuggerPath =
+            QStandardPaths::locate(QStandardPaths::GenericDataLocation,
+                                   QStringLiteral("kdevpythonsupport/debugger/kdevpdb.py"), QStandardPaths::LocateFile);
+        if (data.debuggerPath.isEmpty()) {
+            qCDebug(KDEV_PYTHON_DEBUGGER) << "failed to locate kdevpdb.py debugger script";
+            return nullptr;
         }
 
-        DebugJob* job = new DebugJob();
-        job->m_scriptUrl = scriptUrl;
-        job->m_interpreter = interpreter;
-        job->m_args = iface->arguments(cfg, err);
-        job->m_workingDirectory = wd;
+        data.args = iface->arguments(cfg, err);
 
         const KDevelop::EnvironmentProfileList environmentProfiles(KSharedConfig::openConfig());
         QString envProfileName = iface->environmentProfileName(cfg);
@@ -113,11 +127,18 @@ KJob* PdbLauncher::start(const QString&
                                        ". Using default environment profile.";
             envProfileName = environmentProfiles.defaultProfileName();
         }
-        job->m_envProfileName = envProfileName;
 
-        QList<KJob*> l;
-        l << job;
-        return new KDevelop::ExecuteCompositeJob( KDevelop::ICore::self()->runController(), l );
+        const auto environment = environmentProfiles.variables(envProfileName);
+        data.environment = QProcessEnvironment::systemEnvironment();
+        for (auto i = environment.cbegin(); i != environment.cend(); i++) {
+            data.environment.insert(i.key(), i.value());
+        }
+
+        DebugJob* job = new DebugJob(data);
+        const auto scriptFileName = data.scriptPath.section(QLatin1Char{'/'}, -1);
+        job->setObjectName(scriptFileName);
+
+        return job;
     }
     qCDebug(KDEV_PYTHON_DEBUGGER) << "unknown launch mode";
     return nullptr;
diff -pruN 24.12.3-1/debugger/pdbprocess.cpp 25.11.80-0ubuntu1/debugger/pdbprocess.cpp
--- 24.12.3-1/debugger/pdbprocess.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/pdbprocess.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,372 @@
+/*
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
+
+    SPDX-License-Identifier: GPL-2.0-or-later
+*/
+#include "pdbprocess.h"
+#include "startupinfo.h"
+
+#include <QDebug>
+#include <QString>
+
+#include "debuggerdebug.h"
+
+namespace Python {
+
+/// @see pdbinterrupt.cpp
+extern void interruptProcess(KProcess* process);
+
+PdbProcess::PdbProcess(QObject* parent)
+    : QObject(parent)
+{
+}
+
+PdbProcess::~PdbProcess()
+{
+}
+
+void PdbProcess::start(const StartupInfo& info)
+{
+    if (!m_socketdir.isValid() || info.scriptPath.isEmpty() || info.debuggerPath.isEmpty()) {
+        Q_EMIT finished();
+        return;
+    }
+
+    // Launch the debugger process.
+    m_debuggerProcess = new KProcess(this);
+    // Add required arguments for the kdevpdb.py server process.
+    // TODO: Pass arguments (-m) which we can support to the kdevpdb.py script and accept
+    //       interpreter arguments that don't interfere with debugging.
+    *m_debuggerProcess << info.interpreter.constFirst() << QStringLiteral("-u") // Need unbuffered stdout/stderr
+                       << info.debuggerPath << QStringLiteral("-s") << m_socketdir.path() + QStringLiteral("/")
+                       << QStringLiteral("--") << info.scriptPath << info.args;
+    m_debuggerProcess->setOutputChannelMode(KProcess::SeparateChannels);
+    m_debuggerProcess->setWorkingDirectory(info.workingDirectory.path());
+    m_debuggerProcess->setProcessEnvironment(info.environment);
+
+    connect(m_debuggerProcess, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), this,
+            &PdbProcess::processEnded);
+    connect(m_debuggerProcess, &QProcess::errorOccurred, this, &PdbProcess::processError);
+    // Must be queued or we may fail to read the data.
+    connect(m_debuggerProcess, &QProcess::channelReadyRead, this, &PdbProcess::processIoReady, Qt::QueuedConnection);
+
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "creating debugger process:" << m_debuggerProcess->program();
+
+    // The Pdb server/inferior initialization is split into a few phases:
+    // 0. After constructor: m_socket == null, m_sentFrames > 0, m_recvFrames == 0, isBusy() returns true.
+    // 1. Launch the process.
+    // 2. A start-up synchronization is done by reading a "socket:" line from the kdevpdb.py stdout before
+    //    we create our socket and connect. (otherwise we could race and get ConnectionRefusedError)
+    // 3. Once the socket is connected, the server sends initial response(s).
+    //    Receiving the response(s) brings the system into a full sync, where m_sentFrames == m_recvFrames.
+    // 4. ready() signal is finally emitted by tryRecvFrame(), along with bunch of other signals.
+    //    At the point of the ready() signal, the debugger is fully operational.
+    m_debuggerProcess->start();
+}
+
+void PdbProcess::sendCommand(const QByteArray data)
+{
+    m_sendQueue.emplaceBack(DataFrame{static_cast<int32_t>(data.size()), std::move(data), false});
+    QMetaObject::invokeMethod(this, &PdbProcess::trySendFrame, Qt::QueuedConnection);
+}
+
+void PdbProcess::sendControlCommand(ControlCommand code)
+{
+    m_sendQueue.emplaceBack(DataFrame{static_cast<int32_t>(code), {}, true});
+    QMetaObject::invokeMethod(this, &PdbProcess::trySendFrame, Qt::QueuedConnection);
+}
+
+void PdbProcess::killNow()
+{
+    if (m_exitWait || !m_debuggerProcess || m_debuggerProcess->state() == KProcess::NotRunning) {
+        return;
+    }
+    // Inhibit all of our signals first and kill the debugger process.
+    m_exitWait = new QEventLoop(this);
+    m_sendQueue.clear();
+    m_debuggerProcess->kill();
+    // Process events until the process is terminated.
+    while (m_debuggerProcess->state() != KProcess::NotRunning) {
+        m_exitWait->processEvents(QEventLoop::WaitForMoreEvents);
+    }
+}
+
+bool PdbProcess::tryInterrupt()
+{
+    // Interrupting the debugger process is only possible when we are missing responses,
+    // and the debugger has explicitly allowed the interruption.
+    if (m_allowInterrupt && m_recvFrames < m_sentFrames) {
+        interruptProcess(m_debuggerProcess);
+        return true;
+    } else {
+        return false;
+    }
+}
+
+bool PdbProcess::isBusy() const
+{
+    // PdbProcess remains is busy while we are missing responses to any sent data-frames
+    // or if we haven't sent all of the data-frames yet.
+    return m_recvFrames < (m_sentFrames + m_sendQueue.size());
+}
+
+void PdbProcess::connectToServer()
+{
+    qCDebug(KDEV_PYTHON_DEBUGGER).noquote()
+        << "debugger process ready, connecting to" << m_socketdir.filePath(QStringLiteral("kdevpdb.socket"));
+    m_socket = new QLocalSocket(this);
+    // Signals from the socket must be queued/deferred for the slots to work.
+    connect(m_socket, &QLocalSocket::errorOccurred, this, &PdbProcess::error, Qt::QueuedConnection);
+    connect(m_socket, &QLocalSocket::readyRead, this, &PdbProcess::tryRecvFrame, Qt::QueuedConnection);
+    m_socket->connectToServer(m_socketdir.filePath(QStringLiteral("kdevpdb.socket")));
+}
+
+void PdbProcess::processEnded(int exitCode, QProcess::ExitStatus exitStatus)
+{
+    // Ensure we won't miss any output from the process.
+    processIoReady(QProcess::StandardOutput);
+    processIoReady(QProcess::StandardError);
+
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "debugger process exited with code:" << exitCode;
+
+    if (m_debuggerProcess && (exitCode || exitStatus != QProcess::ExitStatus::NormalExit)) {
+        qCWarning(KDEV_PYTHON_DEBUGGER) << "debugger exited abnormally:" << exitStatus << m_debuggerProcess->error();
+    }
+
+    if (m_socket && m_socket->state() == QLocalSocket::ConnectedState) {
+        // Somehow not disconnected yet.
+        m_socket->disconnectFromServer();
+    }
+
+    if (!m_exitWait) {
+        // Process exited voluntarily.
+        Q_EMIT finished();
+    }
+}
+
+void PdbProcess::processError(QProcess::ProcessError error)
+{
+    qCWarning(KDEV_PYTHON_DEBUGGER) << "process error:" << error;
+}
+
+void PdbProcess::error(QLocalSocket::LocalSocketError reason)
+{
+    qCWarning(KDEV_PYTHON_DEBUGGER) << "socket error:" << reason;
+
+    if (!m_exitWait) {
+        Q_EMIT socketStatus(reason);
+    }
+
+    if (m_socket && m_socket->state() == QLocalSocket::ConnectedState) {
+        m_socket->disconnectFromServer();
+    }
+}
+
+void PdbProcess::trySendFrame()
+{
+    if (m_exitWait || m_sendQueue.isEmpty() || !m_socket) {
+        return;
+    }
+
+    // Escape codes must wait for previous commands to complete before they are sent.
+    // E.g. sending ControlCommand::Terminate would close the connection *immediately*,
+    // because this is processed by the kdevpdb.py's receiver thread.
+    if (m_recvFrames < m_sentFrames && m_sendQueue.first().synchronizeFirst) {
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "not sending until synchronized:" << m_sendQueue.size()
+                                      << "data-frames are waiting";
+        return;
+    }
+
+    if (!m_debuggerBusy) {
+        m_debuggerBusy = true;
+        Q_EMIT running();
+    }
+
+    if (m_socket && m_socket->state() != QLocalSocket::ConnectedState) {
+        qCCritical(KDEV_PYTHON_DEBUGGER) << "Socket not in connected state!";
+        return;
+    }
+
+    const auto frame = m_sendQueue.takeFirst();
+
+    // Send the data-frame header.
+    qint64 ret = m_socket->write(reinterpret_cast<const char*>(&frame.hdr), sizeof(DataFrame::hdr));
+    if (ret != sizeof(DataFrame::hdr)) {
+        qCCritical(KDEV_PYTHON_DEBUGGER) << "Got" << m_socket->error() << "while writing header!";
+    }
+
+    if (frame.hdr > 0) {
+        // Send the data-frame payload.
+        qint64 written = 0;
+        while (written < frame.hdr) {
+            ret = m_socket->write(frame.data.data() + written, frame.hdr - written);
+            if (ret < 1) {
+                qCCritical(KDEV_PYTHON_DEBUGGER) << "Got" << m_socket->error() << "while writing data!";
+                break;
+            }
+            written += ret;
+        }
+        if (written != frame.hdr) {
+            qCCritical(KDEV_PYTHON_DEBUGGER) << "Failed to send a complete data-frame!";
+        }
+    }
+
+    m_socket->flush();
+    m_sentFrames++;
+    qCDebug(KDEV_PYTHON_DEBUGGER) << "sent a data-frame: need" << (m_sentFrames - m_recvFrames)
+                                  << "received frames to synchronize";
+
+    if (!m_sendQueue.isEmpty() && (m_recvFrames >= m_sentFrames || !m_sendQueue.first().synchronizeFirst)) {
+        // Can send the next frame immediately.
+        QMetaObject::invokeMethod(this, &PdbProcess::trySendFrame, Qt::QueuedConnection);
+    }
+}
+
+void PdbProcess::tryRecvFrame()
+{
+    if (m_exitWait || (m_socket && m_socket->state() != QLocalSocket::ConnectedState)) {
+        qCCritical(KDEV_PYTHON_DEBUGGER) << "Socket not in connected state or process is about to exit!";
+        return;
+    }
+
+    if (m_frameRecv < 0) {
+        // No frame length or escape code received yet.
+        if (m_socket->bytesAvailable() < qint64(sizeof(DataFrame::hdr))) {
+            return; // Not enough data. (read() would fail)
+        }
+        int32_t frameHdr = 0;
+        qint64 ret = m_socket->read(reinterpret_cast<char*>(&frameHdr), sizeof(DataFrame::hdr));
+        if (ret != sizeof(DataFrame::hdr)) {
+            // Shouldn't happen...
+            qCCritical(KDEV_PYTHON_DEBUGGER) << "Reading frame header failed!";
+            return;
+        }
+
+        // Check for an escape frame:
+        switch (frameHdr) {
+        case ControlCommand::DoNothing:
+            qCDebug(KDEV_PYTHON_DEBUGGER) << "received empty frame";
+            QMetaObject::invokeMethod(this, &PdbProcess::tryRecvFrame, Qt::QueuedConnection);
+            return;
+        case ControlCommand::Terminate:
+            // End connection. Since the connection will be dead soon don't bother scheduling a further read.
+            m_socket->disconnectFromServer();
+            return;
+        case ControlCommand::InterruptDisallowed:
+            // Notification from the debugger that we are forbidden to interrupt it.
+            qCDebug(KDEV_PYTHON_DEBUGGER) << "interrupting was disabled";
+            m_allowInterrupt = false;
+            QMetaObject::invokeMethod(this, &PdbProcess::tryRecvFrame, Qt::QueuedConnection);
+            return;
+        case ControlCommand::InterruptAllowed:
+            // Notification from the debugger that it is possible to interrupt it.
+            qCDebug(KDEV_PYTHON_DEBUGGER) << "interrupting possible";
+            m_allowInterrupt = true;
+            QMetaObject::invokeMethod(this, &PdbProcess::tryRecvFrame, Qt::QueuedConnection);
+            return;
+        default:
+            break;
+        }
+
+        // Limit the size of a received data-frames.
+        if (frameHdr > WARN_TOO_BIG_FRAMESIZE) {
+            qCWarning(KDEV_PYTHON_DEBUGGER) << "Received data-frame size" << frameHdr << "is greater than"
+                                            << WARN_TOO_BIG_FRAMESIZE << "bytes. This is likely a bug!";
+        } else if (frameHdr > DIE_TOO_BIG_FRAMESIZE) {
+            qCCritical(KDEV_PYTHON_DEBUGGER) << "Received data-frame size" << frameHdr << "is greater than"
+                                             << DIE_TOO_BIG_FRAMESIZE << "bytes. This is a bug!";
+            // End the connection.
+            m_socket->disconnectFromServer();
+            return;
+        }
+        // Prepare receiving the data-frame payload.
+        m_frameRecv = 0;
+        m_frameBuf.resize(frameHdr);
+    }
+
+    Q_ASSERT(m_frameRecv >= 0);
+    Q_ASSERT(m_frameBuf.size() > m_frameRecv);
+    qint64 ret = m_socket->read(m_frameBuf.data() + m_frameRecv, m_frameBuf.size() - m_frameRecv);
+    if (ret > 0) {
+        m_frameRecv += ret;
+        if (m_socket->bytesAvailable() > 0) {
+            // Multiple frames can arrive at once, so continue processing until no more data can be read.
+            QMetaObject::invokeMethod(this, &PdbProcess::tryRecvFrame, Qt::QueuedConnection);
+        }
+    }
+    if (m_frameRecv != m_frameBuf.size()) {
+        // Received a partial data-frame.
+        // Since m_frameRecv >= 0, just return now and continue reading on the next tryRecvFrame() invocation.
+        return;
+    }
+    // Received a complete data-frame.
+    m_frameRecv = -1;
+    m_recvFrames++;
+
+    // Is the server fully booted up yet?
+    if (m_recvFrames == FRAMES_BEFORE_READY) {
+        Q_EMIT ready();
+    } else if (m_recvFrames == m_sentFrames) {
+        // Reached a synchronized state, reset counts to FRAMES_BEFORE_READY+1 so that we'll never overflow them.
+        m_recvFrames = FRAMES_BEFORE_READY + 1;
+        m_sentFrames = FRAMES_BEFORE_READY + 1;
+        qCDebug(KDEV_PYTHON_DEBUGGER) << "synchronized state was reached";
+    }
+
+    // Report the data-frame.
+    Q_EMIT dataReceived(m_frameBuf);
+
+    // Schedule sending the next request, if any.
+    if (!m_sendQueue.isEmpty()) {
+        QMetaObject::invokeMethod(this, &PdbProcess::trySendFrame, Qt::QueuedConnection);
+    }
+}
+
+void PdbProcess::signalSuspended()
+{
+    if (!isBusy()) {
+        // Not busy and send queue empty => suspended.
+        m_debuggerBusy = false;
+        Q_EMIT suspended();
+    }
+}
+
+void PdbProcess::processIoReady(int channel)
+{
+    if (m_exitWait) {
+        return;
+    }
+    // the process produced some output.
+    QByteArray data;
+    switch (channel) {
+    case QProcess::StandardOutput:
+        if (!m_socket) {
+            // the debugger process should be listening now.
+            data = m_debuggerProcess->readLine();
+            if (data.startsWith("socket:")) {
+                connectToServer();
+            } else {
+                qCWarning(KDEV_PYTHON_DEBUGGER) << "Unexpected output from the debugger process";
+                if (!data.isEmpty()) {
+                    Q_EMIT stdoutAvailable(data);
+                }
+            }
+        }
+
+        data = m_debuggerProcess->readAllStandardOutput();
+        if (!data.isEmpty()) {
+            Q_EMIT stdoutAvailable(data);
+        }
+        return;
+    case QProcess::StandardError:
+        data = m_debuggerProcess->readAllStandardError();
+        if (!data.isEmpty()) {
+            Q_EMIT stderrAvailable(data);
+        }
+        return;
+    }
+}
+
+} // namespace Python
+
+#include "moc_pdbprocess.cpp"
\ No newline at end of file
diff -pruN 24.12.3-1/debugger/pdbprocess.h 25.11.80-0ubuntu1/debugger/pdbprocess.h
--- 24.12.3-1/debugger/pdbprocess.h	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/pdbprocess.h	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,203 @@
+/*
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
+
+    SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+#ifndef KDEVPDBPROCESS_H
+#define KDEVPDBPROCESS_H
+
+#include <KProcess>
+
+#include <QByteArray>
+#include <QEventLoop>
+#include <QList>
+#include <QLocalSocket>
+#include <QMutex>
+#include <QObject>
+#include <QString>
+#include <QTemporaryDir>
+#include <QUrl>
+
+Q_DECLARE_METATYPE(QLocalSocket::LocalSocketError);
+
+namespace Python {
+
+struct StartupInfo;
+
+/**
+ * A Manager for kdevpdb.py child process which handles:
+ * - Launching and quitting of the server kdevpdb.py process.
+ * - Passes in the inferior command line.
+ * - Handles the stdout/stderr output from the inferior.
+ * - Socket I/O and queuing of to-be-sent data-frames.
+ */
+class PdbProcess : public QObject
+{
+    Q_OBJECT
+public:
+    PdbProcess(QObject* parent = nullptr);
+    ~PdbProcess();
+
+    /**
+     * Create the process and setup the I/O to it.
+     * @param info the start-up details of the interpreter and the inferior.
+     */
+    void start(const StartupInfo& info);
+
+    /**
+     * How many data-frames the server will send once we initialize() it. @see kdevpdb.py __init__()
+     * method, this value must be kept in-sync with the number pre-inserted frames.
+     */
+    static constexpr int FRAMES_BEFORE_READY = 1;
+
+    /**
+     * Enqueue a data-frame to the debugger.
+     * @param data a data-frame to be queued.
+     * @note kdevpdb.py only accepts the commands in the following format:
+     *       JSON: { "seq": < number>, "input": ["command", "1st argument", "2nd argument", ...]}
+     *       The entire payload must be utf8 encoded.
+     */
+    void sendCommand(const QByteArray data);
+
+    enum ControlCommand : int32_t {
+        DoNothing = 0,
+        Terminate = -1, //!< Request the server to close it's connection and quit.
+        InterruptDisallowed = -2, //!< Internal to PdbProcess, cannot be sent.
+        InterruptAllowed = -3, //!< Internal to PdbProcess, cannot be sent.
+    };
+    /**
+     * Enqueue a escape frame.
+     * @note Escape frames are immediately processed by the kdevpdb.py's receiver thread even if
+     *       the debugger is busy. However, the escape frame is queued with synchronizeFirst =
+     *       true, to wait for all previous commands to complete before it is sent.
+     */
+    void sendControlCommand(ControlCommand code);
+
+    /**
+     * Get the process.
+     */
+    KProcess* process() const
+    {
+        return m_debuggerProcess;
+    }
+
+    /**
+     * Kill the debugger process ungracefully.
+     * @note Waits that the process has exited before returning. Also inhibits all PdbProcess signals
+     *       so e.g. finished() will not be emitted.
+     */
+    void killNow();
+
+    /**
+     * Ask the debugger to stop running the inferior's code or break out of processing a command.
+     * @note Only interrupts the process if we are currently waiting for a response.
+     * @return true, if an interrupt was made.
+     * @warn The debugger may stop at an arbitrary point.
+     */
+    bool tryInterrupt();
+
+    /**
+     * Check if the debugger is busy: until all (queued) commands are actually sent, and their
+     * responses have been received, returns true.
+     */
+    bool isBusy() const;
+
+    /**
+     * Emit suspended() if the debugger is not busy.
+     */
+    void signalSuspended();
+
+Q_SIGNALS:
+    /**
+     * Emitted when a non-empty data-frame has been received.
+     * @note The payload data is utf8 encoded. JSON: {"seq": < number>, "data": [objects]} The
+     *       response "data" is a list of objects in a unspecified order. The listed objects are
+     *       dictionaries with a single key such as "frames", "message", "error", etc.
+     */
+    void dataReceived(const QByteArray& data);
+
+    /**
+     * Standard output data available.
+     */
+    void stdoutAvailable(QByteArray data);
+
+    /**
+     * Standard error data available.
+     */
+    void stderrAvailable(QByteArray data);
+
+    /**
+     * Emitted once the connection is up and I/O can happen.
+     */
+    void ready();
+
+    /**
+     * Emitted when we have pending commands that cannot be sent yet.
+     */
+    void running();
+
+    /**
+     * Emitted when all commands processed and their responses have arrived.
+     */
+    void suspended();
+
+    /**
+     * Emitted when the connection has stopped/failed for any reason.
+     */
+    void socketStatus(QLocalSocket::LocalSocketError reason);
+
+    /**
+     * Emitted once the PdbWorker has completed all of its tasks:
+     * - The process has terminated.
+     * - All necessary data has been read from the process.
+     * - Connection has stopped/failed.
+     */
+    void finished();
+
+private Q_SLOTS:
+    // Launched process terminated.
+    void processEnded(int exitCode, QProcess::ExitStatus exitStatus);
+    void processError(QProcess::ProcessError error);
+    // Error happened on the socket.
+    void error(QLocalSocket::LocalSocketError reason);
+    // Try to read more data from the socket.
+    void tryRecvFrame();
+    // Possible to read more data from the process stdout/stderr.
+    void processIoReady(int channel);
+
+private:
+    /// How large a received data-frame can be before we warn.
+    static constexpr int32_t WARN_TOO_BIG_FRAMESIZE = 1024 * 1024 * 128;
+    /// How large a received data-frame can be before we kill the connection.
+    static constexpr int32_t DIE_TOO_BIG_FRAMESIZE = 1024 * 1024 * 512;
+    QTemporaryDir m_socketdir;
+    KProcess* m_debuggerProcess = nullptr;
+    QEventLoop* m_exitWait = nullptr;
+    /// The socket.
+    QLocalSocket* m_socket = nullptr;
+    /// Data-frame receiving.
+    QByteArray m_frameBuf;
+    int32_t m_frameRecv = -1;
+    /// Data-frame send FIFO.
+    struct DataFrame
+    {
+        /// Payload length (bytes) or if less or equal to zero a escape-code.
+        int32_t hdr;
+        QByteArray data;
+        bool synchronizeFirst = true;
+    };
+    QList<DataFrame> m_sendQueue;
+    /// Debugger synchronization state.
+    int m_recvFrames = 0;
+    int m_sentFrames = FRAMES_BEFORE_READY;
+    bool m_debuggerBusy = true;
+    bool m_allowInterrupt = false;
+
+    void connectToServer();
+    void trySendFrame();
+};
+
+} // namespace Python
+
+#endif
\ No newline at end of file
diff -pruN 24.12.3-1/debugger/startupinfo.h 25.11.80-0ubuntu1/debugger/startupinfo.h
--- 24.12.3-1/debugger/startupinfo.h	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/startupinfo.h	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,28 @@
+/*
+    SPDX-FileCopyrightText: 2025 Jarmo Tiitto <jarmo.tiito@gmail.com>
+
+    SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+#ifndef STARTUPINFOSTRUCT_H
+#define STARTUPINFOSTRUCT_H
+
+#include <QProcessEnvironment>
+#include <QString>
+#include <QStringList>
+#include <QUrl>
+
+namespace Python {
+
+struct StartupInfo
+{
+    QString scriptPath;
+    QString debuggerPath;
+    QStringList interpreter;
+    QStringList args;
+    QUrl workingDirectory;
+    QProcessEnvironment environment;
+};
+
+}
+#endif
diff -pruN 24.12.3-1/debugger/variable.cpp 25.11.80-0ubuntu1/debugger/variable.cpp
--- 24.12.3-1/debugger/variable.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/variable.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -1,117 +1,403 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
 
 #include "variable.h"
+#include "variablecontroller.h"
 #include "debugsession.h"
 #include <interfaces/icore.h>
 
 #include <QDebug>
-#include <QRegularExpression>
-#include "debuggerdebug.h"
+#include "variabledebug.h"
 
 namespace Python {
 
-Variable::Variable(KDevelop::TreeModel* model, KDevelop::TreeItem* parent, const QString& expression, const QString& display)
+class VariableRequestHandler
+{
+    UpdateGuard m_guard;
+    QPointer<Variable> m_holder;
+
+public:
+    VariableRequestHandler(Variable* var)
+        : m_guard(var->collection())
+        , m_holder(var)
+    {
+    }
+    virtual ~VariableRequestHandler()
+    {
+    }
+
+    void operator()(const ResponseData& d)
+    {
+        auto* const var = m_holder.data();
+        if (!var) {
+            cleanup(d);
+        } else {
+            process(*var, d);
+        }
+    }
+    virtual void process(Variable& self, const ResponseData& d) = 0;
+    virtual void cleanup(const ResponseData& /*d*/)
+    {
+        qCWarning(KDEV_PYTHON_VARIABLECONTROLLER) << "Variable was deleted before its update completed";
+    }
+};
+
+Variable::Variable(KDevelop::TreeModel* model, KDevelop::TreeItem* parent, int collection, const QString& expression,
+                   const QString& display)
     : KDevelop::Variable(model, parent, expression, display)
-    , m_notifyCreated(nullptr)
-    , m_pythonPtr(0)
+    , m_collection(collection)
+{
+    // Copy the namespace id from the parent if possible.
+    if (auto* const var = qobject_cast<Python::Variable*>(parent)) {
+        m_nsId = var->m_nsId;
+    }
+}
+
+Variable::~Variable()
+{
+    if (!KDevelop::ICore::self() || !KDevelop::ICore::self()->debugController())
+        return;
+    if (m_is_watch && namespaceId() < -2) {
+        session()->debugger()->request({QStringLiteral("dropnamespace"), namespaceId()});
+    }
+}
+
+DebugSession* Variable::session()
+{
+    KDevelop::IDebugSession* is = KDevelop::ICore::self()->debugController()->currentSession();
+    return qobject_cast<DebugSession*>(is);
+}
+
+class EvalHandler : public VariableRequestHandler
+{
+    QObject* m_context;
+    const char* m_callback;
+
+public:
+    EvalHandler(Variable* self, QObject* context, const char* callback)
+        : VariableRequestHandler(self)
+        , m_context(context)
+        , m_callback(callback)
+    {
+    }
+
+    void process(Variable& self, const ResponseData& d) override
+    {
+        self.attachDone(d, m_context, m_callback);
+    }
+
+    void cleanup(const ResponseData& d) override
+    {
+        // var got deleted...
+        qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "attachMaybe() was aborted";
+        // Release the namespace id if it was assigned.
+        const auto result = responseObject(d, QStringLiteral("evaluate"));
+        const auto ns_id = result.value(QStringLiteral("namespace")).toInt();
+        if (ns_id < -2) {
+            Variable::session()->debugger()->request({QStringLiteral("dropnamespace"), ns_id});
+        }
+    }
+};
+
+void Variable::attachMaybe(QObject* context, const char* callback)
 {
+    if (auto* s = session(); !s || s->state() != DebugSession::PausedState) {
+        // KDevelop can call this function even if the inferior is running, so just don't.
+        if (context) {
+            QMetaObject::invokeMethod(context, callback, Qt::QueuedConnection, Q_ARG(bool, false));
+        }
+        return;
+    }
 
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "search for:" << expression();
+
+    // FIXME: expression() can be from an expanded tooltip that contains "foo/[0]"
+    //        This does not work since "foo/[0]" is syntactically wrong.
+
+    m_is_watch = true;
+    session()->debugger()->request(
+        {QStringLiteral("evalexpression"), QStringLiteral("'%1'").arg(expression()), namespaceId()},
+        EvalHandler(this, context, callback));
 }
 
-void Variable::dataFetched(QByteArray rawData)
+void Variable::attachDone(const ResponseData& d, QObject* context, const char* callback)
 {
-    QList<QByteArray> data = rawData.split('\n');
-    data.removeLast();
-    QByteArray value;
-    for (const QByteArray& item : std::as_const(data)) {
-        value.append(item);
+    const auto result = responseObject(d, QStringLiteral("evaluate"));
+    const auto ns_id = result.value(QStringLiteral("namespace")).toInt();
+    const auto inscope = result.value(QStringLiteral("inscope")).toBool();
+    if (!ns_id) {
+        qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "failed to lookup:" << expression();
+        if (context) {
+            QMetaObject::invokeMethod(context, callback, Qt::QueuedConnection, Q_ARG(bool, false));
+        }
+        return;
     }
-    setValue(QString::fromLatin1(value));
-    setHasMore(true);
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "value set to" << value << ", calling update method";
-    if ( m_notifyCreated ) {
-        QMetaObject::invokeMethod(m_notifyCreated, m_notifyCreatedMethod, Qt::QueuedConnection, Q_ARG(bool, true));
-        m_notifyCreated = nullptr;
+
+    setNamespaceId(ns_id);
+    setInScope(inscope);
+
+    if (!inscope) {
+        // The server accepted the ns_id but there is no value available.
+        if (context) {
+            QMetaObject::invokeMethod(context, callback, Qt::QueuedConnection, Q_ARG(bool, true));
+        }
+        return;
+    }
+
+    // Process the "enumeratevariables" response.
+    const auto var = responseObject(d, QStringLiteral("variable"));
+    const PythonId ptr = var.value(QStringLiteral("ptr")).toInt();
+    setId(ptr);
+    // Process the 'inspect' response.
+    valueFetched(d);
+
+    if (context) {
+        QMetaObject::invokeMethod(context, callback, Qt::QueuedConnection, Q_ARG(bool, true));
     }
 }
 
-void Variable::attachMaybe(QObject* callback, const char* callbackMethod)
+class FetchHandler : public VariableRequestHandler
 {
-    IDebugSession* is = ICore::self()->debugController()->currentSession();
-    DebugSession* s = static_cast<DebugSession*>(is);
-    s->createVariable(this, callback, callbackMethod);
+public:
+    FetchHandler(Variable* self)
+        : VariableRequestHandler(self)
+    {
+    }
+    void process(Variable& self, const ResponseData& d) override
+    {
+        self.valueFetched(d);
+    }
+};
+
+void Variable::fetchValue()
+{
+    session()->debugger()->request({QStringLiteral("inspectvalue"), int(m_pythonPtr), m_nsId}, FetchHandler(this));
+}
+
+class EnumerateHandler : public VariableRequestHandler
+{
+public:
+    EnumerateHandler(Variable* self)
+        : VariableRequestHandler(self)
+    {
+    }
+    void process(Variable& self, const ResponseData& d) override
+    {
+        const auto fetched = self.variablesEnumerated(d);
+        self.enumerateDone(fetched);
+    }
+};
+
+void Variable::valueFetched(const ResponseData& d)
+{
+    auto errors = responseValue(d, QStringLiteral("error"));
+    if (!errors.isUndefined()) {
+        qCWarning(KDEV_PYTHON_VARIABLECONTROLLER) << "inspectvalue failed:" << errors.toString();
+        return;
+    }
+
+    const auto result = responseObject(d, QStringLiteral("inspect"));
+    if (result.empty()) {
+        // failed.
+        more_ = ellipsis_;
+        deleteChildren();
+        setValue(QString());
+        setType(QString());
+        return;
+    }
+
+    bool firstInit = m_maxItems == -1;
+    m_maxItems = result.value(QStringLiteral("count")).toInt();
+    m_expandBy = qMin(result.value(QStringLiteral("expandhint")).toInt(1), m_maxItems);
+
+    QString data;
+    if (result.contains(QStringLiteral("data"))) {
+        data = result.value(QStringLiteral("data")).toString();
+    }
+    if (result.contains(QStringLiteral("len"))) {
+        const int len = result.value(QStringLiteral("len")).toInt();
+        if (data.isEmpty()) {
+            data = QStringLiteral("len=%1").arg(len);
+        } else {
+            data = QStringLiteral("len=%1, %2").arg(len).arg(data);
+        }
+    }
+
+    bool changed = result.value(QStringLiteral("changed")).toBool();
+    bool report = changed != isChanged();
+    if (value() != data) {
+        itemData[KDevelop::VariableCollection::ValueColumn] = data;
+        report = true;
+    }
+
+    const auto typeident = result.value(QStringLiteral("type")).toString();
+    if (type() != typeident) {
+        itemData[KDevelop::VariableCollection::TypeColumn] = typeident;
+        report = true;
+    }
+
+    if (report) {
+        // This assumes setChange() unconditionally calls reportChange().
+        // Thus, this updates all of value(), type() and isChanged() in one go.
+        setChanged(changed);
+    }
+
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << expression() << "children:" << childItems.size() << "->" << m_maxItems
+                                            << "type:" << typeident << "data:" << data << "changed:" << changed;
+
+    if (!m_maxItems) {
+        // No children.
+        more_ = ellipsis_;
+        deleteChildren();
+    }
+
+    if (firstInit || childItems.empty()) {
+        // How setHasMoreInitial() should be used is beyond me...
+        more_ = ellipsis_;
+        setHasMore(m_maxItems);
+        // No need to update existing children.
+        return;
+    }
+
+    Q_ASSERT(!m_pendingUpdates);
+    ++m_pendingUpdates;
+    // Update all existing children.
+    const auto count = qMin(m_maxItems, childItems.size());
+    session()->debugger()->request({QStringLiteral("enumeratevariables"), int(m_pythonPtr), m_nsId, count},
+                                   EnumerateHandler(this));
+}
+
+void Variable::enumerateDone(const QList<Variable*>& fetched)
+{
+    // var->die() modifies childItems...
+    const auto list = childItems;
+    for (auto* const item : std::as_const(list)) {
+        Q_ASSERT(qobject_cast<Variable*>(item));
+        auto* var = static_cast<Variable*>(item);
+
+        if (fetched.contains(var)) {
+            var->fetchValue();
+        } else {
+            qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "removing:" << var->expression();
+            Q_ASSERT(!var->m_pendingUpdates);
+            var->die();
+        }
+    }
+
+    updateHasMore();
+}
+
+void Variable::updateHasMore()
+{
+    more_ = ellipsis_;
+    setHasMore(m_maxItems > childItems.size());
+
+    --m_pendingUpdates;
+    if (m_pendingUpdates) {
+        QMetaObject::invokeMethod(this, &Variable::tryFetchMoreChildren, Qt::QueuedConnection);
+    }
 }
 
-// TODO: make it really fetch *more*, not just some
 void Variable::fetchMoreChildren()
 {
-    QString cmd;
-    if ( m_pythonPtr ) {
-        cmd = QStringLiteral("__kdevpython_debugger_utils.format_ptr_children(") + QString::number(m_pythonPtr) + QStringLiteral(")\n");
-    }
-    else {
-        cmd = QStringLiteral("__kdevpython_debugger_utils.format_object_children(") + expression() + QStringLiteral(")\n");
-    }
-    InternalPdbCommand* fetchChildrenScript = new InternalPdbCommand(this, "moreChildrenFetched", cmd);
-    static_cast<DebugSession*>(ICore::self()->debugController()->currentSession())->addCommand(fetchChildrenScript);
-}
-
-void Variable::setId(unsigned long int id)
-{
-    m_pythonPtr = id;
-}
-
-void Variable::moreChildrenFetched(QByteArray rawData)
-{
-    deleteChildren();
-
-    QList<QByteArray> data = rawData.split('\n');
-    data.removeLast();
-    int i = 0;
-    int initialLength = data.length();
-    static QRegularExpression formatExtract(QStringLiteral("(ptr:<(\\d*)>\\s)?([\\[\\]\\.a-zA-Z0-9_]+) \\=\\> (.*)$"),
-                                            QRegularExpression::InvertedGreedinessOption);
-    while ( i < data.length() ) {
-        QByteArray d = data.at(i);
-        // sort magic functions at the end of the list, they're not too interesting usually
-        if ( d.startsWith('_') && i < initialLength ) {
-            data.append(d);
-            i++;
-            continue;
-        }
-
-        QString childName;
-        QString realValue;
-        QString prettyName;
-        unsigned long int pythonId = 0;
-        auto match = formatExtract.match(QString::fromLatin1(d));
-        if ( match.hasMatch() ) {
-            QString id = match.captured(2);
-            if ( ! id.isEmpty() ) {
-                pythonId = id.toLong();
-            }
-            childName = expression() + match.captured(3);
-            prettyName = match.captured(3);
-            realValue = match.captured(4);
-        }
-        else {
-            i++;
-            continue;
-        }
-        Variable* v = new Variable(model_, this, childName, prettyName);
-        appendChild(v);
-        qCDebug(KDEV_PYTHON_DEBUGGER) << "adding child:" << expression() << i << d;
-        v->setValue(realValue);
-        v->setId(pythonId);
-        v->setHasMoreInitial(true);
-        i++;
+    if (m_pendingUpdates) {
+        // The user attempted this action before the last update had completed...
+        ++m_pendingUpdates;
+        return;
     }
+    ++m_pendingUpdates;
+    tryFetchMoreChildren();
 }
 
+class FetchMoreHandler : public VariableRequestHandler
+{
+public:
+    FetchMoreHandler(Variable* self)
+        : VariableRequestHandler(self)
+    {
+    }
+
+    void process(Variable& self, const ResponseData& d) override
+    {
+        // Process the response.
+        const auto fetched = self.variablesEnumerated(d);
+        // Update any added children.
+        for (auto* const var : std::as_const(fetched)) {
+            var->fetchValue();
+        }
+
+        self.updateHasMore();
+    }
+};
+
+void Variable::tryFetchMoreChildren()
+{
+    Q_ASSERT(m_pendingUpdates);
+    if (m_maxItems <= 0 || childItems.size() >= m_maxItems) {
+        --m_pendingUpdates;
+        return;
+    }
+
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "expand" << expression();
+
+    // Enumerate more of the variable's children.
+    // (The server continues the enumeration from the last point, so count is relative)
+    const auto count = qMin(m_expandBy, m_maxItems - childItems.size());
+    session()->debugger()->request({QStringLiteral("enumeratevariables"), int(m_pythonPtr), m_nsId, count},
+                                   FetchMoreHandler(this));
+}
+
+std::pair<Variable*, bool> Variable::findOrCreateChild(QString longname, QString expr)
+{
+    for (auto* const item : std::as_const(childItems)) {
+        Q_ASSERT(qobject_cast<Variable*>(item));
+        auto* const var = static_cast<Variable*>(item);
+        if (var->expression() == longname) {
+            return {var, false};
+        }
+    }
+    return {new Variable(model_, this, m_collection, longname, expr), true};
+}
+
+QList<Variable*> Variable::variablesEnumerated(const ResponseData& d)
+{
+    QList<Variable*> fetched;
+    auto errors = responseValue(d, QStringLiteral("error"));
+    if (!errors.isUndefined()) {
+        qCWarning(KDEV_PYTHON_VARIABLECONTROLLER) << "fetching a children failed:" << errors.toString();
+        return fetched;
+    }
+
+    const auto list = responseValue(d, QStringLiteral("variables")).toArray();
+    for (auto& result : std::as_const(list)) {
+        if (!result.isObject()) {
+            // All children fetched.
+            return fetched;
+        }
+        const auto obj = result.toObject();
+        const auto expr = obj.value(QStringLiteral("expression")).toString();
+        // longname can contain dots so using '/' enables splitting the longname to its components
+        // if a such need arises. This also follows how kdevpdbvariablesupport.py: _enumerateHandle()
+        // generates the longnames.
+        const QString longname = expression() + QLatin1Char('/') + expr;
+        const PythonId ptr = obj.value(QStringLiteral("ptr")).toInt();
+
+        auto [var, isnew] = findOrCreateChild(longname, expr);
+        fetched.emplace_back(var);
+        var->setId(ptr);
+        // the child must originate from the same namespace as this.
+        Q_ASSERT(var->namespaceId() == m_nsId);
+
+        if (isnew) {
+            insertChild(childItems.size(), var);
+        }
+    }
+    return fetched;
+}
 }
 
 #include "moc_variable.cpp"
diff -pruN 24.12.3-1/debugger/variable.h 25.11.80-0ubuntu1/debugger/variable.h
--- 24.12.3-1/debugger/variable.h	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/variable.h	2025-11-09 03:41:22.000000000 +0000
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
@@ -7,16 +8,33 @@
 #ifndef VARIABLE_H
 #define VARIABLE_H
 
+#include <QList>
+#include <QPointer>
+
 #include <debugger/variable/variablecollection.h>
 
+#include "pdbdebuggerinstance.h"
+
 namespace Python {
 
+class DebugSession;
+
+/// A unsigned integer large enough to hold a handle.
+typedef unsigned int PythonId;
+
 class Variable : public KDevelop::Variable
 {
 Q_OBJECT
 public:
-    Variable(KDevelop::TreeModel* model, TreeItem* parent, const QString& expression, const QString& display = QString());
-    
+    /**
+     * Construct a variable.
+     * @note If possible, the namespaceId() is inherited from @p parent.
+     */
+    Variable(KDevelop::TreeModel* model, TreeItem* parent, int collection, const QString& expression,
+             const QString& display = QString());
+
+    ~Variable();
+
     /**
      * @brief Fetch this variable's value, and notify callback::callbackMethod when done.
      *
@@ -26,31 +44,81 @@ public:
     void attachMaybe(QObject* callback = nullptr, const char* callbackMethod = nullptr) override;
     
     /**
-     * @brief Fetches children (list items, object attributes...) for this variable.
-     * TODO: Should fetch more children, it currently simply fetches all children which is not so good
-     * if there's 20.000 of them
-     * This is invoked if the user clicks the "expand" icon in any variable tree view
+     * @brief Fetches more children (list items, object attributes...) for this variable.
+     * This is invoked if the user clicks the "expand" icon in any variable tree view.
      **/
     void fetchMoreChildren() override;
-    
-    QObject* m_notifyCreated;
-    const char* m_notifyCreatedMethod;
-public Q_SLOTS:
+
+    static DebugSession* session();
+
     /**
-     * @brief Parse the debugger output and update this variable's value.
-     **/
-    void dataFetched(QByteArray rawData);
+     * @brief Fetch this variable's value.
+     */
+    void fetchValue();
+
     /**
-     * @brief Parse the debugger output and add children to this variable.
+     * @brief Set this object's python ID.
      **/
-    void moreChildrenFetched(QByteArray rawData);
+    void setId(PythonId id)
+    {
+        m_pythonPtr = id;
+    }
+    PythonId id() const
+    {
+        return m_pythonPtr;
+    }
+
     /**
-     * @brief Set this object's python ID
+     * @brief Set this object's "namespace id".
      **/
-    void setId(long unsigned int id);
+    void setNamespaceId(int nsid)
+    {
+        m_nsId = nsid;
+    }
+    int namespaceId() const
+    {
+        return m_nsId;
+    }
+    /// Collection index of this variable.
+    int collection()
+    {
+        return m_collection;
+    }
+
+private Q_SLOTS:
+    /**
+     * Try fetch more children.
+     * @note m_pendingUpdates must be incremented before calling this.
+     */
+    void tryFetchMoreChildren();
+
 private:
-    /// A unique ID of the python object pointed to by this variable.
-    unsigned long int m_pythonPtr;
+    /// Which collection this variable is part of? ("Locals", "Globals", "Watches" or "Return info")
+    const int m_collection;
+    /// A unique ID of the python object associated with this variable.
+    PythonId m_pythonPtr = 0;
+    /// To what namespace this variable is bound to?
+    int m_nsId = -1;
+    /// Number of items to expand by
+    int m_expandBy = 1;
+    /// Count of possible children.
+    int m_maxItems = -1;
+    /// Account deferred fetchMoreChildren() calls.
+    int m_pendingUpdates = 0;
+    /// True, if this is a watch root variable.
+    bool m_is_watch = false;
+
+    /**
+     * Try insert a new child or return an existing child.
+     */
+    std::pair<Variable*, bool> findOrCreateChild(QString longname, QString expr);
+
+public:
+    void valueFetched(const ResponseData& data);
+    QList<Variable*> variablesEnumerated(const ResponseData& data);
+    void enumerateDone(const QList<Variable*>& fetched);
+    void updateHasMore();
+    void attachDone(const ResponseData& d, QObject* object, const char* method);
 };
 
 }
diff -pruN 24.12.3-1/debugger/variablecontroller.cpp 25.11.80-0ubuntu1/debugger/variablecontroller.cpp
--- 24.12.3-1/debugger/variablecontroller.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/variablecontroller.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
@@ -7,7 +8,6 @@
 #include "variablecontroller.h"
 #include "variable.h"
 #include "debugsession.h"
-#include "pdbframestackmodel.h"
 #include <codehelpers.h>
 #include <language/duchain/duchainlock.h>
 #include <language/duchain/declaration.h>
@@ -15,7 +15,7 @@
 #include <interfaces/ilanguagecontroller.h>
 
 #include <debugger/variable/variablecollection.h>
-#include <debugger/framestack/framestackmodel.h>
+#include <debugger/interfaces/iframestackmodel.h>
 #include <interfaces/icore.h>
 #include <QStack>
 #include <KMessageBox>
@@ -23,18 +23,70 @@
 
 #include <QDebug>
 #include <QRegularExpression>
-#include "debuggerdebug.h"
-
-using namespace KDevelop;
+#include "variabledebug.h"
 
 namespace Python {
 
-VariableController::VariableController(IDebugSession* parent) : IVariableController(parent)
+VariableController::VariableController(KDevelop::IDebugSession* parent)
+    : IVariableController(parent)
+    , m_collections{Collection{UpdateType::UpdateLocals, variableCollection()->locals(),
+                               std::bind(&VariableController::doLocalsUpdate, this), {}},
+                    Collection{UpdateType::UpdateReturnInfo, variableCollection()->locals(i18n("Return info")),
+                               std::bind(&VariableController::doReturnInfoUpdate, this), {}},
+                    Collection{UpdateType::UpdateGlobals, variableCollection()->locals(i18n("Globals")),
+                               std::bind(&VariableController::doGlobalsUpdate, this), {}},
+                    Collection{UpdateType::UpdateWatches, variableCollection()->watches(),
+                               std::bind(&VariableController::doWatchesUpdate, this), {}}}
 {
-    m_updateTimer.setSingleShot(true);
-    m_updateTimer.setInterval(100);
-    QObject::connect(&m_updateTimer, &QTimer::timeout,
-                     this, &VariableController::_update);
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "constructing VariableController";
+
+    /*
+     * TreeItem::isExpanded() is not an public method and this causes quite a headache. Any custom
+     * collection(s) also won't get updated (or created) unless we do this ourselves.
+     * To partially work-around this:
+     * 1. Connect TreeItem::expanded() signal to a lambda, which sets a flag and calls our updateCollections().
+     * 2. Connect TreeItem::collapsed() signal to a lambda, which clears a flag.
+     * This allows us to at least attempt updating all collections when user expands
+     * them, and skip updating while the collection is collapsed.
+     * FIXME: The m_isExpanded can get out-of-sync with what the state of isExpanded() is,
+     *        since we have no way to query this and the Locals and Watches can live longer than
+     *        VariableController. We may also miss an update when the variable widget is shown/hidden.
+     *        (can detect only hiding via autoUpdate() which is useless...)
+     */
+    for (auto& item : m_collections) {
+        auto expander = [&, flag = item.flag]() {
+            m_updateRequested |= flag;
+            m_isExpanded |= flag;
+            updateCollections();
+        };
+        auto collapser = [&, flag = item.flag]() {
+            m_isExpanded &= ~flag;
+        };
+        // The four argument connect() must be used here or else the connections are not cleaned up
+        // when VariableController is destroyed.
+        Q_ASSERT(item.collection);
+        connect(item.collection, &KDevelop::TreeItem::expanded, this, expander);
+        connect(item.collection, &KDevelop::TreeItem::collapsed, this, collapser);
+
+        // The user cannot expand collection without this...
+        if (auto* collection = qobject_cast<KDevelop::Locals*>(item.collection)) {
+            collection->setHasMore(true);
+            /**
+             * FIXME: enable this code once KDevelop::Locals::isExpanded() becomes public
+            if (collection->isExpanded()) {
+                m_isExpanded |= item.flag;
+            } else {
+                m_isExpanded &= ~item.flag;
+            }
+            */
+        }
+    }
+}
+
+DebugSession* VariableController::session()
+{
+    KDevelop::IDebugSession* is = KDevelop::ICore::self()->debugController()->currentSession();
+    return qobject_cast<DebugSession*>(is);
 }
 
 void VariableController::addWatch(KDevelop::Variable* variable)
@@ -44,34 +96,36 @@ void VariableController::addWatch(KDevel
 
 void VariableController::addWatchpoint(KDevelop::Variable* /*variable*/)
 {
-    qCWarning(KDEV_PYTHON_DEBUGGER) << "addWatchpoint requested (not implemented)";
+    qCWarning(KDEV_PYTHON_VARIABLECONTROLLER) << "addWatchpoint requested (not implemented)";
 }
 
-void VariableController::handleEvent(IDebugSession::event_t event)
+KDevelop::Variable* VariableController::createVariable(KDevelop::TreeModel* model, KDevelop::TreeItem* parent, const QString& expression, const QString& display)
 {
-    if ( event == IDebugSession::thread_or_frame_changed ) {
-        DebugSession* s = static_cast<DebugSession*>(session());
-        PdbFrameStackModel* model = static_cast<PdbFrameStackModel*>(s->frameStackModel());
-        int delta = model->currentFrame() - model->debuggerAtFrame();
-        model->setDebuggerAtFrame(model->currentFrame());
-        bool positive = delta > 0;
-        qCDebug(KDEV_PYTHON_DEBUGGER) << "changing frame by" << delta;
-        for ( int i = delta; i != 0; i += ( positive ? -1 : 1 ) ) {
-            qCDebug(KDEV_PYTHON_DEBUGGER) << ( positive ? "up" : "down" ) << model->currentFrame() << model->debuggerAtFrame();
-            s->addSimpleInternalCommand(positive ? QStringLiteral("up") : QStringLiteral("down"));
-        }
+    // Put the variable into one of the collections:
+    // This is propagated up in the tree to account the queued request handlers in each collection.
+    if (qobject_cast<KDevelop::Watches*>(parent) || qobject_cast<KDevelop::TooltipRoot*>(parent)) {
+        // Tooltips and watches are accounted in the Watches collection.
+        return new Variable(model, parent, UpdateGuard::WatchesIndex, expression, display);
     }
-    KDevelop::IVariableController::handleEvent(event);
-}
 
-KDevelop::Variable* VariableController::createVariable(KDevelop::TreeModel* model, KDevelop::TreeItem* parent, const QString& expression, const QString& display)
-{
-    return new Variable(model, parent, expression, display);
+    // Parent can only be a Locals TreeItem
+    Q_ASSERT(qobject_cast<KDevelop::Locals*>(parent));
+
+    const auto itr = std::find_if(m_collections.cbegin(), m_collections.cend(), [parent](const Collection& c) {
+        return c.collection == parent;
+    });
+    Q_ASSERT(itr != m_collections.end());
+
+    const int collectionIndex = std::distance(m_collections.cbegin(), itr);
+    Q_ASSERT(collectionIndex >= UpdateGuard::LocalsIndex);
+    Q_ASSERT(collectionIndex < UpdateGuard::WatchesIndex);
+    return new Variable(model, parent, collectionIndex, expression, display);
 }
 
 KTextEditor::Range VariableController::expressionRangeUnderCursor(KTextEditor::Document* doc, const KTextEditor::Cursor& cursor)
 {
     QString prefix;
+    using namespace KDevelop;
     DUChainReadLocker lock;
     if ( ! doc->isModified() ) {
         if ( TopDUContext* context = DUChain::self()->chainForDocument(doc->url()) ) {
@@ -84,7 +138,8 @@ KTextEditor::Range VariableController::e
         }
     }
     else {
-        qCDebug(KDEV_PYTHON_DEBUGGER) << "duchain unavailable for document" << doc->url() << "or document out of date";
+        qCDebug(KDEV_PYTHON_VARIABLECONTROLLER)
+            << "duchain unavailable for document" << doc->url() << "or document out of date";
     }
 
     TextDocumentLazyLineFetcher linefetcher(doc);
@@ -93,75 +148,317 @@ KTextEditor::Range VariableController::e
     return {startCursor, startCursor + KTextEditor::Cursor{0, static_cast<int>(text.length())}};
 }
 
-void VariableController::localsUpdateReady(QByteArray rawData)
+void VariableController::update()
 {
-    static QRegularExpression formatExtract(
-        QRegularExpression::anchoredPattern(QStringLiteral("([a-zA-Z0-9_]+) \\=\\> (.*)")));
-    QList<QByteArray> data = rawData.split('\n');
-    data.removeAll({});
-    qCDebug(KDEV_PYTHON_DEBUGGER) << "locals update:" << data;
-
-    int i = 0;
-    QStringList vars;
-    QMap<QString, QString> values;
-    while ( i < data.length() ) {
-        QByteArray d = data.at(i);
-        auto match = formatExtract.match(QString::fromLatin1(d));
-        if ( match.hasMatch() ) {
-            QString key = match.captured(1);
-            vars << key;
-            values[key] = match.captured(2);
-        }
-        else qCWarning(KDEV_PYTHON_DEBUGGER) << "mismatch:" << d;
-        i++;
-    }
-
-    QList<KDevelop::Variable*> variableObjects = KDevelop::ICore::self()->debugController()->variableCollection()
-                                                 ->locals()->updateLocals(vars);
-    for ( int i = 0; i < variableObjects.length(); i++ ) {
-        KDevelop::Variable* v = variableObjects[i];
-
-        auto model = v->model();
-        auto parent = model->indexForItem(v, 0);
-        auto childCount = v->model()->rowCount(parent);
-        qCDebug(KDEV_PYTHON_DEBUGGER) << "updating:" << v->expression() << "active children:" << childCount;
-        for ( int j = 0; j < childCount; j++ ) {
-            auto index = model->index(j, 0, parent);
-            auto child = static_cast<KDevelop::TreeItem*>(index.internalPointer());
-            if ( auto childVariable = qobject_cast<Variable*>(child) ) {
-                qCDebug(KDEV_PYTHON_DEBUGGER) << "   got child var:" << childVariable->expression();
-                v->fetchMoreChildren();
-                break;
-            }
+    // This a stub method. Actual update happens via handleEvent() and updateCollections()
+}
+
+void VariableController::handleEvent(KDevelop::IDebugSession::event_t event)
+{
+    if (!variableCollection())
+        return;
+
+    // Sync m_isExpanded from autoUpdate() state.
+    m_isExpanded.setFlag(UpdateType::UpdateLocals, autoUpdate() & UpdateType::UpdateLocals);
+    m_isExpanded.setFlag(UpdateType::UpdateWatches, autoUpdate() & UpdateType::UpdateWatches);
+
+    // Note: PdbFrameStackModel queues a "selectframe" command after this method. The call to
+    // updateCollections() is deferred here to order any commands we may queue after the "selectframe".
+
+    if (event == KDevelop::IDebugSession::program_state_changed) {
+        // The program state has expired and so we must re-fetch *everything* again.
+        session()->debugger()->request({QStringLiteral("cleanupobjects")}, [](const ResponseData& d) {
+            // This handler is just for logging that cleanupobjects is doing its job.
+            const auto obj = responseObject(d, QStringLiteral("released"));
+            int purged = obj.value(QStringLiteral("purged")).toInt();
+            int pinned = obj.value(QStringLiteral("pinned")).toInt();
+            qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "purged:" << purged << "pinned:" << pinned;
+        });
+
+        // Ensure that all other than Locals collection will be updated.
+        m_updateRequested = ~UpdateTypes(UpdateLocals);
+        m_updateStarted = UpdateType::UpdateNone;
+        session()->debugger()->defer([this](const ResponseData&) { updateCollections(); });
+        return;
+    }
+
+    if (session()->frameStackModel()->currentFrame() == -1 || event != KDevelop::IDebugSession::thread_or_frame_changed)
+        return;
+
+    // Invoking IVariableController::handleEvent() doesn't make sense for us:
+    // 1. IVariableController::updateIfFrameOrThreadChanged() calls root()->resetChanged() which would throw away
+    //    the changed state which has been applied to *all* collections since program_state_changed.
+    // 2. updateCollections() already checks all preconditions before doing an update.
+    // 3. The collections expanded() and collapsed() signals have been connected to updateCollections().
+    if (autoUpdate() & UpdateLocals) {
+        m_updateRequested |= UpdateType::UpdateLocals;
+    }
+
+    // FIXME: no way to detect when the variable widget is being shown to set all m_updateRequested bits on.
+    //        Result: If the variable widget isn't visible when stepping no update may happen until the next
+    //        thread_or_frame_changed event or re-expanding an collection item.
+
+    session()->debugger()->defer([this](const ResponseData&) { updateCollections(); });
+}
+
+UpdateGuard::UpdateGuard(int index)
+    : m_collection(index)
+{
+    Q_ASSERT(index >= UpdateGuard::LocalsIndex);
+    Q_ASSERT(index <= UpdateGuard::WatchesIndex);
+    pendingRequests(1);
+}
+
+UpdateGuard::UpdateGuard(const UpdateGuard& copy)
+    : m_collection(copy.m_collection)
+{
+    pendingRequests(1);
+}
+
+UpdateGuard::~UpdateGuard()
+{
+    pendingRequests(-1);
+}
+
+void UpdateGuard::pendingRequests(int adjust)
+{
+    if (auto* s = VariableController::session()) {
+        if (auto* ctrl = qobject_cast<Python::VariableController*>(s->variableController())) {
+            ctrl->pendingRequests(adjust, m_collection);
+            return;
         }
+    }
+    // The debug session is likely exiting due to a bug.
+    qCCritical(KDEV_PYTHON_VARIABLECONTROLLER) << "failed to account the number of operations!";
+}
+
+void VariableController::pendingRequests(int adjust, int index)
+{
+    auto& collection = m_collections[index];
+    if (adjust > 0) {
+        ++collection.pending;
+    } else {
+        --collection.pending;
+    }
+
+    if (collection.pending)
+        return;
+
+    // Clear flag on m_updateStarted since it's now safe to update this collection.
+    m_updateStarted &= ~collection.flag;
 
-        v->setValue(values[v->expression()]);
-        v->setHasMoreInitial(true);
+    if (m_updateDeferred & collection.flag) {
+        m_updateDeferred &= ~collection.flag;
+        m_updateRequested |= collection.flag;
+        QMetaObject::invokeMethod(this, &VariableController::updateCollections, Qt::QueuedConnection);
     }
 }
 
-void VariableController::update() {
-    m_updateTimer.start();
+void VariableController::fetchFrameLocals(const ResponseData& d)
+{
+    const auto data = responseObject(d, QStringLiteral("locals"));
+    if (data.empty()) {
+        qCWarning(KDEV_PYTHON_VARIABLECONTROLLER) << "failed to enumerate stack-frame!";
+    }
+    // The debugger provides a "namespace id" that must be assigned to all created variables
+    // and propagated into all children variables.
+    // For frame objects, nsid is the index of the PDB frame object between zero and max frames - 1.
+    // (nsid therefore isn't same as kdevframe but is related to it.)
+    int nsid = data.value(QStringLiteral("namespace")).toInt();
+    int count = data.value(QStringLiteral("count")).toInt();
+    PythonId handle = data.value(QStringLiteral("ptr")).toInt();
+
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER).noquote() << "enumerating stack-frame:"
+        << QStringLiteral("ns_id=%1, count=%2, ptr=%3").arg(nsid).arg(count).arg(handle);
+
+    /**
+     * TODO: KDevelop's Locals or Variable classes provide no way to swap out/in a set of children
+     * from it such that we could more quickly update it. Perhaps mockingly, Variable::removeSelf() can
+     * detach a variable from Locals but there is *no way to insert* a variable back into Locals.
+     *
+     * Therefore, a better API such as making Locals::insertChild() public or perhaps: QList<
+     * TreeItem*> TreeItem::exchangeItems(QList< TreeItem*> newSet) which would replace all of the
+     * children in one-go and simply return the previous set of items without deleting any of them.
+     * (leaving the possible deletion of items to the caller.) Thus, until such support arrives in
+     * KDevelop, the penalty of updating Locals remains rather high:
+     *
+     * All of the local variables' children are destroyed when the user changes the selected
+     * stack-frame to different one, or when more stack-frames become available. The API limitation not
+     * only causes us lose how the variables were expanded, but we are forced rebuild the "Locals"
+     * collection from scratch each time a switch happens.
+     */
+    enumerateNamespace(nsid, count, handle, UpdateGuard::LocalsIndex, i18n("Locals"));
 }
 
-void VariableController::_update()
+void VariableController::fetchReturnInfo(const ResponseData& d)
 {
-    qCDebug(KDEV_PYTHON_DEBUGGER) << " ************************* update requested";
-    DebugSession* d = static_cast<DebugSession*>(parent());
-    if (autoUpdate() & UpdateWatches) {
-        variableCollection()->watches()->reinstall();
+    const auto data = responseObject(d, QStringLiteral("returninfo"));
+    if (data.empty()) {
+        qCWarning(KDEV_PYTHON_VARIABLECONTROLLER) << "failed to get return info!";
     }
 
-   if (autoUpdate() & UpdateLocals) {
-        // TODO find a more elegant solution for this import!
-        InternalPdbCommand* import = new InternalPdbCommand(nullptr, nullptr, QStringLiteral("import __kdevpython_debugger_utils\n"));
-        InternalPdbCommand* cmd = new InternalPdbCommand(this, "localsUpdateReady",
-                                  QStringLiteral("__kdevpython_debugger_utils.format_locals(__kdevpython_debugger_utils.__kdevpython_builtin_locals())\n"));
-        d->addCommand(import);
-        d->addCommand(cmd);
-   }
+    int nsid = data.value(QStringLiteral("namespace")).toInt();
+    int count = data.value(QStringLiteral("count")).toInt();
+    PythonId handle = data.value(QStringLiteral("ptr")).toInt();
+
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER).noquote()
+        << "enumerating return info:" << QStringLiteral("ns_id=%1, count=%2, ptr=%3").arg(nsid).arg(count).arg(handle);
+
+    enumerateNamespace(nsid, count, handle, UpdateGuard::ReturnInfoIndex, i18n("Return info"));
 }
 
+void VariableController::fetchGlobals(const ResponseData& d)
+{
+    const auto data = responseObject(d, QStringLiteral("globals"));
+    if (data.empty()) {
+        qCWarning(KDEV_PYTHON_VARIABLECONTROLLER) << "failed to enumerate globals";
+    }
+    int nsid = data.value(QStringLiteral("namespace")).toInt();
+    int count = data.value(QStringLiteral("count")).toInt();
+    PythonId handle = data.value(QStringLiteral("ptr")).toInt();
+
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER).noquote()
+        << "enumerating globals:" << QStringLiteral("ns_id=%1, count=%2, ptr=%3").arg(nsid).arg(count).arg(handle);
+
+    enumerateNamespace(nsid, count, handle, UpdateGuard::GlobalsIndex, i18n("Globals"));
+}
+
+void VariableController::enumerateNamespace(int nsid, int count, PythonId handle, int collection, QString name)
+{
+    auto itr = m_namespaces.find(nsid);
+    if (itr == m_namespaces.end()) {
+        itr = m_namespaces.emplace(nsid, QSharedPointer<Namespace>::create());
+    }
+    auto ns = *itr;
+    ns->name = name;
+    // Reset which variables can be kept.
+    for (auto& item : ns->items) {
+        item->remove = true;
+    }
+
+    // The last argument count + 1 ensures the server will release the enumeration handle.
+    session()->debugger()->request({QStringLiteral("enumeratevariables"), int(handle), nsid, count + 1},
+        [this, nsid, guard = UpdateGuard(collection)](const ResponseData& d) {
+            variablesEnumerated(d, nsid);
+    });
+}
+
+void VariableController::variablesEnumerated(const ResponseData& d, int nsid)
+{
+    auto errors = responseValue(d, QStringLiteral("error"));
+    if (!errors.isUndefined()) {
+        qCWarning(KDEV_PYTHON_VARIABLECONTROLLER) << "enumeratevariables failed:" << errors.toString();
+    }
+
+    Q_ASSERT(m_namespaces.contains(nsid));
+    auto ns = m_namespaces.find(nsid).value();
+
+    const auto list = responseValue(d, QStringLiteral("variables")).toArray();
+    for (auto result : list) {
+        if (!result.isObject()) {
+            continue;
+        }
+
+        const auto obj = result.toObject();
+        const auto expression = obj.value(QStringLiteral("expression")).toString();
+        auto itr = ns->items.find(expression);
+        if (itr == ns->items.end()) {
+            itr = ns->items.emplace(expression, ItemPtr::create());
+        }
+
+        auto& item = *itr.value();
+        item.remove = false;
+        item.ptr = obj.value(QStringLiteral("ptr")).toInteger();
+    }
+
+    // Drop removed items from ns->names
+    for (auto itr = ns->items.begin(); itr != ns->items.end();) {
+        if (itr.value()->remove) {
+            itr = ns->items.erase(itr);
+        } else {
+            ++itr;
+        }
+    }
+
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER)
+        << "enumeration of ns_id" << nsid << "completed, updating" << ns->name << "variables.";
+
+    auto* collection = variableCollection()->locals(ns->name);
+    const auto variables = collection->updateLocals(ns->items.keys());
+
+    for (auto* const itr : std::as_const(variables)) {
+        Q_ASSERT(qobject_cast<Variable*>(itr));
+        auto* const var = static_cast<Variable*>(itr);
+        const auto& item = *ns->items[var->expression()];
+
+        if (var->namespaceId() != nsid) {
+            // TODO: Can't keep any of the existing variable's children...
+            var->deleteChildren();
+        }
+
+        var->setId(item.ptr);
+        var->setNamespaceId(nsid);
+        var->fetchValue();
+    }
+}
+
+void VariableController::updateCollections()
+{
+    if (session()->state() != DebugSession::PausedState) {
+        // Can't update unless we are in PausedState.
+        return;
+    }
+
+    // What actually needs to be updated?
+    auto updateMask = m_updateRequested & m_isExpanded;
+
+    for (auto& updater : m_collections) {
+        if (!(updateMask & updater.flag))
+            continue;
+        if (updater.pending || (m_updateStarted & updater.flag)) {
+            // Defer the update. pendingRequests(-1)
+            // will call us again once the pending request count reaches zero.
+            m_updateDeferred |= updater.flag;
+        } else {
+            m_updateStarted |= updater.flag;
+            m_updateRequested &= ~updater.flag;
+            updater.fn();
+        }
+    }
+}
+
+void VariableController::doLocalsUpdate()
+{
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "starting Locals update";
+    session()->debugger()->request({QStringLiteral("framelocals")},
+        [this, guard = UpdateGuard(UpdateGuard::LocalsIndex)](const ResponseData& d) {
+            fetchFrameLocals(d);
+    });
+}
+
+void VariableController::doReturnInfoUpdate()
+{
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "starting Return info update";
+    session()->debugger()->request({QStringLiteral("getreturninfo")},
+        [this, guard = UpdateGuard(UpdateGuard::ReturnInfoIndex)](const ResponseData& d) {
+            fetchReturnInfo(d);
+    });
+}
+
+void VariableController::doGlobalsUpdate()
+{
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "starting Globals update";
+    session()->debugger()->request({QStringLiteral("globalobjects")},
+        [this, guard = UpdateGuard(UpdateGuard::GlobalsIndex)](const ResponseData& d) {
+            fetchGlobals(d);
+    });
+}
+
+void VariableController::doWatchesUpdate()
+{
+    qCDebug(KDEV_PYTHON_VARIABLECONTROLLER) << "starting Watches update";
+    variableCollection()->watches()->reinstall();
+}
 }
 
 #include "moc_variablecontroller.cpp"
diff -pruN 24.12.3-1/debugger/variablecontroller.h 25.11.80-0ubuntu1/debugger/variablecontroller.h
--- 24.12.3-1/debugger/variablecontroller.h	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/debugger/variablecontroller.h	2025-11-09 03:41:22.000000000 +0000
@@ -1,26 +1,50 @@
 /*
     SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com>
+    SPDX-FileCopyrightText: 2024 Jarmo Tiitto <jarmo.tiitto@gmail.com>
 
     SPDX-License-Identifier: GPL-2.0-or-later
 */
 
 #ifndef VARIABLECONTROLLER_H
 #define VARIABLECONTROLLER_H
-#include <debugger/interfaces/ivariablecontroller.h>
+
+#include <QHash>
+#include <QList>
+#include <QSharedPointer>
+
 #include <debugger/interfaces/idebugsession.h>
-#include "variable.h"
+#include <debugger/interfaces/ivariablecontroller.h>
+#include <util/scopedincrementor.h>
 
-#include <QTimer>
+#include "pdbdebuggerinstance.h"
 
-using namespace KDevelop;
+#include <array>
 
 namespace Python {
 
+class DebugSession;
+class Variable;
+typedef unsigned int PythonId;
+
+class UpdateGuard
+{
+public:
+    enum : int { LocalsIndex, ReturnInfoIndex, GlobalsIndex, WatchesIndex };
+
+    explicit UpdateGuard(int index);
+    UpdateGuard(const UpdateGuard&);
+    ~UpdateGuard();
+
+private:
+    const int m_collection;
+    void pendingRequests(int adjust);
+};
+
 class VariableController : public KDevelop::IVariableController
 {
 Q_OBJECT
 public:
-    VariableController(IDebugSession* parent);
+    VariableController(KDevelop::IDebugSession* parent);
     void addWatch(KDevelop::Variable* variable) override;
     void addWatchpoint(KDevelop::Variable* variable) override;
     
@@ -46,26 +70,83 @@ public:
      * @brief Update locals and/or watches, as indicated by autoUpdate().
      **/
     void update() override;
-protected:
+
+    static DebugSession* session();
+
+    // Extend IVariableController::UpdateType
+    enum UpdateType {
+        UpdateNone = IVariableController::UpdateNone,
+        UpdateLocals = IVariableController::UpdateLocals,
+        UpdateWatches = IVariableController::UpdateWatches,
+        UpdateReturnInfo = 0x4,
+        UpdateGlobals = 0x8
+    };
+    Q_DECLARE_FLAGS(UpdateTypes, UpdateType)
+
     /**
-     * @brief Overridden to handle frame change events (when the user clicks the frame list).
-     * This then enqueues many "up" or "down" commands to react to the frame change.
-     **/
-    void handleEvent(IDebugSession::event_t event) override;
+     * @brief Before a debugger request is made with an response handler that might modify an
+     *        variable, pendingRequests(1) must be called to keep track of the number of such
+     *        queued requests. Before the response handler returns, the
+     *        pendingRequests(-1) must be called to signal the handler has completed.
+     * @param adjust Increment (1) or decrement (-1) the count of queued requests.
+     */
+    void pendingRequests(int adjust, int index);
+
+protected:
+    void handleEvent(KDevelop::IDebugSession::event_t event) override;
 
 private:
-    QTimer m_updateTimer;
     QList<Variable*> m_watchVariables;
 
-private Q_SLOTS:
-    /**
-     * @brief Parse the debugger output, and perform an update of the local variables.
-     **/
-    void localsUpdateReady(QByteArray rawData);
-
-    void _update();
+    struct Item
+    {
+        PythonId ptr = 0;
+        bool remove = false;
+    };
+    using ItemPtr = QSharedPointer<Item>;
+    struct Namespace
+    {
+        QString name;
+        QHash<QString, ItemPtr> items;
+    };
+    QHash<int, QSharedPointer<Namespace>> m_namespaces;
+
+    /// Which collections are expanded? (to best of knowing)
+    UpdateTypes m_isExpanded;
+    /// Which updates have been requested?
+    UpdateTypes m_updateRequested;
+    /// Which updates have been started?
+    UpdateTypes m_updateStarted;
+    /// Which updates have been deferred?
+    UpdateTypes m_updateDeferred;
+
+    struct Collection
+    {
+        const VariableController::UpdateTypes flag;
+        KDevelop::TreeItem* collection;
+        std::function<void()> fn;
+        /// Count of in-flight queued requests on Python::Variable(s)
+        KDevelop::NonNegative<> pending;
+    };
+    // Array of Collections.
+    std::array<Collection, 4> m_collections;
+
+    /// Update any variable collections which have m_updateRequested flag set.
+    void updateCollections();
+
+    void fetchFrameLocals(const ResponseData& data);
+    void fetchReturnInfo(const ResponseData& data);
+    void fetchGlobals(const ResponseData& data);
+    void enumerateNamespace(int nsid, int count, PythonId handle, int collection, QString name = QString());
+    void variablesEnumerated(const ResponseData& data, int nsid);
+
+    void doLocalsUpdate();
+    void doReturnInfoUpdate();
+    void doGlobalsUpdate();
+    void doWatchesUpdate();
 };
 
+Q_DECLARE_OPERATORS_FOR_FLAGS(VariableController::UpdateTypes)
 }
 
 #endif // VARIABLECONTROLLER_H
diff -pruN 24.12.3-1/duchain/declarationbuilder.cpp 25.11.80-0ubuntu1/duchain/declarationbuilder.cpp
--- 24.12.3-1/duchain/declarationbuilder.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/duchain/declarationbuilder.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -1083,6 +1083,11 @@ void DeclarationBuilder::visitMatch(Matc
                         continue;
                     }
                     auto* asElement = static_cast<MatchAsAst*>(element);
+                    if (!asElement->name)
+                    {
+                        // generated for _ in case [a, _, b]
+                        continue;
+                    }
                     auto type = Helper::contentOfIterable(subjectVisitor.lastType(), topContext());
                     visitVariableDeclaration<Declaration>(asElement->name, nullptr, type);
                 }
diff -pruN 24.12.3-1/duchain/tests/pyduchaintest.cpp 25.11.80-0ubuntu1/duchain/tests/pyduchaintest.cpp
--- 24.12.3-1/duchain/tests/pyduchaintest.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/duchain/tests/pyduchaintest.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -438,6 +438,7 @@ void PyDUChainTest::testCrashes_data() {
     QTest::newRow("definition_in_baseclass_2") << "class Foo([x for x in (1, 2)]): pass";
 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 10, 0)
     QTest::newRow("match") << "match x.split():\n case [a, b]: pass";
+    QTest::newRow("match2") << "def fn():\n match [first, second, third]:\n  case [True, _, False]:\n   return 2";
 #endif
 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 11, 0)
     QTest::newRow("except_star") << "try: pass\nexcept* (IndexError, ValueError): pass";
diff -pruN 24.12.3-1/kdevpythonsupport.json 25.11.80-0ubuntu1/kdevpythonsupport.json
--- 24.12.3-1/kdevpythonsupport.json	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/kdevpythonsupport.json	2025-11-09 03:41:22.000000000 +0000
@@ -4,6 +4,7 @@
             {
                 "Email": "svenbrauch@googlemail.com",
                 "Name": "Sven Brauch",
+                "Name[ar]": "سفين بروش",
                 "Name[ca@valencia]": "Sven Brauch",
                 "Name[ca]": "Sven Brauch",
                 "Name[cs]": "Sven Brauch",
@@ -18,6 +19,7 @@
                 "Name[fr]": "Sven Brauch",
                 "Name[gl]": "Sven Brauch",
                 "Name[he]": "סוון בראוך",
+                "Name[hi]": "स्वेन कस्टम",
                 "Name[ia]": "Sven Brauch",
                 "Name[it]": "Sven Brauch",
                 "Name[ka]": "Sven Brauch",
@@ -28,18 +30,19 @@
                 "Name[pt]": "Sven Brauch",
                 "Name[pt_BR]": "Sven Brauch",
                 "Name[ru]": "Sven Brauch",
+                "Name[sa]": "स्वेन् प्रथा",
                 "Name[sk]": "Sven Brauch",
                 "Name[sl]": "Sven Brauch",
                 "Name[sv]": "Sven Brauch",
                 "Name[tr]": "Sven Brauch",
                 "Name[uk]": "Sven Brauch",
-                "Name[x-test]": "xxSven Brauchxx",
                 "Name[zh_CN]": "Sven Brauch",
                 "Name[zh_TW]": "Sven Brauch"
             }
         ],
         "Category": "Language Support",
         "Description": "Python Language Support",
+        "Description[ar]": "دعم لغة بيثون",
         "Description[ca@valencia]": "Implementació del llenguatge Python",
         "Description[ca]": "Implementació del llenguatge Python",
         "Description[cs]": "Podpora jazyka Python",
@@ -54,8 +57,9 @@
         "Description[fr]": "Prise en charge du langage Python",
         "Description[gl]": "Compatibilidade coa linguaxe Python.",
         "Description[he]": "תמיכה בשפת Python",
+        "Description[hi]": "पायथन भाषा समर्थन",
         "Description[it]": "Supporto per il linguaggio Python",
-        "Description[ka]": "Python ენის მხარდაჭერა",
+        "Description[ka]": "ენის Python მხარდაჭერა",
         "Description[ko]": "파이썬 언어 지원",
         "Description[nl]": "Ondersteuning voor de taal Python",
         "Description[nn]": "Støtte for språket Python",
@@ -63,16 +67,17 @@
         "Description[pt]": "Suporte à Linguagem Python",
         "Description[pt_BR]": "Suporte à linguagem Python",
         "Description[ru]": "Поддержка языка программирования Python",
+        "Description[sa]": "पायथन भाषा समर्थन",
         "Description[sk]": "Podpora jazyka Python",
         "Description[sl]": "Podpora jeziku Python",
         "Description[sv]": "Stöd för språket Python",
         "Description[tr]": "Python Dil Desteği",
         "Description[uk]": "Підтримка мови програмування Python",
-        "Description[x-test]": "xxPython Language Supportxx",
         "Description[zh_CN]": "Python 语言支持",
         "Description[zh_TW]": "Python 語言支援",
         "Icon": "text-x-python",
         "Name": "Python Support",
+        "Name[ar]": "دعم بيثون",
         "Name[ca@valencia]": "Implementació de Python",
         "Name[ca]": "Implementació de Python",
         "Name[cs]": "Podpora Pythonu",
@@ -87,8 +92,9 @@
         "Name[fr]": "Prise en charge de Python",
         "Name[gl]": "Compatibilidade con Python",
         "Name[he]": "תמיכה ב־Python",
+        "Name[hi]": "पायथन समर्थन",
         "Name[it]": "Supporto per Python",
-        "Name[ka]": "Python -ის მხარდაჭერა",
+        "Name[ka]": "Python-ის მხარდაჭერა",
         "Name[ko]": "파이썬 지원",
         "Name[nl]": "Python-ondersteuning",
         "Name[nn]": "Python-støtte",
@@ -96,12 +102,12 @@
         "Name[pt]": "Suporte para Python",
         "Name[pt_BR]": "Suporte à Python",
         "Name[ru]": "Поддержка Python",
+        "Name[sa]": "पायथन समर्थन",
         "Name[sk]": "Podpora Pythonu",
         "Name[sl]": "Podpora Pythonu",
         "Name[sv]": "Python-stöd",
         "Name[tr]": "Python Desteği",
         "Name[uk]": "Підтримка Python",
-        "Name[x-test]": "xxPython Supportxx",
         "Name[zh_CN]": "Python 支持",
         "Name[zh_TW]": "Python 支援",
         "ServiceTypes": [
diff -pruN 24.12.3-1/org.kde.kdev-python.metainfo.xml 25.11.80-0ubuntu1/org.kde.kdev-python.metainfo.xml
--- 24.12.3-1/org.kde.kdev-python.metainfo.xml	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/org.kde.kdev-python.metainfo.xml	2025-11-09 03:41:22.000000000 +0000
@@ -6,6 +6,7 @@
     <name translate="no">KDE</name>
   </developer>
   <name>KDevelop Python Support</name>
+  <name xml:lang="ar">إتاحة لغة بيثون لمطورك</name>
   <name xml:lang="ca">Implementació de Python al KDevelop</name>
   <name xml:lang="ca-valencia">Implementació de Python a KDevelop</name>
   <name xml:lang="cs">Podpora Pythonu v KDevelop</name>
@@ -19,6 +20,7 @@
   <name xml:lang="fr">Prise en charge de Python pour KDevelop</name>
   <name xml:lang="gl">Compatibilidade con Python para KDevelop</name>
   <name xml:lang="he">תמיכה של KDevelop ב־Python</name>
+  <name xml:lang="hi">KDevelop पायथन समर्थन</name>
   <name xml:lang="ia">Supporto de KDevelop per Python</name>
   <name xml:lang="it">Supporto Python per KDevelop</name>
   <name xml:lang="ka">KDevelop Python მხარდაჭერა</name>
@@ -29,15 +31,16 @@
   <name xml:lang="pt">Suporte para Python do KDevelop</name>
   <name xml:lang="pt-BR">Suporte à Python do KDevelop</name>
   <name xml:lang="ru">Поддержка Python в KDevelop</name>
+  <name xml:lang="sa">KDevelop पायथन समर्थनम्</name>
   <name xml:lang="sk">Podpora jazyka Python pre KDevelop</name>
   <name xml:lang="sl">Podpora Pythonu za KDevelop</name>
   <name xml:lang="sv">KDevelop Python-stöd</name>
   <name xml:lang="tr">K Geliştir Python Desteği</name>
   <name xml:lang="uk">Підтримка Python у KDevelop</name>
-  <name xml:lang="x-test">xxKDevelop Python Supportxx</name>
   <name xml:lang="zh-CN">KDevelop Python 支持</name>
   <name xml:lang="zh-TW">KDevelop Python 支援</name>
   <summary>Python language support for KDevelop</summary>
+  <summary xml:lang="ar">إتاحة لغة بيثون لمطورك</summary>
   <summary xml:lang="ca">Implementació del llenguatge Python al KDevelop</summary>
   <summary xml:lang="ca-valencia">Implementació del llenguatge Python a KDevelop</summary>
   <summary xml:lang="de">Python-Sprachunterstützung für KDevelop</summary>
@@ -50,6 +53,7 @@
   <summary xml:lang="fr">Prise en charge du langage Python pour KDevelop</summary>
   <summary xml:lang="gl">Compatibilidade coa linguaxe Python para KDevelop</summary>
   <summary xml:lang="he">תמיכה בשפת Python ב־KDevelop</summary>
+  <summary xml:lang="hi">KDevelop के लिए पायथन भाषा समर्थन</summary>
   <summary xml:lang="ia">Supporto de linguage Python per KDevelop</summary>
   <summary xml:lang="it">Supporto per il linguaggio Python in KDevelop</summary>
   <summary xml:lang="ka">Python ენის მხარდაჭერა KDevelop-სთვის</summary>
@@ -60,18 +64,19 @@
   <summary xml:lang="pt">Suporte para a linguagem Python no KDevelop</summary>
   <summary xml:lang="pt-BR">Suporta à linguagem Python para o KDevelop</summary>
   <summary xml:lang="ru">Поддержка языка программирования Python в KDevelop</summary>
+  <summary xml:lang="sa">KDevelop कृते पायथन् भाषासमर्थनम्</summary>
   <summary xml:lang="sk">Podpora jazyka Python pre KDevelop</summary>
   <summary xml:lang="sl">Podpora jeziku Python za KDevelop</summary>
   <summary xml:lang="sv">Stöd för språket Python i KDevelop</summary>
-  <summary xml:lang="tr">K Geliştir için Python dil desteği</summary>
+  <summary xml:lang="tr">K Geliştir için Python dili desteği</summary>
   <summary xml:lang="uk">Підтримка мови Python у KDevelop</summary>
-  <summary xml:lang="x-test">xxPython language support for KDevelopxx</summary>
   <summary xml:lang="zh-CN">KDevelop 的 Python 语言支持</summary>
   <summary xml:lang="zh-TW">KDevelop 的 Python 語言支援</summary>
   <description>
     <p>Adds Python support to KDevelop.  Includes adding integration with code
     highlighting, code completion, build system support, documentation
     linking and debugging support.</p>
+    <p xml:lang="ar">يضيف دعم بيثون إلى مطورك KDevelop. يتضمن إضافة التكامل مع تمييز الكود، وإكمال الكود، ودعم نظام البناء، وربط الوثائق، ودعم تصحيح الأخطاء.</p>
     <p xml:lang="ca">Afegeix suport de Python al KDevelop. Afegeix els «include» per a la integració amb el ressaltat de codi, compleció de codi, suport per al sistema de construcció, enllaços a la documentació i suport per a la depuració.</p>
     <p xml:lang="ca-valencia">Afig suport de Python a KDevelop. Afig els «include» per a la integració amb el ressaltat de codi, compleció de codi, suport per al sistema de construcció, enllaços cap a la documentació i suport per a la depuració.</p>
     <p xml:lang="de">Python-Unterstützung für KDevelop. Einschließlich Integration von Quelltexthervorhebung, Quelltextvervollständigung, Unterstützung für Build-System, Verknüpfung zur Dokumentation und Unterstützung für die Fehlersuche.</p>
@@ -84,6 +89,7 @@
     <p xml:lang="fr">Ajoute la prise en charge de Python à KDevelop. Les fonctionnalités incluent la coloration syntaxique, le complètement du code, la prise en charge du système de compilation, les liens avec la documentation et la prise en charge du débogage.</p>
     <p xml:lang="gl">Engade compatibilidade con Python a KDevelop. Inclúe engadir integración con KDevelop para realce de código, completado de código, compatibilidade co sistema de construción, ligazóns á documentación e funcionalidade de depuración.</p>
     <p xml:lang="he">הוספת תמיכה ב־Python ל־KDevelop. כולל הוספת שילוב עם הדגשת קוד, השלמת קוד, תמיכה במערכת בנייה, קישור לתיעוד וניפוי שגיאות.</p>
+    <p xml:lang="hi">KDevelop में पायथन समर्थन जोड़ता है। इसमें कोड हाइलाइटिंग, कोड पूर्णता, बिल्ड सिस्टम समर्थन, डॉक्यूमेंटेशन लिंकिंग और डिबगिंग समर्थन के साथ एकीकरण जोड़ना शामिल है।</p>
     <p xml:lang="it">Aggiunge il supporto a Python in KDevelop. Include l'integrazione con l'evidenziazione del codice, il completamente del codice, il supporto per il sistema di compilazione, il collegamento con la documentazione ed il supporto per il debugging.</p>
     <p xml:lang="ka">KDevelop-სთვის Python-ის მხარდაჭერის დამატება. ემატება კოდის გამოკვეთა, კოდის დასრულება, აგების სისტემის მხარდაჭერა, აწყობისა და გამართვის დოკუმენტაცია.</p>
     <p xml:lang="ko">KDevelop에 Python 지원을 추가합니다. 코드 구문 강조, 자동 완성, 빌드 시스템 지원, 문서 링크 및 디버그 지원 통합이 들어 있습니다.</p>
@@ -93,12 +99,12 @@
     <p xml:lang="pt">Adiciona o suporte para Python ao KDevelop. Inclui a adição da integração com o realce de código, completação de código, suporte para sistemas de compilação, referências à documentação e suporte para a depuração.</p>
     <p xml:lang="pt-BR">Adiciona suporte para Python ao KDevelop. Inclui a adição da integração com o realce de código, completação de código, suporte para sistemas de compilação, referências à documentação e suporte para depuração.</p>
     <p xml:lang="ru">Добавляет поддержку Python в KDevelop. Включена интеграция подсветки кода и автоматического дополнения кода, поддержка систем сборки, поддержка ссылок на документацию и отладки.</p>
+    <p xml:lang="sa">KDevelop मध्ये Python समर्थनं योजयति । कोड् हाइलाइटिङ्ग्, कोड् समाप्तिः, बिल्ड सिस्टम् समर्थनम्, दस्तावेजीकरण लिङ्किङ्ग्, डिबगिंग् समर्थनं च सह एकीकरणं योजयितुं समाविष्टम् अस्ति ।</p>
     <p xml:lang="sk">Pridá podporu Pythonu do KDevelopu. Zahŕňa pridanie integrácie so zvýrazňovaním kódu, ukončovanie kódu, podpora systému zostavení, linkovanie dokumentácie a podporu ladenia.</p>
     <p xml:lang="sl">Programu KDevelop doda podporo za Python. Vključuje dodatek integracije z označevanjem kode, dokončanje kode, gradnje podpore sistema, povezovanje dokumentacije in podporo za odpravljanje napak</p>
     <p xml:lang="sv">Lägger till stöd för Python i KDevelop. Inkluderar tillägg av integrering med kodfärgläggning, kodkomplettering, byggsystemstöd, dokumentationslänkning och avlusningsstöd.</p>
-    <p xml:lang="tr">K Geliştir'e Python desteği ekler. Kod vurgulaması, kod tamamlama, yapı sistemi desteği, belgelendirme bağlaması ve hata ayıklama desteği bütünleştirmesi içerir.</p>
+    <p xml:lang="tr">K Geliştir’e Python desteği ekler. Kod vurgulaması, kod tamamlama, yapı sistemi desteği, belgelendirme bağlaması ve hata ayıklama desteği bütünleştirmesi içerir.</p>
     <p xml:lang="uk">Додає підтримку Python до KDevelop. Включено інтеграцію із засобами підсвічування коду, автоматичне доповнення коду, підтримку систем збирання, інтеграцію посилань на документацію та засобів діагностики.</p>
-    <p xml:lang="x-test">xxAdds Python support to KDevelop. Includes adding integration with code highlighting, code completion, build system support, documentation linking and debugging support.xx</p>
     <p xml:lang="zh-CN">向 KDevelop 添加 Python 支持。包括代码高亮、代码完成、构建系统支持、文档链接和调试支持的集成。</p>
     <p xml:lang="zh-TW">對 KDevelop 增加 Python 支援。包含增加程式碼突顯、程式碼自動完成、編譯系統支援、文件連結及除錯支援整合。</p>
   </description>
@@ -120,6 +126,14 @@
     <category>IDE</category>
   </categories>
   <releases>
+    <release version="6.0.250803" date="2025-11-06"/>
+    <release version="6.0.250802" date="2025-10-09"/>
+    <release version="6.0.250801" date="2025-09-11"/>
+    <release version="6.0.250800" date="2025-08-14"/>
+    <release version="6.0.250403" date="2025-07-03"/>
+    <release version="6.0.250402" date="2025-06-05"/>
+    <release version="6.0.250401" date="2025-05-08"/>
+    <release version="6.0.250400" date="2025-04-17"/>
     <release version="6.0.241203" date="2025-03-06"/>
     <release version="6.0.241202" date="2025-02-06"/>
     <release version="6.0.241201" date="2025-01-09"/>
diff -pruN 24.12.3-1/parser/astbuilder.cpp 25.11.80-0ubuntu1/parser/astbuilder.cpp
--- 24.12.3-1/parser/astbuilder.cpp	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/parser/astbuilder.cpp	2025-11-09 03:41:22.000000000 +0000
@@ -172,6 +172,7 @@ CodeAst::Ptr AstBuilder::parse(const QUr
                     atLineBeginning = false;
                 }
                 else {
+                    if ( indents.length() <= currentLine ) indents.append(currentLineIndent);
                     currentLine += 1;
                     currentLineBeginning = i+1;
                     // this line has had content, so reset the "empty lines since" counter
@@ -181,14 +182,13 @@ CodeAst::Ptr AstBuilder::parse(const QUr
                         emptyLinesSinceLine = currentLine;
                     }
                     atLineBeginning = true;
-                    if ( indents.length() <= currentLine ) indents.append(currentLineIndent);
                     currentLineIndent = 0;
                 }
             }
             else if ( atLineBeginning ) {
                 currentLineIndent += 1;
             }
-            
+
             if ( currentLine == errline && ! atLineBeginning ) {
                 // if the last non-empty char before the error opens a new block, it's likely an "empty block" problem
                 // we can easily fix that by adding in a "pass" statement. However, we want to add that in the next line, if possible
@@ -204,9 +204,9 @@ CodeAst::Ptr AstBuilder::parse(const QUr
                     }
                 }
                 else if ( indents.length() >= currentLine && currentLine > 0 ) {
-                    qCDebug(KDEV_PYTHON_PARSER) << indents << currentLine;
-                    contents[i+1+indents.at(currentLine - 1)] = QLatin1Char('#');
-                    contents.insert(i+1+indents.at(currentLine - 1), QStringLiteral("pass"));
+                    qCDebug(KDEV_PYTHON_PARSER) << "indents, current line:" << indents << currentLine << contents;
+                    contents[i+1+indents.at(currentLine)] = QLatin1Char('#');
+                    contents.insert(i+1+indents.at(currentLine), QStringLiteral("pass"));
                 }
                 break;
             }
diff -pruN 24.12.3-1/po/ar/kdevpython.po 25.11.80-0ubuntu1/po/ar/kdevpython.po
--- 24.12.3-1/po/ar/kdevpython.po	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ar/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,579 @@
+# Copyright (C) 2025 This file is copyright:
+# This file is distributed under the same license as the kdev-python package.
+# SPDX-FileCopyrightText: 2025 Zayed Al-Saidi <zayed.alsaidi@gmail.com>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdev-python\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-10-05 14:17+0400\n"
+"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
+"Language-Team: ar\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
+"X-Generator: Lokalize 23.08.5\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "زايد السعيدي"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "zayed.alsaidi@gmail.com"
+
+#: codecompletion/context.cpp:115
+#, kde-format
+msgid "insert Shebang line"
+msgstr "أَدخِل سطر شي بانج"
+
+#: codecompletion/context.cpp:123
+#, kde-format
+msgid "specify document encoding"
+msgstr "حَدِّد ترميز المستند"
+
+#: codecompletion/context.cpp:125
+#, kde-format
+msgid "Add file header"
+msgstr "أَضِف ترويسة ملف"
+
+#: codecompletion/context.cpp:175
+#, kde-format
+msgid "specify default parameter"
+msgstr "حَدِّد وسيطًا مبدئيًا"
+
+#: codecompletion/context.cpp:386
+#, kde-format
+msgid "Insert next positional variable"
+msgstr "أَدخِل المتغير الموضعي التالي"
+
+#: codecompletion/context.cpp:391
+#, kde-format
+msgid "Insert named variable"
+msgstr "أَدخِل متغيّرًا مُسمّى"
+
+#: codecompletion/context.cpp:427
+#, kde-format
+msgid "Format using str()"
+msgstr "نَسِّق باستعمال $\text{str}()$"
+
+#: codecompletion/context.cpp:428
+#, kde-format
+msgid "Format using repr()"
+msgstr "نَسِّق باستعمال $\text{repr}()$"
+
+#: codecompletion/context.cpp:436
+#, kde-format
+msgid "Format as left-aligned"
+msgstr "نَسِّق كـ محاذاة لليسار"
+
+#: codecompletion/context.cpp:437
+#, kde-format
+msgid "Format as right-aligned"
+msgstr "نَسِّق كـ محاذاة لليمين"
+
+#: codecompletion/context.cpp:438
+#, kde-format
+msgid "Format as centered"
+msgstr "نَسِّق كـ متوسّط"
+
+#: codecompletion/context.cpp:442
+#, kde-format
+msgid "Specify precision"
+msgstr "حَدِّد الدّقّة"
+
+#: codecompletion/context.cpp:443
+#, kde-format
+msgid "Format as percentage"
+msgstr "نَسِّق كـ نسبة مئويّة"
+
+#: codecompletion/context.cpp:444
+#, kde-format
+msgid "Format as character"
+msgstr "نَسِّق كـ محرف"
+
+#: codecompletion/context.cpp:445
+#, kde-format
+msgid "Format as binary number"
+msgstr "نَسِّق كـ رقم ثنائي"
+
+#: codecompletion/context.cpp:446
+#, kde-format
+msgid "Format as octal number"
+msgstr "نَسِّق كـ رقم ثماني"
+
+#: codecompletion/context.cpp:447
+#, kde-format
+msgid "Format as hexadecimal number"
+msgstr "نَسِّق كـ رقم سداسي عشري"
+
+#: codecompletion/context.cpp:448
+#, kde-format
+msgid "Format in scientific (exponent) notation"
+msgstr "نَسِّق بالتنسيق العلمي (الأُسّي)"
+
+#: codecompletion/context.cpp:449
+#, kde-format
+msgid "Format as fixed point number"
+msgstr "نَسِّق كـ رقم ثابت النقطة"
+
+#: codecompletion/context.cpp:509
+#, kde-format
+msgid "Initialize property"
+msgstr "هَيِّئ الخاصيّة"
+
+#: codecompletion/items/functiondeclaration.cpp:81
+#, kde-format
+msgid "function"
+msgstr "دالّة"
+
+#: codecompletion/items/missingincludeitem.cpp:38
+#, kde-format
+msgctxt "programming; %1 is a code statement to be added in the editor"
+msgid "Add \"%1\""
+msgstr "أَضِف «%1»"
+
+#: codegen/correctionfilegenerator.cpp:58
+#, kde-format
+msgid "Specify type for \"%1\"..."
+msgstr "حَدِّد نوعًا لـ «%1»..."
+
+#: codegen/correctionfilegenerator.cpp:108
+#, kde-format
+msgid "Function return type"
+msgstr "نوع قيمة الإرجاع للدالة"
+
+#: codegen/correctionfilegenerator.cpp:111
+#, kde-format
+msgid "Local variable"
+msgstr "متغيّر محليّ"
+
+#: codegen/correctionfilegenerator.cpp:147
+#, kde-format
+msgid "Sorry, cannot create hints for files which are not part of a project."
+msgstr "آسف، لا يمكن إنشاء تلميحات للملفات التي ليست جزءًا من مشروع."
+
+#. i18n: ectx: property (windowTitle), widget (QWidget, CorrectionWidget)
+#: codegen/correctionwidget.ui:20
+#, kde-format
+msgid "Specify correct type"
+msgstr "حَدِّد النوع الصحيح"
+
+#. i18n: ectx: property (text), widget (QLabel, givenKindLabel)
+#: codegen/correctionwidget.ui:28
+#, kde-format
+msgid "Kind:"
+msgstr "النّوع:"
+
+#. i18n: ectx: property (text), widget (QLabel, givenIdentifierLabel)
+#: codegen/correctionwidget.ui:42
+#, kde-format
+msgid "Identifier:"
+msgstr "المعرِّف:"
+
+#. i18n: ectx: property (text), widget (QLabel, typeLabel)
+#: codegen/correctionwidget.ui:56
+#, kde-format
+msgid "Correct type:"
+msgstr "النوع الصحيح:"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, typeText)
+#: codegen/correctionwidget.ui:63
+#, kde-format
+msgid "Code which evaluates to the type, e.g. int()"
+msgstr "الشيفرة التي تَقِيّم إلى النوع، مثل $\text{int}()$"
+
+#. i18n: ectx: property (text), widget (QLabel, importsLabel)
+#: codegen/correctionwidget.ui:70
+#, kde-format
+msgid "Required modules:"
+msgstr "الوحدات المطلوبة:"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, importsText)
+#: codegen/correctionwidget.ui:77
+#, kde-format
+msgid "A comma separated list of modules required for the type"
+msgstr "قائمة مفصولة بفواصل للوحدات المطلوبة للنوع"
+
+#: debugger/pdblauncher.cpp:45
+#, kde-format
+msgid "A plugin to debug Python applications with pdb."
+msgstr "مُلحَق لتنقيح تطبيقات بايثون باستعمال $\text{pdb}$."
+
+#: debugger/pdblauncher.cpp:86
+#, kde-format
+msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgstr "آسف، تنقيح الأخطاء مدعوم فقط لتطبيقات بايثون 3.x."
+
+#: debugger/pdblauncher.cpp:87
+#, kde-format
+msgid "Unsupported interpreter"
+msgstr "مفسّر غير مدعوم"
+
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "معلومات الإرجاع"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "العامّات"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "المحليّات"
+
+#: docfilekcm/docfilemanagerwidget.cpp:37
+#, kde-format
+msgid "Failed to find a valid data directory for kdevpythonsupport."
+msgstr "فشل في إيجاد دليل بيانات صالح لـ $\text{kdevpythonsupport}$."
+
+#: docfilekcm/docfilemanagerwidget.cpp:51
+#, kde-format
+msgid "Generate..."
+msgstr "أَنْشِئ..."
+
+#: docfilekcm/docfilemanagerwidget.cpp:53
+#, kde-format
+msgid "Import From Editor"
+msgstr "اِستورد من المحرّر"
+
+#: docfilekcm/docfilemanagerwidget.cpp:54
+#, kde-format
+msgid ""
+"Copy the contents of the active editor window to a new file in the "
+"documentation directory"
+msgstr "اِنسخ محتويات نافذة المحرّر النشط إلى ملف جديد في دليل التوثيق"
+
+#: docfilekcm/docfilemanagerwidget.cpp:66
+#, kde-format
+msgid "Open File Manager"
+msgstr "اِفتح مدير الملفّات"
+
+#: docfilekcm/docfilemanagerwidget.cpp:68
+#, kde-format
+msgctxt "Edit selected files"
+msgid "Edit Selected"
+msgstr "عَدِّل المُختار"
+
+#: docfilekcm/docfilemanagerwidget.cpp:70
+#, kde-format
+msgid "Search Paths..."
+msgstr "مسارات البحث..."
+
+#: docfilekcm/docfilemanagerwidget.cpp:101
+#, kde-format
+msgctxt "displays a list of search paths below"
+msgid "Paths searched for documentation by kdev-python (in this order):"
+msgstr ""
+"المسارات التي يَبحث فيها $\text{kdev-python}$ عن التوثيق (بهذا الترتيب):"
+
+#: docfilekcm/docfilemanagerwidget.cpp:141
+#, kde-format
+msgid "Enter a relative target path to copy %1 to:"
+msgstr "أَدخِل مسارًا نسبيًّا للهدف لنسخ %1 إليه:"
+
+#: docfilekcm/docfilemanagerwidget.cpp:145
+#, kde-format
+msgid ""
+"This path must match what you use in Python to import this module. For "
+"example, enter \"numpy/fft.py\" for numpy.fft"
+msgstr ""
+"يَجب أن يتطابق هذا المسار مع ما تستعمله في بايثون لاستيراد هذه الوحدة. على "
+"سبيل المثال، أَدخِل «$\text{numpy/fft.py}$» لـ $\text{numpy.fft}$"
+
+#: docfilekcm/docfilemanagerwidget.cpp:147
+#, kde-format
+msgid "After copying, you will be editing the new document."
+msgstr "بعد النسخ، سـتُعدِّل المستند الجديد."
+
+#: docfilekcm/docfilemanagerwidget.cpp:166
+#, kde-format
+msgid "Please select at least one file from the list for editing."
+msgstr "اِختر ملفًّا واحدًا على الأقل من القائمة للتعديل."
+
+#: docfilekcm/docfilewizard.cpp:41
+#, kde-format
+msgid "Configure the Python interpreter to use"
+msgstr "اضبط مفسّر بايثون لاستعماله"
+
+#: docfilekcm/docfilewizard.cpp:44
+#, kde-format
+msgid "Python executable"
+msgstr "تنفيذي بايثون"
+
+#: docfilekcm/docfilewizard.cpp:49
+#, kde-format
+msgid "Select a python module to generate documentation for"
+msgstr "اِختر وحدة بايثون لتوليد توثيقها"
+
+#: docfilekcm/docfilewizard.cpp:53
+#, kde-format
+msgctxt "refers to selecting a python module to perform some operation on"
+msgid "Target module (e.g. \"math\")"
+msgstr "وحدة الهدف (مثال «$\text{math}$»)"
+
+#: docfilekcm/docfilewizard.cpp:55
+#, kde-format
+msgid "Output filename"
+msgstr "اسم ملف الخرج"
+
+#: docfilekcm/docfilewizard.cpp:61
+#, kde-format
+msgid "Status and output"
+msgstr "الحالة والخرج"
+
+#: docfilekcm/docfilewizard.cpp:63 docfilekcm/docfilewizard.cpp:69
+#, kde-format
+msgid "The process has not been run yet."
+msgstr "العمليّة لم تُشغَّل بعد."
+
+#: docfilekcm/docfilewizard.cpp:75
+#, kde-format
+msgid "Script output"
+msgstr "خرج السكربت"
+
+#: docfilekcm/docfilewizard.cpp:76
+#, kde-format
+msgid "Results"
+msgstr "النتائج"
+
+#: docfilekcm/docfilewizard.cpp:82
+#, kde-format
+msgid "Close"
+msgstr "أَغلِق"
+
+#: docfilekcm/docfilewizard.cpp:84
+#, kde-format
+msgid "Save and close"
+msgstr "اِحفظ وأَغلِق"
+
+#: docfilekcm/docfilewizard.cpp:87
+#, kde-format
+msgid "Generate"
+msgstr "أَنْشِئ"
+
+#: docfilekcm/docfilewizard.cpp:138
+#, kde-format
+msgid "Couldn't find the introspect.py script; check your installation!"
+msgstr "لم أَجِد سكربت $\text{introspect.py}$؛ اِفحص تنصيبك!"
+
+#: docfilekcm/docfilewizard.cpp:142
+#, kde-format
+msgid ""
+"Couldn't find a valid kdev-python data directory; check your installation!"
+msgstr "لم أَجِد دليل بيانات $\text{kdev-python}$ صالح؛ اِفحص تنصيبك!"
+
+#: docfilekcm/docfilewizard.cpp:148
+#, kde-format
+msgid "Invalid output filename"
+msgstr "اسم ملف الخرج غير صالح"
+
+#: docfilekcm/docfilewizard.cpp:188
+#, kde-format
+msgid ""
+"The output file <br/>%1<br/> already exists, do you want to overwrite it?"
+msgstr "ملف الخرج <br/>%1<br/> موجود بالفعل، أَتُريد الكتابة فوقه؟"
+
+#: docfilekcm/docfilewizard.cpp:203
+#, kde-format
+msgid ""
+"This file contains auto-generated documentation extracted\n"
+"from python run-time information. It is analyzed by KDevelop\n"
+"to offer features such as code-completion and syntax highlighting.\n"
+"If you discover errors in KDevelop's support for this module,\n"
+"you can edit this file to correct the errors, e.g. you can add\n"
+"additional return statements to functions to control the return\n"
+"type to be used for that function by the analyzer.\n"
+"Make sure to keep a copy of your changes so you don't accidentally\n"
+"overwrite them by re-generating the file.\n"
+msgstr ""
+"يحتوي هذا الملف على توثيق مُولَّد آليًّا مُستَخرَج\n"
+"من معلومات تشغيل بايثون. يُحلّله كيديڤلوب\n"
+"لتقديم ميزات مثل الإكمال التلقائي للشيفرة وتظليل الصيغة.\n"
+"إذا اِكتشفت أخطاءً في دعم كيديڤلوب لهذه الوحدة،\n"
+"يُمكنك تعديل هذا الملف لتصحيح الأخطاء، على سبيل المثال، يُمكنك إضافة\n"
+"عبارات إرجاع إضافيّة للدوال للتحكم بنوع الإرجاع\n"
+"المُستخدَم لهذه الدالة من قِبَل المُحلِّل.\n"
+"تأكَّد من إبقاء نسخة من تغييراتك كي لا تقوم بـ الكتابة فوقها عن طريق\n"
+"إعادة توليد الملف آليًّا عن طريق الخطأ.\n"
+
+#: docfilekcm/kcm_docfiles.cpp:48
+#, kde-format
+msgid "Manage Documentation Files Used by the Python Plugin"
+msgstr "أَدِر ملفّات التوثيق المستخدَمة من قِبَل مُلحَق بايثون"
+
+#: docfilekcm/kcm_docfiles.cpp:58
+#, kde-format
+msgid "Python Documentation"
+msgstr "توثيق بايثون"
+
+#: duchain/assistants/missingincludeassistant.cpp:48
+#, kde-format
+msgid "Generate documentation for module \"%1\"..."
+msgstr "أَنْشِئ توثيقًا للوحدة «%1»..."
+
+#: duchain/declarationbuilder.cpp:705
+#, kde-format
+msgid "Module \"%1\" not found"
+msgstr "لم أَجِد الوحدة «%1»"
+
+#: duchain/declarationbuilder.cpp:776
+#, kde-format
+msgid "Declaration for \"%1\" not found in specified module"
+msgstr "لم أَجِد التصريح لـ «%1» في الوحدة المحدّدة"
+
+#: duchain/declarationbuilder.cpp:1590
+#, kde-format
+msgid ""
+"First argument of class method is not called self or cls, this is deprecated"
+msgstr "الوسيط الأول لدالة الصنف ليس $\text{self}$ أو $\text{cls}$، هذا مهجور"
+
+#: duchain/declarationbuilder.cpp:1610
+#, kde-format
+msgid ""
+"Non-static class method without arguments, must have at least one (self)"
+msgstr ""
+"دالة صنف غير ساكنة بدون وسائط، يجب أن يكون لها واحد على الأقل ($\text{self}$)"
+
+#: duchain/declarationbuilder.cpp:1771
+#, kde-format
+msgid "Return statement not within function declaration"
+msgstr "عبارة الإرجاع ليست ضمن تصريح دالة"
+
+#: duchain/navigation/declarationnavigationcontext.cpp:67
+#, kde-format
+msgctxt "refers to an unknown type in programming"
+msgid "unknown"
+msgstr "مجهول"
+
+#: duchain/navigation/declarationnavigationcontext.cpp:83
+#: duchain/navigation/declarationnavigationcontext.cpp:99
+#: duchain/types/indexedcontainer.cpp:78
+#, kde-format
+msgctxt "as in list of int, set of string"
+msgid "%1 of %2"
+msgstr "%1 من %2"
+
+#: duchain/types/unsuretype.cpp:101
+#, kde-format
+msgctxt "some object that can be called, in programming"
+msgid "<callable>"
+msgstr "<قابل للاستدعاء>"
+
+#: duchain/types/unsuretype.cpp:106
+#, kde-format
+msgctxt "a set with some elements"
+msgid "<iterable>"
+msgstr "<قابل للتكرار>"
+
+#: duchain/types/unsuretype.cpp:127
+#, kde-format
+msgctxt "refers to a type (in program code) which is not known"
+msgid "mixed"
+msgstr "مختلط"
+
+#: duchain/types/unsuretype.cpp:130
+#, kde-format
+msgctxt "refers to a type (in program code) which can have multiple values"
+msgid "unsure (%1)"
+msgstr "غير متأكد (%1)"
+
+#: duchain/usebuilder.cpp:83
+#, kde-format
+msgid "Undefined variable: %1"
+msgstr "متغيّر غير مُعرَّف: %1"
+
+#: duchain/usebuilder.cpp:130
+#, kde-format
+msgid "Attribute \"%1\" not found on accessed object"
+msgstr "لم أَجِد السِّمة «%1» على الكائن الذي وُصِل"
+
+#: pep8kcm/kcm_pep8.cpp:63
+#, kde-format
+msgid "Configure Python Style Checking"
+msgstr "اضبط فحص نمط بايثون"
+
+#: pep8kcm/kcm_pep8.cpp:73
+#, kde-format
+msgid "Python Style Checking"
+msgstr "فحص نمط بايثون"
+
+#. i18n: ectx: property (title), widget (QGroupBox, enableChecking)
+#: pep8kcm/pep8.ui:29
+#, kde-format
+msgid "Enable Style Checking"
+msgstr "مَكِّن فحص النمط"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, disableErrors)
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, enableErrors)
+#: pep8kcm/pep8.ui:44 pep8kcm/pep8.ui:58
+#, kde-format
+msgid "Comma-separated list of error codes"
+msgstr "قائمة مفصولة بفواصل لرموز الخطأ"
+
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: pep8kcm/pep8.ui:51
+#, kde-format
+msgid "Enable these errors and warnings:"
+msgstr "مَكِّن هذه الأخطاء والتحذيرات:"
+
+#. i18n: ectx: property (text), widget (QLabel, label_3)
+#: pep8kcm/pep8.ui:65
+#, kde-format
+msgid "Maximum line length:"
+msgstr "طول السطر الأقصى:"
+
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: pep8kcm/pep8.ui:88
+#, kde-format
+msgid "Disable these errors and warnings:"
+msgstr "عَطِّل هذه الأخطاء والتحذيرات:"
+
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: pep8kcm/pep8.ui:100
+#, kde-format
+msgid ""
+"The `pycodestyle` Python module must be installed in order to use style "
+"checking."
+msgstr "يَجب تنصيب وحدة بايثون $\text{pycodestyle}$ لاستعمال فحص النمط."
+
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: projectconfig/projectconfig.ui:19
+#, kde-format
+msgid "Python interpreter:"
+msgstr "مفسّر بايثون:"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, pythonInterpreter)
+#: projectconfig/projectconfig.ui:26
+#, kde-format
+msgid "Full path to python interpreter, leave empty for default"
+msgstr "المسار الكامل لمفسّر بايثون، اِتركه فارغًا للمبدئي"
+
+#: projectconfig/projectconfigpage.cpp:47
+#, kde-format
+msgid "Python Settings"
+msgstr "إعدادات بايثون"
+
+#: pythonlanguagesupport.cpp:140
+#, kde-format
+msgid "Format source with the autopep8 formatter."
+msgstr "نَسِّق المصدر مع مُنسِّق $\text{autopep8}$."
+
+#: pythonstylechecking.cpp:107
+#, kde-format
+msgid "PEP8 checker error: %1"
+msgstr "خطأ فاحص $\text{PEP8}$: %1"
+
+#: pythonstylechecking.cpp:209
+#, kde-format
+msgid "The PEP8 syntax checker does not seem to work correctly."
+msgstr "لا يَعمل فاحص صيغة $\text{PEP8}$ بشكل صحيح على ما يبدو."
diff -pruN 24.12.3-1/po/bs/kdevpython.po 25.11.80-0ubuntu1/po/bs/kdevpython.po
--- 24.12.3-1/po/bs/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/bs/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: desktop files\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2014-11-27 13:41+0000\n"
 "Last-Translator: Mirza Bulbulusic <mbulbulusic@gmail.com>\n"
 "Language-Team: bs <bs@kde.org>\n"
@@ -204,36 +204,36 @@ msgstr "Potrebni moduli:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Zarez je odvojio listu modula potrebnih za ovaj tip"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Program koji se debagira je aktivirao neobrađeni izuzetak."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Možete istražiti status programa nakon što je izašao."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Debager će tiho stati kada se pokrene naredna komanda."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Dodatak za traženje grešaka u Python programima koristeći pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, fuzzy, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Nažalost, praćenje grešaka je podržano samo za Python 2.x aplikacije."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Nepodržan interpreter"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -463,7 +463,7 @@ msgstr "Modul \"%1\" nije nađen"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Deklaracija \"%1\" nije pronađena u naznačenom modulu"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, fuzzy, kde-format
 #| msgid ""
 #| "First argument of class method is not called self, this is deprecated"
@@ -471,13 +471,13 @@ msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr "Prvi argument metode klase se ne naziva self, taj naziv je zastario"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr "Nestatična metoda klase bez argumenata, mora imati barem jedan (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Naredba povratka bez deklaracije funkcije"
@@ -620,6 +620,15 @@ msgstr "PEP8 greška provjere: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Izabrani PEP8 provjeravač sintakse \"%1\" ne izgleda da radi ispravno."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "Program koji se debagira je aktivirao neobrađeni izuzetak."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Možete istražiti status programa nakon što je izašao."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "Debager će tiho stati kada se pokrene naredna komanda."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr "Prvi argument od __new__ metode se ne zove cls, to nije dozvoljeno"
diff -pruN 24.12.3-1/po/ca/kdevpython.po 25.11.80-0ubuntu1/po/ca/kdevpython.po
--- 24.12.3-1/po/ca/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ca/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,17 +1,17 @@
 # Translation of kdevpython.po to Catalan
-# Copyright (C) 2009-2024 This_file_is_part_of_KDE
+# Copyright (C) 2009-2025 This_file_is_part_of_KDE
 # This file is distributed under the license LGPL version 2.1 or
 # version 3 or later versions approved by the membership of KDE e.V.
 #
-# Manuel Tortosa <manutortosa@gmail.com>, 2009.
-# SPDX-FileCopyrightText: 2010, 2013, 2014, 2015, 2016, 2017, 2021, 2023, 2024 Josep M. Ferrer <txemaq@gmail.com>
-# Antoni Bella Pérez <antonibella5@yahoo.com>, 2013, 2014, 2015, 2016, 2017, 2020.
+# SPDX-FileCopyrightText: 2009 Manuel Tortosa <manutortosa@gmail.com>
+# SPDX-FileCopyrightText: 2010, 2013, 2014, 2015, 2016, 2017, 2021, 2023, 2024, 2025 Josep M. Ferrer <txemaq@gmail.com>
+# SPDX-FileCopyrightText: 2013, 2014, 2015, 2016, 2017, 2020 Antoni Bella Pérez <antonibella5@yahoo.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: kdev-python\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-17 15:12+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 08:40+0200\n"
 "Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
 "Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
 "Language: ca\n"
@@ -20,7 +20,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Accelerator-Marker: &\n"
-"X-Generator: Lokalize 24.08.2\n"
+"X-Generator: Lokalize 25.04.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -207,37 +207,37 @@ msgstr "Mòduls requerits:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Una llista separada per comes dels mòduls requerits pel tipus"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "El programa que s'està depurant ha generat una excepció no controlada."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Ara podeu inspeccionar l'estat del programa després que finalitzi."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "El depurador s'aturarà en silenci quan s'activi la següent ordre."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Un connector per a depurar aplicacions de Python amb «pdb»."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Perdoneu, la depuració només és compatible amb les aplicacions de Python 3.x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Intèrpret no admès"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Informació de retorn"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globals"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Locals"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -446,7 +446,7 @@ msgstr "No s'ha trobat el mòdul «%1»"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "No s'ha trobat la declaració per a «%1» en el mòdul especificat"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -454,7 +454,7 @@ msgstr ""
 "El primer argument del mètode de la classe no es crida a si mateix o «cls», "
 "això és obsolet"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -462,7 +462,7 @@ msgstr ""
 "Mètode de classe no estàtic sense arguments. Com a mínim n'ha de contenir un "
 "(a si mateix)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "La sentència retornada no està present a la declaració de la funció"
@@ -599,6 +599,16 @@ msgstr "Error del comprovador «PEP8»:
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Sembla que el comprovador de sintaxi «PEP8» no funciona correctament."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr ""
+#~ "El programa que s'està depurant ha generat una excepció no controlada."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Ara podeu inspeccionar l'estat del programa després que finalitzi."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "El depurador s'aturarà en silenci quan s'activi la següent ordre."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/ca@valencia/kdevpython.po 25.11.80-0ubuntu1/po/ca@valencia/kdevpython.po
--- 24.12.3-1/po/ca@valencia/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ca@valencia/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,17 +1,17 @@
 # Translation of kdevpython.po to Catalan (Valencian)
-# Copyright (C) 2009-2024 This_file_is_part_of_KDE
+# Copyright (C) 2009-2025 This_file_is_part_of_KDE
 # This file is distributed under the license LGPL version 2.1 or
 # version 3 or later versions approved by the membership of KDE e.V.
 #
-# Manuel Tortosa <manutortosa@gmail.com>, 2009.
-# SPDX-FileCopyrightText: 2010, 2013, 2014, 2015, 2016, 2017, 2021, 2023, 2024 Josep M. Ferrer <txemaq@gmail.com>
-# Antoni Bella Pérez <antonibella5@yahoo.com>, 2013, 2014, 2015, 2016, 2017, 2020.
+# SPDX-FileCopyrightText: 2009 Manuel Tortosa <manutortosa@gmail.com>
+# SPDX-FileCopyrightText: 2010, 2013, 2014, 2015, 2016, 2017, 2021, 2023, 2024, 2025 Josep M. Ferrer <txemaq@gmail.com>
+# SPDX-FileCopyrightText: 2013, 2014, 2015, 2016, 2017, 2020 Antoni Bella Pérez <antonibella5@yahoo.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: kdev-python\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-17 15:12+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 08:40+0200\n"
 "Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
 "Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
 "Language: ca@valencia\n"
@@ -20,7 +20,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Accelerator-Marker: &\n"
-"X-Generator: Lokalize 24.08.2\n"
+"X-Generator: Lokalize 25.04.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -207,37 +207,37 @@ msgstr "Mòduls requerits:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Una llista separada per comes dels mòduls requerits pel tipus"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "El programa que s'està depurant ha generat una excepció no controlada."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Ara podeu inspeccionar l'estat del programa després que finalitze."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "El depurador es pararà en silenci quan s'active l'ordre següent."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Un connector per a depurar aplicacions de Python amb «pdb»."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Perdoneu, la depuració només és compatible amb les aplicacions de Python 3.x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Intèrpret no admés"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Informació de retorn"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globals"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Locals"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -307,7 +307,7 @@ msgstr "Després de la còpia, estareu e
 #: docfilekcm/docfilemanagerwidget.cpp:166
 #, kde-format
 msgid "Please select at least one file from the list for editing."
-msgstr "Per a editar un fitxer, seleccioneu-ne almenys un de la llista."
+msgstr "Per a editar un fitxer, trieu-ne almenys un de la llista."
 
 #: docfilekcm/docfilewizard.cpp:41
 #, kde-format
@@ -322,7 +322,7 @@ msgstr "Executable de Python"
 #: docfilekcm/docfilewizard.cpp:49
 #, kde-format
 msgid "Select a python module to generate documentation for"
-msgstr "Seleccioneu un mòdul de Python per a generar la documentació"
+msgstr "Trieu un mòdul de Python per a generar la documentació"
 
 #: docfilekcm/docfilewizard.cpp:53
 #, kde-format
@@ -445,7 +445,7 @@ msgstr "No s'ha trobat el mòdul «%1»"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "No s'ha trobat la declaració per a «%1» en el mòdul especificat"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -453,7 +453,7 @@ msgstr ""
 "El primer argument del mètode de la classe no es crida a si mateix o «cls», "
 "açò és obsolet"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -461,7 +461,7 @@ msgstr ""
 "Mètode de classe no estàtic sense arguments. Com a mínim n'ha de contindre "
 "un (a si mateix)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "La sentència retornada no està present en la declaració de la funció"
diff -pruN 24.12.3-1/po/cs/kdevpython.po 25.11.80-0ubuntu1/po/cs/kdevpython.po
--- 24.12.3-1/po/cs/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/cs/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2017-08-03 13:58+0100\n"
 "Last-Translator: Vít Pelčák <vit@pelcak.org>\n"
 "Language-Team: Czech <kde-i18n-doc@kde.org>\n"
@@ -200,35 +200,35 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
+msgid "Unsupported interpreter"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
-msgstr ""
+msgid "Globals"
+msgstr "Globály"
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
-msgstr ""
+msgid "Locals"
+msgstr "Místní"
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
@@ -418,19 +418,19 @@ msgstr "Modul \"%1\" nenalezen"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/da/kdevpython.po 25.11.80-0ubuntu1/po/da/kdevpython.po
--- 24.12.3-1/po/da/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/da/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2014-02-23 14:14+0100\n"
 "Last-Translator: Martin Schlander <mschlander@opensuse.org>\n"
 "Language-Team: Danish <kde-i18n-doc@kde.org>\n"
@@ -201,37 +201,37 @@ msgstr "Påkrævede moduler:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Kommasepareret liste over moduler der kræves af typen"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Programmet der fejlsøges udsendte en undtagelse, som ikke blev fanget."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Du kan nu inspicere programmets status efter at det afsluttede."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Fejlsøgeren vil stoppe tavst når den næste kommando udløses."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Et plugin til at fejlsøge Python-programmer med pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, fuzzy, kde-format
 #| msgid "Sorry, debugging is only supported for Python 2.x applications."
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Beklager, fejlsøgning understøttes kun for programmer i Python 2.x"
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Ikke-understøttet fortolker"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -458,7 +458,7 @@ msgstr "Modulet \"%1\" blev ikke fundet"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Erklæringen for \"%1\" blev ikke fundet i det angivne modul"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, fuzzy, kde-format
 #| msgid ""
 #| "First argument of class method is not called self, this is deprecated"
@@ -467,13 +467,13 @@ msgid ""
 msgstr ""
 "Klassemetodes første argument kaldes ikke self, dette bør ikke bruges mere"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr "Ikke-statisk klassemetode uden argumenter, skal have mindst en (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Return-sætning ikke indenfor funktionserklæring"
@@ -616,6 +616,16 @@ msgstr "PEP8-tjekkerfejl: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Den valgte PEP8-syntakstjekker \"%1\" lader ikke til at virke korrekt."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr ""
+#~ "Programmet der fejlsøges udsendte en undtagelse, som ikke blev fanget."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Du kan nu inspicere programmets status efter at det afsluttede."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "Fejlsøgeren vil stoppe tavst når den næste kommando udløses."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/de/kdevpython.po 25.11.80-0ubuntu1/po/de/kdevpython.po
--- 24.12.3-1/po/de/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/de/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,28 +1,30 @@
-# Burkhard Lück <lueck@hube-lueck.de>, 2009, 2012, 2013, 2014, 2015, 2016, 2017.
-# Frederik Schwarzer <schwarzer@kde.org>, 2013, 2015, 2016.
+# SPDX-FileCopyrightText: 2025 Alexander Becker <alex-at-kde-l10n-de@freenet.de>
+# SPDX-FileCopyrightText: 2009, 2012, 2013, 2014, 2015, 2016, 2017 Burkhard Lück <lueck@hube-lueck.de>
+# SPDX-FileCopyrightText: 2013, 2015, 2016 Frederik Schwarzer <schwarzer@kde.org>
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2017-11-26 17:10+0100\n"
-"Last-Translator: Burkhard Lück <lueck@hube-lueck.de>\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-05 22:37+0200\n"
+"Last-Translator: Alexander Becker <alex-at-kde-l10n-de@freenet.de>\n"
 "Language-Team: German <kde-i18n-de@kde.org>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 25.04.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
-msgstr "Frederik Schwarzer"
+msgstr "Deutsches KDE-Übersetzungsteam"
 
 #, kde-format
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
-msgstr "schwarzer@kde.org"
+msgstr "kde-i18n-de@kde.org"
 
 #: codecompletion/context.cpp:115
 #, kde-format
@@ -138,7 +140,7 @@ msgstr "„%1“ hinzufügen"
 #: codegen/correctionfilegenerator.cpp:58
 #, kde-format
 msgid "Specify type for \"%1\"..."
-msgstr "Geben Sie den Typ für „%1“ an ..."
+msgstr "Geben Sie den Typ für „%1“ an …"
 
 #: codegen/correctionfilegenerator.cpp:108
 #, kde-format
@@ -200,43 +202,38 @@ msgid "A comma separated list of modules
 msgstr ""
 "Durch Komma getrennte Liste von Modulen, die für diesen Typ erforderlich sind"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr ""
-"Das im Debugger ausgeführte Programm hat eine nicht behandelte "
-"Ausnahmebedingung ausgelöst."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr ""
-"Sie können jetzt den Status des Programms nach den Beenden untersuchen."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"Der Debugger wird ohne Benachrichtigung anhalten, wenn der nächste Befehl "
-"ausgelöst wird."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Ein Modul zur Fehlersuche in Python-Programmen mit pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Leider wird die Fehlersuche nur für Programme mit der Python-Version 3.x "
 "unterstützt."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Nicht unterstützter Interpreter"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -245,7 +242,7 @@ msgstr "Es wurde kein gültiger Datenord
 #: docfilekcm/docfilemanagerwidget.cpp:51
 #, kde-format
 msgid "Generate..."
-msgstr "Erzeugen ..."
+msgstr "Erzeugen …"
 
 #: docfilekcm/docfilemanagerwidget.cpp:53
 #, kde-format
@@ -275,7 +272,7 @@ msgstr "Ausgewählte bearbeiten"
 #: docfilekcm/docfilemanagerwidget.cpp:70
 #, kde-format
 msgid "Search Paths..."
-msgstr "Suchpfade ..."
+msgstr "Suchpfade …"
 
 #: docfilekcm/docfilemanagerwidget.cpp:101
 #, kde-format
@@ -413,16 +410,16 @@ msgid ""
 "Make sure to keep a copy of your changes so you don't accidentally\n"
 "overwrite them by re-generating the file.\n"
 msgstr ""
-"Diese Datei enthält automatisch generierte Documentation, die\n"
-"aus der Python-Laufzeitinformation extrahiert wird. Sie wird analysiert,\n"
-"um Funktionen wie Quelltext-Vervollständigung und -Hervorhebung "
-"bereitzustellen.\n"
-"Finden Sie Fehler in diesen Funktionen für dieses Modul, dann können\n"
-"Sie diese Datei bearbeiten und Fehler korrigieren. Z. B. können Sie\n"
-"zusätzliche Rückgabe-Anweisungen hinzufügen, die bei der Analyse des\n"
-"Rückgabetyps dieser Funktion verwendet werden. Erstellen Sie eine Kopie\n"
-"dieser geänderten Datei, so dass Ihre Änderungen nicht unbeabsichtigt beim\n"
-"erneuten Regenerieren der Datei überschrieben werden.\n"
+"Diese Datei enthält automatisch generierte Dokumentation, die\n"
+"aus Python-Laufzeitinformationen extrahiert wird. Sie wird von\n"
+"KDevelop analysiert, um Funktionen wie Quelltextvervollständigung\n"
+"und Syntaxhervorhebung bereitzustellen. Finden Sie Fehler in\n"
+"der Unterstützung von KDevelop für dieses Modul, dann können\n"
+"Sie diese Datei bearbeiten und Fehler korrigieren. Z.B. können Sie\n"
+"zusätzliche Rückgabe-Anweisungen hinzufügen, die bei der Analyse\n"
+"des Rückgabetyps dieser Funktion verwendet werden. Erstellen Sie\n"
+"eine Kopie Ihrer Änderungen, da diese unbeabsichtigt durch das\n"
+"erneute Erzeugen der Datei überschrieben werden können.\n"
 
 #: docfilekcm/kcm_docfiles.cpp:48
 #, kde-format
@@ -437,7 +434,7 @@ msgstr "Python-Dokumentation"
 #: duchain/assistants/missingincludeassistant.cpp:48
 #, kde-format
 msgid "Generate documentation for module \"%1\"..."
-msgstr "Die Dokumentation für das Modul „%1“ wird generiert ..."
+msgstr "Die Dokumentation für das Modul „%1“ wird generiert …"
 
 #: duchain/declarationbuilder.cpp:705
 #, kde-format
@@ -449,16 +446,15 @@ msgstr "Das Modul „%1“ wurde nicht g
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Die Deklaration für „%1“ wurde im angegebenen Modul nicht gefunden"
 
-#: duchain/declarationbuilder.cpp:1585
-#, fuzzy, kde-format
-#| msgid ""
-#| "First argument of class method is not called self, this is deprecated"
+#: duchain/declarationbuilder.cpp:1590
+#, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
-"Das erste Argument der Klassenmethode heißt nicht „self“. Dies ist veraltet."
+"Das erste Argument der Klassenmethode heißt nicht „self“ oder „cls“, dies "
+"ist veraltet"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -466,7 +462,7 @@ msgstr ""
 "Nichtstatische Klassenmethode ohne Argumente. Es muss mindestens eines "
 "verwendet werden („self“)."
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Return-Anweisung nicht innerhalb der Funktionsdeklaration"
@@ -604,6 +600,20 @@ msgstr "PEP8-Überprüfungsfehler: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Die PEP8-Syntaxüberprüfung  scheint nicht richtig zu funktionieren."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr ""
+#~ "Das im Debugger ausgeführte Programm hat eine nicht behandelte "
+#~ "Ausnahmebedingung ausgelöst."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr ""
+#~ "Sie können jetzt den Status des Programms nach den Beenden untersuchen."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "Der Debugger wird ohne Benachrichtigung anhalten, wenn der nächste Befehl "
+#~ "ausgelöst wird."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/en_GB/kdevpython.po 25.11.80-0ubuntu1/po/en_GB/kdevpython.po
--- 24.12.3-1/po/en_GB/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/en_GB/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2024-10-18 17:20+0100\n"
 "Last-Translator: Steve Allewell <steve.allewell@gmail.com>\n"
 "Language-Team: British English\n"
@@ -201,36 +201,36 @@ msgstr "Required modules:"
 msgid "A comma separated list of modules required for the type"
 msgstr "A comma separated list of modules required for the type"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "The program being debugged raised an uncaught exception."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "You can now inspect the status of the program after it exited."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "The debugger will silently stop when the next command is triggered."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "A plugin to debug Python applications with pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Sorry, debugging is only supported for Python 3.x applications."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Unsupported interpreter"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -434,21 +434,21 @@ msgstr "Module \"%1\" not found"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Declaration for \"%1\" not found in specified module"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 "First argument of class method is not called self or cls, this is deprecated"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 "Non-static class method without arguments, must have at least one (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Return statement not within function declaration"
@@ -584,6 +584,15 @@ msgstr "PEP8 checker error: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "The PEP8 syntax checker does not seem to work correctly."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "The program being debugged raised an uncaught exception."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "You can now inspect the status of the program after it exited."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "The debugger will silently stop when the next command is triggered."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/eo/kdevpython.po 25.11.80-0ubuntu1/po/eo/kdevpython.po
--- 24.12.3-1/po/eo/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/eo/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2024-12-27 10:42+0100\n"
 "Last-Translator: Oliver Kellogg <olivermkellogg@gmail.com>\n"
 "Language-Team: esperanto <kde-i18n-eo@kde.org>\n"
@@ -203,36 +203,36 @@ msgstr "Bezonataj moduloj:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Komo apartigita listo de moduloj necesaj por la tipo"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "La programo sencimigita levis nekaptitan escepton."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Vi nun povas inspekti la staton de la programo post kiam ĝi eliris."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "La erarserĉilo silente ĉesos kiam la sekva komando estas ekigita."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Kromaĵo por sencimi Python-aplikaĵojn per pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Pardonu, sencimigado estas nur subtenata por Python 3.x-aplikoj."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Nesubtenata interpretisto"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -436,20 +436,20 @@ msgstr "Modulo \"%1\" ne trovita"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Deklaro por \"%1\" ne trovita en specifita modulo"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 "Unua argumento de klasmetodo ne nomiĝas self aŭ cls, ĉi tio estas evitinda"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr "Ne-senmova klasmetodo sen argumentoj, devas havi almenaŭ unu (mem)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Redona deklaro ne ene de funkciodeklaro"
@@ -583,3 +583,12 @@ msgstr "PEP8-kontrolilo eraro: %1"
 #, kde-format
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "La sintaksa kontrolilo de PEP8 ŝajnas ne funkcii ĝuste."
+
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "La programo sencimigita levis nekaptitan escepton."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Vi nun povas inspekti la staton de la programo post kiam ĝi eliris."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "La erarserĉilo silente ĉesos kiam la sekva komando estas ekigita."
diff -pruN 24.12.3-1/po/es/kdevpython.po 25.11.80-0ubuntu1/po/es/kdevpython.po
--- 24.12.3-1/po/es/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/es/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,13 +1,14 @@
-# Copyright (C) YEAR This_file_is_part_of_KDE
-# This file is distributed under the same license as the PACKAGE package.
+# Spanish translations for kdevpython.po package.
+# Copyright (C) 2013-2025 This file is copyright:
+# This file is distributed under the same license as the kdev-python package.
 #
-# SPDX-FileCopyrightText: 2013, 2014, 2015, 2016, 2017, 2024 Eloy Cuadra <ecuadra@eloihr.net>
+# SPDX-FileCopyrightText: 2013, 2014, 2015, 2016, 2017, 2024, 2025 Eloy Cuadra <ecuadra@eloihr.net>
 msgid ""
 msgstr ""
-"Project-Id-Version: \n"
+"Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-18 00:09+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 13:03+0100\n"
 "Last-Translator: Eloy Cuadra <ecuadra@eloihr.net>\n"
 "Language-Team: Spanish <kde-l10n-es@kde.org>\n"
 "Language: es\n"
@@ -15,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Lokalize 24.08.2\n"
+"X-Generator: Lokalize 25.04.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -141,7 +142,7 @@ msgstr "Añadir «%1»"
 #: codegen/correctionfilegenerator.cpp:58
 #, kde-format
 msgid "Specify type for \"%1\"..."
-msgstr "Especifique el tipo para «%1»..."
+msgstr "Especifique el tipo para «%1»…"
 
 #: codegen/correctionfilegenerator.cpp:108
 #, kde-format
@@ -202,41 +203,38 @@ msgstr "Módulos requeridos:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Una lista separada por comas de los módulos requeridos por el tipo"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr ""
-"El programa que está siendo depurado ha generado una excepción no "
-"contemplada."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Ya puede inspeccionar el estado del programa tras su salida."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"El depurador se detendrá en silencio cuando se lance la siguiente orden."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Un complemento para depurar aplicaciones de Python con pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Lo sentimos. La depuración solo está permitida para aplicaciones de Python 3."
 "x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Intérprete no permitido"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Información de retorno"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globales"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Locales"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -247,7 +245,7 @@ msgstr ""
 #: docfilekcm/docfilemanagerwidget.cpp:51
 #, kde-format
 msgid "Generate..."
-msgstr "Generar..."
+msgstr "Generar…"
 
 #: docfilekcm/docfilemanagerwidget.cpp:53
 #, kde-format
@@ -277,7 +275,7 @@ msgstr "Editar la selección"
 #: docfilekcm/docfilemanagerwidget.cpp:70
 #, kde-format
 msgid "Search Paths..."
-msgstr "Rutas de búsqueda..."
+msgstr "Rutas de búsqueda…"
 
 #: docfilekcm/docfilemanagerwidget.cpp:101
 #, kde-format
@@ -434,7 +432,7 @@ msgstr "Documentación de Python"
 #: duchain/assistants/missingincludeassistant.cpp:48
 #, kde-format
 msgid "Generate documentation for module \"%1\"..."
-msgstr "Generar documentación para el módulo «%1»..."
+msgstr "Generar documentación para el módulo «%1»…"
 
 #: duchain/declarationbuilder.cpp:705
 #, kde-format
@@ -446,7 +444,7 @@ msgstr "Módulo «%1» no encontrado"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Declaración para «%1» no encontrada en el módulo especificado"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -454,14 +452,14 @@ msgstr ""
 "El primer argumento del método de la clase no se llama «self» ni «cls», lo "
 "que está desaconsejado"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 "Método de clase no estático sin argumentos; debe tener al menos uno (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "La sentencia de retorno no está dentro de la declaración de la función"
@@ -598,104 +596,3 @@ msgstr "Error del comprobador PEP8: %1"
 #, kde-format
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Parece que el comprobador de sintaxis PEP8 no funciona correctamente."
-
-#~ msgid ""
-#~ "First argument of __new__ method is not called cls, this is deprecated"
-#~ msgstr ""
-#~ "El primer argumento del método __new__ no se llama «cls», lo que está "
-#~ "desaconsejado"
-
-#~ msgid "%1 of ( %2 )"
-#~ msgstr "%1 de ( %2 )"
-
-#~ msgid "Form"
-#~ msgstr "Formulario"
-
-#~ msgid "Full path to the PEP8 checker to use:"
-#~ msgstr "Ruta completa del comprobador PEP8 a usar:"
-
-#~ msgid "PEP8 checker arguments:"
-#~ msgstr "Argumentos del comprobador PEP8:"
-
-#~ msgid "Download new"
-#~ msgstr "Descargar nuevo"
-
-#~ msgid "Share selected"
-#~ msgstr "Compartir selección"
-
-#~ msgid "Unused computation result"
-#~ msgstr "Resultado de cálculo no usado"
-
-#~ msgid "Python Debugger (pdb) Support"
-#~ msgstr "Implementación del depurador de Python (pdb)"
-
-#~ msgid "Support for the Python Debugger"
-#~ msgstr "Implementación del depurador de Python"
-
-#~ msgid "Sven Brauch"
-#~ msgstr "Sven Brauch"
-
-#~ msgid "Author"
-#~ msgstr "Autor"
-
-#~ msgid "Python Support"
-#~ msgstr "Implementación de Python"
-
-#~ msgid "Support for the Python Scripting Language"
-#~ msgstr "Implementación del lenguaje de script de Python"
-
-#~ msgctxt ""
-#~ "refers to types of variables in programming, as in \"various possible "
-#~ "types\""
-#~ msgid "various types"
-#~ msgstr "varios tipos"
-
-#~ msgid "%1 of %2 : %3"
-#~ msgstr "%1 de %2 : %3"
-
-#~ msgid "%1 of %2"
-#~ msgstr "%1 de %2"
-
-#~ msgid "Rename \"%1\"..."
-#~ msgstr "Cambiar el nombre de «%1»..."
-
-#~ msgid "No declaration under cursor"
-#~ msgstr "Ninguna declaración bajo el cursor"
-
-#~ msgid "Declaration is located in non-writeable file %1."
-#~ msgstr ""
-#~ "La declaración está ubicada en el archivo sin permiso de escritura %1."
-
-#~ msgid "Rename %1"
-#~ msgstr "Cambiar el nombre de %1"
-
-#~ msgid "New name:"
-#~ msgstr "Nuevo nombre:"
-
-#~ msgid "Rename"
-#~ msgstr "Cambiar nombre"
-
-#~ msgid ""
-#~ "Note: All overloaded functions, overloads, forward-declarations, etc. "
-#~ "will be renamed too"
-#~ msgstr ""
-#~ "Nota: también se cambiará el nombre de todas las funciones sobrecargadas, "
-#~ "las sobrecargas, las declaraciones previas, etc."
-
-#~ msgid "Cancel"
-#~ msgstr "Cancelar"
-
-#~ msgid "Uses"
-#~ msgstr "Usos"
-
-#~ msgid "Declaration Info"
-#~ msgstr "Información de la declaración"
-
-#~ msgid "Applying changes failed: %1"
-#~ msgstr "Ha fallado la aplicación de cambios: %1"
-
-#~ msgid "list"
-#~ msgstr "lista"
-
-#~ msgid "dictionary"
-#~ msgstr "diccionario"
diff -pruN 24.12.3-1/po/et/kdevpython.po 25.11.80-0ubuntu1/po/et/kdevpython.po
--- 24.12.3-1/po/et/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/et/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2020-01-15 14:53+0200\n"
 "Last-Translator: Marek Laane <qiilaq69@gmail.com>\n"
 "Language-Team: Estonian <kde-et@lists.linux.ee>\n"
@@ -201,36 +201,36 @@ msgstr "Nõutavad moodulid:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Tüübile vajalike moodulite komadega eraldatud loend"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Silutav programm tekitas tabamata erindi."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Pärast programmi töö lõppemist võib nüüd uurida selle olekut."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Silur peatub vaikselt, kui käivitatakse järgmine käsk."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Plugin Pythoni rakenduste silumiseks pdb-s."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Vabandust, silumine on toetatud ainult Python 3.x rakenduste korral."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Toetamata interpretaator"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -434,7 +434,7 @@ msgstr "Moodulit \"%1\" ei leitud."
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "\"%1\" deklaratsiooni määratud moodulis ei leitud"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, fuzzy, kde-format
 #| msgid ""
 #| "First argument of class method is not called self, this is deprecated"
@@ -442,7 +442,7 @@ msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr "Klassi meetodi esimeseks argumendiks ei ole self, see on iganenud"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -450,7 +450,7 @@ msgstr ""
 "Mittestaatiline klassi meetod ilma argumentidega, peab olema vähemalt üks "
 "(self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Funktsiooni deklaratsioonis mitteleiduva lause tagastamine"
@@ -588,6 +588,15 @@ msgstr "PEP8 kontrollija viga: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Paistab, et PEP8 süntaksi kontrollija ei tööta korralikult."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "Silutav programm tekitas tabamata erindi."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Pärast programmi töö lõppemist võib nüüd uurida selle olekut."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "Silur peatub vaikselt, kui käivitatakse järgmine käsk."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr "__new__ meetodi esimeseks argumendiks ei ole cls, see on iganenud"
diff -pruN 24.12.3-1/po/eu/kdevpython.po 25.11.80-0ubuntu1/po/eu/kdevpython.po
--- 24.12.3-1/po/eu/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/eu/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,16 +1,16 @@
 # Translation for kdevpython.po to Euskara/Basque (eu).
-# Copyright (C) 2022-2024 This file is copyright:
+# Copyright (C) 2022-2025 This file is copyright:
 # This file is distributed under the same license as the kdev-python package.
-# SPDX-FileCopyrightText: 2024 KDE euskaratzeko proiektuko arduraduna <xalba@ni.eus>
+# SPDX-FileCopyrightText: 2024, 2025 KDE euskaratzeko proiektuaren arduraduna <xalba@ni.eus>
 #
 # Translators:
-# Iñigo Salvador Azurmendi <xalba@ni.eus>, 2022, 2023, 2024.
+# Iñigo Salvador Azurmendi <xalba@ni.eus>, 2022, 2023, 2024, 2025.
 msgid ""
 msgstr ""
 "Project-Id-Version: kdev-python\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-26 22:11+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 20:12+0200\n"
 "Last-Translator: Iñigo Salvador Azurmendi <xalba@ni.eus>\n"
 "Language-Team: Basque <kde-i18n-eu@kde.org>\n"
 "Language: eu\n"
@@ -18,7 +18,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 24.08.2\n"
+"X-Generator: Lokalize 25.04.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -205,37 +205,37 @@ msgstr "Beharrezko moduluak:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Motarako beharrezkoak diren moduluen, komaz bereizitako zerrenda bat"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Araztutako programak oharkabeko salbuespen bat igorri du."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Orain, amaitu ondoren, programaren egoera ikuskatu dezakezu."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Araztailea isilean geldituko da hurrengo komandoa eragiten denean."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "«pdb» erabiliz Python aplikazioak arazteko plugin bat."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Sentitzen dugu, arazteko euskarria Python 3.x aplikazioetara mugatuta dago."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Euskarririk gabeko interpretea"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Itzulerako informazioa"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globalak"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Lokalak"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -445,7 +445,7 @@ msgstr "%1 modulua ez da aurkitu"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "\"%1\"(e)ren deklarazioa ez da aurkitu zehaztutako moduluan"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -453,7 +453,7 @@ msgstr ""
 "Klase metodoaren aurreneko argumentua ez da «self» edo «cls» deitzen, hori "
 "zaharkitua dago"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -461,7 +461,7 @@ msgstr ""
 "Klase ez-estatikoaren argumenturik gabeko metodoa, gutxienez «(self)» bat "
 "izan behar du"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Itzulerako adierazpena ez dago funtzioaren deklarazioan"
@@ -598,6 +598,15 @@ msgstr "PEP8 zuzentzaile errorea: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Ematen du PEP8 sintaxi zuzentzailea ez dabilela ondo."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "Araztutako programak oharkabeko salbuespen bat igorri du."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Orain, amaitu ondoren, programaren egoera ikuskatu dezakezu."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "Araztailea isilean geldituko da hurrengo komandoa eragiten denean."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/fi/kdevpython.po 25.11.80-0ubuntu1/po/fi/kdevpython.po
--- 24.12.3-1/po/fi/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/fi/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,12 +1,12 @@
 # KDE Finnish translation sprint participants:
+# SPDX-FileCopyrightText: 2018, 2025 Tommi Nieminen <translator@legisign.org>
 # Lasse Liehu <lasse.liehu@gmail.com>, 2013, 2014, 2015, 2016.
-# Tommi Nieminen <translator@legisign.org>, 2018.
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2018-08-19 17:06+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-03-03 19:26+0200\n"
 "Last-Translator: Tommi Nieminen <translator@legisign.org>\n"
 "Language-Team: Finnish <kde-i18n-doc@kde.org>\n"
 "Language: fi\n"
@@ -14,6 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 23.08.5\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -198,38 +199,36 @@ msgstr "Vaaditut moduulit:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Pilkuin eroteltu luettelo tyypin vaatimista moduuleista"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr ""
-"Ohjelma, jonka virheitä paikannetaan, heitti käsittelemättömän poikkeuksen."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Voit nyt tarkastella ohjelman tilaa sen päätyttyä."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"Virheenpaikannin pysähtyy hiljaisesti, kun seuraava komento suoritetaan."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Liitännäinen Python-sovellusten virheiden paikantamiseen pdb:llä."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Virheiden paikantamista tuetaan vain Python 3.x -sovelluksille."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Tulkkia ei tueta"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -432,17 +431,15 @@ msgstr "Moduulia ”%1” ei löytynyt"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Esittelyä ”%1” ei löydy määrämoduulista"
 
-#: duchain/declarationbuilder.cpp:1585
-#, fuzzy, kde-format
-#| msgid ""
-#| "First argument of class method is not called self, this is deprecated"
+#: duchain/declarationbuilder.cpp:1590
+#, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
-"Luokkametodin ensimmäinen parametri ei ole nimeltään self. Tämä on "
+"Luokkametodin ensimmäinen parametri ei ole nimeltään self tai cls: tämä on "
 "vanhentunut ominaisuus"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -450,7 +447,7 @@ msgstr ""
 "Ei-staattinen luokkametodi ilman parametreja. Niitä täytyy olla ainakin yksi "
 "(self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Return-lause ei ole funktioesittelyn sisällä"
@@ -586,6 +583,18 @@ msgstr "PEP8-tarkistusohjelman virhe: %1
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "PEP8-syntaksintarkistus ei vaikuta toimivan oikein."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr ""
+#~ "Ohjelma, jonka virheitä paikannetaan, heitti käsittelemättömän "
+#~ "poikkeuksen."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Voit nyt tarkastella ohjelman tilaa sen päätyttyä."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "Virheenpaikannin pysähtyy hiljaisesti, kun seuraava komento suoritetaan."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/fr/kdevpython.po 25.11.80-0ubuntu1/po/fr/kdevpython.po
--- 24.12.3-1/po/fr/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/fr/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -4,15 +4,15 @@
 # Joëlle Cornavin <jcorn@free.fr>, 2009, 2010, 2011, 2012, 2013.
 # Vincent PINON <vpinon@kde.org>, 2013, 2014.
 # Thomas Vergnaud <thomas.vergnaud@gmx.fr>, 2015, 2017, 2018, 2022.
-# SPDX-FileCopyrightText: 2021, 2023, 2024 Xavier Besnard <xavier.besnard@kde.org>
+# SPDX-FileCopyrightText: 2021, 2023, 2024, 2025 Xavier Besnard <xavier.besnard@kde.org>
 # Xavier Besnard <xavier.besnard@kde.org>, 2023.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-18 11:14+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-11 09:38+0200\n"
 "Last-Translator: Xavier Besnard <xavier.besnard@kde.org>\n"
 "Language-Team: French <French <kde-francophone@kde.org>>\n"
 "Language: fr\n"
@@ -20,9 +20,9 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Lokalize 23.08.5\n"
-"X-Environment: kde\n"
 "X-Accelerator-Marker: &\n"
+"X-Environment: kde\n"
+"X-Generator: Lokalize 25.07.90\n"
 "X-Text-Markup: kde4\n"
 
 #, kde-format
@@ -210,25 +210,6 @@ msgstr "Modules requis :"
 msgid "A comma separated list of modules required for the type"
 msgstr "Une liste séparée par des virgules des modules requis pour le type"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Le programme en cours de débogage a déclenché une exception non gérée."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr ""
-"Vous pouvez maintenant analyser l'état du programme après qu'il se soit "
-"terminé."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"Le débogueur s'arrêtera silencieusement lorsque la commande suivante sera "
-"déclenchée."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
@@ -236,18 +217,33 @@ msgstr ""
 "Un module externe pour déboguer des applications en Python avec le débogueur "
 "« pdb » de Python."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Désolé, le débogage n'est pris en charge que pour les applications Python 3."
 "x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Interpréteur non pris en charge"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Informations renvoyées"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Règles globales"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Règles locales"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -465,7 +461,7 @@ msgid "Declaration for \"%1\" not found
 msgstr ""
 "Impossible de trouver la déclaration pour « %1 » dans le module spécifié"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -473,7 +469,7 @@ msgstr ""
 "Le premier argument de la méthode de la classe n'est pas appelé lui-même. "
 "Cette utilisation est déconseillée"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -481,7 +477,7 @@ msgstr ""
 "Méthode de classe non statique sans argument. Elle doit en comporter au "
 "moins un (lui-même)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Instruction de retour non présente dans la déclaration de fonction"
@@ -620,6 +616,20 @@ msgid "The PEP8 syntax checker does not
 msgstr ""
 "Le vérificateur de syntaxe « pep8 » ne semble pas fonctionner correctement."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr ""
+#~ "Le programme en cours de débogage a déclenché une exception non gérée."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr ""
+#~ "Vous pouvez maintenant analyser l'état du programme après qu'il se soit "
+#~ "terminé."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "Le débogueur s'arrêtera silencieusement lorsque la commande suivante sera "
+#~ "déclenchée."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/ga/kdevpython.po 25.11.80-0ubuntu1/po/ga/kdevpython.po
--- 24.12.3-1/po/ga/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ga/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2012-12-07 20:23-0500\n"
 "Last-Translator: Kevin Scannell <kscanne@gmail.com>\n"
 "Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
@@ -200,34 +200,34 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
+msgid "Unsupported interpreter"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
+msgid "Locals"
 msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
@@ -418,19 +418,19 @@ msgstr ""
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/gl/kdevpython.po 25.11.80-0ubuntu1/po/gl/kdevpython.po
--- 24.12.3-1/po/gl/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/gl/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2025-01-12 17:11+0100\n"
 "Last-Translator: Adrián Chaves (Gallaecio) <adrian@chaves.io>\n"
 "Language-Team: Proxecto Trasno (proxecto@trasno.gal)\n"
@@ -207,37 +207,36 @@ msgstr "Módulos necesarios:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Unha lista de módulos necesarios para o tipo, separados por comas."
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr ""
-"O programa que se está a depurar produciu unha excepción non capturada."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Agora pode inspeccionar o estado do programa unha vez saíu."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "O depurador deterase silandeiramente cando se active a seguinte orde."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Un complemento para depurar aplicacións de Python con pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Só se permite depurar aplicacións de Python 3.x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Intérprete incompatíbel"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -444,7 +443,7 @@ msgstr "Non se atopou o módulo «%1»."
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Non se atopou a declaración de «%1» no módulo indicado."
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -452,7 +451,7 @@ msgstr ""
 "O primeiro argumento do método da clase non se chama «self» ou «cls», iso "
 "está obsoleto."
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -460,7 +459,7 @@ msgstr ""
 "Método non estático dunha clase sen argumentos; debe ter polo menos un: "
 "«self»."
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "A instrución de devolución non está dentro da declaración da función."
@@ -600,6 +599,17 @@ msgstr "Erro do comprobador PEP8: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "O comprobador de sintaxe PEP8 non parece funcionar correctamente."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr ""
+#~ "O programa que se está a depurar produciu unha excepción non capturada."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Agora pode inspeccionar o estado do programa unha vez saíu."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "O depurador deterase silandeiramente cando se active a seguinte orde."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/he/kdevpython.po 25.11.80-0ubuntu1/po/he/kdevpython.po
--- 24.12.3-1/po/he/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/he/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,13 +1,13 @@
 # Copyright (C) 2024 This file is copyright:
 # This file is distributed under the same license as the kdev-python package.
 #
-# SPDX-FileCopyrightText: 2024 Yaron Shahrabani <sh.yaron@gmail.com>
+# SPDX-FileCopyrightText: 2024, 2025 Yaron Shahrabani <sh.yaron@gmail.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: kdev-python\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-17 22:58+0300\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 09:37+0300\n"
 "Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
 "Language-Team: צוות התרגום של KDE ישראל\n"
 "Language: he\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
 "n % 10 == 0) ? 2 : 3));\n"
-"X-Generator: Lokalize 24.05.2\n"
+"X-Generator: Lokalize 25.04.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -201,36 +201,36 @@ msgstr "מודולים נדרשים:"
 msgid "A comma separated list of modules required for the type"
 msgstr "רשימה מופרדת בפסיקים של מודולים שנחוצים לסוג"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "התוכנית בניתוח לניפוי שגיאות הרימה חריגה שלא נתפסה."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "עכשיו ניתן לחקור את מצב התוכנית לאחר יציאתה."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "מנפה השגיאות ייעצר בשקט עם הזנקת הפקודה הבאה."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "תוסף לניפוי שגיאות ביישומי Python עם pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "ניפוי שגיאות נתמך ביישומי Python 3.x ואילך בלבד, עמך הסליחה."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "מפענח לא נתמך"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "פרטי חזרה"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "משתנים מקיפים"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "משתנים מקומיים"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -429,7 +429,7 @@ msgstr "המודול „%1” לא נמ
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "ההכרזה עבור „%1” לא נמצא במודול שצוין"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -437,13 +437,13 @@ msgstr ""
 "הארגומנט הראשון של מתודת מחלקה (class) לא נקרא self או cls, ההתנהגות הזאת לא "
 "תקפה עוד"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr "מתודת מחלקה (class) ללא ארגומנטים, חייב להיות לה לפחות אחד (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "הצהרת החזרה (Return) לא בתוך הכרזת הפונקציה"
@@ -578,6 +578,15 @@ msgstr "שגיאת בודק PEP8:‏ %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "נראה שבודק תחביר PEP8 לא פועל כראוי."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "התוכנית בניתוח לניפוי שגיאות הרימה חריגה שלא נתפסה."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "עכשיו ניתן לחקור את מצב התוכנית לאחר יציאתה."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "מנפה השגיאות ייעצר בשקט עם הזנקת הפקודה הבאה."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/hi/kdevpython.po 25.11.80-0ubuntu1/po/hi/kdevpython.po
--- 24.12.3-1/po/hi/kdevpython.po	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/po/hi/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,590 @@
+# Hindi translations for kdev-python package.
+# Copyright (C) 2024 This file is copyright:
+# This file is distributed under the same license as the kdev-python package.
+# Kali <EMAIL@ADDRESS>, 2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdev-python\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2024-12-15 19:18+0530\n"
+"Last-Translator: Kali <EMAIL@ADDRESS>\n"
+"Language-Team: Hindi <fedora-trans-hi@redhat.com>\n"
+"Language: hi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.5\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "तुम्हारे नाम"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "आपके ईमेल"
+
+#: codecompletion/context.cpp:115
+#, kde-format
+msgid "insert Shebang line"
+msgstr "शेबैंग लाइन डालें"
+
+#: codecompletion/context.cpp:123
+#, kde-format
+msgid "specify document encoding"
+msgstr "दस्तावेज़ एनकोडिंग निर्दिष्ट करें"
+
+#: codecompletion/context.cpp:125
+#, kde-format
+msgid "Add file header"
+msgstr "फ़ाइल हेडर जोड़ें"
+
+#: codecompletion/context.cpp:175
+#, kde-format
+msgid "specify default parameter"
+msgstr "डिफ़ॉल्ट पैरामीटर निर्दिष्ट करें"
+
+#: codecompletion/context.cpp:386
+#, kde-format
+msgid "Insert next positional variable"
+msgstr "अगला स्थितीय चर डालें"
+
+#: codecompletion/context.cpp:391
+#, kde-format
+msgid "Insert named variable"
+msgstr "नामित चर डालें"
+
+#: codecompletion/context.cpp:427
+#, kde-format
+msgid "Format using str()"
+msgstr "str() का उपयोग करके प्रारूपित करें"
+
+#: codecompletion/context.cpp:428
+#, kde-format
+msgid "Format using repr()"
+msgstr "repr() का उपयोग करके प्रारूपित करें"
+
+#: codecompletion/context.cpp:436
+#, kde-format
+msgid "Format as left-aligned"
+msgstr "बाएं संरेखित स्वरूप में प्रारूपित करें"
+
+#: codecompletion/context.cpp:437
+#, kde-format
+msgid "Format as right-aligned"
+msgstr "दाएं संरेखित स्वरूप में प्रारूपित करें"
+
+#: codecompletion/context.cpp:438
+#, kde-format
+msgid "Format as centered"
+msgstr "केन्द्रित स्वरूप में प्रारूपित करें"
+
+#: codecompletion/context.cpp:442
+#, kde-format
+msgid "Specify precision"
+msgstr "परिशुद्धता निर्दिष्ट करें"
+
+#: codecompletion/context.cpp:443
+#, kde-format
+msgid "Format as percentage"
+msgstr "प्रतिशत के रूप में प्रारूपित करें"
+
+#: codecompletion/context.cpp:444
+#, kde-format
+msgid "Format as character"
+msgstr "वर्ण के रूप में प्रारूपित करें"
+
+#: codecompletion/context.cpp:445
+#, kde-format
+msgid "Format as binary number"
+msgstr "बाइनरी संख्या के रूप में प्रारूपित करें"
+
+#: codecompletion/context.cpp:446
+#, kde-format
+msgid "Format as octal number"
+msgstr "अष्टक संख्या के रूप में प्रारूपित करें"
+
+#: codecompletion/context.cpp:447
+#, kde-format
+msgid "Format as hexadecimal number"
+msgstr "हेक्साडेसिमल संख्या के रूप में प्रारूपित करें"
+
+#: codecompletion/context.cpp:448
+#, kde-format
+msgid "Format in scientific (exponent) notation"
+msgstr "वैज्ञानिक (घातांक) संकेतन में प्रारूप"
+
+#: codecompletion/context.cpp:449
+#, kde-format
+msgid "Format as fixed point number"
+msgstr "निश्चित बिंदु संख्या के रूप में प्रारूपित करें"
+
+#: codecompletion/context.cpp:509
+#, kde-format
+msgid "Initialize property"
+msgstr "संपत्ति आरंभ करें"
+
+#: codecompletion/items/functiondeclaration.cpp:81
+#, kde-format
+msgid "function"
+msgstr "समारोह"
+
+#: codecompletion/items/missingincludeitem.cpp:38
+#, kde-format
+msgctxt "programming; %1 is a code statement to be added in the editor"
+msgid "Add \"%1\""
+msgstr "\"%1\"जोड़ें"
+
+#: codegen/correctionfilegenerator.cpp:58
+#, kde-format
+msgid "Specify type for \"%1\"..."
+msgstr "\"%1\" के लिए प्रकार निर्दिष्ट करें..."
+
+#: codegen/correctionfilegenerator.cpp:108
+#, kde-format
+msgid "Function return type"
+msgstr "फ़ंक्शन वापसी प्रकार"
+
+#: codegen/correctionfilegenerator.cpp:111
+#, kde-format
+msgid "Local variable"
+msgstr "स्थानीय चर"
+
+#: codegen/correctionfilegenerator.cpp:147
+#, kde-format
+msgid "Sorry, cannot create hints for files which are not part of a project."
+msgstr ""
+"क्षमा करें, उन फ़ाइलों के लिए संकेत नहीं बनाए जा सकते जो किसी प्रोजेक्ट का हिस्सा नहीं हैं।"
+
+#. i18n: ectx: property (windowTitle), widget (QWidget, CorrectionWidget)
+#: codegen/correctionwidget.ui:20
+#, kde-format
+msgid "Specify correct type"
+msgstr "सही प्रकार निर्दिष्ट करें"
+
+#. i18n: ectx: property (text), widget (QLabel, givenKindLabel)
+#: codegen/correctionwidget.ui:28
+#, kde-format
+msgid "Kind:"
+msgstr "दयालु:"
+
+#. i18n: ectx: property (text), widget (QLabel, givenIdentifierLabel)
+#: codegen/correctionwidget.ui:42
+#, kde-format
+msgid "Identifier:"
+msgstr "पहचानकर्ता:"
+
+#. i18n: ectx: property (text), widget (QLabel, typeLabel)
+#: codegen/correctionwidget.ui:56
+#, kde-format
+msgid "Correct type:"
+msgstr "सही प्रकार:"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, typeText)
+#: codegen/correctionwidget.ui:63
+#, kde-format
+msgid "Code which evaluates to the type, e.g. int()"
+msgstr "कोड जो प्रकार का मूल्यांकन करता है, जैसे int()"
+
+#. i18n: ectx: property (text), widget (QLabel, importsLabel)
+#: codegen/correctionwidget.ui:70
+#, kde-format
+msgid "Required modules:"
+msgstr "आवश्यक मॉड्यूल:"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, importsText)
+#: codegen/correctionwidget.ui:77
+#, kde-format
+msgid "A comma separated list of modules required for the type"
+msgstr "प्रकार के लिए आवश्यक मॉड्यूल की अल्पविराम से अलग की गई सूची"
+
+#: debugger/pdblauncher.cpp:45
+#, kde-format
+msgid "A plugin to debug Python applications with pdb."
+msgstr "पीडीबी के साथ पायथन अनुप्रयोगों को डीबग करने के लिए एक प्लगइन।"
+
+#: debugger/pdblauncher.cpp:86
+#, kde-format
+msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgstr "क्षमा करें, डिबगिंग केवल पायथन 3.x अनुप्रयोगों के लिए समर्थित है।"
+
+#: debugger/pdblauncher.cpp:87
+#, kde-format
+msgid "Unsupported interpreter"
+msgstr "असमर्थित दुभाषिया"
+
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
+#: docfilekcm/docfilemanagerwidget.cpp:37
+#, kde-format
+msgid "Failed to find a valid data directory for kdevpythonsupport."
+msgstr "kdevpythonsupport के लिए वैध डेटा निर्देशिका खोजने में विफल।"
+
+#: docfilekcm/docfilemanagerwidget.cpp:51
+#, kde-format
+msgid "Generate..."
+msgstr "उत्पन्न..."
+
+#: docfilekcm/docfilemanagerwidget.cpp:53
+#, kde-format
+msgid "Import From Editor"
+msgstr "संपादक से आयात करें"
+
+#: docfilekcm/docfilemanagerwidget.cpp:54
+#, kde-format
+msgid ""
+"Copy the contents of the active editor window to a new file in the "
+"documentation directory"
+msgstr "सक्रिय संपादक विंडो की सामग्री को डॉक्यूमेंटेशन निर्देशिका में एक नई फ़ाइल में कॉपी करें"
+
+#: docfilekcm/docfilemanagerwidget.cpp:66
+#, kde-format
+msgid "Open File Manager"
+msgstr "फ़ाइल प्रबंधक खोलें"
+
+#: docfilekcm/docfilemanagerwidget.cpp:68
+#, kde-format
+msgctxt "Edit selected files"
+msgid "Edit Selected"
+msgstr "चयनित संपादित करें"
+
+#: docfilekcm/docfilemanagerwidget.cpp:70
+#, kde-format
+msgid "Search Paths..."
+msgstr "खोज पथ..."
+
+#: docfilekcm/docfilemanagerwidget.cpp:101
+#, kde-format
+msgctxt "displays a list of search paths below"
+msgid "Paths searched for documentation by kdev-python (in this order):"
+msgstr "kdev-python द्वारा दस्तावेज़ीकरण के लिए खोजे गए पथ (इस क्रम में):"
+
+#: docfilekcm/docfilemanagerwidget.cpp:141
+#, kde-format
+msgid "Enter a relative target path to copy %1 to:"
+msgstr "%1 को कॉपी करने के लिए सापेक्ष लक्ष्य पथ दर्ज करें:"
+
+#: docfilekcm/docfilemanagerwidget.cpp:145
+#, kde-format
+msgid ""
+"This path must match what you use in Python to import this module. For "
+"example, enter \"numpy/fft.py\" for numpy.fft"
+msgstr ""
+"यह पथ उससे मेल खाना चाहिए जो आप इस मॉड्यूल को आयात करने के लिए पायथन में उपयोग करते "
+"हैं। उदाहरण के लिए, numpy.fft के लिए \"numpy/fft.py\" दर्ज करें"
+
+#: docfilekcm/docfilemanagerwidget.cpp:147
+#, kde-format
+msgid "After copying, you will be editing the new document."
+msgstr "कॉपी करने के बाद, आप नये दस्तावेज़ को संपादित करेंगे।"
+
+#: docfilekcm/docfilemanagerwidget.cpp:166
+#, kde-format
+msgid "Please select at least one file from the list for editing."
+msgstr "कृपया संपादन के लिए सूची से कम से कम एक फ़ाइल का चयन करें।"
+
+#: docfilekcm/docfilewizard.cpp:41
+#, kde-format
+msgid "Configure the Python interpreter to use"
+msgstr "उपयोग करने के लिए पायथन इंटरप्रेटर को कॉन्फ़िगर करें"
+
+#: docfilekcm/docfilewizard.cpp:44
+#, kde-format
+msgid "Python executable"
+msgstr "पायथन निष्पादन योग्य"
+
+#: docfilekcm/docfilewizard.cpp:49
+#, kde-format
+msgid "Select a python module to generate documentation for"
+msgstr "दस्तावेज़ बनाने के लिए एक पायथन मॉड्यूल का चयन करें"
+
+#: docfilekcm/docfilewizard.cpp:53
+#, kde-format
+msgctxt "refers to selecting a python module to perform some operation on"
+msgid "Target module (e.g. \"math\")"
+msgstr "लक्ष्य मॉड्यूल (जैसे \"गणित\")"
+
+#: docfilekcm/docfilewizard.cpp:55
+#, kde-format
+msgid "Output filename"
+msgstr "आउटपुट फ़ाइल नाम"
+
+#: docfilekcm/docfilewizard.cpp:61
+#, kde-format
+msgid "Status and output"
+msgstr "स्थिति और आउटपुट"
+
+#: docfilekcm/docfilewizard.cpp:63 docfilekcm/docfilewizard.cpp:69
+#, kde-format
+msgid "The process has not been run yet."
+msgstr "प्रक्रिया अभी तक शुरू नहीं हुई है."
+
+#: docfilekcm/docfilewizard.cpp:75
+#, kde-format
+msgid "Script output"
+msgstr "स्क्रिप्ट आउटपुट"
+
+#: docfilekcm/docfilewizard.cpp:76
+#, kde-format
+msgid "Results"
+msgstr "परिणाम"
+
+#: docfilekcm/docfilewizard.cpp:82
+#, kde-format
+msgid "Close"
+msgstr "बंद करना"
+
+#: docfilekcm/docfilewizard.cpp:84
+#, kde-format
+msgid "Save and close"
+msgstr "सहेजें और बंद करें"
+
+#: docfilekcm/docfilewizard.cpp:87
+#, kde-format
+msgid "Generate"
+msgstr "उत्पन्न"
+
+#: docfilekcm/docfilewizard.cpp:138
+#, kde-format
+msgid "Couldn't find the introspect.py script; check your installation!"
+msgstr "introspect.py स्क्रिप्ट नहीं मिल सकी; अपनी स्थापना की जाँच करें!"
+
+#: docfilekcm/docfilewizard.cpp:142
+#, kde-format
+msgid ""
+"Couldn't find a valid kdev-python data directory; check your installation!"
+msgstr "वैध kdev-python डेटा निर्देशिका नहीं मिल सकी; अपनी स्थापना की जाँच करें!"
+
+#: docfilekcm/docfilewizard.cpp:148
+#, kde-format
+msgid "Invalid output filename"
+msgstr "अमान्य आउटपुट फ़ाइल नाम"
+
+#: docfilekcm/docfilewizard.cpp:188
+#, kde-format
+msgid ""
+"The output file <br/>%1<br/> already exists, do you want to overwrite it?"
+msgstr "आउटपुट फ़ाइल<br/> %1<br/> पहले से मौजूद है, क्या आप इसे अधिलेखित करना चाहते हैं?"
+
+#: docfilekcm/docfilewizard.cpp:203
+#, kde-format
+msgid ""
+"This file contains auto-generated documentation extracted\n"
+"from python run-time information. It is analyzed by KDevelop\n"
+"to offer features such as code-completion and syntax highlighting.\n"
+"If you discover errors in KDevelop's support for this module,\n"
+"you can edit this file to correct the errors, e.g. you can add\n"
+"additional return statements to functions to control the return\n"
+"type to be used for that function by the analyzer.\n"
+"Make sure to keep a copy of your changes so you don't accidentally\n"
+"overwrite them by re-generating the file.\n"
+msgstr ""
+"इस फ़ाइल में स्वचालित रूप से जेनरेट किए गए दस्तावेज़ हैं, \n"
+"जो पाइथन रन-टाइम जानकारी से निकाले गए हैं। \n"
+"कोड-पूर्णता और सिंटैक्स हाइलाइटिंग जैसी सुविधाएँ प्रदान करने के लिए KDevelop द्वारा इसका "
+"विश्लेषण किया जाता है। \n"
+"यदि आपको इस मॉड्यूल के लिए KDevelop के समर्थन में त्रुटियाँ मिलती हैं, \n"
+"तो आप त्रुटियों को ठीक करने के लिए इस फ़ाइल को संपादित कर सकते हैं, \n"
+"उदाहरण के लिए आप विश्लेषक द्वारा उस फ़ंक्शन के लिए उपयोग किए जाने वाले रिटर्न प्रकार को "
+"नियंत्रित करने के लिए \n"
+"फ़ंक्शन में अतिरिक्त रिटर्न स्टेटमेंट जोड़ सकते हैं। \n"
+"अपने परिवर्तनों की एक प्रति रखना सुनिश्चित करें ताकि आप फ़ाइल को फिर से जेनरेट करके गलती "
+"से उन्हें अधिलेखित न कर दें।\n"
+
+#: docfilekcm/kcm_docfiles.cpp:48
+#, kde-format
+msgid "Manage Documentation Files Used by the Python Plugin"
+msgstr "पायथन प्लगइन द्वारा उपयोग की जाने वाली दस्तावेज़ फ़ाइलों का प्रबंधन करें"
+
+#: docfilekcm/kcm_docfiles.cpp:58
+#, kde-format
+msgid "Python Documentation"
+msgstr "पायथन दस्तावेज़ीकरण"
+
+#: duchain/assistants/missingincludeassistant.cpp:48
+#, kde-format
+msgid "Generate documentation for module \"%1\"..."
+msgstr "मॉड्यूल \"%1\" के लिए दस्तावेज़ तैयार करें..."
+
+#: duchain/declarationbuilder.cpp:705
+#, kde-format
+msgid "Module \"%1\" not found"
+msgstr "मॉड्यूल \"%1\" नहीं मिला"
+
+#: duchain/declarationbuilder.cpp:776
+#, kde-format
+msgid "Declaration for \"%1\" not found in specified module"
+msgstr "\"%1\" के लिए घोषणा निर्दिष्ट मॉड्यूल में नहीं मिली"
+
+#: duchain/declarationbuilder.cpp:1590
+#, kde-format
+msgid ""
+"First argument of class method is not called self or cls, this is deprecated"
+msgstr "क्लास विधि का पहला तर्क self या cls नहीं कहा जाता है, यह अप्रासंगिक है"
+
+#: duchain/declarationbuilder.cpp:1610
+#, kde-format
+msgid ""
+"Non-static class method without arguments, must have at least one (self)"
+msgstr "तर्कों के बिना गैर-स्थिर वर्ग विधि, कम से कम एक (स्वयं) होना चाहिए"
+
+#: duchain/declarationbuilder.cpp:1771
+#, kde-format
+msgid "Return statement not within function declaration"
+msgstr "रिटर्न स्टेटमेंट फ़ंक्शन घोषणा के अंतर्गत नहीं है"
+
+#: duchain/navigation/declarationnavigationcontext.cpp:67
+#, kde-format
+msgctxt "refers to an unknown type in programming"
+msgid "unknown"
+msgstr "अज्ञात"
+
+#: duchain/navigation/declarationnavigationcontext.cpp:83
+#: duchain/navigation/declarationnavigationcontext.cpp:99
+#: duchain/types/indexedcontainer.cpp:78
+#, kde-format
+msgctxt "as in list of int, set of string"
+msgid "%1 of %2"
+msgstr "%2 में से %1"
+
+#: duchain/types/unsuretype.cpp:101
+#, kde-format
+msgctxt "some object that can be called, in programming"
+msgid "<callable>"
+msgstr "<कॉल करने योग्य>"
+
+#: duchain/types/unsuretype.cpp:106
+#, kde-format
+msgctxt "a set with some elements"
+msgid "<iterable>"
+msgstr "<पुनरावर्तनीय>"
+
+#: duchain/types/unsuretype.cpp:127
+#, kde-format
+msgctxt "refers to a type (in program code) which is not known"
+msgid "mixed"
+msgstr "मिश्रित"
+
+#: duchain/types/unsuretype.cpp:130
+#, kde-format
+msgctxt "refers to a type (in program code) which can have multiple values"
+msgid "unsure (%1)"
+msgstr "अनिश्चित (%1)"
+
+#: duchain/usebuilder.cpp:83
+#, kde-format
+msgid "Undefined variable: %1"
+msgstr "अपरिभाषित चर: %1"
+
+#: duchain/usebuilder.cpp:130
+#, kde-format
+msgid "Attribute \"%1\" not found on accessed object"
+msgstr "एक्सेस की गई वस्तु पर विशेषता \"%1\" नहीं मिली"
+
+#: pep8kcm/kcm_pep8.cpp:63
+#, kde-format
+msgid "Configure Python Style Checking"
+msgstr "पायथन शैली जाँच कॉन्फ़िगर करें"
+
+#: pep8kcm/kcm_pep8.cpp:73
+#, kde-format
+msgid "Python Style Checking"
+msgstr "पायथन शैली जाँच"
+
+#. i18n: ectx: property (title), widget (QGroupBox, enableChecking)
+#: pep8kcm/pep8.ui:29
+#, kde-format
+msgid "Enable Style Checking"
+msgstr "शैली जाँच सक्षम करें"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, disableErrors)
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, enableErrors)
+#: pep8kcm/pep8.ui:44 pep8kcm/pep8.ui:58
+#, kde-format
+msgid "Comma-separated list of error codes"
+msgstr "त्रुटि कोडों की अल्पविराम से अलग की गई सूची"
+
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: pep8kcm/pep8.ui:51
+#, kde-format
+msgid "Enable these errors and warnings:"
+msgstr "इन त्रुटियों और चेतावनियों को सक्षम करें:"
+
+#. i18n: ectx: property (text), widget (QLabel, label_3)
+#: pep8kcm/pep8.ui:65
+#, kde-format
+msgid "Maximum line length:"
+msgstr "अधिकतम पंक्ति लंबाई:"
+
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: pep8kcm/pep8.ui:88
+#, kde-format
+msgid "Disable these errors and warnings:"
+msgstr "इन त्रुटियों और चेतावनियों को अक्षम करें:"
+
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: pep8kcm/pep8.ui:100
+#, kde-format
+msgid ""
+"The `pycodestyle` Python module must be installed in order to use style "
+"checking."
+msgstr ""
+"शैली जाँच का उपयोग करने के लिए `pycodestyle` पायथन मॉड्यूल स्थापित होना चाहिए।"
+
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: projectconfig/projectconfig.ui:19
+#, kde-format
+msgid "Python interpreter:"
+msgstr "पायथन इंटरप्रेटर:"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, pythonInterpreter)
+#: projectconfig/projectconfig.ui:26
+#, kde-format
+msgid "Full path to python interpreter, leave empty for default"
+msgstr "पायथन इंटरप्रेटर का पूर्ण पथ, डिफ़ॉल्ट के लिए रिक्त छोड़ दें"
+
+#: projectconfig/projectconfigpage.cpp:47
+#, kde-format
+msgid "Python Settings"
+msgstr "पायथन सेटिंग्स"
+
+#: pythonlanguagesupport.cpp:140
+#, kde-format
+msgid "Format source with the autopep8 formatter."
+msgstr "ऑटोपेप8 फ़ॉर्मेटर के साथ स्रोत को फ़ॉर्मेट करें।"
+
+#: pythonstylechecking.cpp:107
+#, kde-format
+msgid "PEP8 checker error: %1"
+msgstr "PEP8 चेकर त्रुटि: %1"
+
+#: pythonstylechecking.cpp:209
+#, kde-format
+msgid "The PEP8 syntax checker does not seem to work correctly."
+msgstr "ऐसा प्रतीत होता है कि PEP8 सिंटैक्स परीक्षक सही ढंग से काम नहीं कर रहा है।"
+
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "डिबग किए जा रहे प्रोग्राम ने एक अनकैच्ड अपवाद उठाया।"
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "अब आप प्रोग्राम से बाहर निकलने के बाद उसकी स्थिति का निरीक्षण कर सकते हैं।"
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "अगला आदेश सक्रिय होने पर डिबगर चुपचाप बंद हो जाएगा।"
diff -pruN 24.12.3-1/po/hu/kdevpython.po 25.11.80-0ubuntu1/po/hu/kdevpython.po
--- 24.12.3-1/po/hu/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/hu/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2014-01-20 20:24+0100\n"
 "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
 "Language-Team: Hungarian <kde-l10n-hu@kde.org>\n"
@@ -200,37 +200,37 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr ""
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr ""
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Egy bővítmény Python alkalmazások hibakeresés PDB segítéséhez."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, fuzzy, kde-format
 #| msgid "Sorry, debugging is only supported for Python 2.x applications."
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Elnézést, a hibakeresés csak a Python 2.x alkalmazásokat támogatja."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Nem támogatott értelmező"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -427,19 +427,19 @@ msgstr "A(z) „%1” modul nem találha
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Deklaráció nem található a megadott modulban ehhez: „%1”"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/ia/kdevpython.po 25.11.80-0ubuntu1/po/ia/kdevpython.po
--- 24.12.3-1/po/ia/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ia/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdev-python\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2024-09-11 10:22+0200\n"
 "Last-Translator: giovanni <g.sora@tiscali.it>\n"
 "Language-Team: Interlingua <kde-i18n-doc@kde.org>\n"
@@ -200,34 +200,34 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
+msgid "Unsupported interpreter"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
+msgid "Locals"
 msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
@@ -418,19 +418,19 @@ msgstr "Modulo \"%1\" non trovate"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/it/kdevpython.po 25.11.80-0ubuntu1/po/it/kdevpython.po
--- 24.12.3-1/po/it/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/it/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -2,14 +2,14 @@
 # This file is distributed under the same license as the kdev-python package.
 # Valter Mura <valtermura@gmail.com>, 2010, 2011, 2012, 2013.
 # Simone Solinas <ksolsim@gmail.com>, 2013, 2014.
-# Luigi Toscano <luigi.toscano@tiscali.it>, 2016, 2017, 2024.
+# SPDX-FileCopyrightText: 2016, 2017, 2024, 2025 Luigi Toscano <luigi.toscano@tiscali.it>
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-18 13:53+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-11 14:32+0200\n"
 "Last-Translator: Luigi Toscano <luigi.toscano@tiscali.it>\n"
 "Language-Team: Italian <kde-i18n-it@kde.org>\n"
 "Language: it\n"
@@ -17,17 +17,17 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 22.12.3\n"
+"X-Generator: Lokalize 25.04.0\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
-msgstr "Simone Solinas, Valter Mura"
+msgstr "Luigi Toscano, Simone Solinas, Valter Mura"
 
 #, kde-format
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
-msgstr "ksolsim@gmail.com, valtermura@gmail.com"
+msgstr "luigi.toscano@tiscali.it,,"
 
 #: codecompletion/context.cpp:115
 #, kde-format
@@ -204,38 +204,36 @@ msgstr "Moduli richiesti:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Una lista separata da virgole di moduli richiesti dal tipo"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Il programma in fase di debug ha generato un'eccezione non gestita."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Ora puoi ispezionare lo stato del programma dopo la sua chiusura."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"Il debugger si fermerà senza avvisare quando verrà attivato il prossimo "
-"comando."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Un'estensione per eseguire il debug delle applicazioni Python con pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Spiacente, il debug è supportato solo per le applicazioni Python 3.x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Interprete non supportato"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Informazioni di ritorno"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globali"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Locali"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -442,7 +440,7 @@ msgstr "Modulo «%1» non trovato"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Dichiarazione per «%1» non trovata nel modulo specificato"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -450,14 +448,14 @@ msgstr ""
 "Il primo argomento del metodo di classe non è chiamato self o cls, questa "
 "sintassi è deprecata"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 "Metodo di classe non statico senza argomenti, deve averne almeno uno (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Istruzione di ritorno non all'interno della dichiarazione di funzione"
@@ -594,6 +592,17 @@ msgstr "Errore del correttore PEP8: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Il correttore di sintassi PEP8 non sembra funzionare correttamente."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "Il programma in fase di debug ha generato un'eccezione non gestita."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Ora puoi ispezionare lo stato del programma dopo la sua chiusura."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "Il debugger si fermerà senza avvisare quando verrà attivato il prossimo "
+#~ "comando."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/ja/kdevpython.po 25.11.80-0ubuntu1/po/ja/kdevpython.po
--- 24.12.3-1/po/ja/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ja/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2009-01-26 21:02+0900\n"
 "Last-Translator: Japanese KDE translation team <kde-jp@kde.org>\n"
 "Language-Team: Japanese <kde-jp@kde.org>\n"
@@ -197,34 +197,34 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
+msgid "Unsupported interpreter"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
+msgid "Locals"
 msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
@@ -415,19 +415,19 @@ msgstr ""
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/ka/kdevpython.po 25.11.80-0ubuntu1/po/ka/kdevpython.po
--- 24.12.3-1/po/ka/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ka/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdev-python\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-17 05:30+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 06:11+0200\n"
 "Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
 "Language-Team: Georgian <kde-i18n-doc@kde.org>\n"
 "Language: ka\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 3.5\n"
+"X-Generator: Poedit 3.6\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -46,7 +46,7 @@ msgstr "ფაილის თავს
 #: codecompletion/context.cpp:175
 #, kde-format
 msgid "specify default parameter"
-msgstr "ნაგულისხმები პარამეტრის მითითება"
+msgstr "ნაგულისხმევი პარამეტრის მითითება"
 
 #: codecompletion/context.cpp:386
 #, kde-format
@@ -203,37 +203,36 @@ msgstr "აუცილებელი 
 msgid "A comma separated list of modules required for the type"
 msgstr "ტიპისთვის აუცილებელი მძიმით გამოყოფილი მოდულების სია"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "გამართვადი პროგრამის უცნობი შეცდომა."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr ""
-"ახლა პროგრამის სტატუსი მისი მუშაობის დასრულების შემდეგ შეგიძლიათ შეამოწმოთ."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "გამმართველი შემდეგი ბრძანების დატრიგერებისას ჩუმად გაჩერდება."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Python-ის აპლიკაციების pdb-ით გამართვის დამატება."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "უკაცრავად, გამართვა მხოლოდ Python 3.x აპლიკაციებისთვისაა მხარდაჭერილი."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "მხარდაუჭერელი ინტერპრეტატორი"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "დაბრუნების ინფორმაცია"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "გლობალები"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "ლოკალურები"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -442,13 +441,13 @@ msgstr "მოდული \"%1\" ვე
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "აღწერა \"%1\"-სთვის მითითებულ მოდულში ვერ ვიპოვე"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr "კლასის მეთოდის პირველ არგუმენტს self ან cls არ ჰქვია. ეს მოძველებულია"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -456,7 +455,7 @@ msgstr ""
 "არასტატიკური კლასის მეთოდი არგუმენტების გარეშეა. აუცილებელია, ერთი მაინც "
 "(self) ჰქონდეს"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "დაბრუნების რუტინა ფუნქციის აღწერაში არაა"
@@ -571,7 +570,7 @@ msgstr "Python -ის ინტერ
 #, kde-format
 msgid "Full path to python interpreter, leave empty for default"
 msgstr ""
-"სრული ბილიკი python-ის ინტერპრეტატორამდე. ნაგულისხმები მნიშვნელობის "
+"სრული ბილიკი python-ის ინტერპრეტატორამდე. ნაგულისხმევი მნიშვნელობის "
 "გამოსაყენებლად ცარიელი დატოვეთ"
 
 #: projectconfig/projectconfigpage.cpp:47
@@ -594,6 +593,17 @@ msgstr "PEP8 შემმოწმებ
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "PEP8 სინტაქსის შემმოწმებელი სწორად არ მუშაობს."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "გამართვადი პროგრამის უცნობი შეცდომა."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr ""
+#~ "ახლა პროგრამის სტატუსი მისი მუშაობის დასრულების შემდეგ შეგიძლიათ "
+#~ "შეამოწმოთ."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "გამმართველი შემდეგი ბრძანების დატრიგერებისას ჩუმად გაჩერდება."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr "__new__ მეთოდის პირველ არგუმენტს cls არ ჰქვია და ეს მოძველებულია"
diff -pruN 24.12.3-1/po/kk/kdevpython.po 25.11.80-0ubuntu1/po/kk/kdevpython.po
--- 24.12.3-1/po/kk/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/kk/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2013-11-15 05:35+0600\n"
 "Last-Translator: Sairan Kikkarin <sairan@computer.org>\n"
 "Language-Team: Kazakh <kde-i18n-doc@kde.org>\n"
@@ -203,37 +203,37 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Бағдарламаны жөндеу мақсатпен жібергенде беймәлім ерекшелік орын алды."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Енді бағдарламаның доғарылғаннан кейінгі күй-жайын білуге болады."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Келесі командаға ауысқанда жөндегіш үндемей тоқтатады."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Python бағдарламасын pdb көмегімен жөндейтін плагині."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, fuzzy, kde-format
 #| msgid "Sorry, debugging is only supported for Python 2.x applications."
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Ғафу етіңіз, жөндеу тек қана Python 2.x бағдарламаларға істейді."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Қолдауы жоқ интерпретаторы"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -456,7 +456,7 @@ msgstr "\"%1\" модулі табылм
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Келтірілген модулінде \"%1\" үшін мәлімдеме жоқ"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, fuzzy, kde-format
 #| msgid ""
 #| "First argument of class method is not called self, this is deprecated"
@@ -466,13 +466,13 @@ msgstr ""
 "Клас әдісінің бірінші аргументі өзі бөлек (self) шақырылмады. Ол ескірген "
 "тәсіл."
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr "Статикалық емес әдіс аргументсіз, кемінде біреуі (self) болу тиіс"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Return нұсқасы функция мәлімдемеден тыс жерде"
@@ -613,6 +613,16 @@ msgstr "PEP8 тексергіш қате
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Таңдалған PEP8 \"%1\" синтаксіс тексергіші дұрыс істемейтін сияқты."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr ""
+#~ "Бағдарламаны жөндеу мақсатпен жібергенде беймәлім ерекшелік орын алды."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Енді бағдарламаның доғарылғаннан кейінгі күй-жайын білуге болады."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "Келесі командаға ауысқанда жөндегіш үндемей тоқтатады."
+
 #, fuzzy
 #~| msgid ""
 #~| "First argument of class method is not called self, this is deprecated"
diff -pruN 24.12.3-1/po/ko/kdevpython.po 25.11.80-0ubuntu1/po/ko/kdevpython.po
--- 24.12.3-1/po/ko/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ko/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,17 +1,17 @@
-# SPDX-FileCopyrightText: 2014, 2015, 2020, 2024 Shinjo Park <kde@peremen.name>
+# SPDX-FileCopyrightText: 2014, 2015, 2020, 2024, 2025 Shinjo Park <kde@peremen.name>
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevelop\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-12-24 16:53+0100\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-10-09 00:41+0200\n"
 "Last-Translator: Shinjo Park <kde@peremen.name>\n"
 "Language-Team: Korean <kde-kr@kde.org>\n"
 "Language: ko\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 23.08.5\n"
+"X-Generator: Lokalize 24.12.3\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #, kde-format
@@ -197,36 +197,36 @@ msgstr "필요한 모듈:"
 msgid "A comma separated list of modules required for the type"
 msgstr "쉼표로 구분된 형식에 필요한 모듈 목록"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "디버그하고 있는 프로그램에서 처리되지 않은 예외가 발생했습니다."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "프로그램이 종료된 후 상태를 조사할 수 있습니다."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "다음 명령을 내렸을 때 디버거가 조용히 중단됩니다."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Python 앱을 pdb로 디버그하는 플러그인입니다."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "디버깅은 Python 3.x 앱만 지원합니다."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "지원하지 않는 인터프리터"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "반환값 정보"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "전역 변수"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "지역 변수"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -426,20 +426,20 @@ msgstr "\"%1\" 모듈을 찾을 수 없
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "지정한 모듈에서 \"%1\" 선언을 찾을 수 없음"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr "class 메서드의 첫 번째 인자가 self나 cls가 아님, 폐기 예고됨"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 "인자가 없는 static이 아닌 클래스 메서드, 인자가 최소 하나가 필요함(self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "return 구문이 함수 선언 내부에 있지 않음"
@@ -573,6 +573,15 @@ msgstr "PEP8 검사기 오류: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "PEP8 문법 검사기가 올바르게 작동하지 않는 것 같습니다."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "디버그하고 있는 프로그램에서 처리되지 않은 예외가 발생했습니다."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "프로그램이 종료된 후 상태를 조사할 수 있습니다."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "다음 명령을 내렸을 때 디버거가 조용히 중단됩니다."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr "__new__ 메서드의 첫 번째 인자가 cls가 아님, 폐기 예고됨"
diff -pruN 24.12.3-1/po/lt/kdevpython.po 25.11.80-0ubuntu1/po/lt/kdevpython.po
--- 24.12.3-1/po/lt/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/lt/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2009-01-25 22:33+0200\n"
 "Last-Translator: Andrius Štikonas <andrius@stikonas.eu>\n"
 "Language-Team: Lithuanian <kde-i18n-lt@kde.org>\n"
@@ -201,34 +201,34 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
+msgid "Unsupported interpreter"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
+msgid "Locals"
 msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
@@ -419,19 +419,19 @@ msgstr ""
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/mai/kdevpython.po 25.11.80-0ubuntu1/po/mai/kdevpython.po
--- 24.12.3-1/po/mai/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/mai/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2010-09-24 13:22+0530\n"
 "Last-Translator: Rajesh Ranjan <rajesh672@gmail.com>\n"
 "Language-Team: Maithili <bhashaghar@googlegroups.com>\n"
@@ -201,34 +201,34 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
+msgid "Unsupported interpreter"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
+msgid "Locals"
 msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
@@ -419,19 +419,19 @@ msgstr ""
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/mr/kdevpython.po 25.11.80-0ubuntu1/po/mr/kdevpython.po
--- 24.12.3-1/po/mr/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/mr/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2013-03-09 15:00+0530\n"
 "Last-Translator: Chetan Khona <chetan@kompkin.com>\n"
 "Language-Team: Marathi <kde-i18n-doc@kde.org>\n"
@@ -200,34 +200,34 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
+msgid "Unsupported interpreter"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
+msgid "Locals"
 msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
@@ -418,19 +418,19 @@ msgstr "विभाग \"%1\" आढळ
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/nds/kdevpython.po 25.11.80-0ubuntu1/po/nds/kdevpython.po
--- 24.12.3-1/po/nds/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/nds/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2014-03-17 18:44+0100\n"
 "Last-Translator: Manfred Wiese <m.j.wiese@web.de>\n"
 "Language-Team: Low Saxon <kde-i18n-nds@kde.org>\n"
@@ -201,35 +201,35 @@ msgstr "Nödig Modulen:"
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
+msgid "Unsupported interpreter"
+msgstr "Nich ünnerstütt Interpreter"
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
-msgstr "Nich ünnerstütt Interpreter"
+msgid "Locals"
+msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
@@ -425,19 +425,19 @@ msgstr "Moduul \"%1\" lett sik nich finn
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Deklaratschoon för \"%1\" nich binnen angeven Moduul funnen"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/nl/kdevpython.po 25.11.80-0ubuntu1/po/nl/kdevpython.po
--- 24.12.3-1/po/nl/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/nl/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,13 +1,13 @@
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
 #
-# SPDX-FileCopyrightText: 2012, 2013, 2014, 2015, 2016, 2017, 2024 Freek de Kruijf <freekdekruijf@kde.nl>
+# SPDX-FileCopyrightText: 2012, 2013, 2014, 2015, 2016, 2017, 2024, 2025 Freek de Kruijf <freekdekruijf@kde.nl>
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-17 12:05+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 09:38+0200\n"
 "Last-Translator: Freek de Kruijf <freekdekruijf@kde.nl>\n"
 "Language-Team: \n"
 "Language: nl\n"
@@ -15,7 +15,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Lokalize 24.08.2\n"
+"X-Generator: Lokalize 25.04.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -201,40 +201,36 @@ msgstr "Vereiste modulen:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Een kommagescheiden lijst met modulen vereist voor het type"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr ""
-"Het programma dat wordt gedebugd kwam met een niet gevangen uitzondering."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr ""
-"U kunt nu de status van het programma inspecteren nadat het is beëindigd."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"De debugger zal stilletjes stoppen wanneer het volgende commando wordt "
-"geactiveerd."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Een plug-in voor het debuggen van Python-toepassingen met pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Debuggen is alleen ondersteund voor Python 3.x toepassingen."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Niet ondersteunde interpretator"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Terugkeerinformatie"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globalen"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Locals"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -438,7 +434,7 @@ msgstr "Module \"%1\" niet gevonden"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Declaratie voor \"%1\" niet gevonden in de gespecificeerde module"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -446,7 +442,7 @@ msgstr ""
 "Eerste argument van klasse methode is niet aangeroepen met self of cls, dit "
 "is afgekeurd"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -454,7 +450,7 @@ msgstr ""
 "Niet-statische klasse methode zonder argumenten, moet er minstens één hebben "
 "(zichzelf)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Return-statement niet in de functiedeclaratie"
@@ -590,6 +586,19 @@ msgstr "Fout uit PEP8-checker: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "De PEP8-syntaxchecker lijkt niet juist te werken."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr ""
+#~ "Het programma dat wordt gedebugd kwam met een niet gevangen uitzondering."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr ""
+#~ "U kunt nu de status van het programma inspecteren nadat het is beëindigd."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "De debugger zal stilletjes stoppen wanneer het volgende commando wordt "
+#~ "geactiveerd."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/nn/kdevpython.po 25.11.80-0ubuntu1/po/nn/kdevpython.po
--- 24.12.3-1/po/nn/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/nn/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdev-python\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2021-02-09 19:20+0100\n"
 "Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
 "Language-Team: Norwegian Nynorsk <l10n-no@lister.huftis.org>\n"
@@ -202,37 +202,36 @@ msgstr "Påkravde modular:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Kommaskild liste med modular som er påkravde for typen"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Programmet som vart feilsøkt, gav eit unntak som ikkje vart fanga opp."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Du kan no inspisera statusen til programmet etter at det avslutta."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"Feilsøkjaren vil stoppa (utan meldingar) når neste kommando vert utløyst."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Programtillegg for å feilsøkja Python-program med pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Feilsøking er berre støtta for Python 3.x-program."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Ikkje-støtta fortolkar"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -423,19 +422,19 @@ msgstr "Fann ikkje modulen «%1»"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/pl/kdevpython.po 25.11.80-0ubuntu1/po/pl/kdevpython.po
--- 24.12.3-1/po/pl/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/pl/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,23 +1,23 @@
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
-# SPDX-FileCopyrightText: 2011, 2012, 2014, 2015, 2016, 2017, 2019, 2020, 2021, 2024 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
+# SPDX-FileCopyrightText: 2011, 2012, 2014, 2015, 2016, 2017, 2019, 2020, 2021, 2024, 2025 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
 # Marta Rybczyńska <kde-i18n@rybczynska.net>, 2013.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-19 12:37+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-09-06 06:09+0200\n"
 "Last-Translator: Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>\n"
-"Language-Team: Polish <kde-i18n-doc@kde.org>\n"
+"Language-Team: pl\n"
 "Language: pl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2);\n"
-"X-Generator: Lokalize 23.08.5\n"
+"X-Generator: Lokalize 25.08.0\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -204,38 +204,37 @@ msgstr "Wymagane moduły:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Wykaz modułów wymaganych dla tego rodzaju oddzielony przecinkami"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Debugowany program zgłosił niezłapany wyjątek."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Teraz możesz przejrzeć stan programu po jego wyjściu."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"Debugger zatrzyma się po cichu, gdy zostanie wywołane następne polecenie."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Wtyczka do debugowania programów Pythona z pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Wybacz, debugowanie jest obsługiwane jedynie dla programów Pythona 3.x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Nieobsługiwany program interpretujący"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Informacja zwrotna"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Symbole globalne"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Lokalne"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -439,7 +438,7 @@ msgstr "Nie znaleziono modułu \"%1\""
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Nie znaleziono deklaracji dla \"%1\" w podanym module"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -447,14 +446,14 @@ msgstr ""
 "Pierwszy argument metody klasy nie jest nazywany self czy cls, jest to "
 "przestarzałe"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 "Niestatyczna metoda klasy bez argumentów, musi mieć co najmniej jedno (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Instrukcja powrotu nie jest wewnątrz deklaracji funkcji"
@@ -589,6 +588,16 @@ msgstr "Błąd sprawdzania PEP8: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Wybrany program sprawdzający składnię PEP8 nie działa poprawnie."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "Debugowany program zgłosił niezłapany wyjątek."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Teraz możesz przejrzeć stan programu po jego wyjściu."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "Debugger zatrzyma się po cichu, gdy zostanie wywołane następne polecenie."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/pt/kdevpython.po 25.11.80-0ubuntu1/po/pt/kdevpython.po
--- 24.12.3-1/po/pt/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/pt/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2017-06-08 11:11+0100\n"
 "Last-Translator: José Nuno Coelho Pires <zepires@gmail.com>\n"
 "Language-Team: Portuguese <kde-i18n-pt@kde.org>\n"
@@ -201,39 +201,38 @@ msgstr "Módulos necessários:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Uma lista, separada por vírgulas, de módulos necessários para o tipo"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "O programa em depuração emitiu uma excepção não capturada."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Poderá agora inspeccionar o estado do programa depois de ter saído."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"O depurador irá parar silenciosamente quando o comando seguinte for invocado."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Um 'plugin' para depurar aplicações em Python com o 'pdb'."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Infelizmente, apenas é suportada a depuração para as aplicações em Python 3."
 "x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Interpretador não suportado"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -441,7 +440,7 @@ msgstr "O módulo \"%1\" não foi encont
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "A declaração de \"%1\" não foi encontrada no módulo indicado"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, fuzzy, kde-format
 #| msgid ""
 #| "First argument of class method is not called self, this is deprecated"
@@ -451,7 +450,7 @@ msgstr ""
 "O primeiro argumento do método da classe não se chama 'self'; isso está "
 "descontinuado"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -459,7 +458,7 @@ msgstr ""
 "Um método da classe não estático e sem argumentos deverá ter pelo menos um "
 "(o 'self')"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "A instrução 'return' está fora de uma declaração de função"
@@ -599,6 +598,17 @@ msgstr ""
 "O analisador de sintaxe PEP8 seleccionado não parece estar a funcionar "
 "correctamente."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "O programa em depuração emitiu uma excepção não capturada."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Poderá agora inspeccionar o estado do programa depois de ter saído."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "O depurador irá parar silenciosamente quando o comando seguinte for "
+#~ "invocado."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/pt_BR/kdevpython.po 25.11.80-0ubuntu1/po/pt_BR/kdevpython.po
--- 24.12.3-1/po/pt_BR/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/pt_BR/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -5,20 +5,21 @@
 # André Marcelo Alvarenga <alvarenga@kde.org>, 2013, 2014, 2015, 2016.
 # Luiz Fernando Ranghetti <elchevive@opensuse.org>, 2019.
 # SPDX-FileCopyrightText: 2025 Guilherme Marçal Silva <guimarcalsilva@gmail.com>
+# SPDX-FileCopyrightText: 2025 Marcus Gama <marcus.gama@gmail.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2025-02-05 23:49-0300\n"
-"Last-Translator: Guilherme Marçal Silva <guimarcalsilva@gmail.com>\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-29 09:20-0300\n"
+"Last-Translator: Marcus Gama <marcus.gama@gmail.com>\n"
 "Language-Team: Brazilian Portuguese <kde-i18n-pt_BR@kde.org>\n"
 "Language: pt_BR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Lokalize 24.12.1\n"
+"X-Generator: Lokalize 25.08.0\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -205,39 +206,37 @@ msgstr "Módulos necessários:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Uma lista separada por vírgulas, de módulos necessários para o tipo"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "O programa sendo depurado apresentou uma exceção não detectada."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Você pode agora inspecionar o estado do programa após sua saída."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"O depurador interromperá silenciosamente quando o próximo comando for "
-"disparado."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Um plugin para depurar aplicativos Python com pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Desculpe, mas somente aplicativos em Python 3.x tem suporte à depuração."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Interpretador não suportado"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Retornar informações"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globais"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Locais"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -444,7 +443,7 @@ msgstr "O módulo \"%1\" não foi encont
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "A declaração para \"%1\" não foi encontrada no módulo específico"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -452,7 +451,7 @@ msgstr ""
 "O primeiro argumento do método da classe não se chama self ou cls; isto foi "
 "descontinuado"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -460,7 +459,7 @@ msgstr ""
 "Um método da classe não estático e sem argumentos deverá ter pelo menos um "
 "(self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "A instrução 'return' está fora de uma declaração de função"
@@ -597,6 +596,17 @@ msgstr "Erro de verificação do PEP8: %
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "O analisador de sintaxe PEP8 parece não funcionar corretamente."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "O programa sendo depurado apresentou uma exceção não detectada."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Você pode agora inspecionar o estado do programa após sua saída."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "O depurador interromperá silenciosamente quando o próximo comando for "
+#~ "disparado."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/ro/kdevpython.po 25.11.80-0ubuntu1/po/ro/kdevpython.po
--- 24.12.3-1/po/ro/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ro/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2012-12-21 03:14+0200\n"
 "Last-Translator: Sergiu Bivol <sergiu@cip.md>\n"
 "Language-Team: Romanian <kde-i18n-ro@kde.org>\n"
@@ -201,35 +201,35 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
+msgid "Unsupported interpreter"
+msgstr "Interpretor incompatibil"
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
-msgstr "Interpretor incompatibil"
+msgid "Locals"
+msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
@@ -419,19 +419,19 @@ msgstr "Modulul „%1” nu a fost găsi
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/ru/kdevpython.po 25.11.80-0ubuntu1/po/ru/kdevpython.po
--- 24.12.3-1/po/ru/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ru/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -4,21 +4,22 @@
 # Alexander Lakhin <exclusion@gmail.com>, 2013.
 # Alexander Potashev <aspotashev@gmail.com>, 2018.
 # Olesya Gerasimenko <translation-team@basealt.ru>, 2022.
+# SPDX-FileCopyrightText: 2025 Alexander Yavorsky <kekcuha@gmail.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2022-03-03 15:16+0300\n"
-"Last-Translator: Olesya Gerasimenko <translation-team@basealt.ru>\n"
-"Language-Team: Basealt Translation Team\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-05-22 18:13+0300\n"
+"Last-Translator: Alexander Yavorsky <kekcuha@gmail.com>\n"
+"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
 "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Lokalize 21.12.1\n"
+"X-Generator: Lokalize 25.04.1\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -205,36 +206,36 @@ msgid "A comma separated list of modules
 msgstr ""
 "Список разделённых запятыми модулей, необходимых для работы с этим типом"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "В отлаживаемой программе возникло необрабатываемое исключение."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Сейчас вы можете изучить состояние программы после этого события."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Отладчик остановится сам при выполнении следующей команды."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Расширение для отладки приложений Python в pdb"
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "К сожалению, отладка поддерживается только для приложений Python 3.x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Неподдерживаемый интерпретатор"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -440,15 +441,15 @@ msgstr "Модуль «%1» не най
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Объявление «%1» не найдено в указанном модуле"
 
-#: duchain/declarationbuilder.cpp:1585
-#, fuzzy, kde-format
-#| msgid ""
-#| "First argument of class method is not called self, this is deprecated"
+#: duchain/declarationbuilder.cpp:1590
+#, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
-msgstr "Первый аргумент метода класса называется не self — эта запись устарела"
+msgstr ""
+"Первый аргумент метода класса называется не self или cls — эта запись "
+"устарела"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -456,7 +457,7 @@ msgstr ""
 "Не статический метод класса не имеет аргументов, а должен иметь минимум один "
 "(self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Оператор return вне объявления функции"
@@ -593,6 +594,15 @@ msgstr "Ошибка при провер
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Видимо, анализатор синтаксиса PEP8 работает неправильно."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "В отлаживаемой программе возникло необрабатываемое исключение."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Сейчас вы можете изучить состояние программы после этого события."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "Отладчик остановится сам при выполнении следующей команды."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/sa/kdevpython.po 25.11.80-0ubuntu1/po/sa/kdevpython.po
--- 24.12.3-1/po/sa/kdevpython.po	1970-01-01 00:00:00.000000000 +0000
+++ 25.11.80-0ubuntu1/po/sa/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -0,0 +1,590 @@
+# Sanskrit translations for kdev-python package.
+# Copyright (C) 2024 This file is copyright:
+# This file is distributed under the same license as the kdev-python package.
+# Kali <EMAIL@ADDRESS>, 2024.
+#
+# SPDX-FileCopyrightText: 2024 kali <skkalwar999@gmail.com>
+msgid ""
+msgstr ""
+"Project-Id-Version: kdev-python\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2024-12-24 20:39+0530\n"
+"Last-Translator: kali <shreekantkalwar@gmail.com>\n"
+"Language-Team: Sanskrit <kde-i18n-doc@kde.org>\n"
+"Language: sa\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>2);\n"
+"X-Generator: Lokalize 24.08.2\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "श्रीकान्त् कलवार्"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "skkalwar999@gmail.com"
+
+#: codecompletion/context.cpp:115
+#, kde-format
+msgid "insert Shebang line"
+msgstr "शेबङ्ग रेखा सम्मिलितं कुर्वन्तु"
+
+#: codecompletion/context.cpp:123
+#, kde-format
+msgid "specify document encoding"
+msgstr "दस्तावेज एन्कोडिंग् निर्दिशन्तु"
+
+#: codecompletion/context.cpp:125
+#, kde-format
+msgid "Add file header"
+msgstr "सञ्चिकाशीर्षकं योजयन्तु"
+
+#: codecompletion/context.cpp:175
+#, kde-format
+msgid "specify default parameter"
+msgstr "पूर्वनिर्धारितं पैरामीटर् निर्दिशन्तु"
+
+#: codecompletion/context.cpp:386
+#, kde-format
+msgid "Insert next positional variable"
+msgstr "अग्रिमः स्थितिचरं सम्मिलितं कुर्वन्तु"
+
+#: codecompletion/context.cpp:391
+#, kde-format
+msgid "Insert named variable"
+msgstr "नामकं चरं सम्मिलितं कुर्वन्तु"
+
+#: codecompletion/context.cpp:427
+#, kde-format
+msgid "Format using str()"
+msgstr "str() इत्यस्य उपयोगेन प्रारूपणं कुर्वन्तु ।"
+
+#: codecompletion/context.cpp:428
+#, kde-format
+msgid "Format using repr()"
+msgstr "repr() इत्यस्य उपयोगेन प्रारूपणं कुर्वन्तु ।"
+
+#: codecompletion/context.cpp:436
+#, kde-format
+msgid "Format as left-aligned"
+msgstr "वाम-संरेखितरूपेण प्रारूपं कुर्वन्तु"
+
+#: codecompletion/context.cpp:437
+#, kde-format
+msgid "Format as right-aligned"
+msgstr "दक्षिण-संरेखितरूपेण प्रारूपं कुर्वन्तु"
+
+#: codecompletion/context.cpp:438
+#, kde-format
+msgid "Format as centered"
+msgstr "केन्द्रीकृतरूपेण प्रारूपं कुर्वन्तु"
+
+#: codecompletion/context.cpp:442
+#, kde-format
+msgid "Specify precision"
+msgstr "सटीकता निर्दिशतु"
+
+#: codecompletion/context.cpp:443
+#, kde-format
+msgid "Format as percentage"
+msgstr "प्रतिशतरूपेण प्रारूपं कुर्वन्तु"
+
+#: codecompletion/context.cpp:444
+#, kde-format
+msgid "Format as character"
+msgstr "वर्णरूपेण प्रारूपं कुर्वन्तु"
+
+#: codecompletion/context.cpp:445
+#, kde-format
+msgid "Format as binary number"
+msgstr "द्विचक्रीयसङ्ख्यारूपेण प्रारूपं कुर्वन्तु"
+
+#: codecompletion/context.cpp:446
+#, kde-format
+msgid "Format as octal number"
+msgstr "अष्टसङ्ख्यारूपेण प्रारूपं कुर्वन्तु"
+
+#: codecompletion/context.cpp:447
+#, kde-format
+msgid "Format as hexadecimal number"
+msgstr "षट्दशमलवसङ्ख्यारूपेण प्रारूपं कुर्वन्तु"
+
+#: codecompletion/context.cpp:448
+#, kde-format
+msgid "Format in scientific (exponent) notation"
+msgstr "वैज्ञानिक (घटक) संकेतने प्रारूप"
+
+#: codecompletion/context.cpp:449
+#, kde-format
+msgid "Format as fixed point number"
+msgstr "नियतबिन्दुसङ्ख्यारूपेण प्रारूपं कुर्वन्तु"
+
+#: codecompletion/context.cpp:509
+#, kde-format
+msgid "Initialize property"
+msgstr "सम्पत्तिं आरभत"
+
+#: codecompletion/items/functiondeclaration.cpp:81
+#, kde-format
+msgid "function"
+msgstr "नियोग"
+
+#: codecompletion/items/missingincludeitem.cpp:38
+#, kde-format
+msgctxt "programming; %1 is a code statement to be added in the editor"
+msgid "Add \"%1\""
+msgstr "\"%1\" योजयतु।"
+
+#: codegen/correctionfilegenerator.cpp:58
+#, kde-format
+msgid "Specify type for \"%1\"..."
+msgstr "\"%1\" कृते प्रकारं निर्दिशन्तु..."
+
+#: codegen/correctionfilegenerator.cpp:108
+#, kde-format
+msgid "Function return type"
+msgstr "फंक्शन् रिटर्न प्रकार"
+
+#: codegen/correctionfilegenerator.cpp:111
+#, kde-format
+msgid "Local variable"
+msgstr "स्थानीय चर"
+
+#: codegen/correctionfilegenerator.cpp:147
+#, kde-format
+msgid "Sorry, cannot create hints for files which are not part of a project."
+msgstr ""
+"क्षम्यतां, परियोजनायाः भागः न भवन्ति इति सञ्चिकानां कृते संकेतान् निर्मातुं न शक्नोति ।"
+
+#. i18n: ectx: property (windowTitle), widget (QWidget, CorrectionWidget)
+#: codegen/correctionwidget.ui:20
+#, kde-format
+msgid "Specify correct type"
+msgstr "सम्यक् प्रकारं निर्दिशतु"
+
+#. i18n: ectx: property (text), widget (QLabel, givenKindLabel)
+#: codegen/correctionwidget.ui:28
+#, kde-format
+msgid "Kind:"
+msgstr "दयालु:"
+
+#. i18n: ectx: property (text), widget (QLabel, givenIdentifierLabel)
+#: codegen/correctionwidget.ui:42
+#, kde-format
+msgid "Identifier:"
+msgstr "परिचयकः :"
+
+#. i18n: ectx: property (text), widget (QLabel, typeLabel)
+#: codegen/correctionwidget.ui:56
+#, kde-format
+msgid "Correct type:"
+msgstr "सम्यक् प्रकारः :"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, typeText)
+#: codegen/correctionwidget.ui:63
+#, kde-format
+msgid "Code which evaluates to the type, e.g. int()"
+msgstr "कोडः यः प्रकारं प्रति मूल्याङ्कनं करोति, उदा. int()"
+
+#. i18n: ectx: property (text), widget (QLabel, importsLabel)
+#: codegen/correctionwidget.ui:70
+#, kde-format
+msgid "Required modules:"
+msgstr "आवश्यकाः मॉड्यूलाः :"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, importsText)
+#: codegen/correctionwidget.ui:77
+#, kde-format
+msgid "A comma separated list of modules required for the type"
+msgstr "प्रकारस्य कृते आवश्यकानां मॉड्यूलानां अल्पविरामविभक्तसूची"
+
+#: debugger/pdblauncher.cpp:45
+#, kde-format
+msgid "A plugin to debug Python applications with pdb."
+msgstr "pdb इत्यनेन सह Python अनुप्रयोगानाम् त्रुटिनिवारणार्थं प्लगिन् ।"
+
+#: debugger/pdblauncher.cpp:86
+#, kde-format
+msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgstr "क्षम्यतां, त्रुटिनिवारणं केवलं Python 3.x अनुप्रयोगानाम् कृते समर्थितम् अस्ति ।"
+
+#: debugger/pdblauncher.cpp:87
+#, kde-format
+msgid "Unsupported interpreter"
+msgstr "असमर्थितः व्याख्याकारः"
+
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
+#: docfilekcm/docfilemanagerwidget.cpp:37
+#, kde-format
+msgid "Failed to find a valid data directory for kdevpythonsupport."
+msgstr "kdevpythonsport कृते वैधदत्तांशनिर्देशिकां अन्वेष्टुं असफलम् ।"
+
+#: docfilekcm/docfilemanagerwidget.cpp:51
+#, kde-format
+msgid "Generate..."
+msgstr "उद्- पद्..."
+
+#: docfilekcm/docfilemanagerwidget.cpp:53
+#, kde-format
+msgid "Import From Editor"
+msgstr "सम्पादकात् आयातम्"
+
+#: docfilekcm/docfilemanagerwidget.cpp:54
+#, kde-format
+msgid ""
+"Copy the contents of the active editor window to a new file in the "
+"documentation directory"
+msgstr ""
+"सक्रियसम्पादकविण्डो इत्यस्य सामग्रीं दस्तावेजनिर्देशिकायां नूतनसञ्चिकायां प्रतिलिपिं कुर्वन्तु"
+
+#: docfilekcm/docfilemanagerwidget.cpp:66
+#, kde-format
+msgid "Open File Manager"
+msgstr "सञ्चिकाप्रबन्धकं उद्घाटयन्तु"
+
+#: docfilekcm/docfilemanagerwidget.cpp:68
+#, kde-format
+msgctxt "Edit selected files"
+msgid "Edit Selected"
+msgstr "सम्पादनं चयनितम्"
+
+#: docfilekcm/docfilemanagerwidget.cpp:70
+#, kde-format
+msgid "Search Paths..."
+msgstr "अन्वेषणमार्गाः..."
+
+#: docfilekcm/docfilemanagerwidget.cpp:101
+#, kde-format
+msgctxt "displays a list of search paths below"
+msgid "Paths searched for documentation by kdev-python (in this order):"
+msgstr "kdev-python द्वारा दस्तावेजीकरणार्थं अन्वेषिताः मार्गाः (अस्मिन् क्रमे):"
+
+#: docfilekcm/docfilemanagerwidget.cpp:141
+#, kde-format
+msgid "Enter a relative target path to copy %1 to:"
+msgstr "%1 इत्यस्य प्रतिलिपिं कर्तुं सापेक्षं लक्ष्यमार्गं प्रविशन्तु:"
+
+#: docfilekcm/docfilemanagerwidget.cpp:145
+#, kde-format
+msgid ""
+"This path must match what you use in Python to import this module. For "
+"example, enter \"numpy/fft.py\" for numpy.fft"
+msgstr ""
+"एषः मार्गः भवता एतत् मॉड्यूल् आयातयितुं Python मध्ये यत् उपयुज्यते तस्य सङ्गतिः भवितुमर्हति । "
+"यथा, numpy.fft कृते \"numpy/fft.py\" इति प्रविष्टं कुर्वन्तु"
+
+#: docfilekcm/docfilemanagerwidget.cpp:147
+#, kde-format
+msgid "After copying, you will be editing the new document."
+msgstr "प्रतिलिपिं कृत्वा भवन्तः नूतनं दस्तावेजं सम्पादयन्ति भविष्यन्ति ।"
+
+#: docfilekcm/docfilemanagerwidget.cpp:166
+#, kde-format
+msgid "Please select at least one file from the list for editing."
+msgstr "सम्पादनार्थं सूचीतः न्यूनातिन्यूनम् एकां सञ्चिकां चिनोतु ।"
+
+#: docfilekcm/docfilewizard.cpp:41
+#, kde-format
+msgid "Configure the Python interpreter to use"
+msgstr "उपयोगाय पायथन् व्याख्याकारं विन्यस्यताम्"
+
+#: docfilekcm/docfilewizard.cpp:44
+#, kde-format
+msgid "Python executable"
+msgstr "पायथन कार्यान्वयनीय"
+
+#: docfilekcm/docfilewizard.cpp:49
+#, kde-format
+msgid "Select a python module to generate documentation for"
+msgstr "दस्तावेजीकरणं जनयितुं python मॉड्यूल् चिनोतु"
+
+#: docfilekcm/docfilewizard.cpp:53
+#, kde-format
+msgctxt "refers to selecting a python module to perform some operation on"
+msgid "Target module (e.g. \"math\")"
+msgstr "लक्ष्यमॉड्यूल (उदा. \"गणित\")"
+
+#: docfilekcm/docfilewizard.cpp:55
+#, kde-format
+msgid "Output filename"
+msgstr "आउटपुट् सञ्चिकानाम"
+
+#: docfilekcm/docfilewizard.cpp:61
+#, kde-format
+msgid "Status and output"
+msgstr "स्थितिः निर्गमः च"
+
+#: docfilekcm/docfilewizard.cpp:63 docfilekcm/docfilewizard.cpp:69
+#, kde-format
+msgid "The process has not been run yet."
+msgstr "प्रक्रिया अद्यापि न चालिता अस्ति।"
+
+#: docfilekcm/docfilewizard.cpp:75
+#, kde-format
+msgid "Script output"
+msgstr "स्क्रिप्ट् आउटपुट्"
+
+#: docfilekcm/docfilewizard.cpp:76
+#, kde-format
+msgid "Results"
+msgstr "परिणामाः"
+
+#: docfilekcm/docfilewizard.cpp:82
+#, kde-format
+msgid "Close"
+msgstr "पिधानं करोतु"
+
+#: docfilekcm/docfilewizard.cpp:84
+#, kde-format
+msgid "Save and close"
+msgstr "रक्षित्वा बन्दं कुर्वन्तु"
+
+#: docfilekcm/docfilewizard.cpp:87
+#, kde-format
+msgid "Generate"
+msgstr "उद्- पद्"
+
+#: docfilekcm/docfilewizard.cpp:138
+#, kde-format
+msgid "Couldn't find the introspect.py script; check your installation!"
+msgstr "introspect.py स्क्रिप्ट् न प्राप्नोत्; स्वस्य संस्थापनं पश्यन्तु!"
+
+#: docfilekcm/docfilewizard.cpp:142
+#, kde-format
+msgid ""
+"Couldn't find a valid kdev-python data directory; check your installation!"
+msgstr "वैधं kdev-python दत्तांशनिर्देशिकां न प्राप्नोत्; स्वस्य संस्थापनं पश्यन्तु!"
+
+#: docfilekcm/docfilewizard.cpp:148
+#, kde-format
+msgid "Invalid output filename"
+msgstr "अमान्यनिर्गमसञ्चिकानाम"
+
+#: docfilekcm/docfilewizard.cpp:188
+#, kde-format
+msgid ""
+"The output file <br/>%1<br/> already exists, do you want to overwrite it?"
+msgstr "आउटपुट् सञ्चिका<br/> %1<br/> पूर्वमेव अस्ति, किं भवन्तः तस्य अधिलेखनं कर्तुम् इच्छन्ति?"
+
+#: docfilekcm/docfilewizard.cpp:203
+#, kde-format
+msgid ""
+"This file contains auto-generated documentation extracted\n"
+"from python run-time information. It is analyzed by KDevelop\n"
+"to offer features such as code-completion and syntax highlighting.\n"
+"If you discover errors in KDevelop's support for this module,\n"
+"you can edit this file to correct the errors, e.g. you can add\n"
+"additional return statements to functions to control the return\n"
+"type to be used for that function by the analyzer.\n"
+"Make sure to keep a copy of your changes so you don't accidentally\n"
+"overwrite them by re-generating the file.\n"
+msgstr ""
+"अस्मिन् सञ्चिकायां स्वतः उत्पन्नं दस्तावेजं निष्कासितम् अस्ति\n"
+"python run-time सूचनातः । अस्य विश्लेषणं KDevelop द्वारा क्रियते\n"
+"कोड-समाप्तिः, वाक्यविन्यास-प्रकाशनं च इत्यादीनि विशेषतानि प्रदातुं ।\n"
+"यदि भवान् अस्य मॉड्यूलस्य समर्थने KDevelop इत्यस्य त्रुटयः आविष्करोति तर्हि\n"
+"दोषान् सम्यक् कर्तुं भवान् एतां सञ्चिकां सम्पादयितुं शक्नोति, उदा. भवन्तः योजयितुं शक्नुवन्ति\n"
+"रिटर्न् नियन्त्रयितुं फंक्शन्स् कृते अतिरिक्तं रिटर्न् स्टेट्मेण्ट्स्\n"
+"तस्य कार्यस्य कृते विश्लेषकेन उपयोक्तव्यः प्रकारः ।\n"
+"भवतः परिवर्तनस्य प्रतिलिपिं सुनिश्चितं कुर्वन्तु येन भवन्तः आकस्मिकतया न भवन्ति\n"
+"सञ्चिकां पुनः जनयित्वा तान् अधिलिखयन्तु ।\n"
+
+#: docfilekcm/kcm_docfiles.cpp:48
+#, kde-format
+msgid "Manage Documentation Files Used by the Python Plugin"
+msgstr "पायथन् प्लगिन् द्वारा उपयुज्यमानाः दस्तावेजीकरणसञ्चिकाः प्रबन्धयन्तु"
+
+#: docfilekcm/kcm_docfiles.cpp:58
+#, kde-format
+msgid "Python Documentation"
+msgstr "पायथन दस्तावेजीकरण"
+
+#: duchain/assistants/missingincludeassistant.cpp:48
+#, kde-format
+msgid "Generate documentation for module \"%1\"..."
+msgstr "\"%1\" मॉड्यूलस्य कृते दस्तावेजीकरणं जनयन्तु..."
+
+#: duchain/declarationbuilder.cpp:705
+#, kde-format
+msgid "Module \"%1\" not found"
+msgstr "\"%1\" मॉड्यूल् न प्राप्तम्"
+
+#: duchain/declarationbuilder.cpp:776
+#, kde-format
+msgid "Declaration for \"%1\" not found in specified module"
+msgstr "निर्दिष्टे मॉड्यूले \"%1\" इत्यस्य घोषणा न प्राप्ता"
+
+#: duchain/declarationbuilder.cpp:1590
+#, kde-format
+msgid ""
+"First argument of class method is not called self or cls, this is deprecated"
+msgstr ""
+"class मेथड् इत्यस्य प्रथमः आर्गुमेण्ट् self अथवा cls इति न उच्यते, एतत् अप्रचलितम् अस्ति"
+
+#: duchain/declarationbuilder.cpp:1610
+#, kde-format
+msgid ""
+"Non-static class method without arguments, must have at least one (self)"
+msgstr "तर्करहितः अस्थिरवर्गविधिः, न्यूनातिन्यूनं एकः (स्वयं) भवितुमर्हति ।"
+
+#: duchain/declarationbuilder.cpp:1771
+#, kde-format
+msgid "Return statement not within function declaration"
+msgstr "फंक्शन् घोषणायाः अन्तः नास्ति इति कथनं प्रत्यागच्छतु"
+
+#: duchain/navigation/declarationnavigationcontext.cpp:67
+#, kde-format
+msgctxt "refers to an unknown type in programming"
+msgid "unknown"
+msgstr "अज्ञात"
+
+#: duchain/navigation/declarationnavigationcontext.cpp:83
+#: duchain/navigation/declarationnavigationcontext.cpp:99
+#: duchain/types/indexedcontainer.cpp:78
+#, kde-format
+msgctxt "as in list of int, set of string"
+msgid "%1 of %2"
+msgstr "%2 इत्यस्य %1"
+
+#: duchain/types/unsuretype.cpp:101
+#, kde-format
+msgctxt "some object that can be called, in programming"
+msgid "<callable>"
+msgstr "<आह्वानीय>"
+
+#: duchain/types/unsuretype.cpp:106
+#, kde-format
+msgctxt "a set with some elements"
+msgid "<iterable>"
+msgstr "<पुनरावर्तनीयम्>"
+
+#: duchain/types/unsuretype.cpp:127
+#, kde-format
+msgctxt "refers to a type (in program code) which is not known"
+msgid "mixed"
+msgstr "मिश्रितम्"
+
+#: duchain/types/unsuretype.cpp:130
+#, kde-format
+msgctxt "refers to a type (in program code) which can have multiple values"
+msgid "unsure (%1)"
+msgstr "अनिश्चित (%1)"
+
+#: duchain/usebuilder.cpp:83
+#, kde-format
+msgid "Undefined variable: %1"
+msgstr "अपरिभाषितः चरः %1"
+
+#: duchain/usebuilder.cpp:130
+#, kde-format
+msgid "Attribute \"%1\" not found on accessed object"
+msgstr "अभिगतवस्तुनि \"%1\" इति विशेषता न प्राप्ता"
+
+#: pep8kcm/kcm_pep8.cpp:63
+#, kde-format
+msgid "Configure Python Style Checking"
+msgstr "पायथन् शैलीपरीक्षणं विन्यस्यताम्"
+
+#: pep8kcm/kcm_pep8.cpp:73
+#, kde-format
+msgid "Python Style Checking"
+msgstr "पायथन शैली जाँच"
+
+#. i18n: ectx: property (title), widget (QGroupBox, enableChecking)
+#: pep8kcm/pep8.ui:29
+#, kde-format
+msgid "Enable Style Checking"
+msgstr "शैलीपरीक्षणं सक्षमं कुर्वन्तु"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, disableErrors)
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, enableErrors)
+#: pep8kcm/pep8.ui:44 pep8kcm/pep8.ui:58
+#, kde-format
+msgid "Comma-separated list of error codes"
+msgstr "त्रुटिसङ्केतानां अल्पविरामेन पृथक्कृता सूची"
+
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: pep8kcm/pep8.ui:51
+#, kde-format
+msgid "Enable these errors and warnings:"
+msgstr "एतानि त्रुटयः चेतावनीश्च सक्षमं कुर्वन्तु:"
+
+#. i18n: ectx: property (text), widget (QLabel, label_3)
+#: pep8kcm/pep8.ui:65
+#, kde-format
+msgid "Maximum line length:"
+msgstr "अधिकतम रेखादीर्घता :"
+
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: pep8kcm/pep8.ui:88
+#, kde-format
+msgid "Disable these errors and warnings:"
+msgstr "एतानि त्रुटयः चेतावनीश्च निष्क्रियं कुर्वन्तु:"
+
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#: pep8kcm/pep8.ui:100
+#, kde-format
+msgid ""
+"The `pycodestyle` Python module must be installed in order to use style "
+"checking."
+msgstr "शैलीपरीक्षणस्य उपयोगाय `pycodestyle` पायथन् मॉड्यूल् संस्थापनीयम् ।"
+
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: projectconfig/projectconfig.ui:19
+#, kde-format
+msgid "Python interpreter:"
+msgstr "पायथन् व्याख्याकारः :"
+
+#. i18n: ectx: property (placeholderText), widget (QLineEdit, pythonInterpreter)
+#: projectconfig/projectconfig.ui:26
+#, kde-format
+msgid "Full path to python interpreter, leave empty for default"
+msgstr "python interpreter इत्यस्य पूर्णमार्गः, पूर्वनिर्धारितार्थं रिक्तं त्यजन्तु"
+
+#: projectconfig/projectconfigpage.cpp:47
+#, kde-format
+msgid "Python Settings"
+msgstr "पायथन सेटिंग्स्"
+
+#: pythonlanguagesupport.cpp:140
+#, kde-format
+msgid "Format source with the autopep8 formatter."
+msgstr "autopep8 स्वरूपकेन स्रोतः प्रारूपयन्तु ।"
+
+#: pythonstylechecking.cpp:107
+#, kde-format
+msgid "PEP8 checker error: %1"
+msgstr "PEP8 परीक्षकदोषः: %1"
+
+#: pythonstylechecking.cpp:209
+#, kde-format
+msgid "The PEP8 syntax checker does not seem to work correctly."
+msgstr "PEP8 वाक्यविन्यासपरीक्षकः सम्यक् कार्यं न करोति इति दृश्यते ।"
+
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "त्रुटिनिवारणं क्रियमाणः कार्यक्रमः अगृहीतं अपवादं उत्थापितवान् ।"
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "इदानीं भवान् कार्यक्रमस्य निर्गमनानन्तरं तस्य स्थितिं निरीक्षितुं शक्नोति ।"
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "अग्रिमः आदेशः प्रवर्तते सति त्रुटिनिवारकः मौनेन स्थगयिष्यति ।"
diff -pruN 24.12.3-1/po/sk/kdevpython.po 25.11.80-0ubuntu1/po/sk/kdevpython.po
--- 24.12.3-1/po/sk/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/sk/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -1,18 +1,18 @@
 # translation of kdevpython.po to Slovak
-# SPDX-FileCopyrightText: 2012, 2013, 2014, 2015, 2016, 2017, 2024 Roman Paholík <wizzardsk@gmail.com>
+# Roman Paholík <wizzardsk@gmail.com>, 2012, 2013, 2014, 2015, 2016, 2017.
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-11-10 19:31+0100\n"
-"Last-Translator: Roman Paholík <wizzardsk@gmail.com>\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2017-09-16 21:11+0100\n"
+"Last-Translator: Roman Paholik <wizzardsk@gmail.com>\n"
 "Language-Team: Slovak <kde-sk@linux.sk>\n"
 "Language: sk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 24.08.3\n"
+"X-Generator: Lokalize 2.0\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #, kde-format
@@ -200,36 +200,36 @@ msgstr "Vyžadované moduly:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Čiarkou oddelený zoznam modulov vyžadovaných pre typ"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Ladený program vygeneroval neošetrenú výnimku."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Teraz môžete preskúmať stav programu po jeho ukončení."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Debugger sa ticho zastaví pri spustení ďalšieho príkazu."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Plugin na ladenie Python aplikácií s pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Prepáčte, ladenie je podporované iba v aplikáciách Python 3.x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Nepodporovaný interpreter"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr ""
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr ""
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -432,20 +432,21 @@ msgstr "Modul \"%1\" nebol nájdený"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Deklarácia pre \"%1\" nenájdená v určenom module"
 
-#: duchain/declarationbuilder.cpp:1585
-#, kde-format
+#: duchain/declarationbuilder.cpp:1590
+#, fuzzy, kde-format
+#| msgid ""
+#| "First argument of class method is not called self, this is deprecated"
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
-msgstr ""
-"Prvý argument metódy triedy nie je volaný sám alebo cls, čo je zastaralé"
+msgstr "Prvý argument metódy triedy nie je volaný sám, čo je zastaralé"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr "Nestatická metóda triedy bez argumentov, musí mať aspoň jednu (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Návratové vyhlásenie nie je v deklarácii funkcie"
@@ -581,6 +582,15 @@ msgstr "Chyba kontroly PEP8: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Kontrolovať syntaxe PEP8 zrejme nepracuje správne."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "Ladený program vygeneroval neošetrenú výnimku."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Teraz môžete preskúmať stav programu po jeho ukončení."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "Debugger sa ticho zastaví pri spustení ďalšieho príkazu."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr "Prvý argument metódy __new__ nie je volaný cls, čo je zastaralé"
diff -pruN 24.12.3-1/po/sl/kdevpython.po 25.11.80-0ubuntu1/po/sl/kdevpython.po
--- 24.12.3-1/po/sl/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/sl/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-20 21:49+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 23:11+0200\n"
 "Last-Translator: Matjaž Jeran <matjaz.jeran@amis.net>\n"
 "Language-Team: Slovenian <lugos-slo@lugos.si>\n"
 "Language: sl\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
 "%100==4 ? 3 : 0);\n"
-"X-Generator: Poedit 3.5\n"
+"X-Generator: Poedit 3.6\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -201,36 +201,36 @@ msgstr "Zahtevani moduli:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Z vejico ločen seznam modulov, ki jih vrsta zahteva"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Program, ki ga razhroščujete, je povzročil neujeto izjemo."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Sedaj lahko preučite stanje programa, potem ko se konča."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Razhroščevalnik se bo potiho zaustavil, ko bo sprožen naslednji ukaz."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Vstavek za razhroščevanje programov za Python s pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Žal je razhroščevanje podprto le v programih Python 3.x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Nepodprt tolmač"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Povratne informacije"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globalne"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Lokalne"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -436,21 +436,21 @@ msgstr "Modula \"%1\" ni bilo mogoče na
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Deklaracija za \"%1\" ni bila najdena v podanem modulu"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 "Prvi argument metode razreda se ne imenuje self ali cls, to je opuščeno"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 "Ne-statična metoda razreda brez argumentov mora imeti vsaj enega (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Vrnitvena izjava ni znotraj deklaracije funkcije"
@@ -586,6 +586,16 @@ msgstr "Napaka preverjalnika PEP8: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "Izgleda, da preverjalnik skladnje PEP8, ne deluje pravilno."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "Program, ki ga razhroščujete, je povzročil neujeto izjemo."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Sedaj lahko preučite stanje programa, potem ko se konča."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "Razhroščevalnik se bo potiho zaustavil, ko bo sprožen naslednji ukaz."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr "Prvi argument metode __new__ se ne imenuje cls, to je opuščeno"
diff -pruN 24.12.3-1/po/sv/kdevpython.po 25.11.80-0ubuntu1/po/sv/kdevpython.po
--- 24.12.3-1/po/sv/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/sv/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -2,21 +2,21 @@
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
 #
-# SPDX-FileCopyrightText: 2009, 2024 Stefan Asserhäll <stefan.asserhall@gmail.com>
+# SPDX-FileCopyrightText: 2009, 2024, 2025 Stefan Asserhäll <stefan.asserhall@gmail.com>
 # Stefan Asserhall <stefan.asserhall@gmail.com>, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017.
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-19 16:12+0200\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 07:41+0200\n"
 "Last-Translator: Stefan Asserhäll <stefan.asserhall@gmail.com>\n"
 "Language-Team: Swedish <kde-i18n-doc@kde.org>\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 24.08.2\n"
+"X-Generator: Lokalize 25.04.3\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
 #, kde-format
@@ -202,36 +202,36 @@ msgstr "Moduler som krävs:"
 msgid "A comma separated list of modules required for the type"
 msgstr "En lista av moduler som krävs för typen åtskilda av kommatecken"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Programmet som avlusades orsakade ett ohanterat undantag."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Du kan nu inspektera programmets status efter det har avslutats."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Avlusaren stoppar utan underrättelse när nästa kommando utförs."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Ett insticksprogram för att avlusa Python-program med PDB."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Tyvärr är avlusning bara tillgänglig för Python 3.x-program."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Tolken stöds inte"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Returinformation"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globala objekt"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Lokala objekt"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -438,21 +438,21 @@ msgstr "Modulen \"%1 hittades inte"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "Deklaration av \"%1\" hittades inte i angiven modul"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 "Första argumentet i en klassmetod kallas inte self eller cls, det avråds från"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 "Icke-statisk klassmetod utan argument, det måste finnas minst ett (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Retursats utanför funktionsdeklaration"
@@ -588,6 +588,15 @@ msgstr "PEP8-kontrollfel: %1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "PEP8-syntaxkontrollverktyget verkar inte fungera riktigt."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "Programmet som avlusades orsakade ett ohanterat undantag."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Du kan nu inspektera programmets status efter det har avslutats."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "Avlusaren stoppar utan underrättelse när nästa kommando utförs."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/th/kdevpython.po 25.11.80-0ubuntu1/po/th/kdevpython.po
--- 24.12.3-1/po/th/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/th/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2009-01-25 08:34+0700\n"
 "Last-Translator: Narachai Sakorn <narachai@gmail.com>\n"
 "Language-Team: Thai <thai-l10n@googlegroups.com>\n"
@@ -201,34 +201,34 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
+msgid "Unsupported interpreter"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
+msgid "Locals"
 msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
@@ -420,19 +420,19 @@ msgstr ""
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/tr/kdevpython.po 25.11.80-0ubuntu1/po/tr/kdevpython.po
--- 24.12.3-1/po/tr/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/tr/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -3,21 +3,21 @@
 #
 # Translators:
 # Volkan Gezer <volkangezer@gmail.com>, 2015.
-# SPDX-FileCopyrightText: 2022, 2023, 2024 Emir SARI <emir_sari@icloud.com>
+# SPDX-FileCopyrightText: 2022, 2023, 2024, 2025 Emir SARI <emir_sari@icloud.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: extragear-kdevelop-kde4\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-18 02:00+0300\n"
-"Last-Translator: Emir SARI <emir_sari@icloud.com>\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 19:38+0300\n"
+"Last-Translator: Emir SARI <emir_sari@îcloud.com>\n"
 "Language-Team: Turkish <kde-l10n-tr@kde.org>\n"
 "Language: tr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Lokalize 24.11.70\n"
+"X-Generator: Lokalize 25.04.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -138,12 +138,12 @@ msgstr "işlev"
 #, kde-format
 msgctxt "programming; %1 is a code statement to be added in the editor"
 msgid "Add \"%1\""
-msgstr "\"%1\" Ekle"
+msgstr "“%1” Ekle"
 
 #: codegen/correctionfilegenerator.cpp:58
 #, kde-format
 msgid "Specify type for \"%1\"..."
-msgstr "\"%1\" Türünü Belirt..."
+msgstr "“%1” türünü belirt…"
 
 #: codegen/correctionfilegenerator.cpp:108
 #, kde-format
@@ -203,37 +203,37 @@ msgstr "Gerekli modüller:"
 msgid "A comma separated list of modules required for the type"
 msgstr "Tür için gerekli modüllerin virgülle ayrılmış listesi"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Hatası ayıklanacak program yakalanamayan bir istisna üretti."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "Programdan çıkıldıktan sonra durumunu kontrol edebilirsiniz."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "Sonraki komut tetiklendiğinde hata ayıklayıcı sessizce duracak."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Pdb ile Python uygulamalarının hatalarını ayıklayan bir eklenti."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 "Üzgünüm, hata ayıklama yalnızca Python 3.x sürümleri için desteklenmektedir."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Desteklenmeyen yorumlayıcı"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Dönüş bilgisi"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Globaller"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Yereller"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -242,7 +242,7 @@ msgstr "kdevpython desteği için geçer
 #: docfilekcm/docfilemanagerwidget.cpp:51
 #, kde-format
 msgid "Generate..."
-msgstr "Oluştur..."
+msgstr "Üret"
 
 #: docfilekcm/docfilemanagerwidget.cpp:53
 #, kde-format
@@ -272,7 +272,7 @@ msgstr "Seçileni Düzenle"
 #: docfilekcm/docfilemanagerwidget.cpp:70
 #, kde-format
 msgid "Search Paths..."
-msgstr "Yolları Ara..."
+msgstr "Yolları Ara…"
 
 #: docfilekcm/docfilemanagerwidget.cpp:101
 #, kde-format
@@ -292,8 +292,8 @@ msgid ""
 "This path must match what you use in Python to import this module. For "
 "example, enter \"numpy/fft.py\" for numpy.fft"
 msgstr ""
-"Bu yol, bu modülü içe aktarmak için Python 'da kullandığınız yol ile "
-"eşleşmek zorundadır; örneğin, numpy.ftt için \"numpy/fft.py\" girin"
+"Bu yol, bu modülü içe aktarmak için Python’da kullandığınız yol ile eşleşmek "
+"zorundadır; örneğin, numpy.ftt için “numpy/fft.py” girin"
 
 #: docfilekcm/docfilemanagerwidget.cpp:147
 #, kde-format
@@ -324,7 +324,7 @@ msgstr "Belgelendirmesi oluşturulacak b
 #, kde-format
 msgctxt "refers to selecting a python module to perform some operation on"
 msgid "Target module (e.g. \"math\")"
-msgstr "Hedef modül (\"math\" gibi)"
+msgstr "Hedef modül (“math” gibi)"
 
 #: docfilekcm/docfilewizard.cpp:55
 #, kde-format
@@ -376,7 +376,7 @@ msgstr "introspect.py betiği bulunamad
 msgid ""
 "Couldn't find a valid kdev-python data directory; check your installation!"
 msgstr ""
-"Geçerli bir kdev-python veri dizini bulunamadı; kurulumunuzu kontrol edin!"
+"Geçerli bir kdev-python veri dizini bulunamadı; kurulumunuzu denetleyin!"
 
 #: docfilekcm/docfilewizard.cpp:148
 #, kde-format
@@ -427,36 +427,36 @@ msgstr "Python Belgelendirmesi"
 #: duchain/assistants/missingincludeassistant.cpp:48
 #, kde-format
 msgid "Generate documentation for module \"%1\"..."
-msgstr "\"%1\" modülü için belgelendirme oluştur ..."
+msgstr "“%1” modülü için belgelendirme oluştur…"
 
 #: duchain/declarationbuilder.cpp:705
 #, kde-format
 msgid "Module \"%1\" not found"
-msgstr "\"%1\" modülü bulunamadı"
+msgstr "“%1” modülü bulunamadı"
 
 #: duchain/declarationbuilder.cpp:776
 #, kde-format
 msgid "Declaration for \"%1\" not found in specified module"
-msgstr "Belirtilen modülde \"%1\" bildirimi bulunamadı"
+msgstr "Belirtilen modülde “%1” beyanı bulunamadı"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 "Sınıf yönteminin ilk argümanı self veya cls değil, bu artık kullanılmıyor"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 "Değişkensiz statik olmayan sınıf metodu, en az bir taneye (self) sahip olmalı"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
-msgstr "Dönüş ifadesi işlev bildirimi içinde değil"
+msgstr "Dönüş ifadesi işlev beyanı içinde değil"
 
 #: duchain/navigation/declarationnavigationcontext.cpp:67
 #, kde-format
@@ -504,7 +504,7 @@ msgstr "Tanımlanmamış değişken: %1"
 #: duchain/usebuilder.cpp:130
 #, kde-format
 msgid "Attribute \"%1\" not found on accessed object"
-msgstr "\"%1\" özniteliği erişilen nesnede bulunamadı"
+msgstr "“%1” özniteliği erişilen nesnede bulunamadı"
 
 #: pep8kcm/kcm_pep8.cpp:63
 #, kde-format
@@ -539,7 +539,7 @@ msgstr "Şu hataları ve uyarıları etk
 #: pep8kcm/pep8.ui:65
 #, kde-format
 msgid "Maximum line length:"
-msgstr "Azami satır uzunluğu:"
+msgstr "En çok satır uzunluğu:"
 
 #. i18n: ectx: property (text), widget (QLabel, label)
 #: pep8kcm/pep8.ui:88
@@ -561,7 +561,7 @@ msgstr ""
 #: projectconfig/projectconfig.ui:19
 #, kde-format
 msgid "Python interpreter:"
-msgstr "Python yorumlayıcı:"
+msgstr "Python yorumlayıcısı:"
 
 #. i18n: ectx: property (placeholderText), widget (QLineEdit, pythonInterpreter)
 #: projectconfig/projectconfig.ui:26
@@ -582,13 +582,22 @@ msgstr "Kaynağı autopep8 biçimlendiri
 #: pythonstylechecking.cpp:107
 #, kde-format
 msgid "PEP8 checker error: %1"
-msgstr "PEP8 kontrol hatası: %1"
+msgstr "PEP8 denetleyicisi hatası: %1"
 
 #: pythonstylechecking.cpp:209
 #, kde-format
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "PEP8 sözdizimi kontrol edicisi düzgün çalışıyor gibi görünmüyor."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "Hatası ayıklanacak program yakalanamayan bir istisna üretti."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "Programdan çıkıldıktan sonra durumunu kontrol edebilirsiniz."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "Sonraki komut tetiklendiğinde hata ayıklayıcısı sessizce duracak."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/ug/kdevpython.po 25.11.80-0ubuntu1/po/ug/kdevpython.po
--- 24.12.3-1/po/ug/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/ug/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2013-09-08 07:04+0900\n"
 "Last-Translator: Gheyret Kenji <gheyret@gmail.com>\n"
 "Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
@@ -200,34 +200,34 @@ msgstr ""
 msgid "A comma separated list of modules required for the type"
 msgstr ""
 
-#: debugger/debugsession.cpp:167
+#: debugger/pdblauncher.cpp:45
 #, kde-format
-msgid "The program being debugged raised an uncaught exception."
+msgid "A plugin to debug Python applications with pdb."
 msgstr ""
 
-#: debugger/debugsession.cpp:168
+#: debugger/pdblauncher.cpp:86
 #, kde-format
-msgid "You can now inspect the status of the program after it exited."
+msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr ""
 
-#: debugger/debugsession.cpp:169
+#: debugger/pdblauncher.cpp:87
 #, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
+msgid "Unsupported interpreter"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:45
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
 #, kde-format
-msgid "A plugin to debug Python applications with pdb."
+msgid "Return info"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
 #, kde-format
-msgid "Sorry, debugging is only supported for Python 3.x applications."
+msgid "Globals"
 msgstr ""
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/variablecontroller.cpp:290
 #, kde-format
-msgid "Unsupported interpreter"
+msgid "Locals"
 msgstr ""
 
 #: docfilekcm/docfilemanagerwidget.cpp:37
@@ -418,19 +418,19 @@ msgstr ""
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr ""
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr ""
diff -pruN 24.12.3-1/po/uk/kdevpython.po 25.11.80-0ubuntu1/po/uk/kdevpython.po
--- 24.12.3-1/po/uk/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/uk/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -3,13 +3,13 @@
 # This file is distributed under the license LGPL version 2.1 or
 # version 3 or later versions approved by the membership of KDE e.V.
 #
-# Yuri Chornoivan <yurchor@ukr.net>, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2024.
+# Yuri Chornoivan <yurchor@ukr.net>, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2024, 2025.
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-17 15:20+0300\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-10 19:37+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
 "Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
 "Language: uk\n"
@@ -206,39 +206,36 @@ msgid "A comma separated list of modules
 msgstr ""
 "Список відокремлених комами записів модулів, потрібних для роботи з типом."
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "Під час діагностичного запуску програми сталося невідоме виключення."
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr ""
-"Тепер можна ознайомитися зі станом програми після завершення її роботи."
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr ""
-"Інструмент діагностики зупинить роботу без повідомлень, коли буде віддано "
-"наступну програму."
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "Додаток для діагностування програм мовою Python за допомогою pdb."
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "Вибачте, діагностування передбачено лише для програм Python 3.x."
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "Непідтримуваний інтерпретатор"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "Повернути відомості"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "Загальні"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "Локальні"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -449,7 +446,7 @@ msgstr "Не знайдено модул
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "У вказаному модулі не знайдено оголошення «%1»"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
@@ -457,7 +454,7 @@ msgstr ""
 "Перший аргумент методу класу не викликається автономно (self) або не "
 "викликає cls, такі синтаксичні конструкції вважаються застарілими"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
@@ -465,7 +462,7 @@ msgstr ""
 "Нестатичний метод класу без аргументів. Має бути принаймні один аргумент "
 "(self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Інструкція return поза межами оголошення функції"
@@ -603,6 +600,19 @@ msgstr ""
 "Здається, засіб перевірки синтаксичних конструкцій PEP8 не працює належним "
 "чином."
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr ""
+#~ "Під час діагностичного запуску програми сталося невідоме виключення."
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr ""
+#~ "Тепер можна ознайомитися зі станом програми після завершення її роботи."
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr ""
+#~ "Інструмент діагностики зупинить роботу без повідомлень, коли буде віддано "
+#~ "наступну програму."
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr ""
diff -pruN 24.12.3-1/po/zh_CN/kdevpython.po 25.11.80-0ubuntu1/po/zh_CN/kdevpython.po
--- 24.12.3-1/po/zh_CN/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/zh_CN/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: kdeorg\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
 "PO-Revision-Date: 2024-04-23 19:30\n"
 "Last-Translator: \n"
 "Language-Team: Chinese Simplified\n"
@@ -200,36 +200,36 @@ msgstr "需要模块："
 msgid "A comma separated list of modules required for the type"
 msgstr "类型所需模块的逗号分隔列表"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "正在调试的程序引发了一个未被捕获的异常。"
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "您现在可以在退出后检查程序的状态。"
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "当下一个命令被触发时，调试器将静默停止。"
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "用 pdb 调试 Python 应用程序的插件。"
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "抱歉，只有Python 3.x应用程序支持调试。"
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "不支持的解释器"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "返回信息"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "全局变量"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "本地"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -425,19 +425,19 @@ msgstr "找不到模块 “%1”"
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "在指定模块中找不到 %1 的声明"
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
-msgstr "类方法的第一个参数既不叫 self 也不叫 cls ，这种做法已不推荐"
+msgstr "类方法的第一个参数未命名为 self 或 cls，此做法已被弃用。"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr "没有参数的非静态类方法，必须至少有一个参数 (self)"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "返回语句不在函数声明内"
diff -pruN 24.12.3-1/po/zh_TW/kdevpython.po 25.11.80-0ubuntu1/po/zh_TW/kdevpython.po
--- 24.12.3-1/po/zh_TW/kdevpython.po	2025-02-27 20:51:05.000000000 +0000
+++ 25.11.80-0ubuntu1/po/zh_TW/kdevpython.po	2025-11-09 03:41:22.000000000 +0000
@@ -2,13 +2,13 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Frank Weng (a.k.a. Franklin) <franklin at goodhorse dot idv dot tw>, 2009, 2013, 2014.
-# SPDX-FileCopyrightText: 2024 Kisaragi Hiu <mail@kisaragi-hiu.com>
+# SPDX-FileCopyrightText: 2024, 2025 Kisaragi Hiu <mail@kisaragi-hiu.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevpython\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2024-10-17 00:39+0000\n"
-"PO-Revision-Date: 2024-10-20 00:33+0900\n"
+"POT-Creation-Date: 2025-08-30 00:40+0000\n"
+"PO-Revision-Date: 2025-08-19 04:55+0900\n"
 "Last-Translator: Kisaragi Hiu <mail@kisaragi-hiu.com>\n"
 "Language-Team: Traditional Chinese <zh-l10n@lists.slat.org>\n"
 "Language: zh_TW\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "dot tw>\n"
-"X-Generator: Lokalize 24.08.2\n"
+"X-Generator: Lokalize 25.11.70\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #, kde-format
@@ -202,36 +202,36 @@ msgstr "需要的模組："
 msgid "A comma separated list of modules required for the type"
 msgstr "此型態需要的模組清單，以逗號分隔"
 
-#: debugger/debugsession.cpp:167
-#, kde-format
-msgid "The program being debugged raised an uncaught exception."
-msgstr "除錯中的程式發出了未捕捉到的例外。"
-
-#: debugger/debugsession.cpp:168
-#, kde-format
-msgid "You can now inspect the status of the program after it exited."
-msgstr "您現在可以在程式離開後檢查其狀態。"
-
-#: debugger/debugsession.cpp:169
-#, kde-format
-msgid "The debugger will silently stop when the next command is triggered."
-msgstr "在下個指令觸發後，除錯器會無聲地停止。"
-
 #: debugger/pdblauncher.cpp:45
 #, kde-format
 msgid "A plugin to debug Python applications with pdb."
 msgstr "用 pdb 除錯 Python 應用程式的外掛程式。"
 
-#: debugger/pdblauncher.cpp:77
+#: debugger/pdblauncher.cpp:86
 #, kde-format
 msgid "Sorry, debugging is only supported for Python 3.x applications."
 msgstr "抱歉，除錯器只支援除錯 Python 3.x 的應用程式。"
 
-#: debugger/pdblauncher.cpp:78
+#: debugger/pdblauncher.cpp:87
 #, kde-format
 msgid "Unsupported interpreter"
 msgstr "未支援的直譯器"
 
+#: debugger/variablecontroller.cpp:34 debugger/variablecontroller.cpp:307
+#, kde-format
+msgid "Return info"
+msgstr "傳回資訊"
+
+#: debugger/variablecontroller.cpp:36 debugger/variablecontroller.cpp:323
+#, kde-format
+msgid "Globals"
+msgstr "全域變數"
+
+#: debugger/variablecontroller.cpp:290
+#, kde-format
+msgid "Locals"
+msgstr "本地變數"
+
 #: docfilekcm/docfilemanagerwidget.cpp:37
 #, kde-format
 msgid "Failed to find a valid data directory for kdevpythonsupport."
@@ -429,19 +429,19 @@ msgstr "找不到模組 \"%1\""
 msgid "Declaration for \"%1\" not found in specified module"
 msgstr "在指定的模組找不到宣告 \"%1\""
 
-#: duchain/declarationbuilder.cpp:1585
+#: duchain/declarationbuilder.cpp:1590
 #, kde-format
 msgid ""
 "First argument of class method is not called self or cls, this is deprecated"
 msgstr "類別方法的第一個參數名稱並非 self 或 cls，這種方式已被廢棄"
 
-#: duchain/declarationbuilder.cpp:1605
+#: duchain/declarationbuilder.cpp:1610
 #, kde-format
 msgid ""
 "Non-static class method without arguments, must have at least one (self)"
 msgstr "非靜態類別方法沒有參數。您必須至少指定一個參數（self）"
 
-#: duchain/declarationbuilder.cpp:1766
+#: duchain/declarationbuilder.cpp:1771
 #, kde-format
 msgid "Return statement not within function declaration"
 msgstr "Return 敘述不在函式宣告內"
@@ -575,6 +575,15 @@ msgstr "PEP8 檢查器發生錯誤：%1"
 msgid "The PEP8 syntax checker does not seem to work correctly."
 msgstr "PEP 語法檢查器似乎無法正常運作。"
 
+#~ msgid "The program being debugged raised an uncaught exception."
+#~ msgstr "除錯中的程式發出了未捕捉到的例外。"
+
+#~ msgid "You can now inspect the status of the program after it exited."
+#~ msgstr "您現在可以在程式離開後檢查其狀態。"
+
+#~ msgid "The debugger will silently stop when the next command is triggered."
+#~ msgstr "在下個指令觸發後，除錯器會無聲地停止。"
+
 #~ msgid ""
 #~ "First argument of __new__ method is not called cls, this is deprecated"
 #~ msgstr "__new__ 方法的第一個參數非 cls，這種方式已被廢棄"
