我想在不使用扩展的情况下格式化时钟......
答案1
BLUF:这是一种永久且干净的方法,可以根据您的喜好改变 Gnome 顶栏时钟的格式,而无需使用扩展。
我的目标是简单地执行此操作而不使用任何扩展,以便在启动时、在活动登录会话中以及在会话解锁屏幕上始终看到自定义时间格式。这需要一些挖掘,但关键在于 Gnome 如何处理本地化/国际化,以及 Gnome 挂钟(正如它的名字)如何获取实际显示在顶部栏中的字符串。
首先,可以在这里找到有关 Gnome 本地化/国际化中使用 .po 和 .mo 文件的一些背景信息:
https://wiki.gnome.org/TranslationProject/LocalisationGuide
基本上,在运行时,Gnome 挂钟会获取当前时间并应用本地化/国际化字符串格式。它使用字符串键来查找用于给定区域设置的格式字符串,以确定实际显示的内容 - 它确实会这样做不是依赖于语言环境文件格式字符串。如果您修改本地化/国际化文件中给定键的返回值,时钟显示将反映该变化。本地化/国际化使用两个文件。第一个是翻译人员为每个语言环境填充的人类可读的 .po 文件,这是从查找键到格式字符串的映射。第二个是从 .po 文件生成的 .mo 文件...稍后将详细介绍这一点以及它之间的关系...
以下是 Ubuntu 20.04 中使用的 Gnome 挂钟版本的源代码链接:
https://github.com/GNOME/gnome-desktop/blob/gnome-3-36/libgnome-desktop/gnome-wall-clock.c
如果您检查从第 310 行开始的函数“gnome_wall_clock_string_for_datetime”,您将看到正在使用的本地化/国际化查找键。有好几个。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 中,我已将时钟设置为以 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 可以在 20.04 中通过“sudo apt install gettext”安装:
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 (%).
答案2
作为源代码在史蒂夫经过充分研究的回答中显示,时钟支持四种设置,无需更改 l10n/i18n 文件即可更改这些设置:
- 使用 12/24 小时格式
- 显示星期几
- 显示完整日期
- 显示秒数
它们可以通过以下方式完成gsettings
,例如
gsettings set org.gnome.desktop.interface clock-show-seconds false
gsettings set org.gnome.desktop.interface clock-show-date true
gsettings set org.gnome.desktop.interface clock-show-weekday true
gsettings set org.gnome.desktop.interface clock-format '24h'
(您可以使用gsettings get
检查值,或gsettings reset
将其恢复为默认设置。)