]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - INSTALL/grub/grub.cfg
menu language update
[Ventoy.git] / INSTALL / grub / grub.cfg
index a53de0a05af0b95f8e0c1d7e152f75656269b2df..10260146ff077ad588e6cb3ff3dd49fd2b53014e 100644 (file)
 # 
 #************************************************************************************
 
+if [ "$grub_platform" = "pc" ]; then
+    insmod setkey
+    insmod regexp
+    insmod video_fb
+fi
+
 function ventoy_pause {
     echo "press Enter to continue ......"
     read vtTmpPause
@@ -65,6 +71,10 @@ function ventoy_vcfg_proc {
     fi
 }
 
+function ventoy_language {
+    configfile $prefix/menulang.cfg
+}
+
 function ventoy_diagnosis {
     vt_enum_video_mode    
     configfile $prefix/debug.cfg
@@ -81,7 +91,7 @@ function ventoy_ext_menu {
         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
 }
@@ -99,8 +109,9 @@ function ventoy_show_help {
         fi
 
         loopback vt_help_tarfs mem:${vtoy_help_txt_mem_addr}:size:${vtoy_help_txt_mem_size}
-        if [ -f "(vt_help_tarfs)/help/${VTOY_HELP_TXT_LANGUAGE}.txt" ]; then
-            cat "(vt_help_tarfs)/help/${VTOY_HELP_TXT_LANGUAGE}.txt"
+        vt_cur_menu_lang vtCurLang
+        if [ -f "(vt_help_tarfs)/help/${vtCurLang}.txt" ]; then
+            cat "(vt_help_tarfs)/help/${vtCurLang}.txt"
         else
             cat "(vt_help_tarfs)/help/en_US.txt"
         fi        
@@ -108,6 +119,11 @@ function ventoy_show_help {
     fi
 }
 
+function ventoy_load_menu_lang_file {
+    vt_load_file_to_mem "auto" $vtoy_efi_part/grub/menu.tar.gz vtoy_menu_lang_mem
+    loopback vt_menu_tarfs mem:${vtoy_menu_lang_mem_addr}:size:${vtoy_menu_lang_mem_size}    
+}
+
 function get_os_type {
     set vtoy_os=Linux
     
@@ -599,33 +615,36 @@ function ventoy_unix_comm_proc {
 function uefi_windows_menu_func {
     vt_windows_reset
 
+    unset vt_cur_wimboot_mode
     if vt_check_mode 4 "$vt_chosen_name"; then
-        vt_windows_chain_data "${1}${chosen_path}"
-        ventoy_debug_pause
-        vtoy_wimboot_func
-    else
-        if [ "$ventoy_compatible" = "NO" ]; then   
-            
-            if [ "$ventoy_fs_probe" = "iso9660" ]; then
-                loopback -d loop
-                vt_iso9660_nojoliet 1            
-                loopback loop "$1$2"
-            fi
-            
-            for file in "efi/microsoft/boot/bcd"; do
-                vt_windows_collect_wim_patch bcd (loop)/$file                
-            done
+        set vt_cur_wimboot_mode=1
+    fi
 
-            vt_windows_count_wim_patch vt_wim_cnt
-            if [ $vt_wim_cnt -eq 0 ]; then
-                distro_specify_wim_patch_phase2
-            fi
-            
-            ventoy_debug_pause        
-            locate_wim "${chosen_path}"
+    if [ "$ventoy_compatible" = "NO" -o "$vt_cur_wimboot_mode" = "1" ]; then
+        if [ "$ventoy_fs_probe" = "iso9660" ]; then
+            loopback -d loop
+            vt_iso9660_nojoliet 1            
+            loopback loop "$1$2"
         fi
-        vt_windows_chain_data "${1}${chosen_path}"
-        ventoy_debug_pause
+        
+        for file in "efi/microsoft/boot/bcd"; do
+            vt_windows_collect_wim_patch bcd (loop)/$file                
+        done
+
+        vt_windows_count_wim_patch vt_wim_cnt
+        if [ $vt_wim_cnt -eq 0 ]; then
+            distro_specify_wim_patch_phase2
+        fi
+        
+        ventoy_debug_pause        
+        locate_wim "${chosen_path}"
+    fi
+    
+    vt_windows_chain_data "${1}${chosen_path}"
+    ventoy_debug_pause
+
+    if [ "$vt_cur_wimboot_mode" = "1" ]; then
+        vtoy_wimboot_func
     fi
 
     if [ -n "$vtoy_chain_mem_addr" ]; then
@@ -784,6 +803,10 @@ function uefi_linux_menu_func {
         unset vtGrub2Mode
         if vt_check_mode 3 "$vt_chosen_name"; then
             set vtGrub2Mode=1
+        elif vt_str_begin "$vt_volume_id" "HOLO_"; then
+            if [ -d (loop)/loader/entries ]; then
+                set vtGrub2Mode=1
+            fi
         elif vt_str_begin "$vt_volume_id" "KRD"; then
             if [ -f (loop)/boot/grub/grub.cfg.sig ]; then
                 set vtGrub2Mode=1
@@ -817,6 +840,25 @@ function uefi_linux_menu_func {
                 break
             fi
         done
+        if [ $vtback_cfg_find -eq 0 ]; then
+            if [ -f (loop)/loader/loader.conf -a -d (loop)/loader/entries ]; then
+                if vt_str_begin "$vt_volume_id" "HOLO_"; then
+                    set root=(loop,2)
+                    vt_systemd_menu (loop,2) vt_sys_menu_mem
+                else
+                    vt_systemd_menu (loop) vt_sys_menu_mem
+                fi
+                set vtback_cfg_find=1
+                configfile "mem:${vt_sys_menu_mem_addr}:size:${vt_sys_menu_mem_size}"
+            fi
+        fi
+        
+        if [ $vtback_cfg_find -eq 0 ]; then
+            if [ -f (loop)/boot/isolinux/syslnx64.cfg ]; then
+                syslinux_configfile (loop)/boot/isolinux/syslnx64.cfg
+                set vtback_cfg_find=1
+            fi
+        fi
 
         if [ "$vtback_cfg_find" = "0" ]; then
             echo " "
@@ -913,6 +955,15 @@ function uefi_iso_menu_func {
         vt_check_compatible (loop)        
     fi
     
+    if vt_need_secondary_menu "$vt_chosen_name"; then
+        vt_show_secondary_menu "$vt_chosen_path" "$vtoy_os" $vt_chosen_size
+        if vt_check_mode 0 "$vt_chosen_name"; then
+            uefi_iso_memdisk $vtoy_iso_part  "$vt_chosen_path"
+            vt_secondary_recover_mode
+            return
+        fi
+    fi
+    
     vt_img_sector "${1}${chosen_path}"
     
     if [ "$ventoy_fs_probe" = "iso9660" ]; then
@@ -930,6 +981,7 @@ function uefi_iso_menu_func {
     fi
 
     ventoy_gui_console
+    vt_secondary_recover_mode
 }
 
 function uefi_iso_memdisk {    
@@ -964,17 +1016,7 @@ function vtoy_windows_wimboot {
         echo vtoy_wimboot_prefix=$vtoy_wimboot_prefix vtoy_wimboot_bit=$vtoy_wimboot_bit vt_wimkernel=$vt_wimkernel
     fi
 
-    for wmfile in sources/boot.wim boot/bcd boot/boot.sdi; do
-        if [ ! -f $vtoy_wimboot_prefix/$wmfile ]; then
-            return
-        fi
-    done
-
-    if [ -f $vtoy_wimboot_prefix/sources/install.wim -o -f $vtoy_wimboot_prefix/sources/install.esd ]; then
-        vt_windows_wimboot_data "$vtoy_wimboot_prefix/sources/boot.wim" vtoy_init_exe
-    else
-        return
-    fi
+    vt_windows_wimboot_data "$vtoy_wimboot_prefix/sources/boot.wim" vtoy_init_exe vtoy_wim_bit
     
     if [ "$grub_platform" = "pc" ]; then
         linux16  "$vtoy_path/$vt_wimkernel"  quiet
@@ -1014,39 +1056,42 @@ function vtoy_windows_wimboot {
 }
 
 function vtoy_winpe_wimboot {
-    unset vtoy_boot_mgr_exe
-    unset vtoy_boot_mgr_efi
-    set vtoy_wimboot_prefix=(loop)
-    set vtoy_bcd_path="$1"
-    set vtoy_sdi_path="$2"
-    set vtoy_wim_path="$3"
-    set vtoy_mgr_flag="$4"
+    unset vtoy_boot_sdi_legacy
+    unset vtoy_boot_sdi_efi
     
-    if [ $vtoy_mgr_flag -eq 1 ]; then
-        set vtoy_boot_mgr_exe="newc:bootmgr.exe:$vtoy_wimboot_prefix/$5"
-    elif [ $vtoy_mgr_flag -eq 2 ]; then
-        set vtoy_boot_mgr_efi="vf=bootmgr.efi:$vtoy_wimboot_prefix/$5"
-    elif [ $vtoy_mgr_flag -eq 3 ]; then
-        set vtoy_boot_mgr_exe="newc:bootmgr.exe:$vtoy_wimboot_prefix/$5"
-        set vtoy_boot_mgr_efi="vf=bootmgr.efi:$vtoy_wimboot_prefix/$6"
+    set vtoy_wimboot_prefix=(loop)    
+    set vtoy_wim_path="$1"
+    
+    if [ -n "${vtdebug_flag}" ]; then
+        echo "winpe_wimboot $1 $2 $3"
+    fi
+    
+    if [ "$2" != "0" ]; then
+        set vtoy_boot_sdi_legacy="newc:boot.sdi:$vtoy_wimboot_prefix/$2"
+        set vtoy_boot_sdi_efi="vf=boot.sdi:$vtoy_wimboot_prefix/$2"
     fi
 
-    vt_windows_wimboot_data $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_init_exe
+    vt_windows_wimboot_data $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_init_exe vtoy_wim_bit
     
     if [ "$grub_platform" = "pc" ]; then
-        linux16  "$vtoy_path/$vt_wimkernel"  quiet
+        linux16  "$vtoy_path/$vt_wimkernel" quiet
         ventoy_debug_pause
 
-        vt_set_wim_load_prompt 1 "Loading files......"        
+        vt_set_wim_load_prompt 1 "Loading files......"         
         initrd16 newc:$vtoy_init_exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size} \
-             $vtoy_boot_mgr_exe \
-             newc:vtoy_wimboot:$vtoy_wimboot_prefix/$vtoy_bcd_path \
-             newc:bcd:$vtoy_wimboot_prefix/$vtoy_bcd_path \
-             newc:boot.sdi:$vtoy_wimboot_prefix/$vtoy_sdi_path \
+             newc:vtoy_wimboot:$vtoy_path/$vt_wimkernel \
+             newc:bootmgr.exe:mem:${vtoy_pe_bootmgr_mem_addr}:size:${vtoy_pe_bootmgr_mem_size} \
+             newc:bcd:mem:${vtoy_pe_bcd_mem_addr}:size:${vtoy_pe_bcd_mem_size} \
+             $vtoy_boot_sdi_legacy \
              newc:boot.wim:$vtoy_wimboot_prefix/$vtoy_wim_path
-        vt_set_wim_load_prompt 0
+        vt_set_wim_load_prompt 0        
         boot
     else
+        if [ "$VTOY_EFI_ARCH" = "x64" -a "$vtoy_wim_bit" = "32" ]; then
+            echo -e "\nThis is 32bit Windows and does NOT support x86_64 UEFI firmware.\n"
+            echo -e "这是32位的 Windows 系统,不支持当前的64位 UEFI 环境。\n"
+        fi
+
         vt_set_wim_load_prompt 1 "Loading files......"
         vt_load_file_to_mem "nodecompress" $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_wimfile_mem
         vt_set_wim_load_prompt 0
@@ -1056,14 +1101,19 @@ function vtoy_winpe_wimboot {
         else
             set vtoy_wimfile_path=$vtoy_wimboot_prefix/$vtoy_wim_path
         fi
+        
+        unset vtoy_boot_efi_path
+        if [ -F (loop)/efi/boot/boot${VTOY_EFI_ARCH}.efi ]; then
+            set vtoy_boot_efi_path="vf=bootx64.efi:(loop)/efi/boot/boot${VTOY_EFI_ARCH}.efi"
+        fi
 
         ventoy_cli_console
         chainloader "$vtoy_path/$vt_wimkernel" quiet \
             "vf=$vtoy_init_exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size}" \
-            "vf=vtoy_wimboot:$vtoy_wimboot_prefix/$vtoy_bcd_path" \
-            "$vtoy_boot_mgr_efi" \
-            "vf=bcd:$vtoy_wimboot_prefix/$vtoy_bcd_path" \
-            "vf=boot.sdi:$vtoy_wimboot_prefix/$vtoy_sdi_path" \
+            "vf=vtoy_wimboot:$vtoy_path/$vt_wimkernel" \
+            "vf=bcd:mem:${vtoy_pe_bcd_mem_addr}:size:${vtoy_pe_bcd_mem_size}" \
+            "$vtoy_boot_sdi_efi" \
+            "$vtoy_boot_efi_path" \
             "vf=boot.wim:$vtoy_wimfile_path" \
             pfsize=$vtoy_chain_file_size  \
             pfread=$vtoy_chain_file_read
@@ -1073,8 +1123,6 @@ function vtoy_winpe_wimboot {
 }
 
 function vtoy_wimboot_func {
-    echo -e "\n===================== VENTOY WIMBOOT ===================\n"
-
     if [ "$grub_platform" = "pc" ]; then
         set vt_wimkernel=wimboot.x86_64.xz        
     else
@@ -1085,46 +1133,75 @@ function vtoy_wimboot_func {
         fi
     fi
 
-    if vt_str_begin "$vt_volume_id" "Modified-Win10PEx64"; then
-        vtoy_winpe_wimboot 'Boot/bcd' 'Boot/boot.sdi' 'sources/boot.wim' 1 'bootmgr.exe'
-    else
+    if vt_is_standard_winiso (loop); then
+        echo -e "\n==================== VENTOY WIMBOOT ==================\n"
         vtoy_windows_wimboot
+    else
+        vt_sel_winpe_wim (loop)
+        if [ -n "$vtoy_pe_wim_path" ]; then            
+            echo -e "\n==================== VENTOY WIMBOOT ==================\n"
+            
+            vt_fs_ignore_case 1
+            vt_load_file_to_mem "auto" $vtoy_path/common_bcd.xz vtoy_pe_bcd_mem
+            
+            set vt_sdi_path=0
+            for vsdi in "boot/boot.sdi" "2K10/FONTS/boot.sdi" "SSTR/boot.sdi" "ISPE/BOOT.SDI" \
+            "boot/uqi.sdi" "ISYL/boot.sdi" "WEPE/WEPE.SDI" ; do
+                if [ -F "(loop)/$vsdi" ]; then
+                    set vt_sdi_path=$vsdi
+                    break
+                fi
+            done
+            
+            if [ "$grub_platform" = "pc" ]; then
+                vt_load_file_to_mem "auto" $vtoy_path/common_bootmgr.xz vtoy_pe_bootmgr_mem
+                vtoy_winpe_wimboot "$vtoy_pe_wim_path" "$vt_sdi_path" 1
+            else
+                vtoy_winpe_wimboot "$vtoy_pe_wim_path" "$vt_sdi_path" 0
+            fi
+            
+            vt_fs_ignore_case 0
+        fi
     fi
 }
 
 function legacy_windows_menu_func {
     vt_windows_reset
     
+    unset vt_cur_wimboot_mode
     if vt_check_mode 4 "$vt_chosen_name"; then
-        vt_windows_chain_data "${1}${chosen_path}"
-        ventoy_debug_pause
-        vtoy_wimboot_func
-    else
-        if [ "$ventoy_compatible" = "NO" ]; then   
-            
-            if [ "$ventoy_fs_probe" = "iso9660" ]; then
-                loopback -d loop
-                vt_iso9660_nojoliet 1
-                loopback loop "$1$2"
-            fi
-            
-            for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD" "boot/bce"; do
-                vt_windows_collect_wim_patch bcd (loop)/$file                
-            done
-            
-            distro_specify_wim_patch
+        set vt_cur_wimboot_mode=1
+    fi
+    
+    if [ "$ventoy_compatible" = "NO" -o "$vt_cur_wimboot_mode" = "1" ]; then
+        if [ "$ventoy_fs_probe" = "iso9660" ]; then
+            loopback -d loop
+            vt_iso9660_nojoliet 1
+            loopback loop "$1$2"
+        fi
+        
+        for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD" "boot/bce"; do
+            vt_windows_collect_wim_patch bcd (loop)/$file                
+        done
+        
+        distro_specify_wim_patch
 
-            vt_windows_count_wim_patch vt_wim_cnt
-            if [ $vt_wim_cnt -eq 0 ]; then
-                distro_specify_wim_patch_phase2
-            fi
-            
-            ventoy_debug_pause        
-            locate_wim "${chosen_path}"
+        vt_windows_count_wim_patch vt_wim_cnt
+        if [ $vt_wim_cnt -eq 0 ]; then
+            distro_specify_wim_patch_phase2
         fi
         
-        vt_windows_chain_data "${1}${chosen_path}"
         ventoy_debug_pause
+        if [ -z "$vt_cur_wimboot_mode" ]; then
+            locate_wim "${chosen_path}"
+        fi
+    fi
+    
+    vt_windows_chain_data "${1}${chosen_path}"
+    ventoy_debug_pause
+    
+    if [ "$vt_cur_wimboot_mode" = "1" ]; then
+        vtoy_wimboot_func
     fi
 
     if [ -n "$vtoy_chain_mem_addr" ]; then
@@ -1206,10 +1283,19 @@ function legacy_linux_menu_func {
     ventoy_debug_pause
     
     if [ -n "$vtoy_chain_mem_addr" ]; then
+        unset vtGrub2Mode
         if vt_check_mode 3 "$vt_chosen_name"; then
+            set vtGrub2Mode=1
+        elif vt_str_begin "$vt_volume_id" "HOLO_"; then
+            if [ -d (loop)/loader/entries ]; then
+                set vtGrub2Mode=1
+            fi        
+        fi
+    
+        if [ -n "$vtGrub2Mode" ]; then
             ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
             ventoy_cli_console
-        
+
             # fallback
             set vtback_root=$root        
             vt_push_last_entry
@@ -1228,6 +1314,25 @@ function legacy_linux_menu_func {
                     break
                 fi
             done
+            if [ $vtback_cfg_find -eq 0 ]; then
+                if [ -f (loop)/loader/loader.conf -a -d (loop)/loader/entries ]; then                    
+                    if vt_str_begin "$vt_volume_id" "HOLO_"; then
+                        set root=(loop,2)
+                        vt_systemd_menu (loop,2) vt_sys_menu_mem
+                    else
+                        vt_systemd_menu (loop) vt_sys_menu_mem
+                    fi
+                    set vtback_cfg_find=1  
+                    configfile "mem:${vt_sys_menu_mem_addr}:size:${vt_sys_menu_mem_size}"
+                fi
+            fi
+            
+            if [ $vtback_cfg_find -eq 0 ]; then
+                if [ -f (loop)/boot/isolinux/syslnx64.cfg ]; then
+                    syslinux_configfile (loop)/boot/isolinux/syslnx64.cfg
+                    set vtback_cfg_find=1
+                fi
+            fi
 
             vt_unset_boot_opt
             set root=$vtback_root        
@@ -1291,6 +1396,15 @@ function legacy_iso_menu_func {
         vt_check_compatible (loop)
     fi
     
+    if vt_need_secondary_menu "$vt_chosen_name"; then
+        vt_show_secondary_menu "$vt_chosen_path" "$vtoy_os" $vt_chosen_size  
+        if vt_check_mode 0 "$vt_chosen_name"; then
+            legacy_iso_memdisk $vtoy_iso_part  "$vt_chosen_path"
+            vt_secondary_recover_mode
+            return
+        fi        
+    fi
+
     vt_img_sector "${1}${chosen_path}"
 
     if [ "$ventoy_fs_probe" = "iso9660" ]; then
@@ -1306,6 +1420,7 @@ function legacy_iso_menu_func {
         vt_check_compatible_linux (loop)
         legacy_linux_menu_func  "$1" "${chosen_path}"
     fi
+    vt_secondary_recover_mode
 }
 
 function legacy_iso_memdisk {
@@ -1386,7 +1501,7 @@ function iso_common_menuentry {
             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
@@ -1474,7 +1589,7 @@ function miso_common_menuentry {
 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
 }
 
@@ -1621,7 +1736,7 @@ function vhd_common_menuentry {
                 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
@@ -1730,7 +1845,7 @@ function vtoy_unsupport_menuentry {
 
 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 
 }
 
@@ -1762,6 +1877,41 @@ function ventoy_img_easyos {
     loopback -d easysfs
 }
 
+function ventoy_img_easyos2 {
+    vt_load_cpio  $vtoy_path  "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+    vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+    
+    if [ -e (vtimghd,2)/easyos/easy.sfs ]; then
+        loopback easysfs (vtimghd,2)/easyos/easy.sfs
+    elif [ -d (vtimghd,2)/easyos/releases ]; then
+        vt_fs_enum_1st_dir (vtimghd,2) /easyos/releases/ vt_dir_name
+        loopback easysfs (vtimghd,2)/easyos/releases/$vt_dir_name/easy.sfs
+    fi
+    
+    vt_get_lib_module_ver (easysfs) /lib/modules/ vt_module_ver
+    
+    if [ -n "$vt_module_ver" ]; then        
+        for mod in "kernel/drivers/md/dm-mod.ko" "kernel/drivers/dax/dax.ko"; do
+            if [ -e (easysfs)/lib/modules/$vt_module_ver/$mod ]; then
+                vt_img_extra_initrd_append  (easysfs)/lib/modules/$vt_module_ver/$mod
+            fi
+        done
+    fi
+
+    ventoy_debug_pause
+
+    #boot image file
+    vt_set_boot_opt rdinit=/vtoy/vtoy
+    vt_img_hook_root
+    
+    vt_limine_menu (vtimghd,1)/limine.cfg vt_sys_menu_mem
+    configfile "mem:${vt_sys_menu_mem_addr}:size:${vt_sys_menu_mem_size}"
+    
+    vt_img_unhook_root
+    vt_unset_boot_opt
+    loopback -d easysfs
+}
+
 function ventoy_img_volumio {
     vt_load_cpio  $vtoy_path  "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
     vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
@@ -1953,7 +2103,7 @@ function ventoy_img_openwrt {
             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
@@ -2085,7 +2235,7 @@ function ventoy_img_memtest86 {
 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 
 }
 
@@ -2177,19 +2327,22 @@ function img_common_menuentry {
         ventoy_img_esysrescue
     elif [ -e (vtimghd,1)/easy.sfs ]; then
         ventoy_img_easyos
+    elif [ -d (vtimghd,2)/easyos ]; then
+        ventoy_img_easyos2
     elif [ -e (vtimghd,1)/volumio.initrd ]; then
         ventoy_img_volumio
     elif [ -f (vtimghd,2)/loader/entries/ubos.conf ]; then
         ventoy_img_ubos
     elif [ -f (vtimghd,2)/etc/openwrt_version ]; then
-        ventoy_img_openwrt
-    elif [ -f (vtimghd,1)/efi/boot/mt86.png ]; then 
-        if [ "$grub_platform" = "pc" ]; then
-            img_unsupport_tip
-        else
-            ventoy_img_memtest86            
-        fi    
+        ventoy_img_openwrt    
     else
+        if [ -f (vtimghd,1)/efi/boot/mt86.png ]; then 
+            if [ "$grub_platform" = "pc" ]; then
+                img_unsupport_tip
+            fi 
+        fi
+
+        #common chain
         vt_linux_chain_data "${vtoy_iso_part}${vt_chosen_path}"
         ventoy_acpi_param ${vtoy_chain_mem_addr} 512
         if [ "$grub_platform" = "pc" ]; then 
@@ -2214,6 +2367,28 @@ function img_unsupport_menuentry {
     common_unsupport_menuentry
 }
 
+function mimg_common_menuentry {
+    vt_chosen_img_path vt_chosen_path vt_chosen_size vt_chosen_name
+
+    if vt_check_password "${vt_chosen_path}"; then
+        return
+    fi
+
+    echo "memdisk mode boot for $vt_chosen_path"
+    echo ""
+    ventoy_debug_pause
+
+    if [ "$grub_platform" = "pc" ]; then
+        legacy_img_memdisk $vtoy_iso_part "$vt_chosen_path"
+    else
+        vt_load_img_memdisk "$vtoy_iso_part$vt_chosen_path" vtoy_img_buf
+        ventoy_cli_console
+        chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi memdisk env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_img_buf_addr}:size:${vtoy_img_buf_size}
+        boot
+        ventoy_gui_console    
+    fi      
+}
+
 #############################################################
 #############################################################
 #############################################################
@@ -2222,7 +2397,7 @@ function img_unsupport_menuentry {
 #############################################################
 #############################################################
 
-set VENTOY_VERSION="1.0.79"
+set VENTOY_VERSION="1.0.84"
 
 #ACPI not compatible with Window7/8, so disable by default
 set VTOY_PARAM_NO_ACPI=1
@@ -2246,6 +2421,7 @@ set VTOY_HELP_CMD="ventoy_show_help"
 set VTOY_CHKSUM_CMD="ventoy_checksum"
 set VTOY_HELP_TXT_LANGUAGE="en_US"
 set VTOY_CHKSUM_FILE_PATH="X"
+set VTOY_LANG_CMD="ventoy_language"
 
 
 if [ "$grub_platform" = "pc" ]; then
@@ -2280,6 +2456,11 @@ if [ "$vtoy_dev" = "tftp" ]; then
     done
     loadfont ascii
 
+    if [ -n "$vtoy_efi_part" ]; then
+        vt_load_file_to_mem "auto" $vtoy_efi_part/grub/fonts/unicode.pf2 vtoy_font_mem
+        loadfont mem:${vtoy_font_mem_addr}:size:${vtoy_font_mem_size}
+    fi
+
     if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
         set vt_plugin_path=$vtoy_iso_part
     else
@@ -2306,6 +2487,9 @@ fi
 #Load Partition Table
 vt_load_part_table $vtoydev
 
+#Load menu lang file
+ventoy_load_menu_lang_file
+
 #Load Plugin
 if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
     clear
@@ -2315,6 +2499,12 @@ else
     vt_check_json_path_case $vtoy_iso_part
 fi
 
+if [ -n "$VTOY_MENU_LANGUAGE" ]; then
+    vt_init_menu_lang "$VTOY_MENU_LANGUAGE"
+else
+    vt_init_menu_lang en_US
+fi
+
 if [ -n "$VTOY_MENU_TIMEOUT" ]; then
     set timeout=$VTOY_MENU_TIMEOUT
 else
@@ -2336,10 +2526,8 @@ fi
 
 if [ $VTOY_DEFAULT_MENU_MODE -eq 0 ]; then
     set VTOY_F3_CMD="vt_dynamic_menu 1 1"
-    set VTOY_HOTKEY_TIP="h:Help  F1:Memdisk  F2:Browser  F3:TreeView  F4:Localboot  F5:Tools  F6:ExMenu"
 else
     set VTOY_F3_CMD="vt_dynamic_menu 1 0"
-    set VTOY_HOTKEY_TIP="h:Help  F1:Memdisk  F2:Browser  F3:ListView  F4:Localboot  F5:Tools  F6:ExMenu"
 fi
 
 terminal_output  console
@@ -2448,6 +2636,7 @@ export VTOY_HELP_CMD
 export VTOY_CHKSUM_CMD
 export VTOY_HELP_TXT_LANGUAGE
 export VTOY_CHKSUM_FILE_PATH
+export VTOY_LANG_CMD
 
 
 #colect all image files (iso files)