Как отображать отформатированные часы в верхней панели на нескольких дисплеях в Ubuntu 18.04?

У меня довольно специфическая проблема, с которой мне не повезло, пытаясь найти рабочее решение. У меня есть ноутбук с Ubuntu 18.04, подключенный к 2 внешним мониторам, в результате 3 экрана. Я хочу, чтобы моя верхняя панель была на всех 3 экранах, чтобы легко смотреть на текущий экран, чтобы увидеть время. Я включаю это, используя расширение Multi-Monitors Add-On Gnome. Я использую Ubuntu на английском языке, но на шведском. Это делает очень уродливый и неправильный формат даты в верхней панели.

Это в значительной степени английский формат со шведскими названиями для дней и месяцев. Кстати, эта "ошибка" локализации была исправлена и готова к предстоящему выпуску GNOME.

Моя главная проблема заключается в том, что я хочу изменить формат отображаемой даты на что-то вроде:

Я легко могу получить этот формат, используя любое из множества расширений Gnome форматирования часов ( Clock Override, Datetime Format). Тем не менее, ни одно из этих расширений не работает с моим надстройкой Multi Monitors, оставляя мне приятно отформатированные часы на главном мониторе, но ужасно отформатированные часы на двух других экранах. Я пытался заставить разработчиков этих дополнений сотрудничать, но, очевидно, зависимости между расширениями gnome - это "ад".

Я также попытался редактировать файлы локали напрямую, как en_US, так и sv_SE. В частности, LC_TIMEd_t_fmt формат для строк даты и времени, но это, похоже, не влияет на формат часов.

В последней попытке я также распаковал libgnome-shell.so файл находится в /usr/lib/gnome-shell/ попытаться отредактировать файлы JavaScript, используемые для отображения часов, используя этот ответ. Я заглянул в dateMenu.js а также calendar.js и изменил большинство строк формата, которые я мог найти, в желаемый формат %Y-%m-%d, Я тогда побежал GNOME_SHELL_JS=$HOME/gnome-shell-js gnome-shell --replace, но опять же это, казалось, не имело никакого эффекта. Чтобы быть справедливым, я нахожусь в глубоких водах здесь и определенно мог потерпеть неудачу в моих попытках. Таким образом, решение все еще может быть в этом методе.

У кого-нибудь был опыт в такой ситуации? Изменение формата даты и времени, отображаемого на нескольких мониторах, с помощью Ubuntu 18.04? Не стесняйтесь попробовать то, что я уже пробовал, поскольку я, конечно, мог пропустить что-то, что могло бы заставить его работать.

1 ответ

Решение

BLUF: Это постоянный и чистый способ изменить форматирование верхней панели часов Gnome по своему вкусу без использования расширений.

Я также хотел отобразить отформатированную строку для часов в верхней панели Gnome, но только с одним дисплеем. Однако этот ответ также будет распространяться на вашу проблему и позволит вам использовать только расширение верхней панели мульти-монитора. Моя цель состояла в том, чтобы просто сделать это без каких-либо расширений в моем случае, чтобы пользовательский формат времени постоянно отображался на начальном экране входа в систему gdm при загрузке, во время активных сеансов входа в систему и на экране разблокировки сеанса. Это заняло некоторое копание, но ключ кроется в том, как Gnome обрабатывает локализацию / интернационализацию и как настенные часы Gnome, как они называются, получают строку для фактического отображения в верхней панели.

Во-первых, немного информации об использовании файлов.po и.mo в локализации / интернационализации Gnome можно найти здесь:

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

В основном, во время выполнения настенные часы Gnome принимают текущее время и применяют форматирование строки локализации / интернационализации. Он использует строковый ключ для поиска строки форматирования, которую можно использовать для данной локали, чтобы определить, что на самом деле отображать - он не полагается на строки форматирования файла локали. Если вы измените значение, возвращаемое для данного ключа в файле локализации / интернационализации, на дисплее часов отобразятся изменения. Локализация / интернационализация использует два файла. Первый - это читаемый человеком.po-файл, который переводчики заполняют для каждой локали, и именно здесь можно найти отображение ключей поиска в строки форматирования. Второй - это файл.mo, который генерируется из файла.po... подробнее об этом и о том, как он связан всего лишь немного...

Ниже приведена ссылка на источник версии настенных часов Gnome, используемой в Ubuntu 18.04:

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

Если вы изучите функцию 'gnome_wall_clock_string_for_datetime', начинающуюся со строки 261, вы увидите используемые ключи поиска локализации / интернационализации. Есть несколько. Ubuntu имеет различные настройки отображения настенных часов в зависимости от того, хотите ли вы отображать только время, время с днем, время с днем ​​и датой и т. Д. Каждый из них соответствует заданному ключу поиска локализации / интернационализации, который использует настенные часы. В приведенных ниже цитатах вы видите не саму строку форматирования, а ключ к поиску фактической строки форматирования. _(), Который окружает каждый ключ, выполняет поиск:

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-часовом формате, который соответствует "полной дате" в приведенном выше коде. Изучив функцию, я смог определить, что этот ключ поиска "полная дата" появился в строке 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. Он не присутствовал в моей системе в указанном месте для любой локали:

/usr/share/locale/XX/LC_MESSAGES

Поэтому мне не нужно было беспокоиться о его замене, а скорее о его создании. В любом случае, вам сначала нужно получить файл.po для вашей локали:

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

Затем найдите указанный выше конкретный ключ (или ключ, для которого вы хотите изменить строку форматирования на основе настроек часов в Ubuntu) в файле.po. Строковый ключ - "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-файл и выполните его через командную строку, чтобы получить файл messages.mo, где XX - ваша локаль. Двоичный файл msgfmt уже установлен в Ubuntu 18.04:

msgfmt -cv XX.po

Затем переименуйте полученный файл messages.mo в gnome-desktop-3.0.mo и скопируйте его в каталог LC_MESSAGE вашей конкретной локали:

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

Затем, чтобы внести изменения, выйдите из системы и снова войдите в нее. Если вы обнаружите, что форматирование не изменилось, дважды проверьте, что ваши текущие настройки часов действительно соответствуют ключу, для которого вы изменили строку форматирования.

Наконец, вот некоторые спецификаторы форматирования строки, которые помогут вам в этом. Я позаимствовал их на другом сайте, поэтому нет никаких гарантий, что все они работают в 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 (%).
Другие вопросы по тегам