Localisation de vos scripts dans BASH, partie 2

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
      
      



Voici à quoi ressemblera ce menu.

. , .





, , , . 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]}"
}
      
      



:









  1. . , 0



    ( ). : , ;



    , , languages



    .



    "English;languages set en"



    , set en



    - languages



    .









  2. prints



    . ,





Menu de sélection de la langue

. 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
      
      



Définition de la langue

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
      
      










All Articles