Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/11/2021, à 10: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, à 11: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, à 10: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, à 10:51)


PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400 Ubuntu 20.04 , 18.04 22.04 (test)
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 20.04 ( 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 )

En ligne

#3 Le 29/11/2021, à 10: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, à 11: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, à 10: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, à 10:59)


PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400 Ubuntu 20.04 , 18.04 22.04 (test)
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 20.04 ( 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 )

En ligne

#5 Le 29/11/2021, à 11: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, à 11: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, à 11: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, à 09:52)


PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400 Ubuntu 20.04 , 18.04 22.04 (test)
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 20.04 ( 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 )

En ligne

#7 Le 29/11/2021, à 11: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, à 11:46)


Retour utilisable de commande
2.d  Le prompt final : - permet de s'assurer que la commande est allée à son terme,- permet de s'assurer que la réponse du système n'est pas coupée à la fin,- et fournit parfois d'autres informations, détaillées au message #42

Hors ligne

#8 Le 29/11/2021, à 11:19

ar barzh paour

Re : Traduction de script bash

p.. d'eval !!!!


PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400 Ubuntu 20.04 , 18.04 22.04 (test)
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 20.04 ( 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 )

En ligne

#9 Le 29/11/2021, à 12:07

Watael

Re : Traduction de script bash

je crois qu'on n'a pas le choix, là. mad
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
$ 

sad

Dernière modification par Watael (Le 29/11/2021, à 12:07)


Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 29/11/2021, à 13: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, à 13: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, à 13:45

MicP

Re : Traduction de script bash

Dans son messsage #3, Anard a écrit :

… 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, à 17:14)


Retour utilisable de commande
2.d  Le prompt final : - permet de s'assurer que la commande est allée à son terme,- permet de s'assurer que la réponse du système n'est pas coupée à la fin,- et fournit parfois d'autres informations, détaillées au message #42

Hors ligne

#12 Le 30/11/2021, à 18:05

LeoMajor

Re : Traduction de script bash

salut,

$ test="coucou"
$ declare -n foo=test
$ var="${foo} les gens"
$ echo "$var"
coucou les gens

En ligne

#13 Le 30/11/2021, à 18:12

Watael

Re : Traduction de script bash

soit, mais le format des "variables" dans le texte de Anard, c'est *variable*. sad

Dernière modification par Watael (Le 30/11/2021, à 18:12)


Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 30/11/2021, à 20: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

En ligne

#15 Le 30/11/2021, à 20: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.


Welcome to sHell. · eval is evil.

Hors ligne

#16 Le 06/12/2021, à 10: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 smile
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, à 10: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, à 17: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, à 17:50)

Hors ligne