Skip to content

Commit 6882157

Browse files
committed
l10n: port dd for translation + add french
1 parent 411874f commit 6882157

6 files changed

Lines changed: 435 additions & 95 deletions

File tree

src/uu/dd/locales/en-US.ftl

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,48 @@ dd-after-help = ### Operands
113113
- nocache : request that OS drop cache.
114114
- noctty : do not assign a controlling tty.
115115
- nofollow : do not follow system links.
116+
117+
# Error messages
118+
dd-error-failed-to-open = failed to open { $path }
119+
dd-error-write-error = write error
120+
dd-error-failed-to-seek = failed to seek in output file
121+
dd-error-io-error = IO error
122+
dd-error-cannot-skip-offset = '{ $file }': cannot skip to specified offset
123+
dd-error-cannot-skip-invalid = '{ $file }': cannot skip: Invalid argument
124+
dd-error-cannot-seek-invalid = '{ $output }': cannot seek: Invalid argument
125+
dd-error-not-directory = setting flags for '{ $file }': Not a directory
126+
dd-error-failed-discard-cache-input = failed to discard cache for: 'standard input'
127+
dd-error-failed-discard-cache-output = failed to discard cache for: 'standard output'
128+
129+
# Parse errors
130+
dd-error-unrecognized-operand = Unrecognized operand '{ $operand }'
131+
dd-error-multiple-format-table = Only one of conv=ascii conv=ebcdic or conv=ibm may be specified
132+
dd-error-multiple-case = Only one of conv=lcase or conv=ucase may be specified
133+
dd-error-multiple-block = Only one of conv=block or conv=unblock may be specified
134+
dd-error-multiple-excl = Only one ov conv=excl or conv=nocreat may be specified
135+
dd-error-invalid-flag = invalid input flag: ‘{ $flag }
136+
Try '{ $cmd } --help' for more information.
137+
dd-error-conv-flag-no-match = Unrecognized conv=CONV -> { $flag }
138+
dd-error-multiplier-parse-failure = invalid number: '{ $input }'
139+
dd-error-multiplier-overflow = Multiplier string would overflow on current system -> { $input }
140+
dd-error-block-without-cbs = conv=block or conv=unblock specified without cbs=N
141+
dd-error-status-not-recognized = status=LEVEL not recognized -> { $level }
142+
dd-error-unimplemented = feature not implemented on this system -> { $feature }
143+
dd-error-bs-out-of-range = { $param }=N cannot fit into memory
144+
dd-error-invalid-number = invalid number: ‘{ $input }
145+
146+
# Progress messages
147+
dd-progress-records-in = { $complete }+{ $partial } records in
148+
dd-progress-records-out = { $complete }+{ $partial } records out
149+
dd-progress-truncated-record = { $count ->
150+
[one] { $count } truncated record
151+
*[other] { $count } truncated records
152+
}
153+
dd-progress-byte-copied = { $bytes } byte copied, { $duration } s, { $rate }/s
154+
dd-progress-bytes-copied = { $bytes } bytes copied, { $duration } s, { $rate }/s
155+
dd-progress-bytes-copied-si = { $bytes } bytes ({ $si }) copied, { $duration } s, { $rate }/s
156+
dd-progress-bytes-copied-si-iec = { $bytes } bytes ({ $si }, { $iec }) copied, { $duration } s, { $rate }/s
157+
158+
# Warnings
159+
dd-warning-zero-multiplier = { $zero } is a zero multiplier; use { $alternative } if that is intended
160+
dd-warning-signal-handler = Internal dd Warning: Unable to register signal handler

src/uu/dd/locales/fr-FR.ftl

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
dd-about = Copier, et optionnellement convertir, une ressource du système de fichiers
2+
dd-usage = dd [OPÉRANDE]...
3+
dd OPTION
4+
dd-after-help = ### Opérandes
5+
6+
- bs=OCTETS : lire et écrire jusqu'à OCTETS octets à la fois (par défaut : 512) ;
7+
remplace ibs et obs.
8+
- cbs=OCTETS : la 'taille de bloc de conversion' en octets. S'applique aux
9+
opérations conv=block et conv=unblock.
10+
- conv=CONVS : une liste séparée par des virgules d'options de conversion ou (pour des
11+
raisons historiques) d'indicateurs de fichier.
12+
- count=N : arrêter la lecture de l'entrée après N opérations de lecture de taille ibs
13+
plutôt que de continuer jusqu'à EOF. Voir iflag=count_bytes si l'arrêt après N octets
14+
est préféré
15+
- ibs=N : la taille du tampon utilisé pour les lectures (par défaut : 512)
16+
- if=FICHIER : le fichier utilisé pour l'entrée. Quand non spécifié, stdin est utilisé à la place
17+
- iflag=INDICATEURS : une liste séparée par des virgules d'indicateurs d'entrée qui spécifient comment
18+
la source d'entrée est traitée. INDICATEURS peut être n'importe lequel des indicateurs d'entrée ou
19+
indicateurs généraux spécifiés ci-dessous.
20+
- skip=N (ou iseek=N) : ignorer N enregistrements de taille ibs dans l'entrée avant de commencer
21+
les opérations de copie/conversion. Voir iflag=seek_bytes si la recherche de N octets est préférée.
22+
- obs=N : la taille du tampon utilisé pour les écritures (par défaut : 512)
23+
- of=FICHIER : le fichier utilisé pour la sortie. Quand non spécifié, stdout est utilisé
24+
à la place
25+
- oflag=INDICATEURS : liste séparée par des virgules d'indicateurs de sortie qui spécifient comment la
26+
source de sortie est traitée. INDICATEURS peut être n'importe lequel des indicateurs de sortie ou
27+
indicateurs généraux spécifiés ci-dessous
28+
- seek=N (ou oseek=N) : recherche N enregistrements de taille obs dans la sortie avant de
29+
commencer les opérations de copie/conversion. Voir oflag=seek_bytes si la recherche de N octets est
30+
préférée
31+
- status=NIVEAU : contrôle si les statistiques de volume et de performance sont écrites sur
32+
stderr.
33+
34+
Quand non spécifié, dd affichera les statistiques à la fin. Un exemple est ci-dessous.
35+
36+
```plain
37+
6+0 enregistrements en entrée
38+
16+0 enregistrements en sortie
39+
8192 octets (8.2 kB, 8.0 KiB) copiés, 0.00057009 s,
40+
14.4 MB/s
41+
42+
Les deux premières lignes sont les statistiques de 'volume' et la dernière ligne est les
43+
statistiques de 'performance'.
44+
Les statistiques de volume indiquent le nombre de lectures complètes et partielles de taille ibs,
45+
ou d'écritures de taille obs qui ont eu lieu pendant la copie. Le format des statistiques de
46+
volume est <complètes>+<partielles>. Si des enregistrements ont été tronqués (voir
47+
conv=block), les statistiques de volume contiendront le nombre d'enregistrements tronqués.
48+
49+
Les valeurs possibles de NIVEAU sont :
50+
- progress : Afficher les statistiques de performance périodiques pendant la copie.
51+
- noxfer : Afficher les statistiques de volume finales, mais pas les statistiques de performance.
52+
- none : N'afficher aucune statistique.
53+
54+
L'affichage des statistiques de performance est aussi déclenché par le signal INFO (quand supporté),
55+
ou le signal USR1. Définir la variable d'environnement POSIXLY_CORRECT à n'importe quelle valeur
56+
(y compris une valeur vide) fera ignorer le signal USR1.
57+
58+
### Options de conversion
59+
60+
- ascii : convertir d'EBCDIC vers ASCII. C'est l'inverse de l'option ebcdic.
61+
Implique conv=unblock.
62+
- ebcdic : convertir d'ASCII vers EBCDIC. C'est l'inverse de l'option ascii.
63+
Implique conv=block.
64+
- ibm : convertir d'ASCII vers EBCDIC, en appliquant les conventions pour [, ]
65+
et ~ spécifiées dans POSIX. Implique conv=block.
66+
67+
- ucase : convertir de minuscules vers majuscules.
68+
- lcase : convertir de majuscules vers minuscules.
69+
70+
- block : pour chaque nouvelle ligne inférieure à la taille indiquée par cbs=OCTETS, supprimer
71+
la nouvelle ligne et remplir avec des espaces jusqu'à cbs. Les lignes plus longues que cbs sont tronquées.
72+
- unblock : pour chaque bloc d'entrée de la taille indiquée par cbs=OCTETS, supprimer
73+
les espaces de fin à droite et remplacer par un caractère de nouvelle ligne.
74+
75+
- sparse : tente de rechercher la sortie quand un bloc de taille obs ne contient que
76+
des zéros.
77+
- swab : échange chaque paire d'octets adjacents. Si un nombre impair d'octets est
78+
présent, l'octet final est omis.
79+
- sync : remplit chaque bloc de taille ibs avec des zéros. Si block ou unblock est
80+
spécifié, remplit avec des espaces à la place.
81+
- excl : le fichier de sortie doit être créé. Échoue si le fichier de sortie est déjà
82+
présent.
83+
- nocreat : le fichier de sortie ne sera pas créé. Échoue si le fichier de sortie n'est
84+
pas déjà présent.
85+
- notrunc : le fichier de sortie ne sera pas tronqué. Si cette option n'est pas
86+
présente, la sortie sera tronquée à l'ouverture.
87+
- noerror : toutes les erreurs de lecture seront ignorées. Si cette option n'est pas présente,
88+
dd n'ignorera que Error::Interrupted.
89+
- fdatasync : les données seront écrites avant la fin.
90+
- fsync : les données et les métadonnées seront écrites avant la fin.
91+
92+
### Indicateurs d'entrée
93+
94+
- count_bytes : une valeur pour count=N sera interprétée comme des octets.
95+
- skip_bytes : une valeur pour skip=N sera interprétée comme des octets.
96+
- fullblock : attendre ibs octets de chaque lecture. les lectures de longueur zéro sont toujours
97+
considérées comme EOF.
98+
99+
### Indicateurs de sortie
100+
101+
- append : ouvrir le fichier en mode ajout. Considérez définir conv=notrunc aussi.
102+
- seek_bytes : une valeur pour seek=N sera interprétée comme des octets.
103+
104+
### Indicateurs généraux
105+
106+
- direct : utiliser les E/S directes pour les données.
107+
- directory : échouer sauf si l'entrée donnée (si utilisée comme iflag) ou
108+
la sortie (si utilisée comme oflag) est un répertoire.
109+
- dsync : utiliser les E/S synchronisées pour les données.
110+
- sync : utiliser les E/S synchronisées pour les données et les métadonnées.
111+
- nonblock : utiliser les E/S non-bloquantes.
112+
- noatime : ne pas mettre à jour l'heure d'accès.
113+
- nocache : demander au système d'exploitation de supprimer le cache.
114+
- noctty : ne pas assigner un tty de contrôle.
115+
- nofollow : ne pas suivre les liens système.
116+
117+
# Error messages
118+
dd-error-failed-to-open = échec de l'ouverture de { $path }
119+
dd-error-write-error = erreur d'écriture
120+
dd-error-failed-to-seek = échec de la recherche dans le fichier de sortie
121+
dd-error-io-error = erreur E/S
122+
dd-error-cannot-skip-offset = '{ $file }' : impossible d'ignorer jusqu'au décalage spécifié
123+
dd-error-cannot-skip-invalid = '{ $file }' : impossible d'ignorer : Argument invalide
124+
dd-error-cannot-seek-invalid = '{ $output }' : impossible de rechercher : Argument invalide
125+
dd-error-not-directory = définir les indicateurs pour '{ $file }' : N'est pas un répertoire
126+
dd-error-failed-discard-cache-input = échec de la suppression du cache pour : 'entrée standard'
127+
dd-error-failed-discard-cache-output = échec de la suppression du cache pour : 'sortie standard'
128+
129+
# Parse errors
130+
dd-error-unrecognized-operand = Opérande non reconnue '{ $operand }'
131+
dd-error-multiple-format-table = Seul un seul de conv=ascii conv=ebcdic ou conv=ibm peut être spécifié
132+
dd-error-multiple-case = Seul un seul de conv=lcase ou conv=ucase peut être spécifié
133+
dd-error-multiple-block = Seul un seul de conv=block ou conv=unblock peut être spécifié
134+
dd-error-multiple-excl = Seul un seul de conv=excl ou conv=nocreat peut être spécifié
135+
dd-error-invalid-flag = indicateur d'entrée invalide : '{ $flag }'
136+
Essayez '{ $cmd } --help' pour plus d'informations.
137+
dd-error-conv-flag-no-match = conv=CONV non reconnu -> { $flag }
138+
dd-error-multiplier-parse-failure = nombre invalide : ‘{ $input }
139+
dd-error-multiplier-overflow = La chaîne de multiplicateur déborderait sur le système actuel -> { $input }
140+
dd-error-block-without-cbs = conv=block ou conv=unblock spécifié sans cbs=N
141+
dd-error-status-not-recognized = status=NIVEAU non reconnu -> { $level }
142+
dd-error-unimplemented = fonctionnalité non implémentée sur ce système -> { $feature }
143+
dd-error-bs-out-of-range = { $param }=N ne peut pas tenir en mémoire
144+
dd-error-invalid-number = nombre invalide : ‘{ $input }
145+
146+
# Progress messages
147+
dd-progress-records-in = { $complete }+{ $partial } enregistrements en entrée
148+
dd-progress-records-out = { $complete }+{ $partial } enregistrements en sortie
149+
dd-progress-truncated-record = { $count ->
150+
[one] { $count } enregistrement tronqué
151+
*[other] { $count } enregistrements tronqués
152+
}
153+
dd-progress-byte-copied = { $bytes } octet copié, { $duration } s, { $rate }/s
154+
dd-progress-bytes-copied = { $bytes } octets copiés, { $duration } s, { $rate }/s
155+
dd-progress-bytes-copied-si = { $bytes } octets ({ $si }) copiés, { $duration } s, { $rate }/s
156+
dd-progress-bytes-copied-si-iec = { $bytes } octets ({ $si }, { $iec }) copiés, { $duration } s, { $rate }/s
157+
158+
# Warnings
159+
dd-warning-zero-multiplier = { $zero } est un multiplicateur zéro ; utilisez { $alternative } si c'est voulu
160+
dd-warning-signal-handler = Avertissement dd interne : Impossible d'enregistrer le gestionnaire de signal

src/uu/dd/src/dd.rs

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use progress::{ProgUpdate, ReadStat, StatusLevel, WriteStat, gen_prog_updater};
2626
use uucore::io::OwnedFileDescriptorOrHandle;
2727

2828
use std::cmp;
29+
use std::collections::HashMap;
2930
use std::env;
3031
use std::ffi::OsString;
3132
use std::fs::{File, OpenOptions};
@@ -62,7 +63,7 @@ use uucore::error::{USimpleError, set_exit_code};
6263
use uucore::show_if_err;
6364
use uucore::{format_usage, show_error};
6465

65-
use uucore::locale::get_message;
66+
use uucore::locale::{get_message, get_message_with_args};
6667
const BUF_INIT_BYTE: u8 = 0xDD;
6768

6869
/// Final settings after parsing
@@ -235,7 +236,13 @@ impl Source {
235236
#[cfg(not(unix))]
236237
Self::Stdin(stdin) => match io::copy(&mut stdin.take(n), &mut io::sink()) {
237238
Ok(m) if m < n => {
238-
show_error!("'standard input': cannot skip to specified offset");
239+
show_error!(
240+
"{}",
241+
get_message_with_args(
242+
"dd-error-cannot-skip-offset",
243+
HashMap::from([("file".to_string(), "standard input".to_string())])
244+
)
245+
);
239246
Ok(m)
240247
}
241248
Ok(m) => Ok(m),
@@ -247,14 +254,26 @@ impl Source {
247254
if len < n {
248255
// GNU compatibility:
249256
// this case prints the stats but sets the exit code to 1
250-
show_error!("'standard input': cannot skip: Invalid argument");
257+
show_error!(
258+
"{}",
259+
get_message_with_args(
260+
"dd-error-cannot-skip-invalid",
261+
HashMap::from([("file".to_string(), "standard input".to_string())])
262+
)
263+
);
251264
set_exit_code(1);
252265
return Ok(len);
253266
}
254267
}
255268
match io::copy(&mut f.take(n), &mut io::sink()) {
256269
Ok(m) if m < n => {
257-
show_error!("'standard input': cannot skip to specified offset");
270+
show_error!(
271+
"{}",
272+
get_message_with_args(
273+
"dd-error-cannot-skip-offset",
274+
HashMap::from([("file".to_string(), "standard input".to_string())])
275+
)
276+
);
258277
Ok(m)
259278
}
260279
Ok(m) => Ok(m),
@@ -343,7 +362,10 @@ impl<'a> Input<'a> {
343362
if settings.iflags.directory && !f.metadata()?.is_dir() {
344363
return Err(USimpleError::new(
345364
1,
346-
"setting flags for 'standard input': Not a directory",
365+
get_message_with_args(
366+
"dd-error-not-directory",
367+
HashMap::from([("file".to_string(), "standard input".to_string())]),
368+
),
347369
));
348370
}
349371
};
@@ -364,8 +386,12 @@ impl<'a> Input<'a> {
364386
opts.custom_flags(libc_flags);
365387
}
366388

367-
opts.open(filename)
368-
.map_err_context(|| format!("failed to open {}", filename.quote()))?
389+
opts.open(filename).map_err_context(|| {
390+
get_message_with_args(
391+
"dd-error-failed-to-open",
392+
HashMap::from([("path".to_string(), filename.quote().to_string())]),
393+
)
394+
})?
369395
};
370396

371397
let mut src = Source::File(src);
@@ -457,10 +483,11 @@ impl Input<'_> {
457483
fn discard_cache(&self, offset: libc::off_t, len: libc::off_t) {
458484
#[cfg(target_os = "linux")]
459485
{
460-
show_if_err!(self
461-
.src
462-
.discard_cache(offset, len)
463-
.map_err_context(|| "failed to discard cache for: 'standard input'".to_string()));
486+
show_if_err!(
487+
self.src
488+
.discard_cache(offset, len)
489+
.map_err_context(|| get_message("dd-error-failed-discard-cache-input"))
490+
);
464491
}
465492
#[cfg(not(target_os = "linux"))]
466493
{
@@ -609,7 +636,16 @@ impl Dest {
609636
if len < n {
610637
// GNU compatibility:
611638
// this case prints the stats but sets the exit code to 1
612-
show_error!("'standard output': cannot seek: Invalid argument");
639+
show_error!(
640+
"{}",
641+
get_message_with_args(
642+
"dd-error-cannot-seek-invalid",
643+
HashMap::from([(
644+
"output".to_string(),
645+
"standard output".to_string()
646+
)])
647+
)
648+
);
613649
set_exit_code(1);
614650
return Ok(len);
615651
}
@@ -723,7 +759,7 @@ impl<'a> Output<'a> {
723759
fn new_stdout(settings: &'a Settings) -> UResult<Self> {
724760
let mut dst = Dest::Stdout(io::stdout());
725761
dst.seek(settings.seek)
726-
.map_err_context(|| "write error".to_string())?;
762+
.map_err_context(|| get_message("dd-error-write-error"))?;
727763
Ok(Self { dst, settings })
728764
}
729765

@@ -744,8 +780,12 @@ impl<'a> Output<'a> {
744780
opts.open(path)
745781
}
746782

747-
let dst = open_dst(filename, &settings.oconv, &settings.oflags)
748-
.map_err_context(|| format!("failed to open {}", filename.quote()))?;
783+
let dst = open_dst(filename, &settings.oconv, &settings.oflags).map_err_context(|| {
784+
get_message_with_args(
785+
"dd-error-failed-to-open",
786+
HashMap::from([("path".to_string(), filename.quote().to_string())]),
787+
)
788+
})?;
749789

750790
// Seek to the index in the output file, truncating if requested.
751791
//
@@ -770,7 +810,7 @@ impl<'a> Output<'a> {
770810
};
771811
let mut dst = Dest::File(dst, density);
772812
dst.seek(settings.seek)
773-
.map_err_context(|| "failed to seek in output file".to_string())?;
813+
.map_err_context(|| get_message("dd-error-failed-to-seek"))?;
774814
Ok(Self { dst, settings })
775815
}
776816

@@ -832,9 +872,11 @@ impl<'a> Output<'a> {
832872
fn discard_cache(&self, offset: libc::off_t, len: libc::off_t) {
833873
#[cfg(target_os = "linux")]
834874
{
835-
show_if_err!(self.dst.discard_cache(offset, len).map_err_context(|| {
836-
"failed to discard cache for: 'standard output'".to_string()
837-
}));
875+
show_if_err!(
876+
self.dst
877+
.discard_cache(offset, len)
878+
.map_err_context(|| { get_message("dd-error-failed-discard-cache-output") })
879+
);
838880
}
839881
#[cfg(not(target_os = "linux"))]
840882
{
@@ -1083,7 +1125,7 @@ fn dd_copy(mut i: Input, o: Output) -> io::Result<()> {
10831125
#[cfg(target_os = "linux")]
10841126
if let Err(e) = &signal_handler {
10851127
if Some(StatusLevel::None) != i.settings.status {
1086-
eprintln!("Internal dd Warning: Unable to register signal handler \n\t{e}");
1128+
eprintln!("{}\n\t{e}", get_message("dd-warning-signal-handler"));
10871129
}
10881130
}
10891131

@@ -1419,7 +1461,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
14191461
None if is_stdout_redirected_to_seekable_file() => Output::new_file_from_stdout(&settings)?,
14201462
None => Output::new_stdout(&settings)?,
14211463
};
1422-
dd_copy(i, o).map_err_context(|| "IO error".to_string())
1464+
dd_copy(i, o).map_err_context(|| get_message("dd-error-io-error"))
14231465
}
14241466

14251467
pub fn uu_app() -> Command {

0 commit comments

Comments
 (0)