web-dev-qa-db-ja.com

Ubuntu 18.04の複数のディスプレイのトップバーにカスタムフォーマットの時計を表示する方法は?

私はかなり具体的な問題を抱えており、それに対してうまく機能する解決策を見つけようとして運がなかった。 Ubuntu 18.04を実行しているラップトップを2つの外部モニターを使用してドッキングし、3つの画面を表示しています。現在の画面を簡単に検索して時刻を確認できるように、3つの画面すべてにトップバーを配置したいと思います。 Multi Monitors Add-On Gnome拡張を使用してこれを有効にします。 Ubuntuを英語で実行していますが、スウェーデン語の形式に設定しています。これにより、トップバーの日付形式が非常にく、正しくなくなります。

Image of top bar clock

これはスウェーデン語の名前が数日と数か月続く、ほぼ英語の形式です。 副次的に、 このローカリゼーションの「バグ」は修正されました そして、今後のgnomeリリースの準備ができました。

私の主な問題は、表示される日付の形式を次のようなものに変更することです。

Image of desired format

Gnome拡張機能( Clock OverrideDatetime Format )を使用して、この形式を簡単に取得できます。ただし、これらの拡張機能はいずれもMulti Monitors Add-Onでは機能せず、メインモニターには適切にフォーマットされたクロックが残りますが、他の2つの画面には見苦しいフォーマットのクロックが残ります。 これらのアドオンの共同開発者 を取得しようとしましたが、明らかにgnome拡張機能間の依存関係は「地獄」です。

また、en_USとsv_SEの両方のロケールファイルを直接編集してみました。具体的には、日付と時刻の文字列のLC_TIMEd_t_fmt形式ですが、これはクロック形式に影響を与えないようです。

最後の試みでは、libgnome-Shell.soにある/usr/lib/gnome-Shell/ファイルも解凍して、 this answer を使用して、時計の表示に使用されるJavaScriptファイルを編集しようとしました。 dateMenu.jscalendar.jsを見て、見つけることができるほとんどのフォーマット文字列を目的のフォーマット%Y-%m-%dに変更しました。次にGNOME_Shell_JS=$HOME/gnome-Shell-js gnome-Shell --replaceを実行しましたが、再び効果がないように見えました。公平を期すために、私はここの深海にいるので、間違いなく私の試みに失敗したかもしれません。そのため、解決策はこの方法でも可能です。

誰かがこのような状況を経験したことがありますか? Ubuntu 18.04を使用して複数のモニターに表示される日付と時刻の形式を変更しますか?私は確かにそれを機能させることができた何かを見逃している可能性があるので、私がすでに試したものを試してみてください。

4
Skillzore

BLUF:これは、拡張機能を使用せずにGnomeのトップバークロックのフォーマットを好みに合わせて変更するための永続的でクリーンな方法です。

また、Gnomeのトップバーに時計のカスタム形式の文字列を表示したかったのですが、ディスプレイは1つだけでした。ただし、この答えはあなたの問題にも拡張され、マルチモニターのトップバー拡張だけを使用できるようになります。私の目標は、私の場合、拡張子を付けずにこれを行うことでした。そのため、起動時、アクティブなログインセッション、およびセッションロック解除画面で、最初のgdmログイン画面でカスタム時間形式が一貫して表示されます。少し掘り下げましたが、重要なのは、Gnomeがローカリゼーション/国際化を処理する方法と、Gnomeの壁時計が呼ばれているように、実際にトップバーに表示する文字列を取得する方法です。

最初に、Gnomeのローカリゼーション/国際化での.poおよび.moファイルの使用に関する背景をここで見つけることができます。

https://wiki.gnome.org/TranslationProject/LocalisationGuide

基本的に、実行時に、Gnomeウォールクロックは現在の時刻を取得し、ローカリゼーション/国際化文字列のフォーマットを適用します。文字列キーを使用して、特定のロケールで使用する書式設定文字列を検索し、実際に表示するものを決定します-notはロケールに依存しますファイルのフォーマット文字列。ローカリゼーション/国際化ファイルの特定のキーに対して返される値を変更すると、時計の表示に変更が反映されます。ローカリゼーション/国際化は2つのファイルを使用します。 1つ目は、翻訳者がロケールごとに入力する人間が読み取れる.poファイルです。これは、ルックアップキーからフォーマット文字列へのマッピングを見つけることができる場所です。 2つ目は、.poファイルから生成される.moファイルです...これに関する詳細と、それが少し関連している...

以下は、Ubuntu 18.04で使用されているGnome壁時計バージョンのソースへのリンクです。

https://github.com/GNOME/gnome-desktop/blob/gnome-3-28/libgnome-desktop/gnome-wall-clock.c

261行目から始まる関数 'gnome_wall_clock_string_for_datetime'を調べると、ローカリゼーション/国際化検索キーが使用されていることがわかります。いくつかあります。 Ubuntuには、時刻だけ、時刻と時刻、時刻と日付と日付などを表示するかどうかに応じて、壁時計のさまざまな表示設定があります。これらはそれぞれ、壁時計が使用する特定のローカリゼーション/国際化検索キーに対応します。以下の引用文に表示されるのは、notフォーマット文字列自体ではなく、実際のフォーマット文字列を検索するためのキーです。各キーを囲む_()が検索を実行します。

char *
gnome_wall_clock_string_for_datetime (GnomeWallClock      *self,
                      GDateTime           *now,
                      GDesktopClockFormat  clock_format,
                      gboolean             show_weekday,
                      gboolean             show_full_date,
                      gboolean             show_seconds)
{
    const char *format_string;

    if (clock_format == G_DESKTOP_CLOCK_FORMAT_24H) {
        if (show_full_date) {
            /* Translators: This is the time format with full date used
               in 24-hour mode. */
            format_string = show_seconds ? _("%a %b %e, %R:%S")
                : _("%a %b %e, %R");
        } else if (show_weekday) {
            /* Translators: This is the time format with day used
               in 24-hour mode. */
            format_string = show_seconds ? _("%a %R:%S")
                : _("%a %R");
        } else {
            /* Translators: This is the time format without date used
               in 24-hour mode. */
            format_string = show_seconds ? _("%R:%S") : _("%R");
        }
    } else {
        if (show_full_date) {
            /* Translators: This is a time format with full date used
               for AM/PM. */
            format_string = show_seconds ? _("%a %b %e, %l:%M:%S %p")
                : _("%a %b %e, %l:%M %p");
        } else if (show_weekday) {
            /* Translators: This is a time format with day used
               for AM/PM. */
            format_string = show_seconds ? _("%a %l:%M:%S %p")
                : _("%a %l:%M %p");
        } else {
            /* Translators: This is a time format without date used
               for AM/PM. */
            format_string = show_seconds ? _("%l:%M:%S %p")
                : _("%l:%M %p");
        }
    }

    return date_time_format (now, format_string);
}

たとえば、曜日、日付、および時刻を12時間形式で表示するためのカスタム形式の文字列が必要でした。それはUbuntuで、日付、日付、および時刻を12時間形式で表示するようにクロックを設定しました。これは上記のコードの「完全な日付」に対応します。関数を調べると、この 'full date'ルックアップキーが288行目で発生したことがわかりました。

/* Translators: This is a time format with full date used
   for AM/PM. */
format_string = show_seconds ? _("%a %b %e, %l:%M:%S %p")
        : _("%a %b %e, %l:%M %p");

私は数秒に興味がなかったので、ローカリゼーション/国際化.poファイルで見つける必要があるキーは次のとおりでした。

'%a %b %e, %l:%M %p'

ローカリゼーション/国際化.moファイルはバイナリ形式ですが、特定のルックアップキーをフォーマット文字列にマッピングする人間が判読できるプレーンテキストマッピング.poファイルから簡単に生成できます。 Gnomeウォールクロックは、ローカリゼーション/国際化のためにgnome-desktop-3.0.moという特定の名前のファイルを使用します。それは、notで、anyロケールの所定の場所にシステム上に存在していました。 :

/usr/share/locale/XX/LC_MESSAGES

そのため、交換することを心配する必要はなく、新しく作成する必要がありました。とにかく、まずロケールの.poファイルを取得する必要があります。

https://github.com/GNOME/gnome-desktop/tree/gnome-3-28/po

次に、上記のspecificキー(またはyou.poファイルで、Ubuntuの時計設定に基づいてフォーマット文字列を変更したい。文字列キーは「msgid」で、返されるフォーマット文字列は「msgstr」です。たとえば、私の.poファイルのスニペットは次のとおりです(コード行が実際に一致しないため、コメントを無視します)。

#: ../libgnome-desktop/gnome-wall-clock.c:316
msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p"

変更後:

#: ../libgnome-desktop/gnome-wall-clock.c:316
msgid "%a %b %e, %l:%M %p"
msgstr "%A %b %-d, %l:%M %p"

上記の「msgstr」に変更が反映される前は、次のように表示されていました。

Mon Feb  4, 12:22 PM

ただし、上記の変更後、日は短縮されなくなり、日付の前にある先頭のスペースが削除されました(書式指定子については、この回答の最後を参照してください)。

Monday Feb 4, 12:22 PM

次に、この.poファイルを取得し、コマンドラインで次のコマンドを実行して、XXがロケールであるmessages.moファイルを取得します。バイナリmsgfmtはすでにUbuntu 18.04にインストールされています。

msgfmt -cv XX.po

次に、結果のmessages.moファイルの名前をgnome-desktop-3.0.moに変更し、your特定のロケールLC_MESSAGEディレクトリにコピーします。

/usr/share/locale/XX/LC_MESSAGES/gnome-desktop-3.0.mo

次に、変更を有効にするには、ログアウトしてから再度ログインします。書式設定がnotで変更されたことがわかった場合は、現在のクロック設定が本当にフォーマット文字列を変更したキーに対応します。

最後に、あなたを助けてくれるいくつかのフォーマット文字列指定子があります。私はこれらを別のサイトから借りたので、これらのallがGnomeで機能するという保証はありません。

The % sign indicating a directive may be immediately followed by a padding modifier, e.g. %-d:

0 - zero-padding
_ - space-padding
- - disable padding

%a - abbreviated weekday name.*
%A - full weekday name.*
%b - abbreviated month name.*
%B - full month name.*
%d - zero-padded day of the month as a decimal number [01,31].
%e - space-padded day of the month as a decimal number [ 1,31]; equivalent to %_d.
%f - microseconds as a decimal number [000000, 999999].
%H - hour (24-hour clock) as a decimal number [00,23].
%I - hour (12-hour clock) as a decimal number [01,12].
%j - day of the year as a decimal number [001,366].
%m - month as a decimal number [01,12].
%M - minute as a decimal number [00,59].
%L - milliseconds as a decimal number [000, 999].
%p - either AM or PM.*
%Q - milliseconds since UNIX Epoch.
%s - seconds since UNIX Epoch.
%S - second as a decimal number [00,61].
%u - Monday-based (ISO 8601) weekday as a decimal number [1,7].
%U - Sunday-based week of the year as a decimal number [00,53].
%V - ISO 8601 week of the year as a decimal number [01, 53].
%w - Sunday-based weekday as a decimal number [0,6].
%W - Monday-based week of the year as a decimal number [00,53].
%x - the locale’s date, such as %-m/%-d/%Y.*
%X - the locale’s time, such as %-I:%M:%S %p.*
%y - year without century as a decimal number [00,99].
%Y - year with century as a decimal number.
%Z - time zone offset, such as -0700, -07:00, -07, or Z.
%% - a literal percent sign (%).
5
Steve