diff --git a/plugins/builtin/romfs/lang/de_DE.json b/plugins/builtin/romfs/lang/de_DE.json index 5c1161a7a..ee4823bb5 100644 --- a/plugins/builtin/romfs/lang/de_DE.json +++ b/plugins/builtin/romfs/lang/de_DE.json @@ -133,7 +133,6 @@ "hex.builtin.menu.file.close": "Schliessen", "hex.builtin.menu.file.create_file": "Neue Datei...", "hex.builtin.menu.file.export": "Exportieren...", - "hex.builtin.menu.file.export.base64.popup.export_error": "Datei hat kein gültiges Base64 Format!", "hex.builtin.menu.file.export.ips": "IPS Patch", "hex.builtin.menu.file.export.ips32": "IPS32 Patch", "hex.builtin.menu.file.export.popup.create": "Daten konnten nicht exportiert werden. Datei konnte nicht erstellt werden!", diff --git a/plugins/builtin/romfs/lang/en_US.json b/plugins/builtin/romfs/lang/en_US.json index 7848e6cd7..e432d9a02 100644 --- a/plugins/builtin/romfs/lang/en_US.json +++ b/plugins/builtin/romfs/lang/en_US.json @@ -136,6 +136,8 @@ "hex.builtin.menu.file.close": "Close", "hex.builtin.menu.file.create_file": "New File...", "hex.builtin.menu.file.export": "Export...", + "hex.builtin.menu.file.export.base64": "Base64", + "hex.builtin.menu.file.export.base64.popup.export_error": "Failed to create new base64 file!", "hex.builtin.menu.file.export.ips.popup.export_error": "Failed to create new IPS file!", "hex.builtin.menu.file.export.ips.popup.invalid_patch_header_error": "Invalid IPS patch header!", "hex.builtin.menu.file.export.ips.popup.address_out_of_range_error": "A patch tried to patch an address that is out of range!", diff --git a/plugins/builtin/romfs/lang/it_IT.json b/plugins/builtin/romfs/lang/it_IT.json index 1ff23a466..7f48e3750 100644 --- a/plugins/builtin/romfs/lang/it_IT.json +++ b/plugins/builtin/romfs/lang/it_IT.json @@ -132,7 +132,6 @@ "hex.builtin.menu.file.close": "Chiudi", "hex.builtin.menu.file.create_file": "***** MISSING TRANSLATION *****", "hex.builtin.menu.file.export": "Esporta...", - "hex.builtin.menu.file.export.base64.popup.export_error": "***** MISSING TRANSLATION *****", "hex.builtin.menu.file.export.ips": "IPS Patch", "hex.builtin.menu.file.export.ips32": "IPS32 Patch", "hex.builtin.menu.file.export.popup.create": "***** MISSING TRANSLATION *****", diff --git a/plugins/builtin/romfs/lang/ja_JP.json b/plugins/builtin/romfs/lang/ja_JP.json index 6640b6ea4..20fcbb6cf 100644 --- a/plugins/builtin/romfs/lang/ja_JP.json +++ b/plugins/builtin/romfs/lang/ja_JP.json @@ -132,7 +132,6 @@ "hex.builtin.menu.file.close": "ファイルを閉じる", "hex.builtin.menu.file.create_file": "***** MISSING TRANSLATION *****", "hex.builtin.menu.file.export": "エクスポート…", - "hex.builtin.menu.file.export.base64.popup.export_error": "有効なBase64形式ではありません。", "hex.builtin.menu.file.export.ips": "IPSパッチ", "hex.builtin.menu.file.export.ips32": "IPS32パッチ", "hex.builtin.menu.file.export.popup.create": "データをエクスポートできません。\nファイルの作成に失敗しました。", diff --git a/plugins/builtin/romfs/lang/ko_KR.json b/plugins/builtin/romfs/lang/ko_KR.json index bf53fdaee..7fe30a325 100644 --- a/plugins/builtin/romfs/lang/ko_KR.json +++ b/plugins/builtin/romfs/lang/ko_KR.json @@ -132,7 +132,6 @@ "hex.builtin.menu.file.close": "닫기", "hex.builtin.menu.file.create_file": "새 파일...", "hex.builtin.menu.file.export": "내보내기...", - "hex.builtin.menu.file.export.base64.popup.export_error": "파일이 올바른 Base64 형식이 아닙니다!", "hex.builtin.menu.file.export.ips": "IPS 패치", "hex.builtin.menu.file.export.ips32": "IPS32 패치", "hex.builtin.menu.file.export.popup.create": "데이터를 내보낼 수 없습니다. 파일을 만드는 데 실패했습니다!", diff --git a/plugins/builtin/romfs/lang/pt_BR.json b/plugins/builtin/romfs/lang/pt_BR.json index f3b6020d6..4948c0330 100644 --- a/plugins/builtin/romfs/lang/pt_BR.json +++ b/plugins/builtin/romfs/lang/pt_BR.json @@ -132,7 +132,6 @@ "hex.builtin.menu.file.close": "Fechar", "hex.builtin.menu.file.create_file": "***** MISSING TRANSLATION *****", "hex.builtin.menu.file.export": "Exportar...", - "hex.builtin.menu.file.export.base64.popup.export_error": "Esse arquivo não é baseado em um formato Base64 valido!", "hex.builtin.menu.file.export.ips": "IPS Patch", "hex.builtin.menu.file.export.ips32": "IPS32 Patch", "hex.builtin.menu.file.export.popup.create": "Não é possível exportar os dados. Falha ao criar arquivo!", diff --git a/plugins/builtin/romfs/lang/zh_CN.json b/plugins/builtin/romfs/lang/zh_CN.json index 4cc1e88e4..dde8bceb6 100644 --- a/plugins/builtin/romfs/lang/zh_CN.json +++ b/plugins/builtin/romfs/lang/zh_CN.json @@ -132,7 +132,6 @@ "hex.builtin.menu.file.close": "关闭", "hex.builtin.menu.file.create_file": "新建文件...", "hex.builtin.menu.file.export": "导出...", - "hex.builtin.menu.file.export.base64.popup.export_error": "文件不是有效的 Base64 格式!", "hex.builtin.menu.file.export.ips": "IPS 补丁", "hex.builtin.menu.file.export.ips32": "IPS32 补丁", "hex.builtin.menu.file.export.popup.create": "无法导出文件。文件创建失败!", diff --git a/plugins/builtin/romfs/lang/zh_TW.json b/plugins/builtin/romfs/lang/zh_TW.json index 4c627c06d..747b168e5 100644 --- a/plugins/builtin/romfs/lang/zh_TW.json +++ b/plugins/builtin/romfs/lang/zh_TW.json @@ -132,7 +132,6 @@ "hex.builtin.menu.file.close": "關閉", "hex.builtin.menu.file.create_file": "新檔案...", "hex.builtin.menu.file.export": "匯出...", - "hex.builtin.menu.file.export.base64.popup.export_error": "檔案並非有效的 Base64 格式!", "hex.builtin.menu.file.export.ips": "IPS 修補檔案", "hex.builtin.menu.file.export.ips32": "IPS32 修補檔案", "hex.builtin.menu.file.export.popup.create": "無法匯出資料。無法建立檔案!", diff --git a/plugins/builtin/source/content/main_menu_items.cpp b/plugins/builtin/source/content/main_menu_items.cpp index bbd063083..8ad895521 100644 --- a/plugins/builtin/source/content/main_menu_items.cpp +++ b/plugins/builtin/source/content/main_menu_items.cpp @@ -210,6 +210,32 @@ namespace hex::plugin::builtin { /* Export */ if (ImGui::BeginMenu("hex.builtin.menu.file.export"_lang, providerValid && provider->isWritable())) { + if (ImGui::MenuItem("hex.builtin.menu.file.export.base64"_lang)) { + + fs::openFileBrowser(fs::DialogMode::Save, {}, [](const auto &path) { + TaskManager::createTask("hex.builtin.common.processing", TaskManager::NoProgress, [path](auto &) { + fs::File outputFile(path, fs::File::Mode::Create); + if (!outputFile.isValid()) { + TaskManager::doLater([] { + View::showErrorPopup("hex.builtin.menu.file.export.base64.popup.export_error"_lang); + }); + return; + } + + auto provider = ImHexApi::Provider::get(); + std::vector bytes(3000); + for (u64 address = 0; address < provider->getActualSize(); address += 3000) { + bytes.resize(std::min(3000, provider->getActualSize() - address)); + provider->read(provider->getBaseAddress() + address, bytes.data(), bytes.size()); + + outputFile.write(crypt::encode64(bytes)); + } + }); + }); + } + + ImGui::Separator(); + if (ImGui::MenuItem("hex.builtin.menu.file.export.ips"_lang, nullptr, false)) { Patches patches = provider->getPatches();