Ini adalah kelanjutan dari artikel Melokalkan skrip Anda di BASH . Di dalamnya, menggunakan array dan referensi tidak langsung, kami belajar bagaimana menambahkan bahasa tambahan ke skrip kami dan beralih di antara mereka.
Pada artikel ini, kami akan menyusun daftar bahasa bawaan dan mengatur pilihan bahasa melalui menu, membangun menu multi-level untuk ini. Untuk mencegah artikel berubah menjadi satu bagian besar kode dengan deskripsi setiap baris, saya akan memposting kode itu sendiri dengan komentar terperinci di bawah, dan di sini saya hanya akan menyentuh beberapa poin utama.
Pembuatan menu
Di artikel terakhir, kami menggunakan loop for
dan operator seleksi untuk menampilkan menu di layar dan memilih item yang diperlukan case
. Tentunya, untuk membuat menu multi-level, langkah-langkah ini perlu diulangi beberapa kali, yaitu untuk setiap submenu. Dalam hal ini, Anda harus membuat ulang tajuk menu, tampilan, dan sebagainya.
Cara yang baik untuk menghindarinya - untuk membuat for
, case
dan read
dalam fungsi terpisah (sebut saja prints
), dan kemudian kita akan meneruskannya ke parameter yang diperlukan. Semua skrip yang akan dijalankan saat item menu tertentu dipilih juga akan ditransfer ke fungsi terkait.
Jadi, untuk menambahkan tindakan baru ke skrip:
tambahkan kata dan frasa ke larik bahasa
ke dalam array dengan menu utama atau menu tambahan, masukkan item yang sesuai dan perintah untuk memanggil fungsi tersebut
tambahkan fungsi dengan fragmen kode yang diperlukan
Pertama, mari buat menu utama, yang akan langsung muncul di layar saat skrip diluncurkan:
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
Di artikel ini dan sebelumnya , kami membuat template yang dapat Anda gunakan untuk menulis skrip Anda sendiri dengan kemampuan untuk menampilkan menu dan pesan di layar dalam berbagai bahasa. Dalam hal ini, skrip terdiri dari satu file dan untuk menambahkan bahasa baru, cukup dengan melepaskan array dengan kata-kata di awal skrip, dan menambahkan tindakan apa pun - buat fungsi dan daftarkan di menu.
Terima kasih sudah membaca sampai akhir.
Semua kode dengan komentar dilampirkan di bawah ini.
Seluruh kode
#!/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