Successivo: Portabilità nell'I18N, Precedente: Estrazione di stringhe, Su: I18N per traduttore [Contenuti][Indice]
printf
Le stringhe di formattazione per printf
e sprintf()
(vedi la sezione Usare l’istruzione printf
per stampe sofisticate)
hanno un problema speciale con le traduzioni.
Si consideri il seguente esempio:97
printf(_"String `%s' has %d characters\n", string, length(string)))
Una possibile traduzione in italiano di questo messaggio potrebbe essere:
"%d è la lunghezza della stringa `%s'\n"
Il problema dovrebbe essere ovvio: l’ordine delle specifiche di
formattazione è differente da quello originale!
gettext()
, che pure può restituire la stringa tradotta
in fase di esecuzione, non è in grado di cambiare l’ordine degli argomenti
nella chiamata a printf
.
Per risolvere questo problema, gli specificatori di formato di printf
possono avere un elemento in più, opzionale, detto specificatore
di posizione. Per esempio:
"%2$d è la lunghezza della stringa `%1$s'\n"
Qui, lo specificatore di posizione consiste in un numero intero, che indica quale argomento utilizzare, seguito da un carattere ‘$’. I numeri partono da uno, e la stringa di formattazione vera e propria non è inclusa. Quindi, nell’esempio seguente, ‘stringa’ è il primo argomento e ‘length(stringa)’ è il secondo:
$ gawk 'BEGIN { > stringa = "Non v\47allarmate!" > printf "%2$d caratteri compongono \"%1$s\"\n", > stringa, length(stringa) > }' -| 16 caratteri compongono "Non v\47allarmate!"
Se presenti, gli specificatori di posizione precedono, nella specifica di formato, i flag, la larghezza del campo e/o la precisione.
Gli specificatori di posizione possono essere usati anche se si specifica una larghezza dinamica dei campi, e della capacità di precisione:
$ gawk 'BEGIN { > printf("%*.*s\n", 10, 20, "hello") > printf("%3$*2$.*1$s\n", 20, 10, "hello") > }' -| hello -| hello
NOTA: Se si usa ‘*’ con uno specificatore di posizione, il carattere ‘*’ viene per primo, seguito dal numero che indica la posizione, a sua volta seguito dal ‘$’. Ciò può parere poco intuitivo.
gawk
non consente di mischiare specificatori di formato standard
con altri contenenti degli specificatori di posizione in una stessa stringa di
formato:
$ gawk 'BEGIN { printf "%d %3$s\n", 1, 2, "ciao" }' error→ gawk: riga com.:1: fatale: `count$' va usato per tutti error→ i formati o per nessuno
NOTA: Ci sono alcuni casi patologici in cui
gawk
potrebbe non inviare alcun messaggio diagnostico, anche quando sarebbe necessario. In tali casi, l’output può non essere quello atteso. Rimane sempre una pessima idea quella di tentare di mischiare i formati, anche segawk
non riesce ad accorgersene.
Sebbene gli specificatori di posizione possano essere usati direttamente nei
programmi awk
, il motivo per cui sono stati introdotti è perché
siano d’aiuto nel produrre traduzioni corrette della stringa di
formattazione in lingue differenti da quella nella quale il programma è stato
originariamente scritto.
Successivo: Portabilità nell'I18N, Precedente: Estrazione di stringhe, Su: I18N per traduttore [Contenuti][Indice]