J'ai un problème assez spécifique, pour lequel je n'ai pas eu de chance en essayant de trouver une solution efficace. J'ai un ordinateur portable sous Ubuntu 18.04 amarré à l'aide de 2 moniteurs externes, ce qui donne 3 écrans. Je veux que ma barre supérieure sur les 3 écrans permette de regarder facilement l'écran actuel pour voir l'heure. J'active ceci en utilisant l'extension Multi Monitors Add-On Gnome. J'exécute Ubuntu en anglais, mais en suédois. Cela crée un format de date très moche et incorrect dans la barre supérieure.
C'est assez bien le format anglais avec des noms suédois pour les jours et les mois. Remarque: ce "bogue" de localisation a été corrigé et est prêt pour une prochaine version de gnome.
Mon problème principal est que je veux changer le format de la date affichée en quelque chose comme:
Je peux facilement obtenir ce format en utilisant l’une des nombreuses extensions de format d’horloge Gnome ( Clock Override , Format Datetime ). Cependant, aucune de ces extensions ne fonctionne avec mon add-on Multi Monitors, ce qui me laisse une horloge bien formatée sur le moniteur principal, mais des horloges formatées laides sur les deux autres écrans. J'ai essayé d'obtenir le les développeurs de ces addons à collaborer , mais apparemment, les dépendances entre les extensions de gnome sont "l'enfer".
J'ai également essayé de modifier directement les fichiers de paramètres régionaux, à la fois en_US et sv_SE. Plus précisément, le format LC_TIME
d_t_fmt
pour les chaînes de date et d’heure, mais cela ne semble pas avoir d’impact sur le format de l’horloge.
Lors d'une dernière tentative, j'ai également décompressé le fichier libgnome-Shell.so
situé dans /usr/lib/gnome-Shell/
pour essayer de modifier les fichiers JavaScript utilisés pour afficher l'horloge, en utilisant cette réponse . J'ai jeté un œil dans dateMenu.js
et calendar.js
et changé la plupart des chaînes de format que je pouvais trouver au format souhaité %Y-%m-%d
. J'ai ensuite exécuté GNOME_Shell_JS=$HOME/gnome-Shell-js gnome-Shell --replace
, mais là encore, il semblait n'avoir aucun effet. Pour être juste, je suis dans les eaux profondes ici et j'aurais certainement pu échouer dans mes tentatives. En tant que telle, la solution pourrait toujours être dans cette méthode.
Quelqu'un a-t-il déjà vécu une telle situation? Changer le format de la date et de l’heure affichées sur plusieurs moniteurs avec Ubuntu 18.04? N'hésitez pas à essayer ce que j'ai déjà essayé car je peux certainement avoir manqué quelque chose qui aurait pu le faire fonctionner.
BLUF: C’est une façon propre et permanente de modifier à votre guise le formatage de l’horloge supérieure de Gnome sans recourir à des extensions.
Je voulais aussi afficher une chaîne au format personnalisé pour l'horloge dans la barre supérieure de Gnome, mais avec un seul affichage. Toutefois, cette réponse s'étendra également à votre problème et vous permettra d’utiliser uniquement l’extension de la barre supérieure pour plusieurs moniteurs. Mon objectif était simplement de faire cela sans aucune extension dans mon cas afin que le format d'heure personnalisé soit affiché de manière cohérente sur l'écran de connexion initial de gdm au démarrage, lors de sessions connectées actives et sur l'écran de déverrouillage de session. Il a fallu creuser un peu, mais la clé réside dans la façon dont Gnome gère la localisation/internationalisation et dans la manière dont l’horloge murale Gnome, telle qu’elle est appelée, obtient la chaîne à afficher dans la barre supérieure.
Tout d'abord, quelques informations sur l'utilisation des fichiers .po et .mo dans la localisation/l'internationalisation de Gnome sont disponibles ici:
https://wiki.gnome.org/TranslationProject/LocalisationGuide
Fondamentalement, au moment de l'exécution, l'horloge murale Gnome prend l'heure actuelle et applique le formatage de chaîne de localisation/internationalisation. Il utilise une clé de chaîne pour rechercher une chaîne de mise en forme à utiliser pour un paramètre régional donné afin de déterminer ce qui doit être réellement affiché - il le fait not s'appuie sur les chaînes de formatage du fichier de paramètres régionaux. Si vous modifiez la valeur renvoyée pour une clé donnée dans le fichier de localisation/internationalisation, l'affichage de l'horloge reflétera le changement. La localisation/internationalisation utilise deux fichiers. Le premier est le fichier .po lisible par l'homme que les traducteurs peuplent pour chaque langue. C'est ici que se trouve le mappage des clés de recherche sur les chaînes de formatage. La seconde est le fichier .mo qui est généré à partir du fichier .po ... plus à ce sujet et comment il se rapporte dans juste un peu ...
Vous trouverez ci-dessous un lien vers le source de la version d'horloge murale Gnome utilisée dans Ubuntu 18.04:
https://github.com/GNOME/gnome-desktop/blob/gnome-3-28/libgnome-desktop/gnome-wall-clock.c
Si vous examinez la fonction 'gnome_wall_clock_string_for_datetime' à partir de la ligne 261, vous verrez les clés de recherche localisation/internationalisation en cours d'utilisation. Il y a plusieurs. Ubuntu propose divers paramètres d'affichage pour l'horloge murale, selon que vous souhaitez afficher uniquement l'heure, l'heure avec le jour, l'heure avec le jour et la date, etc. Chacune de ces correspond à une clé de recherche de localisation/internationalisation donnée utilisée par cette horloge murale. Ce que vous voyez dans les citations ci-dessous est pas la chaîne de formatage elle-même, mais plutôt la clé pour rechercher la chaîne de formatage réelle. Le _ () qui entoure chaque touche effectue la recherche:
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);
}
Par exemple, je voulais une chaîne de format personnalisée pour afficher le jour, la date et l'heure au format 12 heures. C’est dans Ubuntu que j’avais réglé l’horloge pour afficher le jour, la date et l’heure au format 12 heures, ce qui correspond à la "date complète" dans le code ci-dessus. En examinant la fonction, j'ai pu déterminer que cette clé de recherche "date complète" était à la ligne 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");
Secondes ne m'intéressant pas, la clé que je devais trouver dans le fichier .po de localisation/internationalisation était:
'%a %b %e, %l:%M %p'
Les fichiers .mo de localisation/internationalisation sont de format binaire, mais ils sont facilement générés à partir de fichiers .po de mappage en texte brut lisibles par l'homme qui mappent une clé de recherche donnée en chaîne de mise en forme. L'horloge murale Gnome utilise un fichier portant le nom spécifique de gnome-desktop-3.0.mo pour la localisation/l'internationalisation. C'était not présent sur mon système sous l'emplacement spécifié pour any locale:
/usr/share/locale/XX/LC_MESSAGES
Donc, je n'avais pas besoin de m'inquiéter de le remplacer mais de le créer à nouveau. Quoi qu’il en soit, vous devez d’abord obtenir le fichier .po correspondant à votre région:
https://github.com/GNOME/gnome-desktop/tree/gnome-3-28/po
Ensuite, recherchez la clé spécifique mentionnée ci-dessus (ou la clé pour laquelle vous voulez modifier la chaîne de formatage en fonction du réglage de votre horloge dans Ubuntu) dans le fichier .po. "Keygid" est la clé de chaîne et la chaîne de formatage à renvoyer est "msgstr". Par exemple, l'extrait de mon fichier .po est (ignorez leur commentaire car les lignes de code ne correspondent pas réellement):
#: ../libgnome-desktop/gnome-wall-clock.c:316
msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p"
Après la modification:
#: ../libgnome-desktop/gnome-wall-clock.c:316
msgid "%a %b %e, %l:%M %p"
msgstr "%A %b %-d, %l:%M %p"
Avant le changement reflété dans le 'msgstr' ci-dessus, il aurait affiché:
Mon Feb 4, 12:22 PM
Mais après la modification ci-dessus, le jour n'est plus abrégé et l'espace en-tête devant la date a été supprimé (voir la fin de cette réponse pour les spécificateurs de formatage):
Monday Feb 4, 12:22 PM
Ensuite, prenez ce fichier .po et exécutez-le comme suit sur la ligne de commande pour obtenir le fichier messages.mo où XX correspond aux paramètres régionaux. Le msgfmt binaire est déjà installé sur Ubuntu 18.04:
msgfmt -cv XX.po
Ensuite, renommez le fichier messages.mo résultant en gnome-desktop-3.0.mo et copiez-le dans le répertoire LC_MESSAGE = de votre pays:
/usr/share/locale/XX/LC_MESSAGES/gnome-desktop-3.0.mo
Puis, pour effectuer le changement, déconnectez-vous et reconnectez-vous. Si vous constatez que le formatage a été modifié not puis vérifiez à nouveau que les paramètres d’horloge actuels correspondent bien à la clé pour laquelle vous avez modifié la chaîne de formatage. .
Enfin, voici quelques spécificateurs de chaîne de formatage pour vous aider. Je les ai empruntés à un autre site, donc rien ne garantit que ces tous fonctionnent dans 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 (%).