Successivo: , Precedente: , Su: I18N per traduttore   [Contenuti][Indice]


13.4.2 Riordinare argomenti di 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 se gawk 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.


Note a piè di pagina

(97)

Questo esempio è preso in prestito dal manuale del comando GNU gettext.


Successivo: , Precedente: , Su: I18N per traduttore   [Contenuti][Indice]