From cf0813ac7828ba9f3082b0b52c2359ff1a700efb Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 13 Jun 2025 23:38:07 +0200 Subject: [PATCH] l10n: port cut for translation + add french --- src/uu/cut/locales/en-US.ftl | 22 +++++++ src/uu/cut/locales/fr-FR.ftl | 114 ++++++++++++++++++++++++++++++++ src/uu/cut/src/cut.rs | 122 ++++++++++++++++++++--------------- 3 files changed, 206 insertions(+), 52 deletions(-) create mode 100644 src/uu/cut/locales/fr-FR.ftl diff --git a/src/uu/cut/locales/en-US.ftl b/src/uu/cut/locales/en-US.ftl index b7feb048c..3c412ced8 100644 --- a/src/uu/cut/locales/en-US.ftl +++ b/src/uu/cut/locales/en-US.ftl @@ -90,3 +90,25 @@ cut-after-help = Each call must specify a mode (what to use for columns), echo 'ab\\0cd' | cut -z -c 1 will result in 'a\\0c\\0' + +# Help messages +cut-help-bytes = filter byte columns from the input source +cut-help-characters = alias for character mode +cut-help-delimiter = specify the delimiter character that separates fields in the input source. Defaults to Tab. +cut-help-whitespace-delimited = Use any number of whitespace (Space, Tab) to separate fields in the input source (FreeBSD extension). +cut-help-fields = filter field columns from the input source +cut-help-complement = invert the filter - instead of displaying only the filtered columns, display all but those columns +cut-help-only-delimited = in field mode, only print lines which contain the delimiter +cut-help-zero-terminated = instead of filtering columns based on line, filter columns based on \\0 (NULL character) +cut-help-output-delimiter = in field mode, replace the delimiter in output lines with this option's argument + +# Error messages +cut-error-is-directory = Is a directory +cut-error-write-error = write error +cut-error-delimiter-and-whitespace-conflict = invalid input: Only one of --delimiter (-d) or -w option can be specified +cut-error-delimiter-must-be-single-character = the delimiter must be a single character +cut-error-multiple-mode-args = invalid usage: expects no more than one of --fields (-f), --chars (-c) or --bytes (-b) +cut-error-missing-mode-arg = invalid usage: expects one of --fields (-f), --chars (-c) or --bytes (-b) +cut-error-delimiter-only-with-fields = invalid input: The '--delimiter' ('-d') option only usable if printing a sequence of fields +cut-error-whitespace-only-with-fields = invalid input: The '-w' option only usable if printing a sequence of fields +cut-error-only-delimited-only-with-fields = invalid input: The '--only-delimited' ('-s') option only usable if printing a sequence of fields diff --git a/src/uu/cut/locales/fr-FR.ftl b/src/uu/cut/locales/fr-FR.ftl new file mode 100644 index 000000000..cab0d8ccd --- /dev/null +++ b/src/uu/cut/locales/fr-FR.ftl @@ -0,0 +1,114 @@ +cut-about = Affiche les colonnes d'octets ou de champs spécifiées de chaque ligne de stdin ou des fichiers d'entrée +cut-usage = cut OPTION... [FICHIER]... +cut-after-help = Chaque appel doit spécifier un mode (quoi utiliser pour les colonnes), + une séquence (quelles colonnes afficher), et fournir une source de données + + ### Spécifier un mode + + Utilisez --bytes (-b) ou --characters (-c) pour spécifier le mode octet + + Utilisez --fields (-f) pour spécifier le mode champ, où chaque ligne est divisée en + champs identifiés par un caractère délimiteur. Par exemple pour un CSV typique + vous pourriez utiliser ceci en combinaison avec la définition de la virgule comme délimiteur + + ### Spécifier une séquence + + Une séquence est un groupe de 1 ou plusieurs nombres ou plages inclusives séparés + par des virgules. + + cut -f 2,5-7 quelque_fichier.txt + + affichera les 2ème, 5ème, 6ème, et 7ème champs pour chaque ligne source + + Les plages peuvent s'étendre jusqu'à la fin de la ligne en excluant le second nombre + + cut -f 3- quelque_fichier.txt + + affichera le 3ème champ et tous les champs suivants pour chaque ligne source + + Le premier nombre d'une plage peut être exclu, et ceci est effectivement + identique à utiliser 1 comme premier nombre : cela fait commencer la plage à la + première colonne. Les plages peuvent aussi afficher une seule colonne + + cut -f 1,3-5 quelque_fichier.txt + + affichera les 1er, 3ème, 4ème, et 5ème champs pour chaque ligne source + + L'option --complement, quand utilisée, inverse l'effet de la séquence + + cut --complement -f 4-6 quelque_fichier.txt + + affichera tous les champs sauf les 4ème, 5ème, et 6ème + + ### Spécifier une source de données + + Si aucun argument de fichier source n'est spécifié, stdin est utilisé comme source + de lignes à afficher + + Si des arguments de fichier source sont spécifiés, stdin est ignoré et tous les fichiers sont + lus consécutivement si un fichier source n'est pas lu avec succès, un avertissement + sera affiché sur stderr, et le code de statut final sera 1, mais cut + continuera à lire les fichiers sources suivants + + Pour afficher les colonnes depuis STDIN et un argument de fichier, utilisez - (tiret) comme + argument de fichier source pour représenter stdin. + + ### Options du Mode Champ + + Les champs dans chaque ligne sont identifiés par un délimiteur (séparateur) + + #### Définir le délimiteur + + Définissez le délimiteur qui sépare les champs dans le fichier en utilisant l'option + --delimiter (-d). Définir le délimiteur est optionnel. + Si non défini, un délimiteur par défaut de Tab sera utilisé. + + Si l'option -w est fournie, les champs seront séparés par tout nombre + de caractères d'espacement (Espace et Tab). Le délimiteur de sortie sera + un Tab sauf si explicitement spécifié. Seulement une des options -d ou -w peut être spécifiée. + Ceci est une extension adoptée de FreeBSD. + + #### Filtrage optionnel basé sur le délimiteur + + Si le drapeau --only-delimited (-s) est fourni, seules les lignes qui + contiennent le délimiteur seront affichées + + #### Remplacer le délimiteur + + Si l'option --output-delimiter est fournie, l'argument utilisé pour + elle remplacera le caractère délimiteur dans chaque ligne affichée. Ceci est + utile pour transformer les données tabulaires - par ex. pour convertir un CSV en + TSV (fichier séparé par tabulations) + + ### Fins de ligne + + Quand l'option --zero-terminated (-z) est utilisée, cut voit \\0 (null) comme le + caractère de 'fin de ligne' (à la fois pour lire les lignes et + séparer les lignes affichées) au lieu de \\n (nouvelle ligne). Ceci est utile pour + les données tabulaires où certaines cellules peuvent contenir des nouvelles lignes + + echo 'ab\\0cd' | cut -z -c 1 + + donnera comme résultat 'a\\0c\\0' + +# Messages d'aide +cut-help-bytes = filtrer les colonnes d'octets depuis la source d'entrée +cut-help-characters = alias pour le mode caractère +cut-help-delimiter = spécifier le caractère délimiteur qui sépare les champs dans la source d'entrée. Par défaut Tab. +cut-help-whitespace-delimited = Utiliser tout nombre d'espaces (Espace, Tab) pour séparer les champs dans la source d'entrée (extension FreeBSD). +cut-help-fields = filtrer les colonnes de champs depuis la source d'entrée +cut-help-complement = inverser le filtre - au lieu d'afficher seulement les colonnes filtrées, afficher toutes sauf ces colonnes +cut-help-only-delimited = en mode champ, afficher seulement les lignes qui contiennent le délimiteur +cut-help-zero-terminated = au lieu de filtrer les colonnes basées sur la ligne, filtrer les colonnes basées sur \\0 (caractère NULL) +cut-help-output-delimiter = en mode champ, remplacer le délimiteur dans les lignes de sortie avec l'argument de cette option + +# Messages d'erreur +cut-error-is-directory = Est un répertoire +cut-error-write-error = erreur d'écriture +cut-error-delimiter-and-whitespace-conflict = entrée invalide : Seulement une des options --delimiter (-d) ou -w peut être spécifiée +cut-error-delimiter-must-be-single-character = le délimiteur doit être un caractère unique +cut-error-multiple-mode-args = usage invalide : attend au plus une des options --fields (-f), --chars (-c) ou --bytes (-b) +cut-error-missing-mode-arg = usage invalide : attend une des options --fields (-f), --chars (-c) ou --bytes (-b) +cut-error-delimiter-only-with-fields = entrée invalide : L'option '--delimiter' ('-d') n'est utilisable que si on affiche une séquence de champs +cut-error-whitespace-only-with-fields = entrée invalide : L'option '-w' n'est utilisable que si on affiche une séquence de champs +cut-error-only-delimited-only-with-fields = entrée invalide : L'option '--only-delimited' ('-s') n'est utilisable que si on affiche une séquence de champs diff --git a/src/uu/cut/src/cut.rs b/src/uu/cut/src/cut.rs index 19d5d7c0a..0c47cfada 100644 --- a/src/uu/cut/src/cut.rs +++ b/src/uu/cut/src/cut.rs @@ -372,7 +372,11 @@ fn cut_files(mut filenames: Vec, mode: &Mode) { let path = Path::new(&filename[..]); if path.is_dir() { - show_error!("{}: Is a directory", filename.maybe_quote()); + show_error!( + "{}: {}", + filename.maybe_quote(), + get_message("cut-error-is-directory") + ); set_exit_code(1); continue; } @@ -392,7 +396,10 @@ fn cut_files(mut filenames: Vec, mode: &Mode) { } } - show_if_err!(out.flush().map_err_context(|| "write error".into())); + show_if_err!( + out.flush() + .map_err_context(|| get_message("cut-error-write-error")) + ); } // Get delimiter and output delimiter from `-d`/`--delimiter` and `--output-delimiter` options respectively @@ -404,7 +411,7 @@ fn get_delimiters(matches: &ArgMatches) -> UResult<(Delimiter, Option<&[u8]>)> { Some(_) if whitespace_delimited => { return Err(USimpleError::new( 1, - "invalid input: Only one of --delimiter (-d) or -w option can be specified", + get_message("cut-error-delimiter-and-whitespace-conflict"), )); } Some(os_string) => { @@ -420,7 +427,7 @@ fn get_delimiters(matches: &ArgMatches) -> UResult<(Delimiter, Option<&[u8]>)> { { return Err(USimpleError::new( 1, - "the delimiter must be a single character", + get_message("cut-error-delimiter-must-be-single-character"), )); } else { Delimiter::from(os_string) @@ -502,39 +509,50 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { matches.get_one::(options::CHARACTERS), matches.get_one::(options::FIELDS), ) { - (1, Some(byte_ranges), None, None) => list_to_ranges(byte_ranges, complement).map(|ranges| { - Mode::Bytes( - ranges, - Options { - out_delimiter, - line_ending, - field_opts: None, - }, - ) - }), - (1, None, Some(char_ranges), None) => list_to_ranges(char_ranges, complement).map(|ranges| { - Mode::Characters( - ranges, - Options { - out_delimiter, - line_ending, - field_opts: None, - }, - ) - }), - (1, None, None, Some(field_ranges)) => list_to_ranges(field_ranges, complement).map(|ranges| { - Mode::Fields( - ranges, - Options { - out_delimiter, - line_ending, - field_opts: Some(FieldOptions { delimiter, only_delimited })}, - ) - }), - (2.., _, _, _) => Err( - "invalid usage: expects no more than one of --fields (-f), --chars (-c) or --bytes (-b)".into() - ), - _ => Err("invalid usage: expects one of --fields (-f), --chars (-c) or --bytes (-b)".into()), + (1, Some(byte_ranges), None, None) => { + list_to_ranges(byte_ranges, complement).map(|ranges| { + Mode::Bytes( + ranges, + Options { + out_delimiter, + line_ending, + field_opts: None, + }, + ) + }) + } + + (1, None, Some(char_ranges), None) => { + list_to_ranges(char_ranges, complement).map(|ranges| { + Mode::Characters( + ranges, + Options { + out_delimiter, + line_ending, + field_opts: None, + }, + ) + }) + } + + (1, None, None, Some(field_ranges)) => { + list_to_ranges(field_ranges, complement).map(|ranges| { + Mode::Fields( + ranges, + Options { + out_delimiter, + line_ending, + field_opts: Some(FieldOptions { + delimiter, + only_delimited, + }), + }, + ) + }) + } + + (2.., _, _, _) => Err(get_message("cut-error-multiple-mode-args")), + _ => Err(get_message("cut-error-missing-mode-arg")), }; let mode_parse = match mode_parse { @@ -543,17 +561,17 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { Mode::Bytes(_, _) | Mode::Characters(_, _) if matches.contains_id(options::DELIMITER) => { - Err("invalid input: The '--delimiter' ('-d') option only usable if printing a sequence of fields".into()) + Err(get_message("cut-error-delimiter-only-with-fields")) } Mode::Bytes(_, _) | Mode::Characters(_, _) if matches.get_flag(options::WHITESPACE_DELIMITED) => { - Err("invalid input: The '-w' option only usable if printing a sequence of fields".into()) + Err(get_message("cut-error-whitespace-only-with-fields")) } Mode::Bytes(_, _) | Mode::Characters(_, _) if matches.get_flag(options::ONLY_DELIMITED) => { - Err("invalid input: The '--only-delimited' ('-s') option only usable if printing a sequence of fields".into()) + Err(get_message("cut-error-only-delimited-only-with-fields")) } _ => Ok(mode), }, @@ -593,7 +611,7 @@ pub fn uu_app() -> Command { Arg::new(options::BYTES) .short('b') .long(options::BYTES) - .help("filter byte columns from the input source") + .help(get_message("cut-help-bytes")) .allow_hyphen_values(true) .value_name("LIST") .action(ArgAction::Append), @@ -602,7 +620,7 @@ pub fn uu_app() -> Command { Arg::new(options::CHARACTERS) .short('c') .long(options::CHARACTERS) - .help("alias for character mode") + .help(get_message("cut-help-characters")) .allow_hyphen_values(true) .value_name("LIST") .action(ArgAction::Append), @@ -612,13 +630,13 @@ pub fn uu_app() -> Command { .short('d') .long(options::DELIMITER) .value_parser(ValueParser::os_string()) - .help("specify the delimiter character that separates fields in the input source. Defaults to Tab.") + .help(get_message("cut-help-delimiter")) .value_name("DELIM"), ) .arg( Arg::new(options::WHITESPACE_DELIMITED) .short('w') - .help("Use any number of whitespace (Space, Tab) to separate fields in the input source (FreeBSD extension).") + .help(get_message("cut-help-whitespace-delimited")) .value_name("WHITESPACE") .action(ArgAction::SetTrue), ) @@ -626,7 +644,7 @@ pub fn uu_app() -> Command { Arg::new(options::FIELDS) .short('f') .long(options::FIELDS) - .help("filter field columns from the input source") + .help(get_message("cut-help-fields")) .allow_hyphen_values(true) .value_name("LIST") .action(ArgAction::Append), @@ -634,34 +652,34 @@ pub fn uu_app() -> Command { .arg( Arg::new(options::COMPLEMENT) .long(options::COMPLEMENT) - .help("invert the filter - instead of displaying only the filtered columns, display all but those columns") + .help(get_message("cut-help-complement")) .action(ArgAction::SetTrue), ) .arg( Arg::new(options::ONLY_DELIMITED) .short('s') .long(options::ONLY_DELIMITED) - .help("in field mode, only print lines which contain the delimiter") + .help(get_message("cut-help-only-delimited")) .action(ArgAction::SetTrue), ) .arg( Arg::new(options::ZERO_TERMINATED) .short('z') .long(options::ZERO_TERMINATED) - .help("instead of filtering columns based on line, filter columns based on \\0 (NULL character)") + .help(get_message("cut-help-zero-terminated")) .action(ArgAction::SetTrue), ) .arg( Arg::new(options::OUTPUT_DELIMITER) .long(options::OUTPUT_DELIMITER) .value_parser(ValueParser::os_string()) - .help("in field mode, replace the delimiter in output lines with this option's argument") + .help(get_message("cut-help-output-delimiter")) .value_name("NEW_DELIM"), ) .arg( Arg::new(options::FILE) - .hide(true) - .action(ArgAction::Append) - .value_hint(clap::ValueHint::FilePath) + .hide(true) + .action(ArgAction::Append) + .value_hint(clap::ValueHint::FilePath), ) }