Successivo: , Precedente: , Su: Internazionalizzazione   [Contenuti][Indice]


13.3 Internazionalizzare programmi awk

gawk prevede le seguenti variabili per l’internazionalizzazione:

TEXTDOMAIN

Questa variabile indica il dominio di testo dell’applicazione. Per compatibilità con il comando GNU gettext, il valore di default è "messages".

_"questo è un messaggio da tradurre"

Costanti di tipo stringa marcate con un trattino basso iniziale sono candidate per essere tradotte al momento dell’esecuzione del programma gawk. Costanti di tipo stringa non precedute da un trattino basso non verranno tradotte.

gawk fornisce le seguenti funzioni al servizio dell’internazionalizzazione:

dcgettext(string [, dominio [, categoria]])

Restituisce la traduzione di stringa nel dominio di testo dominio per la categoria di localizzazione categoria. Il valore di default per dominio è il valore corrente di TEXTDOMAIN. Il valore di default per categoria è "LC_MESSAGES".

Se si assegna un valore a categoria, dev’essere una stringa uguale a una delle categorie di localizzazione note, descritte nella precedente sezione. Si deve anche specificare un dominio di testo. Si usi TEXTDOMAIN se si desidera usare il dominio corrente.

ATTENZIONE: L’ordine degli argomenti per la versione awk della funzione dcgettext() è differente, per una scelta di progetto, dall’ordine degli argomenti passati alla funzione C che ha lo stesso nome. L’ordine della versione awk è stato scelto per amore di semplicità e per consentire di avere dei valori di default per gli argomenti che fossero il più possibile simili, come stile, a quello di awk.

dcngettext(stringa1, stringa2, numero [, dominio [, categoria]])

Restituisce la forma, singolare o plurale, da usare a seconda del valore di numero per la traduzione di stringa1 e stringa2 nel dominio di testo dominio per la categoria di localizzazione categoria. stringa1 è la variante al singolare in inglese di un messaggio, e stringa2 è la variante al plurale in inglese dello stesso messaggio. Il valore di default per dominio è il valore corrente di TEXTDOMAIN. Il valore di default per categoria è "LC_MESSAGES".

Valgono le stesse osservazioni riguardo all’ordine degli argomenti fatte a proposito della funzione dcgettext().

bindtextdomain(directory [, dominio ])

Cambia la directory nella quale gettext va a cercare i file .gmo, per il caso in cui questi non possano risiedere nelle posizioni standard (p.es., in fase di test). Restituisce la directory alla quale dominio è “collegato”.

Il dominio di default è il valore di TEXTDOMAIN. Se l’argomento directory è impostato alla stringa nulla (""), bindtextdomain() restituisce il collegamento corrente applicabile al dominio specificato.

Per usare queste funzionalità in un programma awk, va seguita la procedura qui indicata:

  1. Impostare la variabile TEXTDOMAIN al dominio di testo del programma. È meglio fare ciò all’interno di una regola BEGIN (vedi la sezione I criteri di ricerca speciali BEGIN ed END), ma si può anche fare dalla riga di comando, usando l’opzione -v (vedi la sezione Opzioni sulla riga di comando):
    BEGIN {
        TEXTDOMAIN = "guide"
        …
    }
    
  2. Marcare tutte le stringhe traducibili anteponendo loro un trattino basso (‘_’). Il trattino deve essere adiacente ai doppi apici di apertura della stringa. Per esempio:
    print _"hello, world"
    x = _"you goofed"
    printf(_"Number of users is %d\n", nusers)
    
  3. Se le stringhe da visualizzare sono create dinamicamente, è ancora possibile tradurle, usando la funzione predefinita dcgettext():95
    if (assonnato)
        messaggio = dcgettext("%d clienti mi scocciano\n", "adminprog")
    else
        messaggio = dcgettext("mi diverto con %d clienti\n", "adminprog")
    printf(messaggio, numero_clienti)
    

    In questo esempio, la chiamata a dcgettext() specifica un diverso dominio di testo ("adminprog") in cui trovare il messaggio, ma usa la categoria di default "LC_MESSAGES".

    Il precedente esempio funziona solo se numero_clienti è un numero maggiore di uno. Per questo esempio sarebbe più appropriato usare la funzione dcngettext():

    if (assonnato)
        messaggio = dcngettext("%d cliente mi scoccia\n",
    			   "%d clienti mi scocciano\n",
    			   numero_clienti, "adminprog")
    else
        messaggio = dcngettext("mi diverto con %d cliente\n",
    			   "mi diverto con %d clienti\n",
    			   numero_clienti, "adminprog")
    printf(messaggio, numero_clienti)
    
  4. In fase di sviluppo, si può scegliere di tenere il file .gmo in una directory a parte, solo per provarlo. Ciò si fa con la funzione predefinita bindtextdomain():
    BEGIN {
       TEXTDOMAIN = "guide"   # dominio di testo regolare
       if (Testing) {
           # dove trovare il file in prova
           bindtextdomain("testdir")
           # joe si occupa del programma adminprog
           bindtextdomain("../joe/testdir", "adminprog")
       }
       …
    }
    

Vedi la sezione Un semplice esempio di internazionalizzazione. per un programma di esempio che illustra i passi da seguire per creare e usare traduzioni nei programmi awk.


Note a piè di pagina

(95)

I miei ringraziamenti a Bruno Haible per questo esempio.


Successivo: , Precedente: , Su: Internazionalizzazione   [Contenuti][Indice]