diff --git a/scripts/lang/chs/bot_tg.lang b/scripts/lang/chs/bot_tg.lang new file mode 100644 index 00000000..2153d311 --- /dev/null +++ b/scripts/lang/chs/bot_tg.lang @@ -0,0 +1,68 @@ +BOT_TG_PRIVATE_HINT="请先通过 \033[32;4mhttps://t.me/BotFather\033[0m 申请TG机器人并获取其\033[36mAPI TOKEN\033[0m" +BOT_TG_INPUT_TOKEN="请输入你获取到的API TOKEN" +BOT_TG_PRIVATE_TOP="请向\033[32m你申请的机器人\033[33m而不是BotFather!\033[0m" +BOT_TG_PUBLIC_HINT="请向机器人:\033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m" +BOT_TG_SET_DONE="已完成Telegram日志推送设置!" +BOT_TG_CHATID_RETRY_PREFIX="第" +BOT_TG_CHATID_RETRY_SUFFIX="次尝试获取对话ID失败,正在重试..." +BOT_TG_SEND_KEY="发送此秘钥:" +BOT_TG_SENT_CONFIRM="我已经发送完成" +BOT_TG_CHATID_FAIL="无法获取对话ID,请返回重新设置或手动输入ChatID!" +BOT_TG_CHATID_MANUAL_HINT="通常访问" +BOT_TG_CHATID_MANUAL_HINT2="即可看到ChatID" +BOT_TG_INPUT_CHATID="请手动输入ChatID" +BOT_TG_CHATID_RECONFIG="无法获取对话ID,请重新配置!" +BOT_TG_CRON_NAME="TG_BOT守护进程" + +BOT_TG_HELP_GROUP="进群讨论:" +BOT_TG_HELP_PROJECT="项目地址:" +BOT_TG_HELP_GUIDE="相关教程:" +BOT_TG_HELP_COFFEE="请喝咖啡:" +BOT_TG_HELP_AIRPORT="友情机场:" +BOT_TG_RUN_ON="🟢正在运行" +BOT_TG_RUN_OFF="🟡未运行" +BOT_TG_WELCOME="欢迎使用ShellCrash!" +BOT_TG_SERVICE="服务" +BOT_TG_MEM_USED="内存占用:" +BOT_TG_RUNNING_TIME="已运行:" +BOT_TG_SELECT_ACTION="请选择操作:" +BOT_TG_SELECT_FILE="请选择需要上传或下载的具体文件:" +BOT_TG_BTN_START="✈️ 启用劫持" +BOT_TG_BTN_PURE="💧 纯净模式" +BOT_TG_BTN_RESTART="🕹 重启服务" +BOT_TG_BTN_LOG="📄 查看日志" +BOT_TG_BTN_TRANSFER="🔃 文件传输" +BOT_TG_BTN_GET_LOG="📥 下载日志" +BOT_TG_BTN_GET_BAK="💾 备份设置" +BOT_TG_BTN_GET_CFG="⬇️ 下载配置" +BOT_TG_BTN_UP_CORE="🪐 上传内核" +BOT_TG_BTN_UP_BAK="🔄 还原设置" +BOT_TG_BTN_UP_CFG="⬆️ 上传配置" +BOT_TG_NO_CURL="⚠️ 因当前设备缺少curl应用,仅支持上传功能!" +BOT_TG_UPLOAD_OK="成功!即将重启服务!" +BOT_TG_UPLOAD_FAIL="失败,请仔细检查文件或重试!" +BOT_TG_CORE_UPDATE="内核更新" +BOT_TG_CFG_RESTORED="配置文件已还原,请手动重启服务!" +BOT_TG_RESTORE_FAIL="解压还原失败,请仔细检查文件或重试!" +BOT_TG_CFG_UPLOADED="配置文件已上传,请手动重启服务!" +BOT_TG_UPLOAD_FAIL2="上传失败,请仔细检查文件或重试!" +BOT_TG_NET_UPLOAD_FAIL="网络错误,上传失败!请重试!" +BOT_TG_FILE_FORMAT_FAIL="文件格式不匹配,上传失败!" +BOT_TG_FW_ENABLED="ShellCrash 透明路由" +BOT_TG_FW_ENABLED_SUFFIX="已启用!" +BOT_TG_SWITCH_PURE="已切换到纯净模式!" +BOT_TG_SERVICE_RESTARTED="ShellCrash 服务已重启!" +BOT_TG_UNFINISHED="错误,还未完成的功能!" +BOT_TG_SEND_CORE="请发送需要上传的内核,必须是以tar.gz,.gz或.upx结尾的【" +BOT_TG_SEND_CORE_SUFFIX="】内核!" +BOT_TG_SEND_BAK="请发送需要还原的备份文件,必须是【.tar.gz】格式!" +BOT_TG_SEND_CFG="请发送需要上传的配置文件,必须是【" +BOT_TG_SEND_CFG_SUFFIX="】格式,支持自定义配置文件" +BOT_TG_SWITCH_TO="已切换到" +BOT_TG_ALREADY="当前已经是" +BOT_TG_ALREADY_PURE="当前已经是纯净模式!" +BOT_TG_SERVICE_RESTARTED_SHORT="🔄 服务已重启" +BOT_TG_LOG_CONTENT="📄 日志内容如下(已过滤任务日志):" +BOT_TG_TASK_WORD="任务" +BOT_TG_INPUT_SUB="✏ 请输入新的订阅链接:" +BOT_TG_SUB_UPDATED="订阅更新完成:" diff --git a/scripts/lang/chs/check_port.lang b/scripts/lang/chs/check_port.lang new file mode 100644 index 00000000..f3dd377e --- /dev/null +++ b/scripts/lang/chs/check_port.lang @@ -0,0 +1,3 @@ +CHECK_PORT_RANGE_ERR="输入错误!请输入正确的数值(1-65535)!" +CHECK_PORT_DUP_ERR="输入错误!请不要输入重复的端口!" +CHECK_PORT_OCCUPIED_ERR="当前端口已被其他进程占用,请重新输入!" diff --git a/scripts/lang/chs/ddns.lang b/scripts/lang/chs/ddns.lang new file mode 100644 index 00000000..1240b036 --- /dev/null +++ b/scripts/lang/chs/ddns.lang @@ -0,0 +1,35 @@ +DDNS_WELCOME="欢迎使用DDNS!" +DDNS_ADD_DONE="服务已经添加!" +DDNS_INPUT_DOMAIN="请输入你的域名" +DDNS_INPUT_USER="请输入用户名或邮箱" +DDNS_INPUT_PASS="请输入密码或令牌秘钥" +DDNS_INPUT_CHECK_INTERVAL="请输入检测更新间隔(单位:分钟;默认为10)" +DDNS_INPUT_FORCE_INTERVAL="请输入强制更新间隔(单位:小时;默认为24)" +DDNS_CONFIRM_INFO="请核对如下信息:" +DDNS_FIELD_SERVICE="服务商:" +DDNS_FIELD_DOMAIN="域名:" +DDNS_FIELD_USER="用户名:" +DDNS_FIELD_INTERVAL="检测间隔:" +DDNS_CONFIRM_ADD="是否确认添加:" +DDNS_YES="是" +DDNS_REINPUT="否,重新輸入" +DDNS_LIST_NOT_FOUND="未找到DDNS列表文件,尝试在线获取……" +DDNS_DOWNLOAD_FAILED="下载失败,请重试!" +DDNS_SELECT_PROVIDER="请选择服务提供商:" +DDNS_INPUT_ERROR="输入错误,请重新输入!" +DDNS_SELECT_NETMODE="请选择网络模式:" +DDNS_IPV4="IPV4" +DDNS_IPV6="IPV6" +DDNS_DISABLE="停用" +DDNS_ENABLE="启用" +DDNS_UPDATE_NOW="立即更新" +DDNS_EDIT_CURRENT="编辑当前服务" +DDNS_CURRENT_SERVICE="当前服务" +DDNS_REMOVE_CURRENT="移除当前服务" +DDNS_VIEW_LOG="查看运行日志" +DDNS_NOT_SUPPORTED="本脚本依赖OpenWrt内置的DDNS服务,当前设备无法运行,已退出!" +DDNS_LIST_HEADER=" 列表 域名 启用 IP地址" +DDNS_ADD_SERVICE="添加DDNS服务" +DDNS_EXIT="退出" +DDNS_INPUT_INDEX="请输入对应序号" +DDNS_INPUT_NUM_ERROR="请输入正确数字!" diff --git a/scripts/lang/chs/providers.lang b/scripts/lang/chs/providers.lang new file mode 100644 index 00000000..f92e2ce1 --- /dev/null +++ b/scripts/lang/chs/providers.lang @@ -0,0 +1,25 @@ +PROVIDERS_MENU_GEN="生成包含全部提供者的配置文件" +PROVIDERS_MENU_TEMPLATE="选择\033[33m规则模版\033[0m" +PROVIDERS_MENU_CLEAN="\033[33m清理\033[0mproviders目录文件" +PROVIDERS_INPUT="请输入对应字母或数字" + +PROVIDERS_EMPTY_HINT="你还未添加链接或本地配置文件,请先添加!" +PROVIDERS_TEMPLATE_CURRENT="当前规则模版为:" +PROVIDERS_TEMPLATE_SELECT="请选择在线模版:" +PROVIDERS_TEMPLATE_LOCAL="使用\033[36m本地模版\033[0m" +PROVIDERS_TEMPLATE_PATH="请输入模版的路径(绝对路径)" +PROVIDERS_TEMPLATE_NOT_FOUND="输入错误,找不到对应模版文件!" + +PROVIDERS_CLEAN_WARN="将清空" +PROVIDERS_CLEAN_WARN_END="目录下所有内容" +PROVIDERS_CLEAN_CONFIRM="是否继续?" + +PROVIDERS_FETCHING_TEMPLATE="正在获取在线模版......" +PROVIDERS_DOWNLOAD_FAILED="下载失败,请尝试更换安装源!" +PROVIDERS_GEN_OK="配置文件生成成功!" +PROVIDERS_GEN_OK_SINGBOX="配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!" +PROVIDERS_GEN_FAILED="生成配置文件出错,请仔细检查输入!" +PROVIDERS_RESTART_ASK="是否立即启动/重启服务?" +PROVIDERS_YES="是" +PROVIDERS_NO="否" +PROVIDERS_CRON_SUB_UPDATE="更新订阅" diff --git a/scripts/lang/chs/set_crashdir.lang b/scripts/lang/chs/set_crashdir.lang new file mode 100644 index 00000000..0ba99bbe --- /dev/null +++ b/scripts/lang/chs/set_crashdir.lang @@ -0,0 +1,34 @@ +SCD_SELECT_INSTALL_DIR="请选择安装目录:" +SCD_INPUT_NUM="请输入相应数字" +SCD_INPUT_ERROR="输入错误!请重新设置!" +SCD_XIAOMI_DETECTED="检测到当前设备为小米官方系统,请选择安装位置:" +SCD_CUSTOM_DIR_WARN="自定义目录(不推荐,不明勿用!)" +SCD_EXIT_INSTALL="退出安装" +SCD_SELECT_USB_DIR="请选择U盘目录:" +SCD_ASUS_DM_NOT_FOUND="未找到下载大师自启文件:" +SCD_CHECK_SETTING="请检查设置!" +SCD_ASUS_DETECTED="检测到当前设备为华硕固件,请选择安装方式" +SCD_ASUS_INSTALL_DM="基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)" +SCD_ASUS_INSTALL_SCRIPT="基于自启脚本安装(仅持部分梅林固件)" +SCD_ASUS_DM_HINT="请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!" +SCD_ASUS_REINSTALL_HINT="如开机无法正常自启,请重新使用U盘+下载大师安装!" +SCD_PATH_FORMAT_HINT="路径是必须带 / 的格式,注意写入虚拟内存(/tmp,/opt,/sys...)的文件会在重启后消失!" +SCD_PATH_FREE_SPACE="可用路径 剩余空间:" +SCD_INPUT_CUSTOM_DIR="请输入自定义路径" +SCD_PATH_ERROR="路径错误!请重新设置!" +SCD_INSTALL_SPACE_HINT="注意:安装ShellCrash至少需要预留约1MB的磁盘空间" +SCD_INSTALL_ETC="在\033[32m/etc目录\033[0m下安装(适合root用户)" +SCD_INSTALL_USR="在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)" +SCD_INSTALL_HOME="在\033[32m当前用户目录\033[0m下安装(适合非root用户)" +SCD_INSTALL_USB="在\033[32m外置存储\033[0m中安装" +SCD_INSTALL_MANUAL="手动设置安装目录" +SCD_INSTALL_CANCELED="安装已取消" +SCD_NO_WRITE_PREFIX="没有" +SCD_NO_WRITE_SUFFIX="目录写入权限!请重新设置!" +SCD_TARGET_DIR_PREFIX="目标目录" +SCD_TARGET_DIR_SPACE="空间剩余:" +SCD_CONFIRM_INSTALL="是否确认安装?" +SCD_YES="是" +SCD_NO="否" +SCD_DIR_FREE="目录,剩余空间:" +SCD_SOFT_SOLID="(支持软固化功能)" diff --git a/scripts/lang/chs/subconverter.lang b/scripts/lang/chs/subconverter.lang new file mode 100644 index 00000000..1b99a0ec --- /dev/null +++ b/scripts/lang/chs/subconverter.lang @@ -0,0 +1,33 @@ +SUBCONVERTER_MENU_GEN="生成包含全部节点、订阅的配置文件" +SUBCONVERTER_MENU_EXCLUDE="设置\033[31m排除节点正则\033[0m" +SUBCONVERTER_MENU_INCLUDE="设置\033[32m包含节点正则\033[0m" +SUBCONVERTER_MENU_RULE="选择\033[33m在线规则模版\033[0m" +SUBCONVERTER_MENU_SERVER="选择Subconverter服务器" +SUBCONVERTER_MENU_UA="自定义浏览器UA" + +SUBCONVERTER_INPUT="请输入" +SUBCONVERTER_BACK="或输入 0 返回上级菜单" + +SUBCONVERTER_EXCLUDE_HINT1="匹配关键字的节点会在导入时被【屏蔽】!" +SUBCONVERTER_INCLUDE_HINT1="仅有匹配关键字的节点才会被【导入】!!!" +SUBCONVERTER_KEYWORD_SPLIT="多个关键字可以用\033[30;47m | \033[0m号分隔" +SUBCONVERTER_REGEX_HINT="\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代" +SUBCONVERTER_EXCLUDE_INPUT="请直接输入节点过滤关键字" +SUBCONVERTER_INCLUDE_INPUT="请直接输入节点匹配关键字" +SUBCONVERTER_EXCLUDE_CLEAR="或输入 d \033[31m清空\033[0m节点过滤关键字" +SUBCONVERTER_INCLUDE_CLEAR="或输入 d \033[31m清空\033[0m节点匹配关键字" + +SUBCONVERTER_RULE_CURRENT="当前使用规则为:" +SUBCONVERTER_SERVER_HINT="以下为互联网采集的第三方服务器,具体安全性请自行斟酌!" +SUBCONVERTER_SERVER_THANKS="感谢以下作者的无私奉献!!!" +SUBCONVERTER_SERVER_CURRENT="当前使用后端为:" +SUBCONVERTER_SET_OK="设置成功!返回上级菜单" + +SUBCONVERTER_UA_HINT="无法正确获取配置文件时可尝试使用" +SUBCONVERTER_UA_CURRENT="当前UA:" +SUBCONVERTER_UA_AUTO="使用自动UA(默认)" +SUBCONVERTER_UA_NONE="不使用UA" +SUBCONVERTER_UA_CUSTOM="使用自定义UA" +SUBCONVERTER_UA_CLEAR="清空UA" +SUBCONVERTER_UA_CUSTOM_WARN="注意:\n自定义UA不可包含空格或特殊符号!" +SUBCONVERTER_UA_CUSTOM_INPUT="请直接输入自定义UA" diff --git a/scripts/lang/chs/task_cmd.lang b/scripts/lang/chs/task_cmd.lang new file mode 100644 index 00000000..a4148521 --- /dev/null +++ b/scripts/lang/chs/task_cmd.lang @@ -0,0 +1,19 @@ +TASK_CMD_EVERY="每隔" +TASK_CMD_HOURLY="时每" +TASK_CMD_MIN="分钟" +TASK_CMD_CORE_SKIP="任务【自动更新内核】中止-未检测到版本更新" +TASK_CMD_CORE_DONE="任务【自动更新内核】下载完成,正在重启服务!" +TASK_CMD_CORE_DL_FAIL="任务【自动更新内核】出错-下载失败!" +TASK_CMD_CORE_VERIFY_FAIL="任务【自动更新内核】出错-内核校验失败!" +TASK_CMD_SCRIPT_SKIP="任务【自动更新脚本】中止-未检测到版本更新" +TASK_CMD_SCRIPT_UNZIP_FAIL="任务【自动更新脚本】出错-解压失败!" +TASK_CMD_DB_SKIP_PREFIX="任务【自动更新数据库文件】跳过-未检测到" +TASK_CMD_DB_SKIP_SUFFIX="版本更新" +TASK_CMD_DB_DL_FAIL_PREFIX="任务【自动更新数据库文件】更新【" +TASK_CMD_DB_DL_FAIL_SUFFIX="】下载失败!" +TASK_CMD_DB_OK_PREFIX="任务【自动更新数据库文件】更新【" +TASK_CMD_DB_OK_SUFFIX="】成功!" +TASK_CMD_RES_OK="成功" +TASK_CMD_RES_FAIL="失败" +TASK_CMD_EXEC_PREFIX="任务【" +TASK_CMD_EXEC_MID="】执行" diff --git a/scripts/lang/chs/uninstall.lang b/scripts/lang/chs/uninstall.lang new file mode 100644 index 00000000..53267d7a --- /dev/null +++ b/scripts/lang/chs/uninstall.lang @@ -0,0 +1,13 @@ +UNINSTALL_WARN="警告:该操作不可逆!" +UNINSTALL_CONFIRM="是否确认卸载ShellCrash?" +UNINSTALL_YES="是" +UNINSTALL_NO="否" +UNINSTALL_KEEP_CONFIRM="是否保留脚本配置及订阅文件?" +UNINSTALL_ENV_ERROR="环境变量配置有误,请尝试手动移除安装目录!" +UNINSTALL_DONE="已卸载ShellCrash相关文件!有缘再会!" +UNINSTALL_CLOSE_HINT="请手动关闭当前窗口以重置环境变量!" +UNINSTALL_CANCELED="操作已取消!" +UNINSTALL_CRON_CLASH="clash服务" +UNINSTALL_CRON_SUB="订阅链接" +UNINSTALL_CRON_INIT="ShellCrash初始化" +UNINSTALL_SSH_MARK="启用外网访问SSH服务" diff --git a/scripts/lang/en/bot_tg.lang b/scripts/lang/en/bot_tg.lang new file mode 100644 index 00000000..0e86697e --- /dev/null +++ b/scripts/lang/en/bot_tg.lang @@ -0,0 +1,68 @@ +BOT_TG_PRIVATE_HINT="Please apply for a Telegram bot via \033[32;4mhttps://t.me/BotFather\033[0m and get its \033[36mAPI TOKEN\033[0m first" +BOT_TG_INPUT_TOKEN="Please enter your API TOKEN" +BOT_TG_PRIVATE_TOP="Please send to \033[32myour bot\033[33m, NOT BotFather!\033[0m" +BOT_TG_PUBLIC_HINT="Please message the bot: \033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m" +BOT_TG_SET_DONE="Telegram log push has been configured!" +BOT_TG_CHATID_RETRY_PREFIX="Attempt" +BOT_TG_CHATID_RETRY_SUFFIX="to get chat ID failed, retrying..." +BOT_TG_SEND_KEY="Send this key:" +BOT_TG_SENT_CONFIRM="I have sent it" +BOT_TG_CHATID_FAIL="Unable to get chat ID. Please reconfigure or input ChatID manually!" +BOT_TG_CHATID_MANUAL_HINT="Usually visit" +BOT_TG_CHATID_MANUAL_HINT2="to find ChatID" +BOT_TG_INPUT_CHATID="Please input ChatID manually" +BOT_TG_CHATID_RECONFIG="Unable to get chat ID. Please reconfigure!" +BOT_TG_CRON_NAME="TG_BOT watchdog" + +BOT_TG_HELP_GROUP="Group chat:" +BOT_TG_HELP_PROJECT="Project:" +BOT_TG_HELP_GUIDE="Guide:" +BOT_TG_HELP_COFFEE="Buy me a coffee:" +BOT_TG_HELP_AIRPORT="Partner provider:" +BOT_TG_RUN_ON="🟢Running" +BOT_TG_RUN_OFF="🟡Stopped" +BOT_TG_WELCOME="Welcome to ShellCrash!" +BOT_TG_SERVICE=" service " +BOT_TG_MEM_USED="Memory usage: " +BOT_TG_RUNNING_TIME="Running: " +BOT_TG_SELECT_ACTION="Please choose:" +BOT_TG_SELECT_FILE="Please choose file upload/download action:" +BOT_TG_BTN_START="✈️ Enable redirect" +BOT_TG_BTN_PURE="💧 Pure mode" +BOT_TG_BTN_RESTART="🕹 Restart service" +BOT_TG_BTN_LOG="📄 View logs" +BOT_TG_BTN_TRANSFER="🔃 File transfer" +BOT_TG_BTN_GET_LOG="📥 Download log" +BOT_TG_BTN_GET_BAK="💾 Backup settings" +BOT_TG_BTN_GET_CFG="⬇️ Download config" +BOT_TG_BTN_UP_CORE="🪐 Upload core" +BOT_TG_BTN_UP_BAK="🔄 Restore settings" +BOT_TG_BTN_UP_CFG="⬆️ Upload config" +BOT_TG_NO_CURL="⚠️ curl is missing on this device, only upload is supported!" +BOT_TG_UPLOAD_OK="success! Service will restart soon!" +BOT_TG_UPLOAD_FAIL="failed, please check file and retry!" +BOT_TG_CORE_UPDATE="Core update " +BOT_TG_CFG_RESTORED="Config restored, please restart service manually!" +BOT_TG_RESTORE_FAIL="Restore failed while extracting backup, please retry!" +BOT_TG_CFG_UPLOADED="Config uploaded, please restart service manually!" +BOT_TG_UPLOAD_FAIL2="Upload failed, please retry!" +BOT_TG_NET_UPLOAD_FAIL="Network error, upload failed! Please retry!" +BOT_TG_FILE_FORMAT_FAIL="File format mismatch, upload failed!" +BOT_TG_FW_ENABLED="ShellCrash redirect mode " +BOT_TG_FW_ENABLED_SUFFIX=" enabled!" +BOT_TG_SWITCH_PURE="Switched to pure mode!" +BOT_TG_SERVICE_RESTARTED="ShellCrash service restarted!" +BOT_TG_UNFINISHED="Error: unfinished feature!" +BOT_TG_SEND_CORE="Please send core file ending with tar.gz/.gz/.upx for [" +BOT_TG_SEND_CORE_SUFFIX="]" +BOT_TG_SEND_BAK="Please send backup file in [.tar.gz] format!" +BOT_TG_SEND_CFG="Please send config file in [" +BOT_TG_SEND_CFG_SUFFIX="] format, custom config is supported" +BOT_TG_SWITCH_TO="Switched to " +BOT_TG_ALREADY="Already in " +BOT_TG_ALREADY_PURE="Already in pure mode!" +BOT_TG_SERVICE_RESTARTED_SHORT="🔄 Service restarted" +BOT_TG_LOG_CONTENT="📄 Logs (task logs filtered):" +BOT_TG_TASK_WORD="Task" +BOT_TG_INPUT_SUB="✏ Please enter new subscription URL:" +BOT_TG_SUB_UPDATED="Subscription update finished:" diff --git a/scripts/lang/en/check_port.lang b/scripts/lang/en/check_port.lang new file mode 100644 index 00000000..2e14ca8a --- /dev/null +++ b/scripts/lang/en/check_port.lang @@ -0,0 +1,3 @@ +CHECK_PORT_RANGE_ERR="Invalid input! Please enter a valid value (1-65535)!" +CHECK_PORT_DUP_ERR="Invalid input! Please do not enter duplicate ports!" +CHECK_PORT_OCCUPIED_ERR="This port is already occupied by another process. Please enter a different one!" diff --git a/scripts/lang/en/ddns.lang b/scripts/lang/en/ddns.lang new file mode 100644 index 00000000..e97c91b0 --- /dev/null +++ b/scripts/lang/en/ddns.lang @@ -0,0 +1,35 @@ +DDNS_WELCOME="Welcome to DDNS!" +DDNS_ADD_DONE="Service has been added!" +DDNS_INPUT_DOMAIN="Please enter your domain" +DDNS_INPUT_USER="Please enter username or email" +DDNS_INPUT_PASS="Please enter password or token" +DDNS_INPUT_CHECK_INTERVAL="Please enter check interval (minutes, default 10)" +DDNS_INPUT_FORCE_INTERVAL="Please enter force update interval (hours, default 24)" +DDNS_CONFIRM_INFO="Please confirm the following info:" +DDNS_FIELD_SERVICE="Provider:" +DDNS_FIELD_DOMAIN="Domain:" +DDNS_FIELD_USER="Username:" +DDNS_FIELD_INTERVAL="Check interval:" +DDNS_CONFIRM_ADD="Confirm add:" +DDNS_YES="Yes" +DDNS_REINPUT="No, re-enter" +DDNS_LIST_NOT_FOUND="DDNS list file not found, trying online update..." +DDNS_DOWNLOAD_FAILED="Download failed, please retry!" +DDNS_SELECT_PROVIDER="Please select provider:" +DDNS_INPUT_ERROR="Invalid input, please retry!" +DDNS_SELECT_NETMODE="Please select network mode:" +DDNS_IPV4="IPV4" +DDNS_IPV6="IPV6" +DDNS_DISABLE="Disable" +DDNS_ENABLE="Enable" +DDNS_UPDATE_NOW="Update now" +DDNS_EDIT_CURRENT="Edit current service" +DDNS_CURRENT_SERVICE=" current service" +DDNS_REMOVE_CURRENT="Remove current service" +DDNS_VIEW_LOG="View logs" +DDNS_NOT_SUPPORTED="This feature depends on OpenWrt built-in DDNS service; unsupported on current device." +DDNS_LIST_HEADER=" List Domain On IP Address" +DDNS_ADD_SERVICE="Add DDNS service" +DDNS_EXIT="Exit" +DDNS_INPUT_INDEX="Please enter index" +DDNS_INPUT_NUM_ERROR="Please enter a valid number!" diff --git a/scripts/lang/en/providers.lang b/scripts/lang/en/providers.lang new file mode 100644 index 00000000..ab2d2f1a --- /dev/null +++ b/scripts/lang/en/providers.lang @@ -0,0 +1,25 @@ +PROVIDERS_MENU_GEN="Generate config including all providers" +PROVIDERS_MENU_TEMPLATE="Select \033[33mrule template\033[0m" +PROVIDERS_MENU_CLEAN="\033[33mClean\033[0m providers directory" +PROVIDERS_INPUT="Please enter a letter or number" + +PROVIDERS_EMPTY_HINT="No link or local config file has been added yet. Please add one first!" +PROVIDERS_TEMPLATE_CURRENT="Current rule template: " +PROVIDERS_TEMPLATE_SELECT="Please select an online template:" +PROVIDERS_TEMPLATE_LOCAL="Use \033[36mlocal template\033[0m" +PROVIDERS_TEMPLATE_PATH="Please enter template path (absolute path)" +PROVIDERS_TEMPLATE_NOT_FOUND="Invalid input, template file not found!" + +PROVIDERS_CLEAN_WARN="This will clear all files under" +PROVIDERS_CLEAN_WARN_END="" +PROVIDERS_CLEAN_CONFIRM="Continue?" + +PROVIDERS_FETCHING_TEMPLATE="Fetching online template..." +PROVIDERS_DOWNLOAD_FAILED="Download failed. Please try switching install source!" +PROVIDERS_GEN_OK="Configuration file generated successfully!" +PROVIDERS_GEN_OK_SINGBOX="Configuration generated successfully! If startup times out, install the Singbox-srs common database package from Update menu." +PROVIDERS_GEN_FAILED="Failed to generate configuration file. Please check your input carefully!" +PROVIDERS_RESTART_ASK="Start/Restart service now?" +PROVIDERS_YES="Yes" +PROVIDERS_NO="No" +PROVIDERS_CRON_SUB_UPDATE="Update subscription" diff --git a/scripts/lang/en/set_crashdir.lang b/scripts/lang/en/set_crashdir.lang new file mode 100644 index 00000000..b4229521 --- /dev/null +++ b/scripts/lang/en/set_crashdir.lang @@ -0,0 +1,34 @@ +SCD_SELECT_INSTALL_DIR="Please select install directory:" +SCD_INPUT_NUM="Please enter a number" +SCD_INPUT_ERROR="Invalid input! Please retry!" +SCD_XIAOMI_DETECTED="Xiaomi stock firmware detected, select installation location:" +SCD_CUSTOM_DIR_WARN="Custom directory (not recommended)" +SCD_EXIT_INSTALL="Exit installation" +SCD_SELECT_USB_DIR="Please select USB directory:" +SCD_ASUS_DM_NOT_FOUND="Download Master startup file not found:" +SCD_CHECK_SETTING="please check your settings!" +SCD_ASUS_DETECTED="Asus firmware detected, please select installation method" +SCD_ASUS_INSTALL_DM="Install via USB + Download Master (all firmwares, ARM only)" +SCD_ASUS_INSTALL_SCRIPT="Install via startup script (some Merlin firmwares only)" +SCD_ASUS_DM_HINT="Install and enable Download Master in router web UI first, then select external storage directory." +SCD_ASUS_REINSTALL_HINT="If boot auto-start fails, please reinstall with USB + Download Master." +SCD_PATH_FORMAT_HINT="Path must start with /. Files under virtual memory (/tmp,/opt,/sys...) will be lost after reboot!" +SCD_PATH_FREE_SPACE="Available paths free space:" +SCD_INPUT_CUSTOM_DIR="Please input custom path" +SCD_PATH_ERROR="Invalid path! Please retry!" +SCD_INSTALL_SPACE_HINT="Notice: ShellCrash requires at least ~1MB free space" +SCD_INSTALL_ETC="Install in \033[32m/etc\033[0m (root users)" +SCD_INSTALL_USR="Install in \033[32m/usr/share\033[0m (Linux systems)" +SCD_INSTALL_HOME="Install in \033[32mcurrent user dir\033[0m (non-root users)" +SCD_INSTALL_USB="Install in \033[32mexternal storage\033[0m" +SCD_INSTALL_MANUAL="Set install directory manually" +SCD_INSTALL_CANCELED="Installation canceled" +SCD_NO_WRITE_PREFIX="No write permission on " +SCD_NO_WRITE_SUFFIX=", please retry!" +SCD_TARGET_DIR_PREFIX="Target directory " +SCD_TARGET_DIR_SPACE=" free space: " +SCD_CONFIRM_INSTALL="Confirm installation?" +SCD_YES="Yes" +SCD_NO="No" +SCD_DIR_FREE=" dir, free: " +SCD_SOFT_SOLID="(supports soft solidification)" diff --git a/scripts/lang/en/subconverter.lang b/scripts/lang/en/subconverter.lang new file mode 100644 index 00000000..7761f82b --- /dev/null +++ b/scripts/lang/en/subconverter.lang @@ -0,0 +1,33 @@ +SUBCONVERTER_MENU_GEN="Generate config including all nodes and subscriptions" +SUBCONVERTER_MENU_EXCLUDE="Set \033[31mexclude node regex\033[0m" +SUBCONVERTER_MENU_INCLUDE="Set \033[32minclude node regex\033[0m" +SUBCONVERTER_MENU_RULE="Select \033[33monline rule template\033[0m" +SUBCONVERTER_MENU_SERVER="Select Subconverter server" +SUBCONVERTER_MENU_UA="Custom browser UA" + +SUBCONVERTER_INPUT="Please enter" +SUBCONVERTER_BACK="or enter 0 to return" + +SUBCONVERTER_EXCLUDE_HINT1="Nodes matching keywords will be blocked during import!" +SUBCONVERTER_INCLUDE_HINT1="Only nodes matching keywords will be imported!!!" +SUBCONVERTER_KEYWORD_SPLIT="Use \033[30;47m | \033[0m to separate multiple keywords" +SUBCONVERTER_REGEX_HINT="\033[32mRegex is supported\033[0m. Use \033[30;47m + \033[0m instead of spaces" +SUBCONVERTER_EXCLUDE_INPUT="Enter exclude keyword(s) directly" +SUBCONVERTER_INCLUDE_INPUT="Enter include keyword(s) directly" +SUBCONVERTER_EXCLUDE_CLEAR="or enter d to \033[31mclear\033[0m exclude keywords" +SUBCONVERTER_INCLUDE_CLEAR="or enter d to \033[31mclear\033[0m include keywords" + +SUBCONVERTER_RULE_CURRENT="Current rule: " +SUBCONVERTER_SERVER_HINT="The following third-party servers are collected from the internet. Please evaluate their security by yourself!" +SUBCONVERTER_SERVER_THANKS="Thanks to the contributors below for their great work!!!" +SUBCONVERTER_SERVER_CURRENT="Current backend: " +SUBCONVERTER_SET_OK="Settings saved. Returning to previous menu" + +SUBCONVERTER_UA_HINT="Try this if the config file cannot be fetched correctly" +SUBCONVERTER_UA_CURRENT="Current UA: " +SUBCONVERTER_UA_AUTO="Use auto UA (default)" +SUBCONVERTER_UA_NONE="Do not use UA" +SUBCONVERTER_UA_CUSTOM="Use custom UA" +SUBCONVERTER_UA_CLEAR="Clear UA" +SUBCONVERTER_UA_CUSTOM_WARN="Note:\nCustom UA cannot contain spaces or special symbols!" +SUBCONVERTER_UA_CUSTOM_INPUT="Enter custom UA" diff --git a/scripts/lang/en/task_cmd.lang b/scripts/lang/en/task_cmd.lang new file mode 100644 index 00000000..ab93d80c --- /dev/null +++ b/scripts/lang/en/task_cmd.lang @@ -0,0 +1,19 @@ +TASK_CMD_EVERY="every" +TASK_CMD_HOURLY="hourly" +TASK_CMD_MIN="minute" +TASK_CMD_CORE_SKIP="Task [Auto update core] skipped - no new version detected" +TASK_CMD_CORE_DONE="Task [Auto update core] download complete, restarting service" +TASK_CMD_CORE_DL_FAIL="Task [Auto update core] failed - download error" +TASK_CMD_CORE_VERIFY_FAIL="Task [Auto update core] failed - core verification error" +TASK_CMD_SCRIPT_SKIP="Task [Auto update script] skipped - no new version detected" +TASK_CMD_SCRIPT_UNZIP_FAIL="Task [Auto update script] failed - extract error" +TASK_CMD_DB_SKIP_PREFIX="Task [Auto update database] skipped - no new version for " +TASK_CMD_DB_SKIP_SUFFIX="" +TASK_CMD_DB_DL_FAIL_PREFIX="Task [Auto update database] failed downloading [" +TASK_CMD_DB_DL_FAIL_SUFFIX="]" +TASK_CMD_DB_OK_PREFIX="Task [Auto update database] updated [" +TASK_CMD_DB_OK_SUFFIX="] successfully" +TASK_CMD_RES_OK="success" +TASK_CMD_RES_FAIL="failed" +TASK_CMD_EXEC_PREFIX="Task [" +TASK_CMD_EXEC_MID="] result: " diff --git a/scripts/lang/en/uninstall.lang b/scripts/lang/en/uninstall.lang new file mode 100644 index 00000000..3d2f1ede --- /dev/null +++ b/scripts/lang/en/uninstall.lang @@ -0,0 +1,13 @@ +UNINSTALL_WARN="Warning: this action is irreversible!" +UNINSTALL_CONFIRM="Are you sure you want to uninstall ShellCrash?" +UNINSTALL_YES="Yes" +UNINSTALL_NO="No" +UNINSTALL_KEEP_CONFIRM="Keep script configs and subscription files?" +UNINSTALL_ENV_ERROR="Environment variable configuration is incorrect. Please remove the installation directory manually!" +UNINSTALL_DONE="ShellCrash related files have been removed. Goodbye!" +UNINSTALL_CLOSE_HINT="Please close the current terminal window manually to reset environment variables!" +UNINSTALL_CANCELED="Operation canceled!" +UNINSTALL_CRON_CLASH="clash service" +UNINSTALL_CRON_SUB="subscription link" +UNINSTALL_CRON_INIT="ShellCrash initialization" +UNINSTALL_SSH_MARK="Enable SSH access from WAN" diff --git a/scripts/menus/bot_tg.sh b/scripts/menus/bot_tg.sh index c3ac471f..09052d7b 100644 --- a/scripts/menus/bot_tg.sh +++ b/scripts/menus/bot_tg.sh @@ -4,10 +4,13 @@ . "$CRASHDIR"/libs/web_json.sh . "$CRASHDIR"/libs/set_config.sh . "$CRASHDIR"/libs/web_get_lite.sh +. "$CRASHDIR"/libs/i18n.sh . "$CRASHDIR"/menus/running_status.sh . "$CRASHDIR"/configs/gateway.cfg . "$CRASHDIR"/configs/ShellCrash.cfg +load_lang bot_tg + TMPDIR='/tmp/ShellCrash' API="https://api.telegram.org/bot$TG_TOKEN" STATE_FILE="$TMPDIR/tgbot_state" @@ -32,15 +35,15 @@ send_msg(){ } send_help(){ TEXT=$(cat </dev/null 2>&1;then CURL_KB=$(cat < "$LOGFILE" + echo "$BOT_TG_FW_ENABLED*$redir_mod_bf*$BOT_TG_FW_ENABLED_SUFFIX" > "$LOGFILE" } do_stop_fw(){ redir_mod_bf=$redir_mod firewall_area=4 setconfig firewall_area 4 "$CRASHDIR"/start.sh stop_firewall - echo "ShellCrash 已切换到纯净模式!" > "$LOGFILE" + echo "$BOT_TG_SWITCH_PURE" > "$LOGFILE" } do_restart(){ "$CRASHDIR"/start.sh restart - echo "ShellCrash 服务已重启!" > "$LOGFILE" + echo "$BOT_TG_SERVICE_RESTARTED" > "$LOGFILE" } do_set_sub(){ #echo "$1" "$2" >> "$CRASHDIR"/configs/providers.cfg - echo "错误,还未完成的功能!" > "$LOGFILE" + echo "$BOT_TG_UNFINISHED" > "$LOGFILE" } transport(){ #文件传输 @@ -204,15 +207,15 @@ transport(){ #文件传输 ;; "ts_up_core") FILE_TYPE=1 - send_msg "请发送需要上传的内核,必须是以tar.gz,.gz或.upx结尾的【${corename}】内核!" + send_msg "$BOT_TG_SEND_CORE ${corename} $BOT_TG_SEND_CORE_SUFFIX" ;; "ts_up_bak") FILE_TYPE=2 - send_msg "请发送需要还原的备份文件,必须是【.tar.gz】格式!" + send_msg "$BOT_TG_SEND_BAK" ;; "ts_up_ccf") FILE_TYPE=3 - send_msg "请发送需要上传的配置文件,必须是【.${config_type}】格式,支持自定义配置文件" + send_msg "$BOT_TG_SEND_CFG .${config_type} $BOT_TG_SEND_CFG_SUFFIX" ;; esac } @@ -246,9 +249,9 @@ polling(){ "start_redir") if [ "$firewall_area" = 4 ];then do_start_fw - send_msg "已切换到$redir_mod_bf!" + send_msg "$BOT_TG_SWITCH_TO$redir_mod_bf!" else - send_msg "当前已经是$redir_mod!" + send_msg "$BOT_TG_ALREADY$redir_mod!" fi send_menu continue @@ -256,22 +259,22 @@ polling(){ "stop_redir") if [ "$firewall_area" != 4 ];then do_stop_fw - send_msg "已切换到纯净模式" + send_msg "$BOT_TG_SWITCH_PURE" else - send_msg "当前已经是纯净模式!" + send_msg "$BOT_TG_ALREADY_PURE" fi send_menu continue ;; "restart") do_restart - send_msg "🔄 服务已重启" + send_msg "$BOT_TG_SERVICE_RESTARTED_SHORT" sleep 10 send_menu continue ;; "readlog") - send_msg "📄 日志内容如下(已过滤任务日志):\n\`\`\`$(grep -v '任务' $TMPDIR/ShellCrash.log |tail -n 20)\`\`\`" + send_msg "$BOT_TG_LOG_CONTENT\n\`\`\`$(grep -v "$BOT_TG_TASK_WORD" $TMPDIR/ShellCrash.log |tail -n 20)\`\`\`" sleep 3 send_menu continue @@ -282,7 +285,7 @@ polling(){ ;; "set_sub") echo "await_sub" > "$STATE_FILE" - send_msg "✏ 请输入新的订阅链接:" + send_msg "$BOT_TG_INPUT_SUB" continue ;; ts_*) @@ -298,7 +301,7 @@ polling(){ if [ "$(cat "$STATE_FILE" 2>/dev/null)" = "await_sub" ]; then echo "" > "$STATE_FILE" do_set_sub "$TEXT" - send_msg "订阅更新完成:\n$(cat "$LOGFILE")" + send_msg "$BOT_TG_SUB_UPDATED\n$(cat "$LOGFILE")" send_menu continue fi diff --git a/scripts/menus/bot_tg_bind.sh b/scripts/menus/bot_tg_bind.sh index 1280ab48..7b81a5f2 100644 --- a/scripts/menus/bot_tg_bind.sh +++ b/scripts/menus/bot_tg_bind.sh @@ -2,16 +2,18 @@ . "$CRASHDIR"/libs/web_get_lite.sh +load_lang bot_tg + private_bot() { - comp_box "请先通过 \033[32;4mhttps://t.me/BotFather\033[0m 申请TG机器人并获取其\033[36mAPI TOKEN\033[0m" - read -r -p "请输入你获取到的API TOKEN> " TOKEN + comp_box "$BOT_TG_PRIVATE_HINT" + read -r -p "$BOT_TG_INPUT_TOKEN> " TOKEN url_tg=https://api.telegram.org/bot${TOKEN}/getUpdates - top_box "请向\033[32m你申请的机器人\033[33m而不是BotFather!\033[0m" + top_box "$BOT_TG_PRIVATE_TOP" } public_bot() { - comp_box "请向机器人:\033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m" + comp_box "$BOT_TG_PUBLIC_HINT" TOKEN=publictoken url_tg=https://tgbot.jwsc.eu.org/publictoken/getUpdates } @@ -20,7 +22,7 @@ tg_push_token() { push_TG="$TOKEN" setconfig push_TG "$TOKEN" setconfig chat_ID "$chat_ID" - . "$CRASHDIR"/libs/logger.sh && logger "已完成Telegram日志推送设置!" 32 + . "$CRASHDIR"/libs/logger.sh && logger "$BOT_TG_SET_DONE" 32 } get_chatid() { @@ -28,7 +30,7 @@ get_chatid() { chat_ID='' while [ $i -le 3 ] && [ -z "$chat_ID" ]; do sleep 1 - comp_box "\033[33m第 $i 次尝试获取对话ID失败,正在重试...\033[0m" + comp_box "\033[33m$BOT_TG_CHATID_RETRY_PREFIX $i $BOT_TG_CHATID_RETRY_SUFFIX\033[0m" chat=$(web_get_lite "$url_tg" 2>/dev/null) if [ -n "$chat" ]; then chat_ID=$(echo "$chat" | sed 's/"update_id":/{\n"update_id":/g' | grep "$public_key" | head -n1 | grep -oE '"id":.*,"is_bot' | sed s'/"id"://' | sed s'/,"is_bot//') @@ -39,19 +41,19 @@ get_chatid() { set_bot() { public_key=$(cat /proc/sys/kernel/random/boot_id | sed 's/.*-//') - btm_box "发送此秘钥: \033[30;46m$public_key\033[0m" - read -r -p "我已经发送完成(1/0)> " res + btm_box "$BOT_TG_SEND_KEY \033[30;46m$public_key\033[0m" + read -r -p "$BOT_TG_SENT_CONFIRM(1/0)> " res if [ "$res" = 1 ]; then get_chatid [ -z "$chat_ID" ] && [ "$TOKEN" != 'publictoken' ] && { - comp_box "\033[31m无法获取对话ID,请返回重新设置或手动输入ChatID!\033[0m" \ - "通常访问 \033[32;4m$url_tg\033[0m \n\033[36m即可看到ChatID\033[0m" - read -r -p "请手动输入ChatID> " chat_ID + comp_box "\033[31m$BOT_TG_CHATID_FAIL\033[0m" \ + "$BOT_TG_CHATID_MANUAL_HINT \033[32;4m$url_tg\033[0m \n\033[36m$BOT_TG_CHATID_MANUAL_HINT2\033[0m" + read -r -p "$BOT_TG_INPUT_CHATID> " chat_ID } if echo "$chat_ID" | grep -qE '^[0-9]{8,}$'; then return 0 else - msg_alert "\033[31m无法获取对话ID,请重新配置!\033[0m" + msg_alert "\033[31m$BOT_TG_CHATID_RECONFIG\033[0m" return 1 fi fi diff --git a/scripts/menus/bot_tg_service.sh b/scripts/menus/bot_tg_service.sh index d5ea1b71..a0b0a23a 100644 --- a/scripts/menus/bot_tg_service.sh +++ b/scripts/menus/bot_tg_service.sh @@ -1,6 +1,8 @@ . "$CRASHDIR"/libs/set_cron.sh +load_lang bot_tg + bot_tg_start(){ . "$CRASHDIR"/starts/start_legacy.sh start_legacy "$CRASHDIR/menus/bot_tg.sh" 'bot_tg' @@ -12,5 +14,5 @@ bot_tg_stop(){ rm -f "$TMPDIR/bot_tg.pid" } bot_tg_cron(){ - cronset 'TG_BOT守护进程' "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #ShellCrash-TG_BOT守护进程" + cronset "$BOT_TG_CRON_NAME" "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #$BOT_TG_CRON_NAME" } diff --git a/scripts/menus/check_port.sh b/scripts/menus/check_port.sh index 97ef9124..0e1dbc13 100644 --- a/scripts/menus/check_port.sh +++ b/scripts/menus/check_port.sh @@ -1,15 +1,17 @@ #!/bin/sh # Copyright (C) Juewuy +load_lang check_port + check_port() { if [ "$1" -gt 65535 ] || [ "$1" -le 1 ]; then - msg_alert "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m" + msg_alert "\033[31m$CHECK_PORT_RANGE_ERR\033[0m" return 1 elif echo "|$mix_port|$redir_port|$dns_port|$db_port|" | grep -q "|$1|"; then - msg_alert "\033[31m输入错误!请不要输入重复的端口!\033[0m" + msg_alert "\033[31m$CHECK_PORT_DUP_ERR\033[0m" return 1 elif netstat -ntul | grep -q ":$1[[:space:]]"; then - msg_alert "\033[31m当前端口已被其他进程占用,请重新输入!\033[0m" + msg_alert "\033[31m$CHECK_PORT_OCCUPIED_ERR\033[0m" return 1 else return 0 diff --git a/scripts/menus/ddns.sh b/scripts/menus/ddns.sh index ee76453f..67326c16 100644 --- a/scripts/menus/ddns.sh +++ b/scripts/menus/ddns.sh @@ -1,8 +1,10 @@ #! /bin/bash # Copyright (C) Juewuy +load_lang ddns + ddns_menu() { - top_box "\033[30;46m欢迎使用DDNS!\033[0m" + top_box "\033[30;46m$DDNS_WELCOME\033[0m" load_ddns } @@ -28,36 +30,36 @@ config service '$service' EOF /usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 & sleep 3 - msg_alert "服务已经添加!" + msg_alert "$DDNS_ADD_DONE" } set_ddns() { while true; do line_break - read -r -p "请输入你的域名> " str + read -r -p "$DDNS_INPUT_DOMAIN> " str [ -z "$str" ] && domain="$domain" || domain="$str" echo "" - read -r -p "请输入用户名或邮箱> " str + read -r -p "$DDNS_INPUT_USER> " str [ -z "$str" ] && username="$username" || username="$str" echo "" - read -r -p "请输入密码或令牌秘钥> " str + read -r -p "$DDNS_INPUT_PASS> " str [ -z "$str" ] && password="$password" || password="$str" echo "" - read -r -p "请输入检测更新间隔(单位:分钟;默认为10)> " check_interval + read -r -p "$DDNS_INPUT_CHECK_INTERVAL> " check_interval [ -z "$check_interval" ] || [ "$check_interval" -lt 1 -o "$check_interval" -gt 1440 ] && check_interval=10 echo "" - read -r -p "请输入强制更新间隔(单位:小时;默认为24)> " force_interval + read -r -p "$DDNS_INPUT_FORCE_INTERVAL> " force_interval [ -z "$force_interval" ] || [ "$force_interval" -lt 1 -o "$force_interval" -gt 240 ] && force_interval=24 - comp_box "请核对如下信息:" \ + comp_box "$DDNS_CONFIRM_INFO" \ "" \ - "服务商: \033[32m$service\033[0m" \ - "域名: \033[32m$domain\033[0m" \ - "用户名: \033[32m$username\033[0m" \ - "检测间隔: \033[32m$check_interval\033[0m" - btm_box "是否确认添加:" - btm_box "1) 是" \ - "0) 否,重新輸入" + "$DDNS_FIELD_SERVICE \033[32m$service\033[0m" \ + "$DDNS_FIELD_DOMAIN \033[32m$domain\033[0m" \ + "$DDNS_FIELD_USER \033[32m$username\033[0m" \ + "$DDNS_FIELD_INTERVAL \033[32m$check_interval\033[0m" + btm_box "$DDNS_CONFIRM_ADD" + btm_box "1) $DDNS_YES" \ + "0) $DDNS_REINPUT" read -r -p "$COMMON_INPUT> " res if [ "$res" = 1 ]; then add_ddns @@ -72,17 +74,17 @@ set_ddns_service() { [ -s "$services_dir" ] || services_dir=/etc/ddns/services [ -s "$services_dir" ] || services_dir=/usr/share/ddns/list [ -s "$services_dir" ] || { - msg_alert "\033[33m未找到DDNS列表文件,尝试在线获取……\033[0m" - ddns service update >/dev/null || msg_alert "\033[31m下载失败,请重试!\033[0m" + msg_alert "\033[33m$DDNS_LIST_NOT_FOUND\033[0m" + ddns service update >/dev/null || msg_alert "\033[31m$DDNS_DOWNLOAD_FAILED\033[0m" } - comp_box "\033[32m请选择服务提供商:\033[0m" + comp_box "\033[32m$DDNS_SELECT_PROVIDER\033[0m" list=$(awk '/^#/ || !NF {next} {print $1}' "$services_dir") list_box "$list" nr=$(echo "$list" | wc -l) common_back - read -r -p "请输入对应数字> " num + read -r -p "$COMMON_INPUT> " num if [ -z "$num" ] || [ "$num" = 0 ]; then i= break @@ -92,19 +94,19 @@ set_ddns_service() { set_ddns break else - msg_alert "\033[33m输入错误,请重新输入!\033[0m" + msg_alert "\033[33m$DDNS_INPUT_ERROR\033[0m" fi done } set_ddns_type() { while true; do - comp_box "\033[32m请选择网络模式:\033[0m" - btm_box "1) \033[36mIPV4\033[0m" \ - "2) \033[36mIPV6\033[0m" \ + comp_box "\033[32m$DDNS_SELECT_NETMODE\033[0m" + btm_box "1) \033[36m$DDNS_IPV4\033[0m" \ + "2) \033[36m$DDNS_IPV6\033[0m" \ "" \ "0) $COMMON_BACK" - read -r -p "请输入对应数字> " num + read -r -p "$COMMON_INPUT> " num case "$num" in "" | 0) break @@ -122,7 +124,7 @@ set_ddns_type() { break ;; *) - msg_alert "\033[33m输入错误,请重新输入!\033[0m" + msg_alert "\033[33m$DDNS_INPUT_ERROR\033[0m" ;; esac done @@ -131,15 +133,15 @@ set_ddns_type() { rev_ddns_service() { while true; do enabled=$(uci get ddns."$service".enabled) - [ "$enabled" = 1 ] && enabled_b="停用" || enabled_b="启用" - comp_box "1) \033[32m立即更新\033[0m" \ - "2) 编辑当前服务" \ - "3) $enabled_b当前服务" \ - "4) 移除当前服务" \ - "5) 查看运行日志" \ + [ "$enabled" = 1 ] && enabled_b="$DDNS_DISABLE" || enabled_b="$DDNS_ENABLE" + comp_box "1) \033[32m$DDNS_UPDATE_NOW\033[0m" \ + "2) $DDNS_EDIT_CURRENT" \ + "3) $enabled_b$DDNS_CURRENT_SERVICE" \ + "4) $DDNS_REMOVE_CURRENT" \ + "5) $DDNS_VIEW_LOG" \ "" \ - "0) 返回上级菜单" - read -r -p "请输入对应数字> " num + "0) $COMMON_BACK" + read -r -p "$COMMON_INPUT> " num case "$num" in "" | 0) break @@ -176,7 +178,7 @@ rev_ddns_service() { break ;; *) - msg_alert "\033[33m输入错误,请重新输入!\033[0m" + msg_alert "\033[33m$DDNS_INPUT_ERROR\033[0m" ;; esac done @@ -187,14 +189,14 @@ load_ddns() { ddns_dir=/etc/config/ddns tmp_dir="$TMPDIR"/ddns [ ! -f "$ddns_dir" ] && { - btm_box "\033[31m本脚本依赖OpenWrt内置的DDNS服务,当前设备无法运行,已退出!\033[0m" + btm_box "\033[31m$DDNS_NOT_SUPPORTED\033[0m" sleep 1 return 1 } nr=0 cat "$ddns_dir" | grep 'config service' | awk '{print $3}' | sed "s/'//g" | sed 's/"//g' >"$tmp_dir" separator_line "=" - content_line " 列表 域名 启用 IP地址" + content_line "$DDNS_LIST_HEADER" content_line "" [ -s "$tmp_dir" ] && for service in $(cat "$tmp_dir"); do # echo $service >>$tmp_dir @@ -204,10 +206,10 @@ load_ddns() { local_ip=$(sed '1!G;h;$!d' /var/log/ddns/"$service".log 2>/dev/null | grep -E 'Registered IP' | tail -1 | awk -F "'" '{print $2}' | tr -d "'\"") content_line "$nr) $domain $enabled $local_ip" done - content_line "$((nr + 1))) 添加DDNS服务" - content_line "0) 退出" + content_line "$((nr + 1))) $DDNS_ADD_SERVICE" + content_line "0) $DDNS_EXIT" separator_line "=" - read -r -p "请输入对应序号> " num + read -r -p "$DDNS_INPUT_INDEX> " num if [ -z "$num" ] || [ "$num" = 0 ]; then i= rm -rf "$tmp_dir" @@ -218,7 +220,7 @@ load_ddns() { service=$(cat "$tmp_dir" | sed -n "$num"p) rev_ddns_service else - msg_alert "\033[33m请输入正确数字!\033[0m" + msg_alert "\033[33m$DDNS_INPUT_NUM_ERROR\033[0m" fi done } diff --git a/scripts/menus/providers.sh b/scripts/menus/providers.sh index 30a744d1..50e0fe29 100644 --- a/scripts/menus/providers.sh +++ b/scripts/menus/providers.sh @@ -4,6 +4,8 @@ [ -n "$__IS_MODULE_PROVIDERS" ] && return __IS_MODULE_PROVIDERS=1 +load_lang providers + if [ "$crashcore" = singboxr ]; then CORE_TYPE=singbox else @@ -21,12 +23,12 @@ providers() { [ -z "$provider_temp_des" ] && provider_temp_des=$provider_temp_file fi - comp_box "1) \033[32m生成\033[0m包含全部提供者的配置文件" \ - "2) 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m" \ - "3) \033[33m清理\033[0mproviders目录文件" \ + comp_box "1) \033[32m$PROVIDERS_MENU_GEN\033[0m" \ + "2) $PROVIDERS_MENU_TEMPLATE \033[32m$provider_temp_des\033[0m" \ + "3) $PROVIDERS_MENU_CLEAN" \ "" \ "0) $COMMON_BACK" - read -r -p "请输入对应字母或数字> " num + read -r -p "$PROVIDERS_INPUT> " num case "$num" in "" | 0) break @@ -36,25 +38,25 @@ providers() { . "$CRASHDIR/menus/providers_$CORE_TYPE.sh" gen_providers else - msg_alert "\033[31m你还未添加链接或本地配置文件,请先添加!\033[0m" + msg_alert "\033[31m$PROVIDERS_EMPTY_HINT\033[0m" fi ;; 2) list=$(cat "$CRASHDIR/configs/${CORE_TYPE}_providers.list" | awk '{print $1}') - comp_box "当前规则模版为:\033[32m$provider_temp_des\033[0m" \ - "\033[33m请选择在线模版:\033[0m" + comp_box "$PROVIDERS_TEMPLATE_CURRENT\033[32m$provider_temp_des\033[0m" \ + "\033[33m$PROVIDERS_TEMPLATE_SELECT\033[0m" list_box "$list" btm_box "" \ - "a) 使用\033[36m本地模版\033[0m" \ + "a) $PROVIDERS_TEMPLATE_LOCAL" \ "" \ "0) $COMMON_BACK" - read -r -p "请输入对应字母或数字> " num + read -r -p "$PROVIDERS_INPUT> " num case "$num" in "" | 0) ;; a) line_break - read -r -p "请输入模版的路径(绝对路径)> " dir + read -r -p "$PROVIDERS_TEMPLATE_PATH> " dir if [ -s "$dir" ]; then provider_temp_file=$dir if setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file"; then @@ -63,7 +65,7 @@ providers() { common_failed fi else - msg_alert "\033[31m输入错误,找不到对应模版文件!\033[0m" + msg_alert "\033[31m$PROVIDERS_TEMPLATE_NOT_FOUND\033[0m" fi ;; *) @@ -81,11 +83,11 @@ providers() { esac ;; 3) - comp_box "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m" \ + comp_box "\033[33m$PROVIDERS_CLEAN_WARN $CRASHDIR/providers $PROVIDERS_CLEAN_WARN_END\033[0m" \ "" \ - "是否继续?" - btm_box "1) 是" \ - "0) 否" + "$PROVIDERS_CLEAN_CONFIRM" + btm_box "1) $PROVIDERS_YES" \ + "0) $PROVIDERS_NO" read -r -p "$COMMON_INPUT> " res if [ "$res" = "1" ]; then if rm -rf "$CRASHDIR"/providers; then diff --git a/scripts/menus/providers_clash.sh b/scripts/menus/providers_clash.sh index d955f170..f8bc313a 100644 --- a/scripts/menus/providers_clash.sh +++ b/scripts/menus/providers_clash.sh @@ -4,6 +4,8 @@ [ -n "$__IS_PROVIDERS_CLASH" ] && return __IS_PROVIDERS_CLASH=1 +load_lang providers + . "$CRASHDIR"/libs/web_get_bin.sh # 生成clash的providers配置文件 @@ -17,10 +19,10 @@ gen_providers() { if [ -s "$provider_temp_file" ]; then ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file else - msg_alert "\033[33m正在获取在线模版......\033[0m" + msg_alert "\033[33m$PROVIDERS_FETCHING_TEMPLATE\033[0m" get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file" [ -z "$(grep -o 'rules' "$TMPDIR"/provider_temp_file)" ] && { - msg_alert "\033[31m下载失败,请尝试更换安装源!\033[0m" + msg_alert "\033[31m$PROVIDERS_DOWNLOAD_FAILED\033[0m" . "$CRASHDIR"/menus/9_upgrade.sh && setserver setproviders } @@ -61,21 +63,21 @@ gen_providers() { # 调用内核测试 . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml if [ "$?" = 0 ]; then - msg_alert "\033[32m配置文件生成成功!\033[0m" + msg_alert "\033[32m$PROVIDERS_GEN_OK\033[0m" mkdir -p "$CRASHDIR"/yamls mv -f "$TMPDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml - comp_box "是否立即启动/重启服务?" - btm_box "1) 是" \ - "0) 否" + comp_box "$PROVIDERS_RESTART_ASK" + btm_box "1) $PROVIDERS_YES" \ + "0) $PROVIDERS_NO" read -r -p "$COMMON_INPUT> " res [ "$res" = 1 ] && { - start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅' + start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset "$PROVIDERS_CRON_SUB_UPDATE" exit } else rm -rf "$TMPDIR"/CrashCore rm -rf "$TMPDIR"/config.yaml - msg_alert "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" + msg_alert "\033[31m$PROVIDERS_GEN_FAILED\033[0m" fi } diff --git a/scripts/menus/providers_singbox.sh b/scripts/menus/providers_singbox.sh index 1644cd62..a0b673ba 100644 --- a/scripts/menus/providers_singbox.sh +++ b/scripts/menus/providers_singbox.sh @@ -4,6 +4,8 @@ [ -n "$__IS_PROVIDERS_SINGBOX" ] && return __IS_PROVIDERS_SINGBOX=1 +load_lang providers + . "$CRASHDIR"/libs/web_get_bin.sh # 生成singbox的providers配置文件 @@ -16,10 +18,10 @@ gen_providers() { if [ -s "$provider_temp_file" ]; then ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file else - msg_alert "\033[33m正在获取在线模版......\033[0m" + msg_alert "\033[33m$PROVIDERS_FETCHING_TEMPLATE\033[0m" get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file" [ -z "$(grep -o 'route' "$TMPDIR"/provider_temp_file)" ] && { - msg_alert "\033[31m下载失败,请尝试更换安装源!\033[0m" + msg_alert "\033[31m$PROVIDERS_DOWNLOAD_FAILED\033[0m" . "$CRASHDIR"/menus/9_upgrade.sh && setserver setproviders } @@ -65,21 +67,21 @@ EOF # 调用内核测试 . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers if [ "$?" = 0 ]; then - msg_alert "\033[32m配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!\033[0m" + msg_alert "\033[32m$PROVIDERS_GEN_OK_SINGBOX\033[0m" mkdir -p "$CRASHDIR"/jsons mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json rm -rf "$TMPDIR"/providerss - comp_box "是否立即启动/重启服务?" - btm_box "1) 是" \ - "0) 否" + comp_box "$PROVIDERS_RESTART_ASK" + btm_box "1) $PROVIDERS_YES" \ + "0) $PROVIDERS_NO" read -r -p "$COMMON_INPUT> " res [ "$res" = 1 ] && { - start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅' + start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset "$PROVIDERS_CRON_SUB_UPDATE" exit } else rm -rf "$TMPDIR"/CrashCore - msg_alert "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" + msg_alert "\033[31m$PROVIDERS_GEN_FAILED\033[0m" # rm -rf "$TMPDIR"/providers fi } diff --git a/scripts/menus/set_crashdir.sh b/scripts/menus/set_crashdir.sh index c5e44b5d..fe0e8fe2 100644 --- a/scripts/menus/set_crashdir.sh +++ b/scripts/menus/set_crashdir.sh @@ -3,19 +3,26 @@ [ -f /tmp/SC_tmp/libs/check_dir_avail.sh ] && . /tmp/SC_tmp/libs/check_dir_avail.sh +if [ -n "$CRASHDIR" ] && [ -s "$CRASHDIR/libs/i18n.sh" ]; then + . "$CRASHDIR/libs/i18n.sh" + load_lang set_crashdir +elif [ -n "$language" ] && [ -s "/tmp/SC_tmp/lang/$language/set_crashdir.lang" ]; then + . "/tmp/SC_tmp/lang/$language/set_crashdir.lang" +fi + set_usb_dir() { while true; do - comp_box "请选择安装目录:" + comp_box "$SCD_SELECT_INSTALL_DIR" du -hL /mnt | awk '{print NR") "$2 " " $1}' | while IFS= read -r line; do content_line "$line" done separator_line "=" - read -r -p "请输入相应数字> " num + read -r -p "$SCD_INPUT_NUM> " num dir=$(du -hL /mnt | awk '{print $2}' | sed -n "$num"p) if [ -z "$dir" ]; then - msg_alert "\033[31m输入错误!请重新设置!\033[0m" + msg_alert "\033[31m$SCD_INPUT_ERROR\033[0m" continue fi break 1 @@ -23,15 +30,15 @@ set_usb_dir() { } set_xiaomi_dir() { - comp_box "\033[33m检测到当前设备为小米官方系统,请选择安装位置:\033[0m" - [ -d /data ] && content_line "1) /data目录,剩余空间:$(dir_avail /data -h) (支持软固化功能)" - [ -d /userdisk ] && content_line "2) /userdisk目录,剩余空间:$(dir_avail /userdisk -h) (支持软固化功能)" - [ -d /data/other_vol ] && content_line "3) /data/other_vol目录,剩余空间:$(dir_avail /data/other_vol -h) (支持软固化功能)" - content_line "4) 自定义目录(不推荐,不明勿用!)" + comp_box "\033[33m$SCD_XIAOMI_DETECTED\033[0m" + [ -d /data ] && content_line "1) /data$SCD_DIR_FREE$(dir_avail /data -h) $SCD_SOFT_SOLID" + [ -d /userdisk ] && content_line "2) /userdisk$SCD_DIR_FREE$(dir_avail /userdisk -h) $SCD_SOFT_SOLID" + [ -d /data/other_vol ] && content_line "3) /data/other_vol$SCD_DIR_FREE$(dir_avail /data/other_vol -h) $SCD_SOFT_SOLID" + content_line "4) $SCD_CUSTOM_DIR_WARN" content_line "" - content_line "0) 退出安装" + content_line "0) $SCD_EXIT_INSTALL" separator_line "=" - read -r -p "请输入相应数字> " num + read -r -p "$SCD_INPUT_NUM> " num case "$num" in 1) dir=/data @@ -54,17 +61,17 @@ set_xiaomi_dir() { set_asus_usb() { while true; do - comp_box "请选择U盘目录:" + comp_box "$SCD_SELECT_USB_DIR" du -hL /tmp/mnt | awk -F/ 'NF<=4 {print NR") "$2 " " $1}' | while IFS= read -r line; do content_line "$line" done separator_line "=" - read -r -p "请输入相应数字> " num + read -r -p "$SCD_INPUT_NUM> " num dir=$(du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print $2}' | sed -n "$num"p) if [ ! -f "$dir/asusware.arm/etc/init.d/S50downloadmaster" ]; then - msg_alert "\033[31m未找到下载大师自启文件:$dir/asusware.arm/etc/init.d/S50downloadmaster,请检查设置!\033[0m" + msg_alert "\033[31m$SCD_ASUS_DM_NOT_FOUND $dir/asusware.arm/etc/init.d/S50downloadmaster,$SCD_CHECK_SETTING\033[0m" else break fi @@ -73,19 +80,19 @@ set_asus_usb() { set_asus_dir() { separator_line "=" - btm_box "\033[33m检测到当前设备为华硕固件,请选择安装方式\033[0m" \ - "1) 基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)" \ - "2) 基于自启脚本安装(仅持部分梅林固件)" \ + btm_box "\033[33m$SCD_ASUS_DETECTED\033[0m" \ + "1) $SCD_ASUS_INSTALL_DM" \ + "2) $SCD_ASUS_INSTALL_SCRIPT" \ "" \ - "0) 退出安装" - read -r -p "请输入相应数字> " num + "0) $SCD_EXIT_INSTALL" + read -r -p "$SCD_INPUT_NUM> " num case "$num" in 1) - msg_alert -t 2 "请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!" + msg_alert -t 2 "$SCD_ASUS_DM_HINT" set_asus_usb ;; 2) - msg_alert -t 2 "如开机无法正常自启,请重新使用U盘+下载大师安装!" + msg_alert -t 2 "$SCD_ASUS_REINSTALL_HINT" dir=/jffs ;; *) @@ -97,9 +104,9 @@ set_asus_dir() { set_cust_dir() { while true; do - comp_box "路径是必须带 / 的格式,注意写入虚拟内存(/tmp,/opt,/sys...)的文件会在重启后消失!" \ + comp_box "$SCD_PATH_FORMAT_HINT" \ "" \ - "可用路径 剩余空间:" + "$SCD_PATH_FREE_SPACE" df -h | awk '{print $6, $4}' | sed '1d' | @@ -107,9 +114,9 @@ set_cust_dir() { content_line "$line" done separator_line "=" - read -r -p "请输入自定义路径> " dir + read -r -p "$SCD_INPUT_CUSTOM_DIR> " dir if [ "$(dir_avail "$dir")" = 0 ] || [ -n "$(echo "$dir" | grep -Eq '^/(tmp|opt|sys)(/|$)')" ]; then - msg_alert "\033[31m路径错误!请重新设置!\033[0m" + msg_alert "\033[31m$SCD_PATH_ERROR\033[0m" continue fi break 1 @@ -118,7 +125,7 @@ set_cust_dir() { set_crashdir() { while true; do - top_box "\033[33m注意:安装ShellCrash至少需要预留约1MB的磁盘空间\033[0m" + top_box "\033[33m$SCD_INSTALL_SPACE_HINT\033[0m" case "$systype" in Padavan) dir=/etc/storage @@ -134,14 +141,14 @@ set_crashdir() { ;; *) separator_line "=" - btm_box "1) 在\033[32m/etc目录\033[0m下安装(适合root用户)" \ - "2) 在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)" \ - "3) 在\033[32m当前用户目录\033[0m下安装(适合非root用户)" \ - "4) 在\033[32m外置存储\033[0m中安装" \ - "5) 手动设置安装目录" \ + btm_box "1) $SCD_INSTALL_ETC" \ + "2) $SCD_INSTALL_USR" \ + "3) $SCD_INSTALL_HOME" \ + "4) $SCD_INSTALL_USB" \ + "5) $SCD_INSTALL_MANUAL" \ "" \ - "0) 退出安装" - read -r -p "请输入相应数字> " num + "0) $SCD_EXIT_INSTALL" + read -r -p "$SCD_INPUT_NUM> " num # 设置目录 case "$num" in 1) @@ -161,7 +168,7 @@ set_crashdir() { set_cust_dir ;; *) - msg_alert "安装已取消" + msg_alert "$SCD_INSTALL_CANCELED" line_break exit 1 ;; @@ -170,14 +177,14 @@ set_crashdir() { esac if [ ! -w "$dir" ]; then - msg_alert "\033[31m没有$dir目录写入权限!请重新设置!\033[0m" + msg_alert "\033[31m$SCD_NO_WRITE_PREFIX$dir$SCD_NO_WRITE_SUFFIX\033[0m" else - comp_box "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail "$dir" -h)" \ + comp_box "$SCD_TARGET_DIR_PREFIX\033[32m$dir\033[0m$SCD_TARGET_DIR_SPACE$(dir_avail "$dir" -h)" \ "" \ - "是否确认安装?" - btm_box "1) 是" \ - "0) 否" - read -r -p "请输入相应数字> " res + "$SCD_CONFIRM_INSTALL" + btm_box "1) $SCD_YES" \ + "0) $SCD_NO" + read -r -p "$SCD_INPUT_NUM> " res if [ "$res" = "1" ]; then CRASHDIR="$dir"/ShellCrash break diff --git a/scripts/menus/subconverter.sh b/scripts/menus/subconverter.sh index 7b1a7290..d1295e52 100644 --- a/scripts/menus/subconverter.sh +++ b/scripts/menus/subconverter.sh @@ -7,18 +7,20 @@ __IS_MODULE_SUBCONVERTER=1 [ -z "$rule_link" ] && rule_link=1 [ -z "$server_link" ] && server_link=1 +load_lang subconverter + # Subconverter在线订阅转换 subconverter() { while true; do - comp_box "1) \033[32m生成\033[0m包含全部节点、订阅的配置文件"\ - "2) 设置\033[31m排除节点正则\033[0m \033[47;30m$exclude\033[0m"\ - "3) 设置\033[32m包含节点正则\033[0m \033[47;30m$include\033[0m"\ - "4) 选择\033[33m在线规则模版\033[0m"\ - "5) 选择\033[0mSubconverter服务器\033[0m"\ - "6) 自定义浏览器UA \033[32m$user_agent\033[0m"\ + comp_box "1) \033[32m$SUBCONVERTER_MENU_GEN\033[0m"\ + "2) $SUBCONVERTER_MENU_EXCLUDE \033[47;30m$exclude\033[0m"\ + "3) $SUBCONVERTER_MENU_INCLUDE \033[47;30m$include\033[0m"\ + "4) $SUBCONVERTER_MENU_RULE"\ + "5) $SUBCONVERTER_MENU_SERVER"\ + "6) $SUBCONVERTER_MENU_UA \033[32m$user_agent\033[0m"\ ""\ "0) $COMMON_BACK" - read -r -p "请输入对应数字> " num + read -r -p "$COMMON_INPUT> " num case "$num" in "" | 0) break @@ -57,13 +59,13 @@ subconverter() { # 排除节点正则 gen_link_flt() { - comp_box "\033[33m匹配关键字的节点会在导入时被【屏蔽】!\033[0m" \ - "多个关键字可以用\033[30;47m | \033[0m号分隔" \ - "\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代" - btm_box "\033[36m请直接输入节点过滤关键字\033[0m" \ - "或输入 d \033[31m清空\033[0m节点过滤关键字" \ - "或输入 0 返回上级菜单" - read -r -p "请输入> " res + comp_box "\033[33m$SUBCONVERTER_EXCLUDE_HINT1\033[0m" \ + "$SUBCONVERTER_KEYWORD_SPLIT" \ + "$SUBCONVERTER_REGEX_HINT" + btm_box "\033[36m$SUBCONVERTER_EXCLUDE_INPUT\033[0m" \ + "$SUBCONVERTER_EXCLUDE_CLEAR" \ + "$SUBCONVERTER_BACK" + read -r -p "$SUBCONVERTER_INPUT> " res case "$res" in 0) return 0 @@ -85,13 +87,13 @@ gen_link_flt() { # 包含节点正则 gen_link_ele() { - comp_box "\033[33m仅有匹配关键字的节点才会被【导入】!!!\033[0m" \ - "多个关键字可以用\033[30;47m | \033[0m号分隔" \ - "\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代" - btm_box "\033[36m请直接输入节点匹配关键字\033[0m" \ - "或输入 d \033[31m清空\033[0m节点匹配关键字" \ - "或输入 0 返回上级菜单" - read -r -p "请输入> " res + comp_box "\033[33m$SUBCONVERTER_INCLUDE_HINT1\033[0m" \ + "$SUBCONVERTER_KEYWORD_SPLIT" \ + "$SUBCONVERTER_REGEX_HINT" + btm_box "\033[36m$SUBCONVERTER_INCLUDE_INPUT\033[0m" \ + "$SUBCONVERTER_INCLUDE_CLEAR" \ + "$SUBCONVERTER_BACK" + read -r -p "$SUBCONVERTER_INPUT> " res case "$res" in 0) return 0 @@ -115,11 +117,11 @@ gen_link_ele() { gen_link_config() { list=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | awk '{print $2$4}') now=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $2}') - comp_box "当前使用规则为:\033[33m$now\033[0m" + comp_box "$SUBCONVERTER_RULE_CURRENT\033[33m$now\033[0m" list_box "$list" content_line "" common_back - read -r -p "请输入对应数字> " num + read -r -p "$COMMON_INPUT> " num totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers.list) if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then errornum @@ -129,7 +131,7 @@ gen_link_config() { # 将对应标记值写入配置 rule_link=$num if setconfig rule_link "$rule_link"; then - msg_alert "\033[32m设置成功!返回上级菜单\033[0m" + msg_alert "\033[32m$SUBCONVERTER_SET_OK\033[0m" else common_failed fi @@ -141,14 +143,14 @@ gen_link_server() { list=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | awk '{print $3" "$2}') now=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}') - comp_box "\033[36m以下为互联网采集的第三方服务器,具体安全性请自行斟酌!\033[0m" \ - "\033[32m感谢以下作者的无私奉献!!!\033[0m" \ + comp_box "\033[36m$SUBCONVERTER_SERVER_HINT\033[0m" \ + "\033[32m$SUBCONVERTER_SERVER_THANKS\033[0m" \ "" \ - "当前使用后端为:\033[33m$now\033[0m" + "$SUBCONVERTER_SERVER_CURRENT\033[33m$now\033[0m" list_box "$list" content_line "" common_back - read -r -p "请输入对应数字> " num + read -r -p "$COMMON_INPUT> " num totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list) if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then errornum @@ -158,7 +160,7 @@ gen_link_server() { # 将对应标记值写入配置 server_link=$num if setconfig server_link "$server_link"; then - content_line "\033[32m设置成功!返回上级菜单\033[0m" + content_line "\033[32m$SUBCONVERTER_SET_OK\033[0m" else common_failed fi @@ -167,16 +169,16 @@ gen_link_server() { set_sub_ua() { while true; do - comp_box "\033[36m无法正确获取配置文件时可尝试使用\033[0m" \ + comp_box "\033[36m$SUBCONVERTER_UA_HINT\033[0m" \ "" \ - "当前UA:$user_agent" - btm_box "1) 使用自动UA(默认)"\ - "2) 不使用UA"\ - "3) 使用自定义UA"\ - "4) 清空UA"\ + "$SUBCONVERTER_UA_CURRENT$user_agent" + btm_box "1) $SUBCONVERTER_UA_AUTO"\ + "2) $SUBCONVERTER_UA_NONE"\ + "3) $SUBCONVERTER_UA_CUSTOM"\ + "4) $SUBCONVERTER_UA_CLEAR"\ ""\ - "0) 返回上级菜单" - read -r -p "请输入对应数字> " num + "0) $COMMON_BACK" + read -r -p "$COMMON_INPUT> " num case "$num" in 0) break @@ -188,10 +190,10 @@ set_sub_ua() { user_agent='none' ;; 3) - comp_box "\033[33m注意:\n自定义UA不可包含空格或特殊符号!\033[0m" - btm_box "\033[36m请直接输入自定义UA\033[0m" \ - "或输入 0 返回上级菜单" - read -r -p "请输入> " text + comp_box "\033[33m$SUBCONVERTER_UA_CUSTOM_WARN\033[0m" + btm_box "\033[36m$SUBCONVERTER_UA_CUSTOM_INPUT\033[0m" \ + "$SUBCONVERTER_BACK" + read -r -p "$SUBCONVERTER_INPUT> " text if [ "$text" = 0 ]; then continue elif [ -n "$text" ]; then diff --git a/scripts/menus/task_cmd.sh b/scripts/menus/task_cmd.sh index 4e39bd25..de5d403b 100644 --- a/scripts/menus/task_cmd.sh +++ b/scripts/menus/task_cmd.sh @@ -9,12 +9,15 @@ . "$CRASHDIR"/libs/set_config.sh . "$CRASHDIR"/libs/web_get_bin.sh . "$CRASHDIR"/libs/logger.sh +. "$CRASHDIR"/libs/i18n.sh + +load_lang task_cmd task_logger(){ [ "$task_push" = 1 ] && push= || push=off [ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m" [ "$3" = 'off' ] && push=off - echo "$1" |grep -qE '(每隔|时每)([1-9]|[1-9][0-9])分钟' && { + echo "$1" |grep -qE "($TASK_CMD_EVERY|$TASK_CMD_HOURLY)([1-9]|[1-9][0-9])$TASK_CMD_MIN" && { push=off cover=on } @@ -32,22 +35,22 @@ update_core(){ #自动更新内核 check_update bin/version crash_v_new=$(eval echo \$${crashcore}_v) if [ -z "$crash_v_new" -o "$crash_v_new" = "$core_v" ];then - task_logger "任务【自动更新内核】中止-未检测到版本更新" + task_logger "$TASK_CMD_CORE_SKIP" return 0 else . "$CRASHDIR"/libs/core_tools.sh && core_webget #调用下载工具 case "$?" in 0) - task_logger "任务【自动更新内核】下载完成,正在重启服务!" + task_logger "$TASK_CMD_CORE_DONE" "$CRASHDIR"/start.sh start return 0 ;; 1) - task_logger "任务【自动更新内核】出错-下载失败!" + task_logger "$TASK_CMD_CORE_DL_FAIL" return 1 ;; *) - task_logger "任务【自动更新内核】出错-内核校验失败!" + task_logger "$TASK_CMD_CORE_VERIFY_FAIL" "$CRASHDIR"/start.sh start return 1 ;; @@ -58,13 +61,13 @@ update_scripts(){ #自动更新脚本 #检查版本 check_update version if [ -z "$versionsh" -o "$versionsh" = "versionsh_l" ];then - task_logger "任务【自动更新脚本】中止-未检测到版本更新" + task_logger "$TASK_CMD_SCRIPT_SKIP" return 0 else get_bin "$TMPDIR"/ShellCrash.tar.gz "ShellCrash.tar.gz" if [ "$?" != "0" ];then rm -rf "$TMPDIR"/ShellCrash.tar.gz - task_logger "任务【自动更新内核】出错-下载失败!" + task_logger "$TASK_CMD_CORE_DL_FAIL" return 1 else #停止服务 @@ -73,7 +76,7 @@ update_scripts(){ #自动更新脚本 tar -zxf "$TMPDIR"/ShellCrash.tar.gz ${tar_para} -C "$CRASHDIR"/ if [ $? -ne 0 ];then rm -rf "$TMPDIR"/ShellCrash.tar.gz - task_logger "任务【自动更新内核】出错-解压失败!" + task_logger "$TASK_CMD_SCRIPT_UNZIP_FAIL" "$CRASHDIR"/start.sh start return 1 else @@ -92,17 +95,17 @@ update_mmdb(){ #自动更新数据库 geo_v_new=$GeoIP_v geo_v_now=$(eval echo \$$geo_v) if [ -z "$geo_v_new" -o "$geo_v_new" = "$geo_v_now" ];then - task_logger "任务【自动更新数据库文件】跳过-未检测到$2版本更新" + task_logger "$TASK_CMD_DB_SKIP_PREFIX$2$TASK_CMD_DB_SKIP_SUFFIX" else #更新文件 get_bin "$TMPDIR"/$1 "bin/geodata/$2" if [ "$?" != "0" ];then - task_logger "任务【自动更新数据库文件】更新【$2】下载失败!" + task_logger "$TASK_CMD_DB_DL_FAIL_PREFIX$2$TASK_CMD_DB_DL_FAIL_SUFFIX" rm -rf "$TMPDIR"/$1 else mv -f "$TMPDIR"/$1 "$BINDIR"/$1 setconfig $geo_v $GeoIP_v - task_logger "任务【自动更新数据库文件】更新【$2】成功!" + task_logger "$TASK_CMD_DB_OK_PREFIX$2$TASK_CMD_DB_OK_SUFFIX" fi fi } @@ -140,8 +143,8 @@ case "$1" in task_command=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $2}') task_name=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $3}') #task_logger "任务$task_name 开始执行" - eval $task_command && task_res=成功 || task_res=失败 - task_logger "任务【$2】执行$task_res" + eval $task_command && task_res="$TASK_CMD_RES_OK" || task_res="$TASK_CMD_RES_FAIL" + task_logger "$TASK_CMD_EXEC_PREFIX$2$TASK_CMD_EXEC_MID$task_res" ;; *) "$1" diff --git a/scripts/menus/uninstall.sh b/scripts/menus/uninstall.sh index bd16286f..57b00920 100644 --- a/scripts/menus/uninstall.sh +++ b/scripts/menus/uninstall.sh @@ -1,26 +1,28 @@ #!/bin/sh # Copyright (C) Juewuy +load_lang uninstall + # 卸载 uninstall() { - comp_box "\033[31m警告:该操作不可逆!\033[0m" \ - "是否确认卸载ShellCrash?" - btm_box "1) 是" \ - "0) 否" + comp_box "\033[31m$UNINSTALL_WARN\033[0m" \ + "$UNINSTALL_CONFIRM" + btm_box "1) $UNINSTALL_YES" \ + "0) $UNINSTALL_NO" read -r -p "$COMMON_INPUT> " res if [ "$res" = '1' ]; then # 停止服务 "$CRASHDIR"/start.sh stop 2>/dev/null - "$CRASHDIR"/start.sh cronset "clash服务" 2>/dev/null - "$CRASHDIR"/start.sh cronset "订阅链接" 2>/dev/null - "$CRASHDIR"/start.sh cronset "ShellCrash初始化" 2>/dev/null + "$CRASHDIR"/start.sh cronset "$UNINSTALL_CRON_CLASH" 2>/dev/null + "$CRASHDIR"/start.sh cronset "$UNINSTALL_CRON_SUB" 2>/dev/null + "$CRASHDIR"/start.sh cronset "$UNINSTALL_CRON_INIT" 2>/dev/null "$CRASHDIR"/start.sh cronset "task.sh" 2>/dev/null # 移除安装目录 if [ -n "$CRASHDIR" ] && [ "$CRASHDIR" != '/' ]; then - comp_box "是否保留脚本配置及订阅文件?" - btm_box "1) 是" \ - "0) 否" + comp_box "$UNINSTALL_KEEP_CONFIRM" + btm_box "1) $UNINSTALL_YES" \ + "0) $UNINSTALL_NO" read -r -p "$COMMON_INPUT> " res if [ "$res" = '1' ]; then mv -f "$CRASHDIR"/configs /tmp/ShellCrash/configs_bak @@ -34,7 +36,7 @@ uninstall() { rm -rf "$CRASHDIR" fi else - msg_alert "\033[31m环境变量配置有误,请尝试手动移除安装目录!\033[0m" + msg_alert "\033[31m$UNINSTALL_ENV_ERROR\033[0m" fi # 移除其他内容 @@ -48,9 +50,9 @@ uninstall() { } sed -i '/all_proxy/'d /etc/profile 2>/dev/null sed -i '/ALL_PROXY/'d /etc/profile 2>/dev/null - sed -i "/启用外网访问SSH服务/d" /etc/firewall.user 2>/dev/null - sed -i '/ShellCrash初始化/'d /etc/storage/started_script.sh 2>/dev/null - sed -i '/ShellCrash初始化/'d /jffs/.asusrouter 2>/dev/null + sed -i "/$UNINSTALL_SSH_MARK/d" /etc/firewall.user 2>/dev/null + sed -i "/$UNINSTALL_CRON_INIT/d" /etc/storage/started_script.sh 2>/dev/null + sed -i "/$UNINSTALL_CRON_INIT/d" /jffs/.asusrouter 2>/dev/null [ "$BINDIR" != "$CRASHDIR" ] && rm -rf "$BINDIR" rm -rf /etc/init.d/shellcrash rm -rf /etc/systemd/system/shellcrash.service @@ -62,12 +64,12 @@ uninstall() { userdel -r shellcrash 2>/dev/null nvram set script_usbmount="" 2>/dev/null nvram commit 2>/dev/null - comp_box "\033[36m已卸载ShellCrash相关文件!有缘再会!\033[0m" \ - "\033[33m请手动关闭当前窗口以重置环境变量!\033[0m" + comp_box "\033[36m$UNINSTALL_DONE\033[0m" \ + "\033[33m$UNINSTALL_CLOSE_HINT\033[0m" line_break sleep 1 exit 0 else - msg_alert "\033[31m操作已取消!\033[0m" + msg_alert "\033[31m$UNINSTALL_CANCELED\033[0m" fi }