Debian 9.2.1 StretchでKDE 5の事前定義された日付と時刻の形式をハッキングして修正したいと思います。
Kickoff Launcher>コンピュータ>システム設定>パーソナライズ>地域設定>フォーマットの事前定義されたフォーマットのリストから事前定義されたフォーマットを選択できます。
(フォーマットダイアログボックスのスクリーンショットについては、以下を参照してください。https://superuser.com/q/1162283スーパーユーザーのウェブサイトから。 )
書式設定の効果は、書式設定ダイアログ自体に表示され、KDEデスクトップのDolphinファイルマネージャの詳細ビューのDateフィールドとDolphinのすべてのファイルプロパティにも表示されます。
残念ながら、事前定義された形式のどれも私には適していません。en_US
私の考えでは、(「US - American English」)日付/時刻形式が特に悪いです。一方、en_SE
(「Swedish-English」)の短い日付/時刻形式はISO 8601であり、私が望むものに近いです。それにもかかわらず、それは私を完全に満足させることはできませんen_SE
。特に長い形式は私を失望させます。
この書式設定ダイアログでは、カスタム書式を自由に作成することはできません。事前定義された形式からのみ選択できます。
だからあらかじめ定義された形式をハッキングして修正したいと思います。どうすればいいか教えてください。
このディレクトリには/usr/share/i18n/locales
フォーマットファイルが含まれています。たとえばen_US
、ファイル名はフォーマット名と同じです。ただし、Debian 9.2.1に含まれているKDEは、これらのフォーマットファイルを変更したり削除したりしても、Debian 9.2.1のKDEの動作には影響しません。ディレクトリがありませんが、まだフォーマットダイアログボックスに表示されます。en_GB
fr_FR
/usr/share/i18n/locales
en_SE
en_SE
事前定義された形式がKDEにハードコードされているかどうか疑問に思います。
Debian 9.0 Stretchは2017年6月17日にリリースされました。 Debian 9.2.1に付属のKDEコンポーネントのバージョンは次のとおりです。
plasmashell --version
# plasmashell 5.8.6
kf5-config --version
# Qt: 5.7.1
# KDE Frameworks: 5.28.0
# kf5-config: 1.0
エゼキエルプロジェクトは彼の投稿で次のように主張した。https://www.linuxquestions.org/questions/linuxquestions-org-member-success-stories-23/guide-to-setting-custom-date-format-in-recent-versions-of-kde-4175595458-print/)彼はディレクトリのフォーマットファイルを変更し、カスタム日付時刻フォーマットを正常に作成しました/usr/share/i18n/locales
。彼がテストしたシステムは、KDE Plasma 5.8.2とKDE Frameworks 5.27.0を含むKali Linux 2016.2、KDE Plasma 5.7.5、およびKDE Frameworks 5.26.0を含むKubuntu 16.10でした。彼のシステムは私より古い。
私は彼の方法を試しました。形式ファイルで、、、および、などをLC_TIME
変更して実行しました。しかし、彼の方法は Debian 9.2.1 の KDE には何の影響も与えないことがわかった。彼の投稿へのコメントでは、彼の方法がNeon(プラズマ5.10)で失敗したと文句を言いました。d_t_fmt
d_fmt
t_fmt
t_fmt_ampm
locale-gen
questions/1162283/use-iso-time-and-date-format-in-kde-5
しかし、私の質問はスーパーユーザーサイトの質問と重複しません。質問1162283en_SE
は、事前定義された形式のリストから選択するだけで、Marco Lussettiの回答ですでにカバーされているISO日付/時刻形式を尋ねます。私の質問は、あらかじめ定義された形式を超えるハッキングを必要とします。
答え1
この問題を(ほぼ)完全に調査するのに半日かかりましたが、方法を見つけたようですが、気に入らないでしょう。
解決策:
要するに、
KDEはQTのみを使用しますQLocale
。 KDE自体は、qlocale_data_p.h
QTコアライブラリコード内でハードコードされたデータを使用します。
このデータは、Unicode Consortiumのデータからのものです。パブリックロケールデータストアutil/local_database/
」は、QTソースコードパッケージ内で複数のPythonスクリプトを使用すること自体です。いいえソースコードの一部でも確実です。コンピュータで何らかの構成やデータファイルを使用することは言うまでもありません。
だからこれを行う唯一の方法は...
- 以下からCLDRファイル(パッケージ)をダウンロードしてください。http://unicode.org/Public/cldr/latest/core.zip(またはcldr-common-*.zip、どちらも同じ内容を含むようです)またはhttps://www.unicode.org/repos/cldr/trunk/をクリックし、.xmlの下にXMLファイルを抽出します
common/main/
。
Gentooにはbtwというパッケージもありますapp-i18n/unicode-cldr
。 - たとえば、ディストリビューションリポジトリからQTコアソースコードを取得して解凍します。
util/local_database/
cldr2qlocalexml.py
静的を再生成します。qlocalexml2cpp.py
qlocale_data_p.h
- 次に、パッケージを正常にコンパイルしてインストールします。
そして他のすべてのインクルードを再コンパイルすることを忘れないでくださいqlocale_data_p.h
。
または、Gentooで次のコマンドを使用して永続パッチを作成します。
ebuild $(equery w dev-qt/qtcore:5) prepare
pushd /var/tmp/portage/dev-qt/qtcore-5*/work/ # assuming default Portage build directory
mv qtbase-opensource-src-5.9.3 a
cp -a a b
b
今では、代わりに上記のように変更しますa
。それから続けてください。
mkdir -p /etc/portage/patches/dev-qt/$(basename $(dirname $(pwd))) # only for this version
#mkdir -p /etc/portage/patches/dev-qt/qtcore # for all versions
diff -ur a b > /etc/portage/patches/dev-qt/qtcore*/my-locale.patch
rm -rf a b
popd
ebuild $(equery w dev-qt/qtcore:5) clean
# Rebuild all packages that depend on it, just to be sure. May be optional.
emerge -1 dev-qt/qtcore:5 $(equery d dev-qt/qtcore:5 | sed 's/^/=/')
最後の考え
正直なところ、XMLファイルを渡して、これらのPythonスクリプトが実際に動作していることを確認していません。なぜなら、その時点で私は気にするのをやめたかったからです。火で殺す。 :)
実際にこれを実際にやりたい人がいたら報告していただければこの回答を更新します。 (または可能であれば直接作成してください。)
これが私がそこに到達した方法です:
- タスクバーの時計を右クリックして、KDEの時間書式設定ダイアログボックスを開きました。
- それから
htop
明らかですkcmshell5 formats
。 htop
istファイルを開く機能を使用してl
「フォーマット」をフィルタリングします/usr/lib64/qt5/plugins/kcm_formats.so
。- Gentooの助けを借りて、
equery belongs /usr/lib64/qt5/plugins/kcm_formats.so
私はこのパッケージを識別することができましたkde-plasma/plasma-desktop
。 - ソースファイルを解凍した後、
kcms/formats/kcmformats.cpp
をaddLocaleToCombo
使用しQLocale
て<QLocale>
含まれるファイルをすばやく見つけました。 QLocale
locate -i QLocale
その後、検索して常駐できます/usr/include/qt[5]/QtCore/qlocale.h
。これには、生成された言語、スクリプトなどのいくつかの列挙が含まれます。- もう一つは、後でソースファイルを解凍するように指示
equery belongs /usr/include/qt[5]/QtCore/qlocale.h
します...dev-qt/qtcore/qtcore
- ...これらすべてが一種のツールによって生成されたような直感がすでにあります。だから、調べてみると、「local_databaseが次に使用される
util/
ことがわかりました。util/local_database/README
パブリックロケールデータストア(ローカライズされた名前データベース(日付形式、国/地域名など)。」 - 私はこんな言葉を聞いたことがない。確認しました。、明らかに原因は次のとおりです。Unicodeコンソーシアム。ただし、このコード
cldr2qlocalexml.py
はCLDRロケールを含むディレクトリパスを介して呼び出されるため、あまり役に立ちません。その結果は、以下を含むqlocalexml2cpp.py
ファイルを生成するために使用されます。src/corelib/tools/qlocale_data_p.h
巨大な ハードコーディングすべてのロケールデータのテーブルです。そして、そのファイルはすでにソースに存在します。だから…はい、(一部?)ハードコードされています。
- ただし、CLDR XMLファイルが見つかりません。だから私はそれが以前に準備されたものを使用していると仮定しています
qlocale_data_p.h
。それはオープンソースの精神に合わない。しかし、上記のように、少なくとも自分で行うことはできます。
答え2
誰もが興味があれば、Debian 10でQT Coreライブラリを修正してコンパイルするためにとった手順は次のとおりです。これにより、KDE PIM(kontact、特にkorganizer)に必要な方法で日付と時刻の形式を指定できます。少し混乱していますが、私には効果があります。数年前にこれをやらなければなりませんでした。 残念ながら、日付形式または時間形式を変更するのに数時間かかります。
私はGlen Whitneyが投稿した便利なステップバイステップガイドを使用してこの方法を始めるのに役立ちました。
注:私は最小限のDebian 10インストールで始めました。sudo
rootでコマンドを実行できるようにインストールされているとします。次のコマンドでは、bashがシェルであると仮定します。
Debian でソースパッケージをビルドするために必要な要件をインストールします。
sudo apt install build-essential fakeroot devscripts
その他の必須依存関係をインストールします。
sudo apt install python2 sudo apt-get build-dep qtbase-opensource-src
作業するディレクトリを作成します。私はこれを
QtLocaleFix
仕事用のトップレベルディレクトリとして使用しています。mkdir QtLocaleFix cd QtLocaleFix TOPDIR="${PWD}"
QtBaseソースコード用、Common Locale Data Repository(CLDR)用、およびCLDRロケール情報をQtBaseライブラリが必要とする形式に変換するために必要なスクリプトを容易にするための3つのサブディレクトリを作成します。
QtBaseSrcDIR="${TOPDIR}/QtBaseSrc" mkdir "${QtBaseSrcDIR}" CLDRDIR="${TOPDIR}/CLDR" mkdir "${CLDRDIR}" CLDRScriptsDIR="${TOPDIR}/CLDRScripts" mkdir "${CLDRScriptsDIR}"
QtBaseライブラリ(libqt5core5a)のソースコードを取得します。
cd "${QtBaseSrcDIR}" apt source qtbase-opensource-src
前のステップでは、QtBaseライブラリのソースファイルをダウンロードしました。また、包装を緩めた。解凍された項目の1つはディレクトリです
qtbase-opensource-src-5.11.3+dfsg1
。これは私たちがライブラリをコンパイルするディレクトリです。便宜上、このディレクトリパスを参照するように環境変数を定義します。基本的には似たようなものが欲しいのQtBaseBuildDIR="${QtBaseSrcDIR}/qtbase-opensource-src-5.11.3+dfsg1"
ですが、ソースコードのバージョンによってはディレクトリ名が異なる場合があります。したがって、find
次のコマンドは解凍されたディレクトリ名を見つけて環境変数に設定します。ディレクトリ名はリストで確認することもできます。QtBaseBuildDIR="$(find "${QtBaseSrcDIR}" -maxdepth 1 -mindepth 1 -type d -print)" && echo "${QtBaseBuildDIR}"
このビルドの専用ソースバージョンを作成します。
cd "${QtBaseBuildDIR}" dch --local "localver" "Modifications to locale settings for date and time formats"
CLDR変換スクリプトをにコピーします
"${CLDRScriptsDIR}"
。この手順をスキップして、"${QtBaseBuildDIR}"
既存のサブディレクトリから直接スクリプトを実行できます。ただし、このコピー手順を実行すると、スクリプトの実行時に生成されたPythonバイトコードファイルを削除または計算する時間を節約できます。cp -pr "${QtBaseBuildDIR}"/util/local_database/* "${CLDRScriptsDIR}"
日付および/または時刻形式を変更するには、CLDRデータが必要です。以下からダウンロードできます。http://cldr.unicode.org/ウェブサイトのダウンロードページ(http://cldr.unicode.org/index/downloads)。複数のバージョンが利用可能です。このステップでは、環境変数をダウンロードするバージョン番号に設定します。最新バージョンを使用しようとするのが難しいので、Debian ソースパッケージの QtBase ライブラリで使用するのと同じバージョンを使用しました。 CLDRデータはという名前のヘッダーファイルを作成するために使用され、
"qlocale_data_p.h"
既存のヘッダーファイルは使用するCLDRのバージョンを指定します。次のコマンドはファイルからバージョンを抽出します。同様のものでなければなりません"31.0.1"
。他のバージョンはそうかもしれないし、そうでないかもしれません。 CLDRversion を希望のバージョンに設定すると、希望のバージョン番号を設定できます。たとえば、CLDRversion="31.0.1"
。ファイルからバージョン番号を抽出するより良い方法があるかもしれません。QLocaleDataFile="$(find "${QtBaseBuildDIR}" -name "qlocale_data_p.h" -size +100k)" && echo "${QLocaleDataFile}" CLDRversion="$(grep "Common Locale Data Repository" "${QLocaleDataFile}" | awk -F " " '{ print $NF }' | awk '{ sub(/v/,""); print }')" && echo "${CLDRversion}"
CLDRファイルのアーカイブをダウンロードします。
cd "${CLDRDIR}" curl "http://unicode.org/Public/cldr/${CLDRversion}/core.zip" --output "${CLDRDIR}/core.zip"
CLDRファイルの抽出
unzip core.zip
次の手順は、QtBaseライブラリを構築する前に、事前定義された日付と時刻(または他のロケール形式)を変更することです。具体的な変更は必要な形式によって異なります。 Glen Whitneyが提供した方法に応じて、
"${CLDRDIR}/common/main"
中間ロケールファイルに編集内容を適用することもできます。localesForQt.xml
中間ロケールファイルはステップ14で作成されました。続行する前に、必要な変更をリストし、ドキュメントを確認してください。
何を変更して変更するかについての具体的な詳細は、このガイドラインの範囲外です。しかし、ここにはいくつかのヒントと考慮事項があります。
CLDRファイルを編集する場合:
- 英語の改訂の場合、
"${CLDRDIR}/comman/main/en.xml"
グレン・ホイットニーのように改訂が可能だ。 //ldml/dates/calendars/calendar[@type="gregorian"]/dateFormats/
または以下の設定を確認してください。//ldml/dates/calendars/calendar[@type="gregorian"]/timeFormats/
- 以下の参照には、フィールドの設定方法へのドキュメントリンクが含まれています。 (ダウンロードしたCLDRファイルは、中間ロケールファイルと形式が異なります。CLDRファイルを変更する場合は、Unicode LDMLのドキュメントを参照してください。)
- CLDR ファイルの一部の変更は、中間ロケール・ファイルに伝播されません。 CLDRファイルの一部の項目には、Qtロケールフレームワークに類似した項目がありません。
- 英語の改訂の場合、
中間ファイルを編集する場合:
- ファイルの各ロケールには約55行のロケールがあります。
//localeDatabase/localeList/locale/
変更する必要がある該当するセクションを見つけます。- 編集したいセクションを見つけるには、言語または国を検索してください。たとえば、「UnitedStates」を検索し、「アメリカ英語」言語と「アメリカ」国に対応するロケールブロックを探します。実際、「United States」または「American English」(2つの単語の間にスペースを含む)を検索すると、変更したいブロックに直接移動しました。
- 以下の参照には、フィールドの設定方法へのドキュメントリンクが含まれています。 (中間ロケールファイルの形式は、ダウンロードしたCLDRファイルとは異なります。中間ロケールファイルを変更する場合は、QtDateおよびQtTimeのマニュアルを参照してください。)
ほとんどのユースケースでは、中間ロケールファイルを編集する方が簡単です。
"${CLDRDIR}/common/main"
変更する必要があるファイルを変更するには、テキストエディタを使用します。上記のように、この手順ではファイルを変更する必要はありません。中間ロケールファイルは編集が簡単になります。sensible-editor "${CLDRDIR}"/common/main/en.xml
CLDRファイルは、処理されて配置される
localesForQt.xml
中間ロケールファイルを作成します"${TOPDIR}"
。この手順には数分かかり、「基本コンテンツのスキップ」と「ファイルのスキップ」メッセージがたくさん生成されます。これらのメッセージは、前の手順で変更されたファイルをスキップしたように見えることがあります。慌てないでください。これらのメッセージは誤解を招くようです。"${CLDRScriptsDIR}"/cldr2qlocalexml.py "${CLDRDIR}"/common/main > "${TOPDIR}/localesForQt.xml"
必要に応じて、テキストエディタを使用して中間ロケールファイルを変更または表示できます。中間ロケールファイルが生成される前にCLDRファイルが変更された場合は、中間ロケールファイルに必要な変更が適用されていることを確認できます。
sensible-editor "${TOPDIR}/localesForQt.xml"
いくつかの変更例(例:「United States」「American English」ロケールに変更):
以前は:
<longDateFormat>dddd, MMMM d, yyyy</longDateFormat> <shortDateFormat>M/d/yy</shortDateFormat> <longTimeFormat>h:mm:ss AP t</longTimeFormat> <shortTimeFormat>h:mm AP</shortTimeFormat>
今:
<longDateFormat>dddd, MMMM dd, yyyy</longDateFormat> <shortDateFormat>yyyy-MM-dd</shortDateFormat> <longTimeFormat>HH:mm:ss t</longTimeFormat> <shortTimeFormat>HH:mm</shortTimeFormat>
提供されたスクリプトを使用して、中間言語環境ファイルからC ++コードを生成します。
"${CLDRScriptsDIR}"/qlocalexml2cpp.py "${TOPDIR}/localesForQt.xml" "${QtBaseBuildDIR}"
パッチファイルへの変更をコミットします。パッチに名前
"localver_locale_modification.diff"
または同様の名前を付けます。編集内容を記録できるエディタが開きます。cd "${QtBaseBuildDIR}" dpkg-source --commit
すべてのQtBaseライブラリをビルドします。このステップは時間がかかります。
debuild -us -uc
完了したら、前の手順でに
"${QtBaseSrcDIR}"
インストールしますdpkg
。すべてのパッケージの名前には「localver」が含まれています。これは、ソースからどのパッケージがインストールされているかを確認するのに役立ちます。を使用して初期インストールを試みた後に依存dpkg
関係がない場合、およびを使用してsudo dpkg --configure -a
それを修正できますsudo apt-get -f install
。その後、「localver」パッケージを繰り返しインストールできます。find "${QtBaseSrcDIR}" -maxdepth 1 -mindepth 1 -type f -name \*localver\*.deb ! -name \*dbgsym\* -print0 | xargs -0 sudo dpkg -i sudo dpkg --configure -a sudo apt-get -f install find "${QtBaseSrcDIR}" -maxdepth 1 -mindepth 1 -type f -name \*localver\*.deb ! -name \*dbgsym\* -print0 | xargs -0 sudo dpkg -i
システム設定/個人化/ロケール/形式を開き、ロケールを目的のロケール(「en_US」など)に設定します。この設定は、ロケールが変更される国と一致する必要があります。 「詳細設定」をクリックし、すべてのサブオプションで同じロケールを設定します。 (すべての詳細設定を開いて明示的に設定するまで更新を受信できませんでした。)設定を適用するには、ログアウトまたは再起動してください。
引用:
kde.org バグレポート: https://bugs.kde.org/show_bug.cgi?id=340982
Unicode LDML(ロケールデータマークアップ言語)パート4:日付#日付フィールドシンボルテーブル: https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
Qt QTimeフォーマットパラメータ: https://doc.qt.io/qt-5/qtime.html#toString
Qt QDate 型パラメーター: https://doc.qt.io/qt-5/qdate.html#fromString
許可されたリンクより多くのリンクが原因で参照が切り捨てられました。
答え3
1年が経過しても同じ状況が発生しました。私はOpenSUSE Tumbleweedでこのプロセスを経て、私が望む方法で日付形式をen_USとして指定しました。 [SOMEPATH](角かっこを含む)を必要に応じて置き換えるステップバイステップの手順は次のとおりです。私が公開してからCLDRが35.1からアップグレードされた場合は、CLDRのバージョン番号を更新する必要があるかもしれません。
sudo zypper si libqt5-qtbase
#Qt Coreのソースrpmのインストールcd /usr/src/packages/SPECS
sudo rpmbuild -bp libqt5-qtbase.spec
cd [SOMEPATH]
curl http://unicode.org/Public/cldr/35.1/core.zip --output core.zip
unzip core.zip
nano common/main/en.xml
#または変更したい言語/地域 - 変更したい地域の日付形式やその他のパラメータを見つけて、必要に応じて編集します。cd /usr/src/packages/BUILD/qtbase-everywhere-src-5.13.0/util/local_database/
./cldr2qlocalexml.py [SOMEPATH]/common/main > [SOMEPATH]/localesForQt.xml
sudo ./qlocalexml2cpp.py [SOMEPATH]/localesForQt.xml /usr/src/packages/BUILD/qtbase-everywhere-src-5.13.0/
cd /usr/src/packages/SPECS
sudo rpmbuild --noprep --noclean -bb libqt5-qtbase.spec
#映画を見に行くのはコンピュータの速度によって異なります。- ビルドが完了したら、/usr/src/packages/RPMS/[your_architecture]に複数のRPMSを作成する必要があります。ディレクトリをこのディレクトリに変更します。
sudo zypper install *Core*
- 再起動して再度ログインすると、変更内容が表示されます:-)
KDE/Qtを構成するのは楽しく便利です。そうですか? ;-)