Ceci est une suite de l'article Localisation de vos scripts dans BASH . Dans celui-ci, en utilisant des tableaux et des références indirectes, nous avons appris à ajouter des langues supplémentaires à nos scripts et à basculer entre elles.
Dans cet article, nous compilerons une liste de langues intégrées et définirons le choix de la langue via le menu, en créant un menu à plusieurs niveaux pour cela. Pour éviter que l'article ne se transforme en un gros morceau de code avec une description de chaque ligne, je posterai le code lui-même avec des commentaires détaillés ci-dessous, et ici je n'aborderai que quelques points principaux.
Création de menu
Dans le dernier article, nous avons utilisé une boucle for
et un opérateur de sélection pour afficher un menu à l'écran et sélectionner l'élément souhaité case
. Évidemment, pour créer un menu à plusieurs niveaux, ces étapes devront être répétées plusieurs fois, c'est-à-dire pour chaque sous-menu. Dans ce cas, vous devrez recréer l'en-tête du menu, l'apparence, etc.
Un bon moyen de l'éviter - faire for
, case
et read
dans une fonction séparée (appelez-le prints
), puis nous le passerons simplement aux paramètres requis. Tous les scripts qui seront exécutés lorsque certains éléments de menu sont sélectionnés seront également transférés vers les fonctions correspondantes.
Donc, pour ajouter une nouvelle action au script:
ajouter des mots et des phrases au tableau de langues
dans le tableau avec le menu principal ou supplémentaire, insérez l'élément correspondant et la commande pour appeler la fonction
ajouter une fonction avec le fragment de code requis
Commençons par créer un menu principal, qui apparaîtra immédiatement à l'écran au lancement du script:
menu0=("${lng[3]};main" "${lng[4]};gitadd" "${lng[5]};gitinit" "${lng[2]};options" "${lng[1]};exit")
: , ;
- , . , . , , .
main
:
main() {
#
local menu0=("${lng[3]};main" "${lng[4]};gitadd" "${lng[5]};gitinit" "${lng[2]};options" "${lng[1]};exit")
while true ; do
#
# ,
prints "menu0[@]" "${msg[1]}"
done
}
main
, options
:
options() {
local menu1=("${lng[2]};options" "${lng[7]} [$langset];langmenu" "${lng[1]};exit")
prints "menu1[@]" "${msg[1]}"
prints
, . , . cut
:
if [[ "$1" == "text" ]] ; then
#
echo "$2" | cut -d ";" -f 1
return
elif [[ "$1" == "command" ]] ; then
#
echo "$2" | cut -d ";" -f 2
return
fi
, , ${prints "text" "${menu[0]}"}
, - .
, : . colors
. ANSI escape ( echo -e
) 256 .
, , pwds
, . , .
, .
prints
. , :
local menu=("${!1}")
- . , , 1 :
pwds
colors "title" "---$(prints "text" "${menu[0]}")---"
for
,
, read
case
:
for (( op=1; op < "${#menu[@]}"; op++ )); do
colors "item" "$op ) $(prints "text" "${menu[$op]}")"
done
echo ----------
read -s -n1 -p "$(colors "item" "$2: ")" item
case $item in
[1-$((${#menu[@]}-1))] )
#
colors "ok" "[$item]->: $(prints "text" "${menu[$item]}")"
#
$(prints "command" "${menu[$item]}") ;;
# [q]
"q" ) echo; exit;;
#
* ) colors "err" "[$item]->: ${msg[2]}"; sleep 2 ;;
esac
. , .
, , , . langmenu
.
, . . , sed
language_
. language_ru
ru
:
# [-r] -
# [-n] - ,
local lng_sfx=($(sed -r -n "s/^\s?+language_(\w+)=.*/\1/p" "${0}"))
, , prints
. . langmenu
:
langmenu(){
local lng_sfx=($(sed -r -n "s/^\s?+language_(\w+)=.*/\1/p" "${0}"))
local menu2=("${lng[7]};langmenu")
for a in ${lng_sfx[@]} ; do
local d="language_$a[@]"; d=("${!d}")
menu2+=("$d;languages set $a")
done
menu2+=("${lng[1]};exit")
prints "menu2[@]" "${msg[6]}"
}
:
. ,
0
( ). : ,;
, ,languages
.
"English;languages set en"
,set en
-languages
.
prints
. ,
. sed
-i
-r
, -i
- () , -r
- .
: , langset=
langset=
:
sed -i -r "0,/^\s?+langset=/s/langset=[\"\']?\w*[\"\']?/langset=\"$langset\"/" "${0}"
exit
prints
. , , case
languages
, set
. languages
, . :
languages
if [ "$1" == "set" ] ; then
#
langset="$2"
local df="language_$langset"
echo
# ,
colors "ok" "${msg[7]} ${!df}. ${msg[8]}"
#
languages
# ,
colors "ok" "${msg[7]} ${lng[0]}. ${msg[8]}"
echo
# langset=
sed -i -r "0,/^\s?+langset=/s/langset=[\"\']?\w*[\"\']?/langset=\"$langset\"/" "${0}"
exit
fi
Dans cet article et dans l' article précédent , nous avons créé un modèle que vous pouvez utiliser pour écrire vos propres scripts avec la possibilité d'afficher des menus et des messages à l'écran dans différentes langues. Dans ce cas, le script se compose d'un fichier et pour ajouter une nouvelle langue, il suffit de déposer le tableau avec des mots au début du script et d'ajouter une action - créez une fonction et enregistrez-la dans le menu.
Merci d'avoir lu jusqu'au bout.
Tout le code avec des commentaires est joint ci-dessous.
Le code entier
#!/bin/bash
#
langset="ru"
#
language_en=( "English" "Quit" "Options" "Main menu" "Git: add ALL files/commit" "Git init" "Change language" "Language selection" )
message_en=( "English" "Select item" "Wrong! This item does not exist" "Added all files" "Enter you commit" "Changes recorded" "Select a language" "The language has been changed to" "Start the program again" "Repository not found\nPlease, select Git init pepository" )
language_ru=( "" "" "" " " "Git: /" "" "" " " )
message_ru=( "" " " "! " " " " " " " " " " " " " " \n, , Git init" )
language_de=( "Deutsch" )
message_de=( "Deutsch" "" "" "" "" "" "" "" "Starten Sie das Programm neu" )
language_cn=( "中文" "出口" "设置" "主菜单")
message_cn=( "中文" "选择项目" "" "" "" "" "选择语言" "语言已改为" "重新启动程序" )
# Settings section
languages() {
#
#
lng="language_$langset[@]"; lng=("${!lng}")
msg="message_$langset[@]"; msg=("${!msg}")
#
for b in ${!language_en[@]} ${!message_en[@]} ; do
if [[ ! ${lng[$b]} ]] ; then
lng[$b]=${language_en[$b]}
fi
if [[ ! ${msg[$b]} ]] ; then
msg[$b]=${message_en[$b]}
fi
done
#
if [ "$1" == "set" ] ; then
#
langset="$2"
local df="language_$langset"
# ,
# ,
echo
colors "ok" "${msg[7]} ${!df}. ${msg[8]}"
#
languages
#
# ,
colors "ok" "${msg[7]} ${lng[0]}. ${msg[8]}"
echo
#
# langset=
# [-r] -
# [-i] -
# [0,] -
sed -i -r "0,/^\s?+langset=/s/langset=[\"\']?\w*[\"\']?/langset=\"$langset\"/" "${0}"
exit
fi
}
#
languages
colors() {
# . ,
# ,
# [48] - , [38] -
# [5] - 8- (0-255), [1] - ,
# [22] - , [0] -
case "$1" in
# : - ()
"tm" ) echo -e "\e[48;5;256;38;5;34;22m$2\e[0m" ;;
# : -, : ( )
"pt" ) echo -e "\e[48;5;24;38;5;15;1m$2\e[0m" ;;
# : - ( )
"cf" ) echo -e "\e[48;5;256;38;5;226;1m$2\e[0m" ;;
# : - ( )
"ok" ) echo -e "\e[48;5;256;38;5;34;1m$2\e[0m" ;;
# : ( )
"err" ) echo -e "\e[48;5;256;38;5;160;1m$2\e[0m" ;;
# : - ( )
"title" ) echo -e "\e[48;5;256;38;5;226;22m$2\e[0m" ;;
# : ( )
"item" ) echo -e "\e[48;5;256;38;5;15;22m$2\e[0m" ;;
esac
}
pwds() {
#
echo
echo ----------
echo "$(colors 'tm' "[$(date +"%T")]") $(colors 'pt' "${PWD%/*}"/)$(colors 'cf' "$(basename "$PWD")")"
echo ----------
}
prints() {
#
# , [;]
if [[ "$1" == "text" ]] ; then
echo "$2" | cut -d ";" -f 1
return
elif [[ "$1" == "command" ]] ; then
echo "$2" | cut -d ";" -f 2
return
fi
# ,
local menu=("${!1}")
#
pwds
# ,
# 1
colors "title" "---$(prints "text" "${menu[0]}")---"
#
for (( op=1; op < "${#menu[@]}"; op++ )); do
# ,
#
colors "item" "$op ) $(prints "text" "${menu[$op]}")"
done
echo ----------
# ,
read -s -n1 -p "$(colors "item" "$2: ")" item
#
case $item in
# 1 1 ( 0)
#
#
[1-$((${#menu[@]}-1))] ) colors "ok" "[$item]->: $(prints "text" "${menu[$item]}")"
# ,
#
$(prints "command" "${menu[$item]}") ;;
# [q]
"q" ) echo; exit;;
#
* ) colors "err" "[$item]->: ${msg[2]}"; sleep 2 ;;
esac
}
# Application section
gitinit() {
# : [git init]
git init
}
gitadd() {
# : [git add] -
git add .
# . [0]
#
if [[ "$?" != "0" ]] ; then
colors "err" "${msg[9]}"
sleep 1
return 1
fi
echo "${msg[3]} ..."
#
read -p "$(colors "item" "${msg[4]}: ")" comm
git commit -m "$comm"
#
colors "ok" "${msg[5]}"
}
# Menu section
langmenu() {
#
# ,
# [language_*]
# [-r] -
# [-n] - ,
local lng_sfx=($(sed -r -n "s/^\s?+language_(\w+)=.*/\1/p" "${0}"))
#
local menu2=("${lng[7]};langmenu")
# , ,
# 0 ( )
for a in ${lng_sfx[@]} ; do
local d="language_$a[@]"; d=("${!d}")
#
# ,
# [;], ,
# [languages] .
# ["English;languages set en"], [set en] - [languages]
menu2+=("$d;languages set $a")
done
#
menu2+=("${lng[1]};exit")
#
# ,
prints "menu2[@]" "${msg[6]}"
}
options() {
#
# ,
# [;], ,
local menu1=("${lng[2]};options" "${lng[7]} [$langset];langmenu" "${lng[1]};exit")
#
# ,
prints "menu1[@]" "${msg[1]}"
}
main() {
#
# ,
# [;], ,
# , , -
# ,
local menu0=("${lng[3]};main" "${lng[4]};gitadd" "${lng[5]};gitinit" "${lng[2]};options" "${lng[1]};exit")
while true ; do
#
# ,
prints "menu0[@]" "${msg[1]}"
done
}
main
exit 0