1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-27 11:07:44 +00:00

Merge pull request #8092 from sylvestre/l10n-uptime

l10n: port uptime to translation + add french
This commit is contained in:
Daniel Hofstetter 2025-06-30 13:42:02 +02:00 committed by GitHub
commit 069a43a65d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 120 additions and 31 deletions

View file

@ -5,3 +5,37 @@ uptime-usage = uptime [OPTION]...
uptime-about-musl-warning = Warning: When built with musl libc, the `uptime` utility may show '0 users' uptime-about-musl-warning = Warning: When built with musl libc, the `uptime` utility may show '0 users'
due to musl's stub implementation of utmpx functions. Boot time and load averages due to musl's stub implementation of utmpx functions. Boot time and load averages
are still calculated using alternative mechanisms. are still calculated using alternative mechanisms.
# Help messages
uptime-help-since = system up since
uptime-help-path = file to search boot time from
# Error messages
uptime-error-io = couldn't get boot time: { $error }
uptime-error-target-is-dir = couldn't get boot time: Is a directory
uptime-error-target-is-fifo = couldn't get boot time: Illegal seek
uptime-error-couldnt-get-boot-time = couldn't get boot time
# Output messages
uptime-output-unknown-uptime = up ???? days ??:??,
uptime-user-count = { $count ->
[one] 1 user
*[other] { $count } users
}
# Error messages
uptime-lib-error-system-uptime = could not retrieve system uptime
uptime-lib-error-system-loadavg = could not retrieve system load average
uptime-lib-error-windows-loadavg = Windows does not have an equivalent to the load average on Unix-like systems
uptime-lib-error-boot-time = boot time larger than current time
# Uptime formatting
uptime-format = { $days ->
[0] { $time }
[one] { $days } day, { $time }
*[other] { $days } days { $time }
}
# Load average formatting
uptime-lib-format-loadavg = load average: { $avg1 }, { $avg5 }, { $avg15 }

View file

@ -0,0 +1,41 @@
uptime-about = Afficher l'heure actuelle, la durée pendant laquelle le système a été actif,
le nombre d'utilisateurs sur le système, et le nombre moyen de tâches
dans la file d'attente d'exécution au cours des 1, 5 et 15 dernières minutes.
uptime-usage = uptime [OPTION]...
uptime-about-musl-warning = Avertissement : Lorsque compilé avec musl libc, l'utilitaire `uptime` peut afficher '0 utilisateur'
en raison de l'implémentation stub des fonctions utmpx de musl. L'heure de démarrage et les moyennes de charge
sont toujours calculées en utilisant des mécanismes alternatifs.
# Messages d'aide
uptime-help-since = système actif depuis
uptime-help-path = fichier pour rechercher l'heure de démarrage
# Messages d'erreur
uptime-error-io = impossible d'obtenir l'heure de démarrage : { $error }
uptime-error-target-is-dir = impossible d'obtenir l'heure de démarrage : Est un répertoire
uptime-error-target-is-fifo = impossible d'obtenir l'heure de démarrage : Recherche illégale
uptime-error-couldnt-get-boot-time = impossible d'obtenir l'heure de démarrage
# Messages de sortie
uptime-output-unknown-uptime = actif ???? jours ??:??,
uptime-user-count = { $count ->
[one] 1 utilisateur
*[other] { $count } utilisateurs
}
# Messages d'erreur
uptime-lib-error-system-uptime = impossible de récupérer la durée de fonctionnement du système
uptime-lib-error-system-loadavg = impossible de récupérer la charge moyenne du système
uptime-lib-error-windows-loadavg = Windows n'a pas d'équivalent à la charge moyenne des systèmes de type Unix
uptime-lib-error-boot-time = heure de démarrage supérieure à l'heure actuelle
# Formatage de la durée de fonctionnement
uptime-format = { $days ->
[0] { $time }
[one] { $days } jour, { $time }
*[other] { $days } jours { $time }
}
# Formatage de la charge moyenne
uptime-lib-format-loadavg = charge moyenne : { $avg1 }, { $avg5 }, { $avg15 }

View file

@ -3,9 +3,10 @@
// For the full copyright and license information, please view the LICENSE // For the full copyright and license information, please view the LICENSE
// file that was distributed with this source code. // file that was distributed with this source code.
// spell-checker:ignore getloadavg behaviour loadavg uptime upsecs updays upmins uphours boottime nusers utmpxname gettime clockid // spell-checker:ignore getloadavg behaviour loadavg uptime upsecs updays upmins uphours boottime nusers utmpxname gettime clockid couldnt
use chrono::{Local, TimeZone, Utc}; use chrono::{Local, TimeZone, Utc};
use std::collections::HashMap;
#[cfg(unix)] #[cfg(unix)]
use std::ffi::OsString; use std::ffi::OsString;
use std::io; use std::io;
@ -17,8 +18,8 @@ use uucore::uptime::*;
use clap::{Arg, ArgAction, Command, ValueHint, builder::ValueParser}; use clap::{Arg, ArgAction, Command, ValueHint, builder::ValueParser};
use uucore::format_usage; use uucore::format_usage;
use uucore::locale::get_message;
use uucore::locale::{get_message, get_message_with_args};
#[cfg(unix)] #[cfg(unix)]
#[cfg(not(target_os = "openbsd"))] #[cfg(not(target_os = "openbsd"))]
use uucore::utmpx::*; use uucore::utmpx::*;
@ -31,11 +32,11 @@ pub mod options {
#[derive(Debug, Error)] #[derive(Debug, Error)]
pub enum UptimeError { pub enum UptimeError {
// io::Error wrapper // io::Error wrapper
#[error("couldn't get boot time: {0}")] #[error("{}", get_message_with_args("uptime-error-io", HashMap::from([("error".to_string(), format!("{}", .0))])))]
IoErr(#[from] io::Error), IoErr(#[from] io::Error),
#[error("couldn't get boot time: Is a directory")] #[error("{}", get_message("uptime-error-target-is-dir"))]
TargetIsDir, TargetIsDir,
#[error("couldn't get boot time: Illegal seek")] #[error("{}", get_message("uptime-error-target-is-fifo"))]
TargetIsFifo, TargetIsFifo,
} }
@ -78,13 +79,13 @@ pub fn uu_app() -> Command {
Arg::new(options::SINCE) Arg::new(options::SINCE)
.short('s') .short('s')
.long(options::SINCE) .long(options::SINCE)
.help("system up since") .help(get_message("uptime-help-since"))
.action(ArgAction::SetTrue), .action(ArgAction::SetTrue),
); );
#[cfg(unix)] #[cfg(unix)]
cmd.arg( cmd.arg(
Arg::new(options::PATH) Arg::new(options::PATH)
.help("file to search boot time from") .help(get_message("uptime-help-path"))
.action(ArgAction::Set) .action(ArgAction::Set)
.num_args(0..=1) .num_args(0..=1)
.value_parser(ValueParser::os_string()) .value_parser(ValueParser::os_string())
@ -130,9 +131,9 @@ fn uptime_with_file(file_path: &OsString) -> UResult<()> {
let bytes = file_path.as_os_str().as_bytes(); let bytes = file_path.as_os_str().as_bytes();
if bytes[bytes.len() - 1] != b'x' { if bytes[bytes.len() - 1] != b'x' {
show_error!("couldn't get boot time"); show_error!("{}", get_message("uptime-error-couldnt-get-boot-time"));
print_time(); print_time();
print!("up ???? days ??:??,"); print!("{}", get_message("uptime-output-unknown-uptime"));
print_nusers(Some(0)); print_nusers(Some(0));
print_loadavg(); print_loadavg();
set_exit_code(1); set_exit_code(1);
@ -142,7 +143,7 @@ fn uptime_with_file(file_path: &OsString) -> UResult<()> {
if non_fatal_error { if non_fatal_error {
print_time(); print_time();
print!("up ???? days ??:??,"); print!("{}", get_message("uptime-output-unknown-uptime"));
print_nusers(Some(0)); print_nusers(Some(0));
print_loadavg(); print_loadavg();
return Ok(()); return Ok(());
@ -157,10 +158,10 @@ fn uptime_with_file(file_path: &OsString) -> UResult<()> {
if let Some(time) = boot_time { if let Some(time) = boot_time {
print_uptime(Some(time))?; print_uptime(Some(time))?;
} else { } else {
show_error!("couldn't get boot time"); show_error!("{}", get_message("uptime-error-couldnt-get-boot-time"));
set_exit_code(1); set_exit_code(1);
print!("up ???? days ??:??,"); print!("{}", get_message("uptime-output-unknown-uptime"));
} }
user_count = count; user_count = count;
} }
@ -171,10 +172,10 @@ fn uptime_with_file(file_path: &OsString) -> UResult<()> {
if upsecs >= 0 { if upsecs >= 0 {
print_uptime(Some(upsecs))?; print_uptime(Some(upsecs))?;
} else { } else {
show_error!("couldn't get boot time"); show_error!("{}", get_message("uptime-error-couldnt-get-boot-time"));
set_exit_code(1); set_exit_code(1);
print!("up ???? days ??:??,"); print!("{}", get_message("uptime-output-unknown-uptime"));
} }
user_count = get_nusers(file_path.to_str().expect("invalid utmp path file")); user_count = get_nusers(file_path.to_str().expect("invalid utmp path file"));
} }

View file

@ -13,19 +13,21 @@
// See https://github.com/uutils/coreutils/pull/7289 for discussion. // See https://github.com/uutils/coreutils/pull/7289 for discussion.
use crate::error::{UError, UResult}; use crate::error::{UError, UResult};
use crate::locale::{get_message, get_message_with_args};
use chrono::Local; use chrono::Local;
use libc::time_t; use libc::time_t;
use std::collections::HashMap;
use thiserror::Error; use thiserror::Error;
#[derive(Debug, Error)] #[derive(Debug, Error)]
pub enum UptimeError { pub enum UptimeError {
#[error("could not retrieve system uptime")] #[error("{}", get_message("uptime-lib-error-system-uptime"))]
SystemUptime, SystemUptime,
#[error("could not retrieve system load average")] #[error("{}", get_message("uptime-lib-error-system-loadavg"))]
SystemLoadavg, SystemLoadavg,
#[error("Windows does not have an equivalent to the load average on Unix-like systems")] #[error("{}", get_message("uptime-lib-error-windows-loadavg"))]
WindowsLoadavg, WindowsLoadavg,
#[error("boot time larger than current time")] #[error("{}", get_message("uptime-lib-error-boot-time"))]
BootTime, BootTime,
} }
@ -174,11 +176,14 @@ pub fn get_formatted_uptime(boot_time: Option<time_t>) -> UResult<String> {
let up_days = up_secs / 86400; let up_days = up_secs / 86400;
let up_hours = (up_secs - (up_days * 86400)) / 3600; let up_hours = (up_secs - (up_days * 86400)) / 3600;
let up_mins = (up_secs - (up_days * 86400) - (up_hours * 3600)) / 60; let up_mins = (up_secs - (up_days * 86400) - (up_hours * 3600)) / 60;
match up_days.cmp(&1) {
std::cmp::Ordering::Equal => Ok(format!("{up_days:1} day, {up_hours:2}:{up_mins:02}")), Ok(get_message_with_args(
std::cmp::Ordering::Greater => Ok(format!("{up_days:1} days {up_hours:2}:{up_mins:02}")), "uptime-format",
_ => Ok(format!("{up_hours:2}:{up_mins:02}")), HashMap::from([
} ("days".to_string(), up_days.to_string()),
("time".to_string(), format!("{up_hours:02}:{up_mins:02}")),
]),
))
} }
/// Get the number of users currently logged in /// Get the number of users currently logged in
@ -305,11 +310,10 @@ pub fn get_nusers() -> usize {
/// e.g. "0 users", "1 user", "2 users" /// e.g. "0 users", "1 user", "2 users"
#[inline] #[inline]
pub fn format_nusers(n: usize) -> String { pub fn format_nusers(n: usize) -> String {
if n == 1 { get_message_with_args(
String::from("1 user") "uptime-user-count",
} else { HashMap::from([("count".to_string(), n.to_string())]),
format!("{n} users") )
}
} }
/// Get the number of users currently logged in in a human-readable format /// Get the number of users currently logged in in a human-readable format
@ -368,18 +372,27 @@ pub fn get_loadavg() -> UResult<(f64, f64, f64)> {
#[inline] #[inline]
pub fn get_formatted_loadavg() -> UResult<String> { pub fn get_formatted_loadavg() -> UResult<String> {
let loadavg = get_loadavg()?; let loadavg = get_loadavg()?;
Ok(format!( Ok(get_message_with_args(
"load average: {:.2}, {:.2}, {:.2}", "uptime-lib-format-loadavg",
loadavg.0, loadavg.1, loadavg.2 HashMap::from([
("avg1".to_string(), format!("{:.2}", loadavg.0)),
("avg5".to_string(), format!("{:.2}", loadavg.1)),
("avg15".to_string(), format!("{:.2}", loadavg.2)),
]),
)) ))
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::locale;
#[test] #[test]
fn test_format_nusers() { fn test_format_nusers() {
unsafe {
std::env::set_var("LANG", "en_US.UTF-8");
}
let _ = locale::setup_localization("uptime");
assert_eq!("0 users", format_nusers(0)); assert_eq!("0 users", format_nusers(0));
assert_eq!("1 user", format_nusers(1)); assert_eq!("1 user", format_nusers(1));
assert_eq!("2 users", format_nusers(2)); assert_eq!("2 users", format_nusers(2));