PDA

Visualizza la versione completa : [BASH] creare un file di lingua


GreyFox86
12-07-2006, 12:28
Sto cercando di creare un file di lingua che contenga in variabili tutte le varie frasi che rappresentano l'output di uno script bash.
Subito avevo pensato di usare il comando source, in questo modo
script_italian
#Language: italian
MSG_ONE="nome programma: $0"
MSG_TWO="seconda riga: $variabile"
script.sh
#!/bin/bash
source script_italian
echo $MSG_ONE
variabile="ciao"
echo $MSG_TWO
Il problema è che visto che $variabile viene assegnata DOPO alla chiamata source, $MSG_TWO risulta essere "seconda riga: " e non "seconda riga: ciao" come vorrei.
Non esiste un modo per far si che $variabile in $MSG_TWO non venga sostituito subito durante source ma che rimanga come testo ma che venga sostituito solo dall'echo nello script dopo la sua assegnazione?

GreyFox86
12-07-2006, 12:57
Ho pensato di fare così ma non mi sembra una gran bella soluzione...
script_italian
#Language: italian
MSG_ONE="nome programma: $0"
MSG_TWO="seconda riga: \$variabile"
In questo modo $variabile non viene sostituita con il suo valore essendo che \$ scrive "$" nella stringa... poi per ogni volta che appare $MSG_TWO oppure qualunque altra stringa costruita in modo similare farei
script.sh
#!/bin/bash
source script_italian
echo $MSG_ONE
variabile="ciao"
echo ${MSG_TWO//'$variabile'/$variabile}
in modo da sostituire ogni occorrenza di '$variabile' con il suo valore. Però risulta scomodo, anche perchè in alcune stringhe di lingua dovrei operare anche più di una sola sostituzione...

U-bahn
12-07-2006, 14:04
scusa, ma non fai prima con:

-script_italian:


#Language: italian
MSG_ONE="nome programma: "
MSG_TWO="seconda riga: "

-script.sh:


#!/bin/bash
source script_italian
echo $MSG_ONE $0
variabile="ciao"
echo $MSG_TWO $variabile

etc...? Oltre ad essere più leggibile (e a facilitare il lavoro di eventuali
traduttori), risulta più semplice e veloce.
Considera che se la variabile è inserita dall'utente, il suo valore dovrà essere quello indicato (è dovrà essere dichiarata nello script), mentre se è costante, ti conviene definirla nel file di traduzione.

:ciauz:

GreyFox86
12-07-2006, 14:10
Si ci avevo pensato ma in alcune frasi fra una parola e l'altra ci sono diverse variabili.
Un esempio stupido:
MSG_EXAMPLE="non puoi $thing_one ma puoi $thing_two anche se non sei root"
Per rendere questa frase come intendi tu dovrei dividere in 3 parti il messaggio:
echo $PART1 $thing_one $PART2 $thing_two $PART3
mentre io speravo di cavarmela in una stringa sola

vortex87
12-07-2006, 14:58
Usa printf:


[fredp@kurtz ~] $ printf "Non sei %s ma sei %s\n" Gianni Pino
Non sei Gianni ma sei Pino

GreyFox86
12-07-2006, 15:48
Giusto! Grande, non ci avevo pensato... metto dei %s nelle stringhe al posto di inserire direttametne le variabili e poi uso delle printf al posto degli echo.
Grazie mille vortex :yuppi:

vortex87
12-07-2006, 15:52
Prego :fighet:

GreyFox86
12-07-2006, 22:42
Domandina sulla printf...
nel mio programma tutte queste stringhe di lingua verranno precedute da un breve messaggio del tipo "$0 error: " o simili.
Per questo, in modo da evitare di inserire questa ulteriore stampa ogni volta che devo stampare una stringa, pensavo di adattare una funzione che già avevo print_err().
Il problema è che, una delle stringhe da inserire al posto di una %s potrebbe contenere degli spazi.
A questo punto pensavo di inserire questo codice per far si che i parametri siano caricati correttamente racchiusi da "", ma purtroppo non funziona.


function print_msg() {
printf "%s: " "$MSG_MESSAGE" #MSG_MESSAGE sarebbe "error" o "errore" a differenza della lingua
local pattern=$1
shift
printf "$pattern\n" `for arg in "$@"; do echo \"$arg\"; done`
}

GreyFox86
14-07-2006, 00:33
up

U-bahn
14-07-2006, 03:04
così dovrebbe andare:


function print_err() {
printf "%s: %s\n" "${MESG}" "${*}";
}

:ciauz:

invisibile : )

Loading