From 2e1744a99384d5f2415e86c4580f7f91ac0bbfec Mon Sep 17 00:00:00 2001 From: juewuy Date: Thu, 8 Jan 2026 18:46:41 +0800 Subject: [PATCH] ~Add i18n support (only menu.sh) --- scripts/lang/chs/menu.lang | 85 +++++++++++++++++++++ scripts/libs/i18n.sh | 8 ++ scripts/menu.sh | 146 +++++++++++++++++++------------------ 3 files changed, 170 insertions(+), 69 deletions(-) create mode 100644 scripts/lang/chs/menu.lang create mode 100644 scripts/libs/i18n.sh diff --git a/scripts/lang/chs/menu.lang b/scripts/lang/chs/menu.lang new file mode 100644 index 00000000..f52be2b5 --- /dev/null +++ b/scripts/lang/chs/menu.lang @@ -0,0 +1,85 @@ +# ===== 通用提示 ===== +MENU_ERR_INPUT="请输入正确的字母或数字!" + +MENU_RESTART_NOTICE="检测到已变更的内容,请重启服务!" +MENU_RESTART_ASK="是否现在重启服务?(1/0) > " + +MENU_PORT_CONFLICT_TITLE="检测到端口被以下进程占用!内核可能无法正常启动!" +MENU_PORT_CONFLICT_HINT="请修改默认端口配置!" + +MENU_CORE_LOADED_OK="内核加载完成!" +MENU_CORE_LOADED_BAD="检测到不可用的内核文件!可能是文件受损或CPU架构不匹配!" +MENU_CORE_REMOVED="内核文件已移除,请认真检查后重新上传!" + +MENU_CFG_LOADED_OK="配置文件加载完成!" + +MENU_OVERRIDE_WARN="你已经禁用了配置文件覆写功能,这会导致大量脚本功能无法使用!" +MENU_OVERRIDE_ASK="是否取消禁用?" + +# ===== 欢迎与状态 ===== +MENU_WELCOME="欢迎使用ShellCrash!" +MENU_VERSION_LABEL="版本:" + +MENU_RUN_ON="正在运行" +MENU_RUN_SET="已设置" +MENU_RUN_OFF="没有运行" + +MENU_IP_DF="设备IP地址" + +MENU_AUTOSTART_ON="已设置开机启动!" +MENU_AUTOSTART_OFF="未设置开机启动!" +MENU_AUTOSTART_DEBUG="并处于debug状态!" + +MENU_MEM_USED="当前内存占用:" +MENU_RUNNING_TIME="已运行:" + +MENU_TG_CHANNEL="TG频道:" +MENU_TG_URL="https://t.me/ShellClash" + +# ===== /tmp 文件检测 ===== +MENU_TMP_CORE_FOUND="发现可用的内核文件:" +MENU_TMP_CORE_ASK="是否加载(会停止当前服务)?" + +MENU_TMP_CFG_FOUND="发现内核配置文件:" +MENU_TMP_CFG_ASK="是否加载为配置文件?(1/0) > " + +MENU_MAIN_1="启动/重启服务" +MENU_MAIN_2="功能设置" +MENU_MAIN_3="停止服务" +MENU_MAIN_4="启动设置" +MENU_MAIN_5="自动任务" +MENU_MAIN_6="配置文件管理" +MENU_MAIN_7="访问与控制" +MENU_MAIN_8="工具与优化" +MENU_MAIN_9="更新与支持" +MENU_MAIN_0="退出脚本" + +MENU_MAIN_PROMPT="请输入对应数字 > " + +# ===== 服务操作 ===== +MENU_SERVICE_STOPPED="服务已停止!" + +# ===== 测试 / 调试 ===== +MENU_TEST_RUNNING="正在测试运行!如发现错误请截图后前往咨询" +MENU_TEST_DONE_OK="测试完成!没有发现问题,请重新启动服务~" +MENU_TEST_DONE_FAIL="测试完成!" +MENU_TEST_LOG_HINT="完整执行记录请查看:" + +MENU_ERROR_FOUND="发现错误:" + +# ===== 命令行帮助 ===== +MENU_CLI_WELCOME="欢迎使用ShellCrash" + +MENU_CLI_TEST="测试模式" +MENU_CLI_HELP="帮助列表" +MENU_CLI_UNINSTALL="卸载脚本" +MENU_CLI_INIT="初始化脚本" +MENU_CLI_DEBUG="测试运行" + +MENU_CLI_START="启动服务" +MENU_CLI_STOP="停止服务" +MENU_CLI_BOOT_INIT="开机初始化" + +MENU_HELP_ONLINE="在线求助:" +MENU_HELP_BLOG="官方博客:" +MENU_HELP_GITHUB="发布页面:" \ No newline at end of file diff --git a/scripts/libs/i18n.sh b/scripts/libs/i18n.sh new file mode 100644 index 00000000..efaa52ee --- /dev/null +++ b/scripts/libs/i18n.sh @@ -0,0 +1,8 @@ + +load_lang() { + i18n=$(cat "$CRASHDIR"/configs/i18n.cfg 2>/dev/null) + [ -z "$i18n" ] && i18n=chs + + file="$CRASHDIR/lang/$i18n/$1.lang" + [ -s "$file" ] && . "$file" +} \ No newline at end of file diff --git a/scripts/menu.sh b/scripts/menu.sh index 86dac1e0..7f17b82b 100644 --- a/scripts/menu.sh +++ b/scripts/menu.sh @@ -6,37 +6,45 @@ CRASHDIR=$( pwd ) CFG_PATH="$CRASHDIR"/configs/ShellCrash.cfg -#加载执行目录,失败则初始化 + +# 加载执行目录,失败则初始化 . "$CRASHDIR"/libs/get_config.sh [ -z "$BINDIR" -o -z "$TMPDIR" -o -z "$COMMAND" ] && . "$CRASHDIR"/init.sh >/dev/null 2>&1 [ ! -f "$TMPDIR" ] && mkdir -p "$TMPDIR" -#通用工具 +# 通用工具 . "$CRASHDIR"/libs/set_config.sh . "$CRASHDIR"/libs/check_cmd.sh . "$CRASHDIR"/libs/check_autostart.sh +. "$CRASHDIR"/libs/i18n.sh . "$CRASHDIR"/menus/1_start.sh . "$CRASHDIR"/menus/running_status.sh + +# 加载语言 +load_lang common +load_lang menu + errornum() { echo "-----------------------------------------------" - echo -e "\033[31m请输入正确的字母或数字!\033[0m" + echo -e "\033[31m$MENU_ERR_INPUT\033[0m" } + checkrestart() { echo "-----------------------------------------------" - echo -e "\033[32m检测到已变更的内容,请重启服务!\033[0m" + echo -e "\033[32m$MENU_RESTART_NOTICE\033[0m" echo "-----------------------------------------------" - read -p "是否现在重启服务?(1/0) > " res + read -p "$MENU_RESTART_ASK" res [ "$res" = 1 ] && start_service } checkport() { #检查端口冲突 for portx in $dns_port $mix_port $redir_port $((redir_port + 1)) $db_port; do - if [ -n "$(netstat -ntul 2>&1 | grep ':$portx ')" ]; then + if [ -n "$(netstat -ntul 2>&1 | grep ":$portx ")" ]; then echo "-----------------------------------------------" - echo -e "检测到端口【$portx】被以下进程占用!内核可能无法正常启动!\033[33m" - echo $(netstat -ntul | grep :$portx | head -n 1) - echo -e "\033[0m-----------------------------------------------" - echo -e "\033[36m请修改默认端口配置!\033[0m" + echo -e "【$portx】: $MENU_PORT_CONFLICT_TITLE" + echo -e "\033[0m$(netstat -ntul | grep ":$portx" | head -n 1)\033[0m" + echo "-----------------------------------------------" + echo -e "\033[36m$MENU_PORT_CONFLICT_HINT\033[0m" . "$CRASHDIR"/menus/2_settings.sh && set_adv_config . "$CRASHDIR"/libs/get_config.sh checkport @@ -46,18 +54,19 @@ checkport() { #检查端口冲突 ckstatus() { #脚本启动前检查 #检查脚本配置文件 if [ -f "$CFG_PATH" ]; then - [ -n "$(awk 'a[$0]++' $CFG_PATH)" ] && awk '!a[$0]++' "$CFG_PATH" >"$CFG_PATH" #检查重复行并去除 + [ -n "$(awk 'a[$0]++' "$CFG_PATH")" ] && awk '!a[$0]++' "$CFG_PATH" >"$CFG_PATH" else . "$CRASHDIR"/init.sh >/dev/null 2>&1 fi + versionsh=$(cat "$CRASHDIR"/version) [ -n "$versionsh" ] && versionsh_l=$versionsh - [ -z "$redir_mod" ] && redir_mod=纯净模式 + [ -z "$redir_mod" ] && redir_mod="纯净模式" #获取本机host地址 [ -z "$host" ] && host=$(ubus call network.interface.lan status 2>&1 | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') [ -z "$host" ] && host=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'lan' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1) [ -z "$host" ] && host=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep -E ' 1(92|0|72)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1) - [ -z "$host" ] && host='设备IP地址' + [ -z "$host" ] && host='$MENU_IP_DF' #dashboard目录位置 if [ -f /www/clash/index.html ]; then dbdir=/www/clash @@ -66,37 +75,37 @@ ckstatus() { #脚本启动前检查 dbdir="$CRASHDIR"/ui hostdir=":$db_port/ui" fi - #开机自启检测 + if check_autostart; then - auto="\033[32m已设置开机启动!\033[0m" - auto1="\033[36m禁用\033[0mShellCrash开机启动" + auto="\033[32m$MENU_AUTOSTART_ON\033[0m" else - auto="\033[31m未设置开机启动!\033[0m" - auto1="\033[36m允许\033[0mShellCrash开机启动" + auto="\033[31m$MENU_AUTOSTART_OFF\033[0m" fi - #获取运行状态 + PID=$(pidof CrashCore | awk '{print $NF}') if [ -n "$PID" ]; then - run="\033[32m正在运行($redir_mod)\033[0m" + run="\033[32m$MENU_RUN_ON($redir_mod)\033[0m" running_status elif [ "$firewall_area" = 5 ] && [ -n "$(ip route list table 100)" ]; then - run="\033[32m已设置($redir_mod)\033[0m" + run="\033[32m$MENU_RUN_SET($redir_mod)\033[0m" else - run="\033[31m没有运行($redir_mod)\033[0m" + run="\033[31m$MENU_RUN_OFF($redir_mod)\033[0m" #检测系统端口占用 checkport fi corename=$(echo $crashcore | sed 's/singboxr/SingBoxR/' | sed 's/singbox/SingBox/' | sed 's/clash/Clash/' | sed 's/meta/Mihomo/') - [ "$firewall_area" = 5 ] && corename='转发' - [ -f "$TMPDIR"/debug.log -o -f "$CRASHDIR"/debug.log -a -n "$PID" ] && auto="\033[33m并处于debug状态!\033[0m" + #[ "$firewall_area" = 5 ] && corename='转发' + [ -f "$TMPDIR"/debug.log -o -f "$CRASHDIR"/debug.log -a -n "$PID" ] && auto="\033[33m$MENU_AUTOSTART_DEBUG\033[0m" #输出状态 echo "-----------------------------------------------" - echo -e "\033[30;46m欢迎使用ShellCrash!\033[0m 版本:$versionsh_l" - echo -e "$corename服务$run,$auto" + echo -e "\033[30;46m$MENU_WELCOME\033[0m $MENU_VERSION_LABEL$versionsh_l" + echo -e "$corename $run,$auto" + if [ -n "$PID" ]; then - echo -e "当前内存占用:\033[44m"$VmRSS"\033[0m,已运行:\033[46;30m"$day"\033[44;37m"$time"\033[0m" + echo -e "$MENU_MEM_USED \033[44m$VmRSS\033[0m,$MENU_RUNNING_TIME \033[46;30m$day\033[44;37m$time\033[0m" fi - echo -e "TG频道:\033[36;4mhttps://t.me/ShellClash\033[0m" + + echo -e "$MENU_TG_CHANNEL \033[36;4m$MENU_TG_URL\033[0m" echo "-----------------------------------------------" #检查新手引导 if [ -z "$userguide" ]; then @@ -107,19 +116,19 @@ ckstatus() { #脚本启动前检查 [ ! -x "$CRASHDIR"/start.sh ] && chmod +x "$CRASHDIR"/start.sh #检查/tmp内核文件 for file in $(ls /tmp | grep -v [/$] | grep -v ' ' | grep -Ev ".*(zip|7z|tar)$" | grep -iE 'CrashCore|^clash$|^clash-linux.*|^mihomo.*|^sing.*box|meta.*'); do - echo -e "发现可用的内核文件: \033[36m/tmp/$file\033[0m " - read -p "是否加载(会停止当前服务)?(1/0) > " res + echo -e "$MENU_TMP_CORE_FOUND \033[36m/tmp/$file\033[0m " + read -p "$MENU_TMP_CORE_ASK(1/0) > " res [ "$res" = 1 ] && { zip_type=$(echo "$file" | grep -oE 'tar.gz$|upx$|gz$') . "$CRASHDIR"/menus/9_upgrade.sh && setcoretype . "$CRASHDIR"/libs/core_tools.sh && core_check "/tmp/$file" if [ "$?" = 0 ]; then - echo -e "\033[32m内核加载完成!\033[0m " + echo -e "\033[32m$MENU_CORE_LOADED_OK\033[0m " switch_core else - echo -e "\033[33m检测到不可用的内核文件!可能是文件受损或CPU架构不匹配!\033[0m" + echo -e "\033[33m$MENU_CORE_LOADED_BAD033[0m" rm -rf /tmp/"$file" - echo -e "\033[33m内核文件已移除,请认真检查后重新上传!\033[0m" + echo -e "\033[33m$MENU_CORE_REMOVED\033[0m" fi sleep 1 } @@ -128,44 +137,43 @@ ckstatus() { #脚本启动前检查 #检查/tmp配置文件 for file in $(ls /tmp | grep -v [/$] | grep -v ' ' | grep -iE 'config.yaml$|config.yml$|config.json$'); do tmp_file=/tmp/$file - echo -e "发现内核配置文件: \033[36m/tmp/$file\033[0m " - read -p "是否加载为$crashcore的配置文件?(1/0) > " res + echo -e "$MENU_TMP_CFG_FOUND \033[36m/tmp/$file\033[0m " + read -p "$MENU_TMP_CFG_ASK(1/0) > " res [ "$res" = 1 ] && { if [ -n "$(echo /tmp/$file | grep -iE '.json$')" ]; then mv -f /tmp/$file "$CRASHDIR"/jsons/config.json else mv -f /tmp/$file "$CRASHDIR"/yamls/config.yaml fi - echo -e "\033[32m配置文件加载完成!\033[0m " + echo -e "\033[32m$MENU_CFG_LOADED_OK\033[0m " sleep 1 } done #检查禁用配置覆写 [ "$disoverride" = "1" ] && { - echo -e "\033[33m你已经禁用了配置文件覆写功能,这会导致大量脚本功能无法使用!\033[0m " - read -p "是否取消禁用?(1/0) > " res + echo -e "\033[33m$MENU_OVERRIDE_WARN\033[0m " + read -p "$MENU_OVERRIDE_ASK(1/0) > " res [ "$res" = 1 ] && unset disoverride && setconfig disoverride echo "-----------------------------------------------" } } -#主菜单 main_menu() { - ############################# ckstatus - ############################# - echo -e " 1 \033[32m启动/重启服务\033[0m" - echo -e " 2 \033[36m功能设置\033[0m" - echo -e " 3 \033[31m停止服务\033[0m" - echo -e " 4 \033[33m启动设置\033[0m" - echo -e " 5 设置\033[32m自动任务\033[0m" - echo -e " 6 管理\033[36m配置文件\033[0m" - echo -e " 7 \033[33m访问与控制\033[0m" - echo -e " 8 \033[0m工具与优化\033[0m" - echo -e " 9 \033[32m更新与支持\033[0m" + + echo -e " 1 \033[32m$MENU_MAIN_1\033[0m" + echo -e " 2 \033[36m$MENU_MAIN_2\033[0m" + echo -e " 3 \033[31m$MENU_MAIN_3\033[0m" + echo -e " 4 \033[33m$MENU_MAIN_4\033[0m" + echo -e " 5 \033[32m$MENU_MAIN_5\033[0m" + echo -e " 6 \033[36m$MENU_MAIN_6\033[0m" + echo -e " 7 \033[33m$MENU_MAIN_7\033[0m" + echo -e " 8 $MENU_MAIN_8" + echo -e " 9 \033[32m$MENU_MAIN_9\033[0m" echo "-----------------------------------------------" - echo -e " 0 \033[0m退出脚本\033[0m" - read -p "请输入对应数字 > " num + echo -e " 0 $MENU_MAIN_0" + + read -p "$MENU_MAIN_PROMPT" num case "$num" in 0) @@ -189,7 +197,7 @@ main_menu() { "$CRASHDIR"/start.sh stop sleep 1 echo "-----------------------------------------------" - echo -e "\033[31m$corename服务已停止!\033[0m" + echo -e "\033[31m$corename$MENU_SERVICE_STOPPED\033[0m" main_menu ;; 4) @@ -255,21 +263,21 @@ case "$1" in ;; -d) shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash - echo -e "正在测试运行!如发现错误请截图后前往\033[32;4mt.me/ShellClash\033[0m咨询" + echo -e "$MENU_TEST_RUNNING\033[32;4mt.me/ShellClash\033[0m" $shtype "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh_bug.log $shtype -x "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh.log echo ----------------------------------------- cat "$TMPDIR"/debug_sh_bug.log | grep 'start\.sh' >"$TMPDIR"/sh_bug if [ -s "$TMPDIR"/sh_bug ]; then while read line; do - echo -e "发现错误:\033[33;4m$line\033[0m" + echo -e "$MENU_ERROR_FOUND\033[33;4m$line\033[0m" grep -A 1 -B 3 "$line" "$TMPDIR"/debug_sh.log echo ----------------------------------------- done <"$TMPDIR"/sh_bug rm -rf "$TMPDIR"/sh_bug - echo -e "\033[32m测试完成!\033[0m完整执行记录请查看:\033[36m$TMPDIR/debug_sh.log\033[0m" + echo -e "\033[32m$MENU_TEST_DONE_FAIL\033[0m$MENU_TEST_LOG_HINT\033[36m$TMPDIR/debug_sh.log\033[0m" else - echo -e "\033[32m测试完成!没有发现问题,请重新启动服务~\033[0m" + echo -e "\033[32m$MENU_TEST_DONE_OK\033[0m" rm -rf "$TMPDIR"/debug_sh.log fi "$CRASHDIR"/start.sh stop @@ -279,21 +287,21 @@ case "$1" in ;; *) echo ----------------------------------------- - echo "欢迎使用ShellCrash" + echo "$MENU_CLI_WELCOME" echo ----------------------------------------- - echo " -t 测试模式" - echo " -h 帮助列表" - echo " -u 卸载脚本" - echo " -i 初始化脚本" - echo " -d 测试运行" + echo " -t $MENU_CLI_TEST" + echo " -h $MENU_CLI_HELP" + echo " -u $MENU_CLI_UNINSTALL" + echo " -i $MENU_CLI_INIT" + echo " -d $MENU_CLI_DEBUG" echo ----------------------------------------- - echo " crash -s start 启动服务" - echo " crash -s stop 停止服务" - echo " $CRASHDIR/start.sh init 开机初始化" + echo " crash -s start $MENU_CLI_START" + echo " crash -s stop $MENU_CLI_STOP" + echo " $CRASHDIR/start.sh init $MENU_CLI_BOOT_INIT" echo ----------------------------------------- - echo "在线求助:t.me/ShellClash" - echo "官方博客:juewuy.github.io" - echo "发布页面:github.com/juewuy/ShellCrash" + echo "$MENU_HELP_ONLINE t.me/ShellClash" + echo "$MENU_HELP_BLOG juewuy.github.io" + echo "$MENU_HELP_GITHUB github.com/juewuy/ShellCrash" echo ----------------------------------------- ;; esac