Как я могу отформатировать верх bar clock в Ubuntu 20.04 без расширений?

Я хотел отформатировать часы без использования расширений ...

4
задан 4 June 2021 в 03:08

1 ответ

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

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

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

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

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

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

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

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

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;

    g_debug ("clock_format: %s", clock_format == G_DESKTOP_CLOCK_FORMAT_24H ? "24h" : "12h");
    g_debug ("show_weekday: %s", show_weekday ? "TRUE" : "FALSE");
    g_debug ("show_full_date: %s", show_full_date ? "TRUE" : "FALSE");
    g_debug ("show_seconds: %s", show_seconds ? "TRUE" : "FALSE");

    if (clock_format == G_DESKTOP_CLOCK_FORMAT_24H) {
        if (show_full_date) {
            if (show_weekday)
                /* Translators: This is the time format with full date
                   plus day used in 24-hour mode. Please keep the under-
                   score to separate the date from the time. */
                format_string = show_seconds ? T_(N_("%a %b %-e_%R:%S"))
                    : T_(N_("%a %b %-e_%R"));
            else
                /* Translators: This is the time format with full date
                   used in 24-hour mode. Please keep the underscore to
                   separate the date from the time. */
                format_string = show_seconds ? T_(N_("%b %-e_%R:%S"))
                    : T_(N_("%b %-e_%R"));
        } else if (show_weekday) {
            /* Translators: This is the time format with day used
               in 24-hour mode. */
            format_string = show_seconds ? T_(N_("%a %R:%S"))
                : T_(N_("%a %R"));
        } else {
            /* Translators: This is the time format without date used
               in 24-hour mode. */
            format_string = show_seconds ? T_(N_("%R:%S"))
                                : T_(N_("%R"));
        }
    } else {
        if (show_full_date) {
            if (show_weekday)
                /* Translators: This is a time format with full date
                   plus day used for AM/PM. Please keep the under-
                   score to separate the date from the time. */
                format_string = show_seconds ? T_(N_("%a %b %-e_%l:%M:%S %p"))
                    : T_(N_("%a %b %-e_%l:%M %p"));
            else
                /* Translators: This is a time format with full date
                   used for AM/PM. Please keep the underscore to
                   separate the date from the time. */
                format_string = show_seconds ? T_(N_("%b %-e_%l:%M:%S %p"))
                    : T_(N_("%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 ? T_(N_("%a %l:%M:%S %p"))
                : T_(N_("%a %l:%M %p"));
        } else {
            /* Translators: This is a time format without date used
               for AM/PM. */
            format_string = show_seconds ? T_(N_("%l:%M:%S %p"))
                : T_(N_("%l:%M %p"));
        }
    }

    g_debug ("format_string: %s", format_string);

    return date_time_format (now, format_string);
}

Например, мне нужна строка настраиваемого формата для отображения дня, даты и времени в 12-часовом (AM / PM) формате. То есть в Ubuntu я установил clock для отображения дня, даты и времени в 12-часовом формате, который соответствует «полной дате» в приведенном выше коде. Изучив функцию, я смог определить, что этот ключ поиска «полная дата» встречается в строке 361:

/* Translators: This is a time format with full date
                   used for AM/PM. Please keep the underscore to
                   separate the date from the time. */
                format_string = show_seconds ? T_(N_("%b %-e_%l:%M:%S %p"))
                    : T_(N_("%b %-e_%l:%M %p"));

Меня не интересовали секунды, поэтому мне нужно было найти ключ в локализации / интернационализации.Файл po был:

'%b %-e_%l:%M %p'

К сожалению, мне не удалось найти этот конкретный ключ в en.po для моей локали. Начиная с выпуска 18.04 LTS, похоже, что люди из Gnome заменили запятые подчеркиванием в строке форматирования , но файл локали - по крайней мере, для en - не был обновлен, чтобы отразить это изменение.

https://github.com/GNOME/gnome-desktop/blob/gnome-3-36/po/en.po

Итак, мне нужно было добавить его, а также сопоставление с форматированием, которое я хотел .

msgid "%a %b %-e_%l:%M %p"
msgstr "%A %b %-d, %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-36/po

Опять же, многие часы Строки форматирования не присутствуют для локали 'en', и мне нужно было добавить ту, которая меня интересовала.

До изменения, отраженного в приведенном выше 'msgstr', часы отображали:

Mon Feb 4  12:22 PM

Но после вышеуказанного изменения день больше не сокращается, а пространство, разделяющее дату и время, было заменено запятой (спецификаторы форматирования см. В конце этого ответа):

Monday Feb 4, 12:22 PM

Затем возьмите это.po и запустите его в командной строке, чтобы получить файл messages.mo, где XX - ваш языковой стандарт. Бинарный файл msgfmt можно установить с помощью sudo apt install gettext в 20.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 (%).
3
ответ дан 28 July 2021 в 11:32

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

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