Pages : 1
#1 Le 29/11/2021, à 09:23
- Anard
Traduction de script bash
Bonjour, je voudrais utiliser sed pour faire l'équivalent d'un bbCode : remplacer un pattern par la valeur d'une variable.
Par exemple, remplacer le texte *variable* par la valeur de $variable
J'ai écrit ceci, mais ça ne fonctionne pas :
$ test="coucou"
$ var="*test* les gens"
$ echo "$var" | sed "s/\*\(.*\)\*/$\1/"
$test les gens
Comment pourrais-je m'y prendre ? Merci.
Dernière modification par Anard (Le 06/12/2021, à 10:19)
"iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3, Intel HD4600, SSD 256+120 / Bootloader Clover - macOS Mojave / Gentoo-Xfce
"Portable" : HP Pavilion DV3500, Intel T6400, 4Go, HDD 500Go / Grub2 - Gentoo-Xfce
Hors ligne
#2 Le 29/11/2021, à 09:47
- ar barzh paour
Re : Traduction de script bash
var="*test* les gens"
regarde ce que donne
echo $var
je suppose que ce que tu veux dire c'est
"dans une variable var , remplacer le texte "test" entouré par une * par "coucou" ?
Dernière modification par ar barzh paour (Le 29/11/2021, à 09:51)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#3 Le 29/11/2021, à 09:50
- Anard
Re : Traduction de script bash
Ce que je voudrais c'est remplacer ce qui se trouve entre deux '*' par la valeur de la variable en question.
*bidule* doit être remplacé par la valeur de la variable $bidule
Avec la commande que j'ai essayée, *bidule* est remplacée par le texte '$bidule' mais pas par ce que contient a variable $bidule
L'idée est de proposer des traductions à un script. J'enregistre tous les messages du script dans des variables dans des fichiers lang/en, lang/fr, ... Au début de mon script, je source le fichier de langue du système. Quand j'affiche les messages par echo, si celui-ci contient une variable, elle n'est pas remplacée puisque la variable n'était pas définie au moment de sourcer le fichier de langue.
Par exemple, si le texte en français est text-cancelled="Fonction ${func} annulée"
Plus tard dans le script, " echo $text-cancelled " donne "Fonction annulée"
C'est pour ça que je veux utiliser une substitution pour pouvoir définir la variable func plus tard en utilisant une fonction
# Fichier langue
text-cancelled="Fonction *func* annulée"
# Fonction du script pour imprimer les messages
## USAGE print_message MESSAGE
print_message () {
echo $1 | sed "s/\*\(.*\)\*/$\1/"
}
Dernière modification par Anard (Le 29/11/2021, à 10:01)
"iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3, Intel HD4600, SSD 256+120 / Bootloader Clover - macOS Mojave / Gentoo-Xfce
"Portable" : HP Pavilion DV3500, Intel T6400, 4Go, HDD 500Go / Grub2 - Gentoo-Xfce
Hors ligne
#4 Le 29/11/2021, à 09:53
- ar barzh paour
Re : Traduction de script bash
le résultat de ton exemple #1 devrait être
*coucou* les gens ?
mais as-tu regardé ce que donne echo $var
bon effectivemanr echo "$var" avec les guilemets c'est bon
Dernière modification par ar barzh paour (Le 29/11/2021, à 09:59)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#5 Le 29/11/2021, à 10:04
- Anard
Re : Traduction de script bash
? ...
Non le résultat de #1 devrait être "coucou les gens"
echo $var donne
*test* les gens
et je veux remplacer *test* par la valeur de $test, soit "coucou"
En l'occurrence, mon sed remplace bien *test* par $test mais cette variable n'est pas substituée par son contenu
Dernière modification par Anard (Le 29/11/2021, à 10:06)
"iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3, Intel HD4600, SSD 256+120 / Bootloader Clover - macOS Mojave / Gentoo-Xfce
"Portable" : HP Pavilion DV3500, Intel T6400, 4Go, HDD 500Go / Grub2 - Gentoo-Xfce
Hors ligne
#6 Le 29/11/2021, à 10:11
- ar barzh paour
Re : Traduction de script bash
désolé , j'avais des exemples de remplacement mais je m'aperçois qu'ils ne fonctionnent plus !!!
j'effectue des recherches
d'ici là tu auras peut-être des réponses
on se perd un peu avec test et $test
en fait c'est moi qui n'avais pas compris ce que tu voulais faire
Dernière modification par ar barzh paour (Le 30/11/2021, à 08:52)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#7 Le 29/11/2021, à 10:13
- MicP
Re : Traduction de script bash
Bonjour
Peut-être comme ça :
michel@debbull:~$ debut="Coucou"
michel@debbull:~$ fin="bons"
michel@debbull:~$
michel@debbull:~$ var='*debut* les gens *fin*.'
michel@debbull:~$
michel@debbull:~$ eval echo $(echo "$var" | sed "s/\*\([[:alpha:]]*\)\*/\$\1/g")
Coucou les gens bons.
michel@debbull:~$
Dernière modification par MicP (Le 29/11/2021, à 10:46)
Hors ligne
#8 Le 29/11/2021, à 10:19
- ar barzh paour
Re : Traduction de script bash
p.. d'eval !!!!
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#9 Le 29/11/2021, à 11:07
- Watael
Re : Traduction de script bash
je crois qu'on n'a pas le choix, là.
parce que
$ var='*test* les gens'
$ test=coucou
$ echo "$var" | sed 's/\*\([^*]*\)\*\(.*\)/echo "${\1:-pas vu}\2" \1/e'
pas vu les gens test
$ echo "$var" | sed 's/\*\([^*]*\)\*\(.*\)/test="coucou"; echo "${\1:-pas vu}\2" \1/e'
coucou les gens test
$
Dernière modification par Watael (Le 29/11/2021, à 11:07)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 29/11/2021, à 12:18
- Anard
Re : Traduction de script bash
Pourquoi "eval is evil"
Parce qu'en effet ça fonctionne bien comme ça, avec une petite modif pour gérer les phrases avec plusieurs variables :
# Function to print translated messages
## USAGE : print_message MESSAGE
print_message () {
eval echo $( echo "$@" | sed "s/\*\([^*]*\)\*/$\{\1\}/g" )
}
Mais du coup, ça fonctionne aussi très bien comme ça :
$ var='$test les gens'
$ test=coucou
$ eval echo $var
coucou les gens
Dernière modification par Anard (Le 29/11/2021, à 12:21)
"iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3, Intel HD4600, SSD 256+120 / Bootloader Clover - macOS Mojave / Gentoo-Xfce
"Portable" : HP Pavilion DV3500, Intel T6400, 4Go, HDD 500Go / Grub2 - Gentoo-Xfce
Hors ligne
#11 Le 29/11/2021, à 12:45
- MicP
Re : Traduction de script bash
… L'idée est de proposer des traductions à un script. …
Voir :
tldp.org -> Advanced Bash-Scripting Guide: localization
Internationalisation de scripts Bash
Dernière modification par MicP (Le 29/11/2021, à 16:14)
Hors ligne
#12 Le 30/11/2021, à 17:05
- LeoMajor
Re : Traduction de script bash
salut,
$ test="coucou"
$ declare -n foo=test
$ var="${foo} les gens"
$ echo "$var"
coucou les gens
Hors ligne
#13 Le 30/11/2021, à 17:12
- Watael
Re : Traduction de script bash
soit, mais le format des "variables" dans le texte de Anard, c'est *variable*.
Dernière modification par Watael (Le 30/11/2021, à 17:12)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 30/11/2021, à 19:02
- LeoMajor
Re : Traduction de script bash
le "*" ne sert à rien, juste à sécuriser la modification dans le sed. "*" simule une balise.
test="coucou"
declare -n foo=test
var="*test* les gens, bonjour le forum, *test* la planète"
var=$(sed "s/\*test\*/$foo/g" <<<"$var")
echo "$var"
-> coucou les gens, bonjour le forum, coucou la planète
Hors ligne
#15 Le 30/11/2021, à 19:47
- Watael
Re : Traduction de script bash
mais ça ne reprend pas le nom de la variable/balise.
foo pourra contenir n'importe quoi, et ne pas être une référence, la substitution aurait quand même lieu.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#16 Le 06/12/2021, à 09:54
- Anard
Re : Traduction de script bash
Merci à tous pour vos réponses.
La solution de MicP me semble la meilleure, je ne savais pas qu'il existait déjà cette fonction en fait
J'ai donc réussi à faire ce que je voulais, pour le moment en utilisant la syntaxe $" " qui est quand même beaucoup plus lisible que gettext.
Ca met un peu de temps à comprendre comment écrire les fichiers car la doc est assez rare et succinte...
Par exemple, je cherche actuellement à créer une chaîne multiligne à traduire, mais il ne semble pas comprendre ma syntaxe...
# Script bash
echo -e $"${Green}OPTIONS${normal} :
${bold}-h|--help${normal} Print this help and exit
${bold}-V|--version${normal} Print this script's current version and exit"
# fr.po
msgid "${Green}OPTIONS${normal} :"
" ${bold}-h|--help${normal} Print this help and exit"
" ${bold}-V|--version${normal} Print this script's current version and exit"
msgstr "${Green}OPTIONS${normal} :"
" ${bold}-h|--help${normal} Afficher cette aide puis sortir"
" ${bold}-V|--version${normal} Afficher la version courante de ce script et sortir"
PS : j'ai donc modifié le titre du sujet pour être plus explicite ...
Dernière modification par Anard (Le 13/12/2021, à 09:27)
"iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3, Intel HD4600, SSD 256+120 / Bootloader Clover - macOS Mojave / Gentoo-Xfce
"Portable" : HP Pavilion DV3500, Intel T6400, 4Go, HDD 500Go / Grub2 - Gentoo-Xfce
Hors ligne
#17 Le 06/12/2021, à 16:42
- Hizoka
Re : Traduction de script bash
Si tu galères, le plus simple et de le faire en 3 lignes ou d'utiliser des \n comme sauts de ligne.
Perso, j'ai une fonction que j'appelle avec en argument la ligne voulue.
function TextTranslated
{
case "$1" in
Texte1) gattext "blabla";;
Texte2) gattext "blibli";;
esac
}
...
echo $(TextTranslated Texte1)
Ca permet de retraduire le texte à la volée si on change langue sans relancer le script bash.
Si la traduction est statique tu utilises un dictionnaire :
declare -Ag TextTranslated
TextTranslated["Texte1"]=$(gettext "blabla")
TextTranslated["Texte2"]=$(gettext "blibli")
...
echo ${TextTranslated["Texte1"]}
L'avantage c'est que toutes les traductions sont gérées au même endroit.
Dernière modification par Hizoka (Le 06/12/2021, à 16:50)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne