I would like to hack and modify a predefined date time format of KDE 5 on Debian 9.2.1 Stretch.
A predefined format can be selected from the list of predefined formats at Kickoff Launcher > Computer > System Settings > Personalization > Regional Settings > Formats.
(For the screen shot of the Formats settings dialog, see https://superuser.com/q/1162283 on the SuperUser site.)
The effect of the format appears on the Formats settings dialog itself, and also appears on the Date field of the Details view of the Dolphin File Manager of the KDE desktop, and also the Properties of any file on Dolphin.
Unfortunately, none of the predefined formats suits me. The date time format of en_US
("United States – American English") is particularly terrible from my viewpoint. On the other hand, the short date time format of en_SE
("Sweden – English") is ISO 8601, and is close to what I want. Nevertheless, even en_SE
does not completely satisfy me; especially its long format disappoints me.
This Formats settings dialog never lets you freely create custom formats. It only gives you a choice from predefined formats.
Thus, I would like to hack and modify a predefined format. Please let me know how.
The directory /usr/share/i18n/locales
contains format files. The file names are identical to the format names such as en_US
, en_GB
, fr_FR
and so on. However, the KDE that came with Debian 9.2.1 does not care about the format files in /usr/share/i18n/locales
. Modification to these format files or even deletion of all of these files never affects the behavior of the KDE on Debian 9.2.1. This directory even lacks en_SE
, and nevertheless en_SE
appears in the Formats settings dialog.
I wonder if the predefined formats are hard-coded in KDE.
Note that Debian 9.0 Stretch was released on 2017-06-17. The versions of KDE components that came with Debian 9.2.1 follow:
plasmashell --version
# plasmashell 5.8.6
kf5-config --version
# Qt: 5.7.1
# KDE Frameworks: 5.28.0
# kf5-config: 1.0
TheEzekielProject claims in his post (https://www.linuxquestions.org/questions/linuxquestions-org-member-success-stories-23/guide-to-setting-custom-date-format-in-recent-versions-of-kde-4175595458-print/) that he managed to create a custom date time format by modifying a format file in the directory /usr/share/i18n/locales
. The systems he tested are Kali Linux 2016.2 rolling with KDE Plasma 5.8.2 and KDE Frameworks 5.27.0, and Kubuntu 16.10 with KDE Plasma 5.7.5 and KDE Frameworks 5.26.0. His systems are older than mine.
I tried his method. In a format file, under LC_TIME
, I changed d_t_fmt
, d_fmt
, t_fmt
and t_fmt_ampm
, and executed locale-gen
, and so on. However, his method has turned out to have no effect on the KDE on Debian 9.2.1. Also a comment to his post complains that his method fails on Neon (plasma 5.10).
By the way, my question is not a duplicate of questions/1162283/use-iso-time-and-date-format-in-kde-5
on the SuperUser site. The question 1162283 asked for ISO date time format, and it has been fulfilled by the answer by
Marco Lussetti, that is, by simply selecting en_SE
from the list of predefined formats. My question asks for a hack to go beyond predefined formats.
Best Answer
It took me half a day to (almost) fully investigate this, but I think I found how to do it, and you’re not gonna like it …
The Solution:
In a nutshell,
KDE just uses QT’s
QLocale
. Which itself uses hard-coded data insideqlocale_data_p.h
, deep in QT’s core library code.This data is apparently manually generated from the Unicode Consortium’s “Common Locale Data Repository”, using several Python scripts inside
util/local_database/
of the QT source code package. Which itself is not even part of the source code, I am certain. Let alone, using any kind of configuration or data files on your computer.So the only way to do this, is to …
common/main/
.Gentoo also has a package called
app-i18n/unicode-cldr
btw.util/local_database/
(likecldr2qlocalexml.py
andqlocalexml2cpp.py
), with your language of choice’s XML file, to re-generate the staticqlocale_data_p.h
.And don’t forget to recompile all other packages that include
qlocale_data_p.h
.Or, on Gentoo, make a lasting patch with:
NOW make the above changes in
b
, and not ina
.Final thoughts
To be perfectly frank, I didn’t check if those Python scripts actually worked by just passing an XML file. As, at that point, I just stopped bothering, and wanted to kill it with fire. :)
If anyone wants to actually do it in practice, please report, and I will update this answer. (Or do it yourself, if you can)
Here’s how I got there:
htop
I found the most recently started processes, which included the obviouskcmshell5 formats
.htop
’sl
ist open files feature on it, I filtered for “format”, and found/usr/lib64/qt5/plugins/kcm_formats.so
.equery belongs /usr/lib64/qt5/plugins/kcm_formats.so
I could identify the packagekde-plasma/plasma-desktop
.kcms/formats/kcmformats.cpp
, whoseaddLocaleToCombo
used theQLocale
, and included<QLocale>
too.QLocale
could then be found withlocate -i QLocale
to reside at/usr/include/qt[5]/QtCore/qlocale.h
. It included some generated enumerations of the languages, scripts, etc.equery belongs /usr/include/qt[5]/QtCore/qlocale.h
pointing me todev-qt/qtcore/qtcore
, and unpacking the source file later…util/
and foundutil/local_database/README
stating “local_database is used to generate qlocale data from the Common Locale Data Repository (The database for localized names (like date formats, country names etc)).”.cldr2qlocalexml.py
was not very useful though, as it is called with the path to a directory containing the CLDR locales. Its result is used forqlocalexml2cpp.py
though, which generates the filesrc/corelib/tools/qlocale_data_p.h
, which includes huge hard-coded tables of all the locale data. And that file already existed in the source. So… yep, it’s (partially?) hard-coded.qlocale_data_p.h
. Which is not very in the spirit of open source. But at least you can do it yourself, as described above.