<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Navya Sai Sadu on KDE Blogs</title><link>https://blogs.kde.org/authors/navyasai/</link><description>Recent content in Navya Sai Sadu on KDE Blogs</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sun, 26 Jul 2026 19:34:48 +0530</lastBuildDate><atom:link href="https://blogs.kde.org/authors/navyasai/index.xml" rel="self" type="application/rss+xml"/><item><title>Redesigning Lokalize's Translation Memory Tab - Mid-GSoC</title><link>https://blogs.kde.org/2026/07/13/mid-gsoc-blog/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><author>Navya Sai Sadu</author><guid>https://blogs.kde.org/2026/07/13/mid-gsoc-blog/</guid><description>&lt;p&gt;The past three weeks were a mix of cleanup, debugging, completing the work concerning UI and understanding &lt;em&gt;TMView&lt;/em&gt;( since I did not look into it during proposal period) and &lt;em&gt;TMTab&lt;/em&gt; again to review my design choices and see if I'm going in the right direction.&lt;/p&gt;
&lt;h2 id="cleaning-up-tmmanager-and-getting-checkboxes-working"&gt;Cleaning up TMManager and getting checkboxes working&lt;/h2&gt;
&lt;p&gt;First up was cleaning &lt;code&gt;TMManagerWin&lt;/code&gt;, reformatting, removing now obsolete references and code. With that done, I resumed work on the per-project TM selection checkboxes.&lt;/p&gt;
&lt;p&gt;The checkboxes are backed directly by DBFilesModel rather than a separate proxy layer. Overriding &lt;code&gt;flags()&lt;/code&gt;, &lt;code&gt;data()&lt;/code&gt;, and &lt;code&gt;setData()&lt;/code&gt; on the existing model was the way to go. Qt's view renders the checkboxes automatically once &lt;code&gt;Qt::ItemIsUserCheckable&lt;/code&gt; is set and &lt;code&gt;Qt::CheckStateRole&lt;/code&gt; returns a value. Check state persists to &lt;code&gt;ProjectLocal::selectedTMs()&lt;/code&gt; immediately on every toggle via &lt;code&gt;saveCheckedState()&lt;/code&gt;, and reloads on project open via a &lt;code&gt;Project::loaded&lt;/code&gt; connection.&lt;/p&gt;
&lt;p&gt;One non-obvious issue I stumbled into and fixed myself was &lt;code&gt;cleanupSelectedTMs()&lt;/code&gt;, which removes stale entries for TMs that no longer exist on disk, was being called immediately when &lt;code&gt;Project::loaded&lt;/code&gt; fired. But &lt;em&gt;DBFilesModel&lt;/em&gt; populates asynchronously via &lt;em&gt;QFileSystemModel&lt;/em&gt; scanning the TM directory. The fix was deferring &lt;code&gt;cleanupSelectedTMs()&lt;/code&gt; using &lt;code&gt;QTimer::singleShot()&lt;/code&gt;, the same pattern used elsewhere in the codebase for async model population. &lt;code&gt;loadCheckedState()&lt;/code&gt; itself runs immediately since it only reads from config and doesn't need the model to be populated. This was a subtle timing issue that only surfaced when testing with an actual project and multiple TM databases. In fact, &lt;code&gt;cleanupSelectedTMs()&lt;/code&gt; itself wasn't thought of when planning.&lt;/p&gt;
&lt;p&gt;After testing this end-to-end and verifying the &lt;em&gt;.local&lt;/em&gt; config file was being written and read correctly, I merged this in.&lt;/p&gt;
&lt;h2 id="studying-tmviews-querying-and-why-it-cant-help-tmtab"&gt;Studying TMView's querying and why it can't help TMTab&lt;/h2&gt;
&lt;p&gt;Before touching TMTab's query logic, I spent time understanding how TMView (the suggestions dock widget in the editor) does its querying since my mentor suggested that it's querying might help designing something similar for TMTab's multi-TM quering.&lt;/p&gt;
&lt;p&gt;TMView uses &lt;em&gt;SelectJob&lt;/em&gt; which operates on &lt;em&gt;TMEntry&lt;/em&gt; structs, it does fuzzy word-level matching, scores results, and is designed specifically for the suggestions workflow. It fires secondary DB queries only when the primary project DB scores below a threshold.&lt;/p&gt;
&lt;p&gt;This is fundamentally different from what TMTab needs, it uses &lt;em&gt;ExecQueryJob&lt;/em&gt; which runs SQL query against a DB and hands the cursor to &lt;em&gt;QSqlQueryModel&lt;/em&gt;. The two systems aren't interchangeable, so the multi-DB approach for each has to be designed separately I guess. For TMView, the change is relatively small, loop &lt;code&gt;selectedTMs()&lt;/code&gt; and fire one SelectJob per DB. For TMTab, it might turn to be little complex.&lt;/p&gt;
&lt;h2 id="removing-the-dbname-combobox"&gt;Removing the dbName combobox&lt;/h2&gt;
&lt;p&gt;With the TM list in TMManagerWin now showing checkboxes for selection, the &lt;code&gt;dbName&lt;/code&gt; KComboBox in the search panel is redundant, users select which TMs to query via checkboxes, not a dropdown. I removed it from queryoptions.ui and cleaned up all references in tmtab.cpp, but some of them need workaround. The &lt;code&gt;openFile()&lt;/code&gt; (RemoveFileJob) gets a TODO, to be fixed properly once multi-DB results carry their source DB name.&lt;/p&gt;
&lt;h2 id="debugging-with-gdb-and-dr-konqi"&gt;Debugging with GDB and Dr Konqi&lt;/h2&gt;
&lt;p&gt;My mentor reported a crash when opening the QA dock widget in the TM tab. This was a good opportunity to learn proper debugging with GDB, Dr Konqi, and reading backtraces.&lt;/p&gt;
&lt;p&gt;After investigating, this appeared to be a preexisting bug unrelated to my changes. It's probably data-dependent and only triggers with specific content in the TM results view at the moment the QA dock repaints. It didn't reproduce on my machine. I might work on it later when I have time.&lt;/p&gt;
&lt;p&gt;The years old chats on QtForum and StackOverflow were helpful throughout. Qt itself is so well documented!&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="TM Tab Redesigned" src="https://blogs.kde.org/2026/07/13/mid-gsoc-blog/TMTabRedesign.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;I'm looking forward to see how translators would like the TMTab's glow up when the project is completed and all the changes get merged.&lt;/p&gt;</description></item><item><title>Redesigning Lokalize's Translation Memory Tab - GSoC Week 2 and 3</title><link>https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><author>Navya Sai Sadu</author><guid>https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/</guid><description>&lt;p&gt;The past two weeks went by fast. The learnings I gained while building the toy project I experimented around with Qt during Contribution Period are quite useful now. In the second week of GSoC, I ported the TM Manager from a separate dialogbox to TM Tab. It was done mainly for ease and with the reasoning that everything related to TMs can be in a single place. I kept most of the things as is. A lot of thought went into the UI Design.&lt;/p&gt;
&lt;p&gt;The TM Manager is currently a standalone window which is accesible from any tab.&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="TM Manager Before" src="https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/tm_manager_before.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;The &amp;quot;Manage Translation Memories&amp;quot; option is already available in the Tools Menu and again in the ToolBar of TM Tab since it's specific to it.&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Menu Options" src="https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/menu_options_before.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;After the changes, pressing F7 or &amp;quot;Translation Memory&amp;quot; option from Tools menu will directly lead to TM Manager too as it is set on the left of TM Tab with a QSplitter. I believe this takes away a little redundancy in the design. This change is also justified pertaing to the future changes regarding Multi-TM selection and quering.&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="TM Manager After" src="https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/tm_tab_after.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;The buttons restrict resizing the splitter horizontally. Intially I put all the actions in a QToolButton as I thought putting them in a right-click context menu might render them undiscovered. But such menus were already being used in some other parts of the app( and obviously other KDE apps).&lt;/p&gt;
&lt;p&gt;From coding perspective, all I had to do was instantiate it in TM Tab instead. Since, it was no longer being used as a window( which would also have worked), it no longer inherits from KMainWindow. It used Grid Layout which I think is not exactly needed and just used a VBoxLayout for simplicity.&lt;/p&gt;
&lt;p&gt;The splitter state is saved and restored using existing methods.&lt;/p&gt;
&lt;p&gt;The obsolete references and methods for TM Manager are cleaned up.&lt;/p&gt;
&lt;p&gt;During Week 3, I added checkboxes to DBFilesModel for TM selection which will be used in querying later in TM View for suggestions, autofill etc. and TM Tab for search. In th beginning of the project, I proposed adding another proxy layer over DBFilesModel for the checkboxes to not to disturb other things. But for ease of work, consistent architecture( couldn't find multiple proxy layers being used in the codebase) and with the solace that it won't impact other methods using DBFilesModel for their specific purpose, I went ahead to add checkboxes directly to it.&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Multi-TM Selection" src="https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/checkboxes.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;This is a deviation from my GSoc Proposal wherein I proposed to replace Combo Box with a List Widget having entries with checkboxes for Multi-TM selection. Since there would be TM dbs on the left of the tab anyways, I thought of enabling selection there itself, than to have two places(TM Manager and the List Widget) listing all the TMs.&lt;/p&gt;
&lt;p&gt;Setting new flag for checking, showing checked state with &lt;code&gt;data()&lt;/code&gt; and storing selected TM names to a set is done. The checked state persistence is to be worked upon. This is where I got stuck. TM names were to be saved and loaded from global and local config based on user's selection but when my mentor reviewed that this complex setup probably is not the best, we reached back to translators who originally requested the feature.&lt;/p&gt;</description></item><item><title>Redesigning Lokalize's Translation Memory Tab - GSoC Week 1</title><link>https://blogs.kde.org/2026/05/31/week1-gsoc-blog/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><author>Navya Sai Sadu</author><guid>https://blogs.kde.org/2026/05/31/week1-gsoc-blog/</guid><description>&lt;p&gt;Hi! I'm Navya and am working on &lt;em&gt;Redesigning Lokalize's Translation Memory Tab&lt;/em&gt;. Lokalize was created during Google Summer of Code several years ago. This also implies that the conventions to be followed are quite old.&lt;/p&gt;
&lt;p&gt;The first week of GSoC was full of learnings and experiments as I had expected. There was no hassle of setting things up and all because I worked on Lokalize during Season of KDE. Things are going as per the plan and I am starting to gain momentum. The weeks ahead require more effort and time. I'm gonna share some of the knowledge gained and used as it might benefit me (to remember or come back to when needed) and other new contributors.&lt;/p&gt;
&lt;p&gt;The project essentially resolves the &lt;a href="https://bugs.kde.org/show_bug.cgi?id=497653"&gt;bug&lt;/a&gt; and integrates the separate TM Manager Window into the TM Tab for ease.&lt;/p&gt;
&lt;h2 id="kconfig"&gt;KConfig&lt;/h2&gt;
&lt;p&gt;KDE provides devs with KConfig classes to auto generate methods to use for app's configuration settings. This &lt;a href="https://develop.kde.org/docs/features/configuration/kconfig_xt/"&gt;site&lt;/a&gt; might also be of some help. Lokalize has &lt;em&gt;lokalize.kcfg&lt;/em&gt; for app-wide configuration and &lt;em&gt;projectbase.kcfg&lt;/em&gt; and &lt;em&gt;projectlocal.kcfg&lt;/em&gt; for project-specific configuration. The latter one appeared to me more apt for user's personal settings such as per-project selection of TMs. A new entry was added to &lt;em&gt;lokalize.kcfg&lt;/em&gt; for global default TMs.&lt;/p&gt;
&lt;p&gt;There are also &amp;quot;.kcfgc&amp;quot; files which apparently act as config for the config files. So, the property of the entry added can be controlled there. In my case, it was to have mutators so as to be able to change the selection of TMs.&lt;/p&gt;
&lt;p&gt;The setters and getters generated were used to write a method that returns a list of TMs to query across. These will also be used in the upcoming weeks when I finally create a UI for checking and selecting TMs.&lt;/p&gt;
&lt;h2 id="git"&gt;Git&lt;/h2&gt;
&lt;p&gt;I always get to know something new and cool in the git world while working. My mentor told that &lt;em&gt;master&lt;/em&gt; is like any other branch, it's just us that we treat it differently. I created a new branch to direct my &lt;a href="https://invent.kde.org/navyasai/lokalize/-/merge_requests/1"&gt;MRs&lt;/a&gt; there since it'll be a long time till everything is ready to be merged into upstream.&lt;/p&gt;
&lt;h2 id="testing"&gt;Testing&lt;/h2&gt;
&lt;p&gt;The example provided &lt;a href="https://doc.qt.io/qt-6/qtest-overview.html"&gt;here&lt;/a&gt; is a basic template which the rest of the tests present also follow. An article on the internet said that there's no point in writing tests for getters and setters (another discussion forum had - especially if those are auto generated) so I just took it as a chance to learn something new and get the hang of those methods.&lt;/p&gt;
&lt;p&gt;I wasted quite some time only to figure out that I need to run the test from the build dir instead.&lt;/p&gt;</description></item><item><title>Mid-SoK Blog</title><link>https://blogs.kde.org/2026/03/04/mid-sok-blog/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><author>Navya Sai Sadu</author><guid>https://blogs.kde.org/2026/03/04/mid-sok-blog/</guid><description>&lt;p&gt;I'm half-way through the Season of KDE 2026 and wanted to share the journey so far.&lt;/p&gt;
&lt;p&gt;I had subscribed to the kde-soc mailing list after I returned from IndiaFOSS'25, where I met KDE contributors who really encouraged me to join the community and told me that one can always learn while building. The first step, always, is to start. Then I got carried away with life until I saw &amp;quot;call to action&amp;quot; in my mailbox in January. It was about SoK'26. I had then recently set up Kubuntu and was in awe about what people can build out of passion and by collaborating with others. I felt mentorship was the way to get started. I explored the projects and found Task-3 under &lt;a href="https://apps.kde.org/lokalize/"&gt;Lokalize&lt;/a&gt; as something that I can contribute to while learning new skills- programming in CPP, debugging, and exploring an old repo.&lt;/p&gt;
&lt;p&gt;Here's everything i did before the season officialy began.&lt;/p&gt;
&lt;h2 id="before-proposal"&gt;Before Proposal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I installed ==Lokalize== and reproduced the bug.&lt;/li&gt;
&lt;li&gt;Cloned the &lt;a href="https://invent.kde.org/sdk/lokalize"&gt;repo&lt;/a&gt;. Used &lt;em&gt;grep&lt;/em&gt; to find “Approve and go next” in codebase. Turned out &lt;strong&gt;EditorTab::gotoNextFuzzyUntr()&lt;/strong&gt; is the origin of bug. I thought about &amp;quot;Approve and go prev&amp;quot; and tried that. It was buggy too!&lt;/li&gt;
&lt;li&gt;Wrote &lt;a href="https://invent.kde.org/teams/mentor-programs/2026/-/issues/42"&gt;proposal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="after-proposal"&gt;After Proposal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;kde-builder failed due to missing libraries. So after lot of fixes, i did ubuntu update to 25.10(has qt6). *Created a test branch and added debug log in forementioned method.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="before-23rd"&gt;Before 23rd&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Got myself acquainted with Kate.&lt;/li&gt;
&lt;li&gt;Fidgeted around files to understand architecture.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="got-to-know-about"&gt;Got to know about&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;qDebug()&lt;/li&gt;
&lt;li&gt;why use .h and .cpp files&lt;/li&gt;
&lt;li&gt;LSP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href="https://community.kde.org/SoK/2026/StatusReport/Navya_Sai_Sadu"&gt;weekly status reports&lt;/a&gt; contain links to supoorting documents, commits and MRs.&lt;/p&gt;
&lt;h2 id="week-1"&gt;Week 1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spent more time understanding the repo, the files,classes and methods which were involved in the bug using debug logs, grep and manual look-over.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wrote a few comments to document better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Had an introductory call, was nice to know the contributors.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="week-2"&gt;Week 2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Researched past commit to understand the intent of navigational shortcuts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added SPDX license headers( did not know it was being actively developed in GSOC too). Aided Kumud by sending an email to the KDE i18n mailing list regarding the cyclic traversal on entries for keyboard shortcuts in the Translation Units View. Typically, KDE applications don't use that, as followed from the replies and was not needed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Had a group call for understanding rebase but i still mess up sometimes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="week-3"&gt;Week 3&lt;/h2&gt;
&lt;p&gt;While Kumud's implementation addressed &lt;code&gt;gotoNextFuzzyUntr()&lt;/code&gt;, analyzed their approach to &lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/288"&gt;generalise&lt;/a&gt; it to make it work for &lt;code&gt;gotoPrevFuzzyyUntr()&lt;/code&gt; and added a parameter to move in either direction for which a &lt;a href="https://invent.kde.org/sdk/lokalize/-/commit/178f919c733f0d8dba5c826dfe85812f119134b1"&gt;new Enum&lt;/a&gt; was used instead of magic numbers(they have a name for it T-T). I could see magic numbers used previously in the code and do get it why it isn't preferred.&lt;/p&gt;
&lt;h2 id="week-4"&gt;Week 4&lt;/h2&gt;
&lt;p&gt;Continued with the week-3's work&lt;/p&gt;
&lt;h2 id="week-5"&gt;Week 5&lt;/h2&gt;
&lt;p&gt;Worked on fixing other navigational shortcuts in editortab.cpp which implied generalising the function furthermore to take another parameter for entry state. &lt;a href="https://www.reddit.com/r/Kotlin/comments/w7rcqt/ifthenelse_vs_nonexhaustive_when_what_is_the/"&gt;StackOverflow&lt;/a&gt; is a saviour(Of course, after my mentor). Throughtout this time, it felt as if things were unravelling themselves to me. New bugs were found and worked upon. Looking back, I mostly improvised upon Kumud's solution but still got to learn a lot on the way.&lt;/p&gt;
&lt;h2 id="week-6"&gt;Week 6&lt;/h2&gt;
&lt;p&gt;Will work on other bugs identified on the way or scout for new ones! See if I make past &lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/298"&gt;this&lt;/a&gt; which was primarily the task for SoK.&lt;/p&gt;</description></item></channel></rss>