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

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

Image of top bar clock

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

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

Image of desired format

Я могу легко получить этот формат с помощью любых из многих часов, форматирующих расширения Gnome (Переопределение Часов, Формат Даты и времени). Однако ни одно из этих расширений, работа с моим Много Дополнением Мониторов, оставляя меня с приятно отформатированным отмечает время прихода на работу основной монитор, но ужасный отформатированный, не отмечает время прихода на работу другие два экрана. Я попытался заставить разработчиков этих дополнений сотрудничать, но по-видимому зависимости между расширениями гнома являются "адом".

Я также попытался редактировать файлы локали непосредственно, и en_US и sv_SE. Конкретно LC_TIME d_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? Не стесняйтесь пробовать то, что я уже попробовал, поскольку я мог, конечно, пропустить что-то, что, возможно, заставило его работать.

5
задан 3 December 2018 в 00:05

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 (%).
6
ответ дан 23 November 2019 в 09:11

Другие вопросы по тегам:

Похожие вопросы: