Ce billet explique comment afficher dans le terminal d'exécution d'un script des textes dans des langues différentes en fonction du choix de l'utilisateur.
Il arrive souvent que l'on est besoin dans un script d'afficher dans le terminal des messages à destination de l'utilisateur, que ce soit pour l'informer ou lui demander de faire un choix. Beaucoup de script imposent l'anglais comme langue de communication. Mais vous pouvez choisir que votre script donne le choix à l'utilisateur de choisir la langue dans laquelle s'afficheront les messages. Cela demande un peu d'effort de traduction mais la mise en œuvre technique n'est pas très compliquée et les utilisateurs de vos scripts apprécieront beaucoup cette possibilité que vous leur offrez.
J'ai présenté dans un autre billet, config, comment utiliser dans un script un fichier de configuration qui permettent de lire et écrire des données à partir du script.
Ce billet part de ce précédent billet pour expliquer comment utiliser plusieurs langues dans votre script.
Le billet sur les fichiers de configuration se termine avec un fichier de configuration `config.txt' qui contient ...
myLanguage="FR"
… et un script qui contient ...
#!/bin/bash
source config.txt
myChoice=$(whiptail --menu "Choisissez votre langue" 12 60 2 \
"FR" "Français" \
"EN" "English" 3>&1 1>&2 2>&3)
echo "myLanguage :" $myLanguage
echo "myChoice :" $myChoice
myLanguage=$myChoice
sed -i "s/^myLanguage=.*/myLanguage=$myLanguage/" "config.txt"
Dans le script le message de la commande whiptail
est écrit en Français et il n'est pas modifiable. Dans le monde du développement des programmes informatiques, on dit qu'il est "en dur". (Ndlr : Ce n'est jamais très bon quand on commence à dire qu'il y des trucs "en dur" dans un programme).
Le remplacement d'un texte écrit "en dur" dans le script par un texte écrit dans la langue choisie par l'utilisateur se fait en plusieurs étapes.
Il faut tout d'abord choisir un nom de variable pour le texte concerné, par exemple scLanguage
.
Il faut ensuite créer un fichier par langue en incluant dans le nom de chaque fichier la valeur de la langue, par exemple languageEN.txt
et languageFR.txt
.
Dans chacun de ces fichiers il faut écrire le texte dans la langue correspondante en l'associant à la variable de texte que l'on a définie.
Cela donne pour le fichier languageFR.txt
...
scLanguage="Choisissez votre langue."
… et pour le fichier languageEN.txt
...
scLanguage="Select your language."
Maintenant que l'on dispose des deux fichiers de traduction, on intègre dynamiquement l'un ou l'autre en utilisant la variable de script de sélection de la langue myLanguage
.
Comme les deux fichiers définissent la même variable scLanguage
, il suffit de remplacer dans la commande whiptail
du script, le texte "en dur" par une référence à cette variable de texte.
#!/bin/bash
source config.txt
source language${myLanguage}.txt
myChoice=$(whiptail --menu "${scLanguage}" 12 60 2 \
"FR" "Français" \
"EN" "English" 3>&1 1>&2 2>&3)
echo "myLanguage :" $myLanguage
echo "myChoice :" $myChoice
myLanguage=$myChoice
sed -i "s/^myLanguage=.*/myLanguage=$myLanguage/" "config.txt"
Et voilà le tour est joué !
Afin de vérifier dans le script que le changement de la langue a bien été pris en compte dans le fichier de configuration, on recharge le fichier de configuration et on crée une deuxième commande whiptail
qui affiche un message en Français ou en anglais en fonction du choix en ajoutant sa traduction dans les fichiers de traduction.
On aura alors un fichier de configuration config.txt
qui contient toujours ...
myLanguage=FR
Le fichier en Français languageFR.txt
qui contient ...
scLanguage="Choisissez votre langue."
scChoice="Vous avez choisi la langue Française."
Le fichier en Anglais languageEN.txt
qui contient ...
scLanguage="Select your language."
scChoice="You have chosen the English language."
Le fichier script main.sh
qui contient maintenant une dernière partie qui recharge le fichier de configuration et affiche le deuxième message...
#!/bin/bash
# Chargement des fichiers
source config.txt
source language${myLanguage}.txt
# Sélection de la langue
myChoice=$(whiptail --menu "${scLanguage}" 12 60 2 \
"FR" "Français" \
"EN" "English" 3>&1 1>&2 2>&3)
myLanguage=$myChoice
# Sauvegarde du choix dans le fichier de configuration
sed -i "s/^myLanguage=.*/myLanguage=$myLanguage/" "config.txt"
# Rechargement du fichier de traduction dans la langue choisie
source config.txt
source language${myLanguage}.txt
# Affichage du deuxième message
whiptail --msgbox "${scChoice}" 12 60
Lors de la première exécution du script, la demande du choix de la langue se fera dans la langue définie par défaut le fichier de configuration.
Mais si l'on a choisi l'Anglais, le deuxième message s'affichera en Anglais.
Et si l'on relance le script, la demande de choix de la langue se fera cette fois-ci dans la langue choisie lors de la précédente exécution du script.
La seule contrainte de cette méthode est qu'il faut refaire le choix de la langue à chaque fois que l'on exécute le script.