--- /dev/null
+/* echo.c - Command to display a line of text */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2006,2007,2010 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/dl.h>
+#include <grub/misc.h>
+#include <grub/extcmd.h>
+#include <grub/i18n.h>
+#include <grub/term.h>
+
+GRUB_MOD_LICENSE ("GPLv3+");
+
+extern const char *ventoy_get_vmenu_title(const char *vMenu);
+
+static const struct grub_arg_option options[] =
+ {
+ {0, 'n', 0, N_("Do not output the trailing newline."), 0, 0},
+ {0, 'e', 0, N_("Enable interpretation of backslash escapes."), 0, 0},
+ {0, 'v', 0, N_("ventoy menu language."), 0, 0},
+ {0, 'V', 0, N_("ventoy menu language with pre-newline."), 0, 0},
+ {0, 0, 0, 0, 0, 0}
+ };
+
+static grub_err_t
+grub_cmd_echo (grub_extcmd_context_t ctxt, int argc, char **args)
+{
+ struct grub_arg_list *state = ctxt->state;
+ char ch;
+ int vtmenu = 0;
+ int newline = 1;
+ int i;
+
+ /* Check if `-n' was used. */
+ if (state[0].set)
+ newline = 0;
+
+ if (state[2].set || state[3].set)
+ vtmenu = 1;
+
+ for (i = 0; i < argc; i++)
+ {
+ char *arg = *args;
+ /* Unescaping results in a string no longer than the original. */
+ char *unescaped = grub_malloc (grub_strlen (arg) + 1);
+ char *p = unescaped;
+ args++;
+
+ if (!unescaped)
+ return grub_errno;
+
+ while (*arg)
+ {
+ /* In case `-e' is used, parse backslashes. */
+ if (*arg == '\\' && state[1].set)
+ {
+ arg++;
+ if (*arg == '\0')
+ break;
+
+ switch (*arg)
+ {
+ case '\\':
+ *p++ = '\\';
+ break;
+
+ case 'a':
+ *p++ = '\a';
+ break;
+
+ case 'c':
+ newline = 0;
+ break;
+
+ case 'f':
+ *p++ = '\f';
+ break;
+
+ case 'n':
+ *p++ = '\n';
+ break;
+
+ case 'r':
+ *p++ = '\r';
+ break;
+
+ case 't':
+ *p++ = '\t';
+ break;
+
+ case 'v':
+ *p++ = '\v';
+ break;
+ }
+ arg++;
+ continue;
+ }
+
+ /* This was not an escaped character, or escaping is not
+ enabled. */
+ *p++ = *arg;
+ arg++;
+ }
+
+ *p = '\0';
+
+ if (vtmenu && grub_strncmp(unescaped, "VTMENU_", 7) == 0)
+ {
+ p = unescaped;
+ while ((*p >= 'A' && *p <= 'Z') || *p == '_')
+ {
+ p++;
+ }
+
+ ch = *p;
+ *p = 0;
+ if (state[3].set)
+ {
+ grub_xputs("\n");
+ }
+ grub_xputs(ventoy_get_vmenu_title(unescaped));
+
+ *p = ch;
+ grub_xputs(p);
+ }
+ else
+ {
+ grub_xputs (unescaped);
+ }
+
+ grub_free (unescaped);
+
+ /* If another argument follows, insert a space. */
+ if ((0 == vtmenu) && (i != argc - 1))
+ grub_printf (" " );
+ }
+
+ if (newline)
+ grub_printf ("\n");
+
+ grub_refresh ();
+
+ return 0;
+}
+
+static grub_extcmd_t cmd;
+\f
+GRUB_MOD_INIT(echo)
+{
+ cmd = grub_register_extcmd ("echo", grub_cmd_echo,
+ GRUB_COMMAND_ACCEPT_DASH
+ | GRUB_COMMAND_OPTIONS_AT_START,
+ N_("[-e|-n] STRING"), N_("Display a line of text."),
+ options);
+}
+
+GRUB_MOD_FINI(echo)
+{
+ grub_unregister_extcmd (cmd);
+}
echo "$vtReadChecksum"
fi
- echo -e "\n\npress ENTER to exit ..."
+ echo -ven "\n\n" "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
else
menuentry "@VTMENU_CHKSUM_MD5_CALC" --class=checksum_md5 {
md5sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
- echo -e "\n\npress ENTER to exit ..."
+ echo -ven "\n\n" "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
fi
echo "$vtReadChecksum"
fi
- echo -e "\n\npress ENTER to exit ..."
+ echo -ven "\n\n" "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
else
menuentry "@VTMENU_CHKSUM_SHA1_CALC" --class=checksum_sha1 {
sha1sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
- echo -e "\n\npress ENTER to exit ..."
+ echo -ven "\n\n" "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
fi
echo "$vtReadChecksum"
fi
- echo -e "\n\npress ENTER to exit ..."
+ echo -ven "\n\n" "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
else
menuentry "@VTMENU_CHKSUM_SHA256_CALC" --class=checksum_sha256 {
sha256sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
- echo -e "\n\npress ENTER to exit ..."
+ echo -ven "\n\n" "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
fi
echo "$vtReadChecksum"
fi
- echo -e "\n\npress ENTER to exit ..."
+ echo -ven "\n\n" "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
else
menuentry "@VTMENU_CHKSUM_SHA512_CALC" --class=checksum_sha512{
sha512sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}"
- echo -e "\n\npress ENTER to exit ..."
+ echo -ven "\n\n" "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
fi
chainloader ${vtoy_path}/vtoyutil_${VTOY_EFI_ARCH}.efi env_param=${env_param} ${vtdebug_flag} feature=show_efi_drivers
boot
vt_pop_pager
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
menuentry '@VTMENU_UTIL_FIX_BLINIT_FAIL' --class=debug_util_blinit --class=debug_util --class=F5tool {
chainloader ${vtoy_path}/vtoyutil_${VTOY_EFI_ARCH}.efi env_param=${env_param} ${vtdebug_flag} feature=fix_windows_mmap
boot
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
set pager=1
vt_check_plugin_json $vt_plugin_path control $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path theme $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path auto_install $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
echo -e "\n############### dump persistence ###############"
vt_dump_persistence
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path menu_alias $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path menu_tip $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path menu_class $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path injection $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path auto_memdisk $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path image_list $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path image_blacklist $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path conf_replace $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path dud $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
set pager=1
vt_check_plugin_json $vt_plugin_path password $vtoy_iso_part
- echo -e "\npress ENTER to exit ..."
+ echo -Vn "VTMENU_ENTER_EXIT ..."
read vtInputKey
unset pager
}
unset ventoy_new_context
else
echo "ventoy_grub.cfg NOT exist."
- echo -e "\npress ENTER to exit ..."
+ echo -V "VTMENU_ENTER_EXIT ..."
read vtInputKey
fi
}
echo -e "\n $vt_volume_space $vt_chosen_size $vt_chosen_size_mod\n"
echo -e "\n The size of the iso file \"$vt_chosen_size\" is invalid. File corrupted ?\n"
echo -e " 此ISO文件的大小 \"$vt_chosen_size\" 有问题,请确认文件是否损坏。\n"
- echo -e "\n press ENTER to continue (请按 回车 键继续) ..."
+ echo -v "VTMENU_ENTER_CONTINUE ..."
read vtInputKey
fi
fi
function common_unsupport_menuentry {
echo -e "\n The name of the iso file could NOT contain space or non-ascii characters. \n"
echo -e " 文件名中不能有中文或空格 \n"
- echo -e "\npress ENTER to exit (请按 回车 键返回) ..."
+ echo -V "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
echo -e "!!! WARNING !!!\n"
echo -e "\nPartition1 ($vtoy_iso_fs) is NOT ntfs, the VHD(x) file may not boot normally \n"
echo -e "\nVHD(x) 文件所在分区不是 ntfs 格式, 可能无法正常启动 \n\n"
- echo -n "press ENTER to continue boot (请按 回车 键继续) ..."
+ echo -vn "VTMENU_ENTER_CONTINUE ..."
read vtInputKey
fi
fi
function only_uefi_tip {
echo -e "\n This IMG file is only supported in UEFI mode. \n"
- echo -e "\n press ENTER to exit ..."
+ echo -V "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
ventoy_gui_console
echo -e "\n ventoy_openwrt.xz not found. Please refer https://www.ventoy.net/en/doc_openwrt.html.\n"
echo -e " 未找到 ventoy_openwrt.xz 文件。请参考 https://www.ventoy.net/cn/doc_openwrt.html\n"
- echo -e "\n press ENTER to exit (请按 回车 键返回) ..."
+ echo -V "VTMENU_ENTER_EXIT ..."
read vtInputKey
ventoy_cli_console
return
function img_unsupport_tip {
echo -e "\n This IMG file is NOT supported now. \n"
echo -e " 当前不支持启动此 IMG 文件 \n"
- echo -e "\npress ENTER to exit (请按 回车 键返回) ..."
+ echo -V "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
echo "BIOS ROM Size $bios_size"
- echo -e "\n\n\npress ENTER to exit ..."
+ echo -ven "\n\n\n" "VTMENU_ENTER_EXIT ..."
read vtInputKey
}
"VTMENU_PERSIST_USE": "الإقلاع مع",
"VTMENU_BROWER_RETURN": "العودة",
+ "VTMENU_ENTER_EXIT": "اضغط على مفتاح Enter للخروج",
+ "VTMENU_ENTER_REBOOT": "اضغط على مفتاح Enter لإعادة التشغيل",
+ "VTMENU_ENTER_CONTINUE": "اضغط على مفتاح Enter للمتابعة",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "ফিরে",
+ "VTMENU_ENTER_EXIT": "প্রস্থান করার জন্য এন্টার কী টিপুন",
+ "VTMENU_ENTER_REBOOT": "রিবুট করতে এন্টার কী টিপুন",
+ "VTMENU_ENTER_CONTINUE": "চালিয়ে যেতে এন্টার কী টিপুন",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "Zurück",
+ "VTMENU_ENTER_EXIT": "Drücken Sie zum Beenden die Eingabetaste",
+ "VTMENU_ENTER_REBOOT": "Drücken Sie die Eingabetaste, um neu zu starten",
+ "VTMENU_ENTER_CONTINUE": "Drücken Sie die Eingabetaste, um fortzufahren",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "Return",
+ "VTMENU_ENTER_EXIT": "press Enter key to exit",
+ "VTMENU_ENTER_REBOOT": "press Enter key to reboot",
+ "VTMENU_ENTER_CONTINUE": "press Enter key to continue",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "Retour",
+ "VTMENU_ENTER_EXIT": "appuyez sur la touche Entrée pour quitter",
+ "VTMENU_ENTER_REBOOT": "appuyez sur la touche Entrée pour redémarrer",
+ "VTMENU_ENTER_CONTINUE": "appuyez sur la touche Entrée pour continuer",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "लौटें",
+ "VTMENU_ENTER_EXIT": "बाहर निकलने के लिए एंटर कुंजी दबाएं",
+ "VTMENU_ENTER_REBOOT": "रिबूट करने के लिए एंटर कुंजी दबाएं",
+ "VTMENU_ENTER_CONTINUE": "जारी रखने के लिए एंटर कुंजी दबाएं",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "Return",
+ "VTMENU_ENTER_EXIT": "pritisnite tipku Enter za izlaz",
+ "VTMENU_ENTER_REBOOT": "pritisnite tipku Enter za ponovno pokretanje",
+ "VTMENU_ENTER_CONTINUE": "pritisnite tipku Enter za nastavak",
+
"MENU_STR_XXX": ""
}
\r
"VTMENU_BROWER_RETURN": "Vissza",\r
\r
+ "VTMENU_ENTER_EXIT": "nyomja meg az Enter billentyűt a kilépéshez",\r
+ "VTMENU_ENTER_REBOOT": "nyomja meg az Enter billentyűt az újraindításhoz",\r
+ "VTMENU_ENTER_CONTINUE": "a folytatáshoz nyomja meg az Enter billentyűt",\r
+ \r
"MENU_STR_XXX": ""\r
}
\ No newline at end of file
"VTMENU_BROWER_RETURN": "Kembali",
+ "VTMENU_ENTER_EXIT": "tekan tombol Enter untuk keluar",
+ "VTMENU_ENTER_REBOOT": "tekan tombol Enter untuk reboot",
+ "VTMENU_ENTER_CONTINUE": "tekan tombol Enter untuk melanjutkan",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "戻る",
+ "VTMENU_ENTER_EXIT": "Enterキーを押して終了します",
+ "VTMENU_ENTER_REBOOT": "Enterキーを押して再起動します",
+ "VTMENU_ENTER_CONTINUE": "Enterキーを押して続行します",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "დაბრუნება",
+ "VTMENU_ENTER_EXIT": "გასასვლელად დააჭირეთ Enter ღილაკს",
+ "VTMENU_ENTER_REBOOT": "დააჭირეთ Enter ღილაკს გადატვირთვისთვის",
+ "VTMENU_ENTER_CONTINUE": "გასაგრძელებლად დააჭირეთ Enter ღილაკს",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "돌아가기",
+ "VTMENU_ENTER_EXIT": "Enter 키를 눌러 종료",
+ "VTMENU_ENTER_REBOOT": "Enter 키를 눌러 재부팅",
+ "VTMENU_ENTER_CONTINUE": "계속하려면 Enter 키를 누르십시오",
+
"MENU_STR_XXX": ""
}
\r
"VTMENU_BROWER_RETURN": "Powrót",\r
\r
+ "VTMENU_ENTER_EXIT": "naciśnij klawisz Enter, aby wyjść",\r
+ "VTMENU_ENTER_REBOOT": "naciśnij klawisz Enter, aby ponownie uruchomić",\r
+ "VTMENU_ENTER_CONTINUE": "naciśnij klawisz Enter, aby kontynuować",\r
+ \r
"MENU_STR_XXX": ""\r
}\r
"VTMENU_BROWER_RETURN": "Voltar",
+ "VTMENU_ENTER_EXIT": "pressione a tecla Enter para sair",
+ "VTMENU_ENTER_REBOOT": "pressione a tecla Enter para reiniciar",
+ "VTMENU_ENTER_CONTINUE": "pressione a tecla Enter para continuar",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "Вернуться",
+ "VTMENU_ENTER_EXIT": "нажмите клавишу Enter, чтобы выйти",
+ "VTMENU_ENTER_REBOOT": "нажмите клавишу Enter для перезагрузки",
+ "VTMENU_ENTER_CONTINUE": "нажмите клавишу Enter, чтобы продолжить",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "Return",
+ "VTMENU_ENTER_EXIT": "press Enter key to exit",
+ "VTMENU_ENTER_REBOOT": "press Enter key to reboot",
+ "VTMENU_ENTER_CONTINUE": "press Enter key to continue",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "திரும்பு",
+ "VTMENU_ENTER_EXIT": "வெளியேற Enter விசையை அழுத்தவும்",
+ "VTMENU_ENTER_REBOOT": "மறுதொடக்கம் செய்ய Enter விசையை அழுத்தவும்",
+ "VTMENU_ENTER_CONTINUE": "தொடர Enter விசையை அழுத்தவும்",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "Geri Dön",
+ "VTMENU_ENTER_EXIT": "çıkmak için ENTER tuşuna basın",
+ "VTMENU_ENTER_REBOOT": "yeniden başlatmak için ENTER'a basın",
+ "VTMENU_ENTER_CONTINUE": "devam etmek için ENTER'a basın",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "返回",
+ "VTMENU_ENTER_EXIT": "按回车键退出",
+ "VTMENU_ENTER_REBOOT": "按回车键重启",
+ "VTMENU_ENTER_CONTINUE": "按回车键继续",
+
"MENU_STR_XXX": ""
}
"VTMENU_BROWER_RETURN": "返回",
+ "VTMENU_ENTER_EXIT": "按回車鍵退出",
+ "VTMENU_ENTER_REBOOT": "按回車鍵重啟",
+ "VTMENU_ENTER_CONTINUE": "按回車鍵繼續",
+
"MENU_STR_XXX": ""
}