diff --git a/jadx-core/src/main/java/jadx/api/ResourceType.java b/jadx-core/src/main/java/jadx/api/ResourceType.java index cfccef15d..6a69f3aa4 100644 --- a/jadx-core/src/main/java/jadx/api/ResourceType.java +++ b/jadx-core/src/main/java/jadx/api/ResourceType.java @@ -10,9 +10,15 @@ public enum ResourceType { CODE(".dex", ".jar", ".class"), XML(".xml"), ARSC(".arsc"), - FONT(".ttf", ".otf"), - IMG(".png", ".gif", ".jpg", ".webp"), - MEDIA(".mp3", ".wav"), + APK(".apk", ".apkm", ".apks"), + FONT(".ttf", ".ttc", ".otf"), + IMG(".png", ".gif", ".jpg", ".webp", ".bmp", ".tiff"), + ARCHIVE(".zip", ".rar", ".7zip", ".7z", ".arj", ".tar", ".gzip", ".bzip", ".bzip2", ".cab", ".cpio", ".ar", ".gz", ".tgz", ".bz2"), + VIDEOS(".mp4", ".mkv", ".webm", ".avi", ".flv", ".3gp"), + SOUNDS(".aac", ".ogg", ".opus", ".mp3", ".wav", ".wma", ".mid", ".midi"), + JSON(".json"), + TEXT(".txt", ".ini", ".conf", ".yaml", ".properties", ".js"), + HTML(".html"), LIB(".so"), MANIFEST, UNKNOWN; diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JResource.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JResource.java index f9ad0fa6e..23353edd4 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JResource.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JResource.java @@ -25,6 +25,7 @@ import jadx.gui.ui.MainWindow; import jadx.gui.ui.codearea.BinaryContentPanel; import jadx.gui.ui.codearea.CodeContentPanel; import jadx.gui.ui.panel.ContentPanel; +import jadx.gui.ui.panel.FontPanel; import jadx.gui.ui.panel.ImagePanel; import jadx.gui.ui.popupmenu.JResourcePopupMenu; import jadx.gui.ui.tab.TabbedPane; @@ -43,6 +44,14 @@ public class JResource extends JLoadableNode { private static final ImageIcon SO_ICON = UiUtils.openSvgIcon("nodes/binaryFile"); private static final ImageIcon MANIFEST_ICON = UiUtils.openSvgIcon("nodes/manifest"); private static final ImageIcon JAVA_ICON = UiUtils.openSvgIcon("nodes/java"); + private static final ImageIcon APK_ICON = UiUtils.openSvgIcon("nodes/archiveApk"); + private static final ImageIcon AUDIO_ICON = UiUtils.openSvgIcon("nodes/audioFile"); + private static final ImageIcon VIDEO_ICON = UiUtils.openSvgIcon("nodes/videoFile"); + private static final ImageIcon FONT_ICON = UiUtils.openSvgIcon("nodes/fontFile"); + private static final ImageIcon HTML_ICON = UiUtils.openSvgIcon("nodes/html"); + private static final ImageIcon JSON_ICON = UiUtils.openSvgIcon("nodes/json"); + private static final ImageIcon TEXT_ICON = UiUtils.openSvgIcon("nodes/text"); + private static final ImageIcon ARCHIVE_ICON = UiUtils.openSvgIcon("nodes/archive"); private static final ImageIcon UNKNOWN_ICON = UiUtils.openSvgIcon("nodes/unknown"); public static final Comparator RESOURCES_COMPARATOR = @@ -150,6 +159,9 @@ public class JResource extends JLoadableNode { if (resFile.getType() == ResourceType.LIB) { return new BinaryContentPanel(tabbedPane, this, false); } + if (resFile.getType() == ResourceType.FONT) { + return new FontPanel(tabbedPane, this); + } if (getSyntaxByExtension(resFile.getDeobfName()) == null) { return new BinaryContentPanel(tabbedPane, this); } @@ -287,6 +299,22 @@ public class JResource extends JLoadableNode { return SO_ICON; case CODE: return JAVA_ICON; + case APK: + return APK_ICON; + case VIDEOS: + return VIDEO_ICON; + case SOUNDS: + return AUDIO_ICON; + case FONT: + return FONT_ICON; + case HTML: + return HTML_ICON; + case JSON: + return JSON_ICON; + case TEXT: + return TEXT_ICON; + case ARCHIVE: + return ARCHIVE_ICON; case UNKNOWN: return UNKNOWN_ICON; } @@ -298,8 +326,10 @@ public class JResource extends JLoadableNode { public static boolean isSupportedForView(ResourceType type) { switch (type) { case CODE: - case FONT: - case MEDIA: + case SOUNDS: + case VIDEOS: + case ARCHIVE: + case APK: return false; case MANIFEST: @@ -307,12 +337,26 @@ public class JResource extends JLoadableNode { case ARSC: case IMG: case LIB: + case FONT: + case TEXT: + case JSON: + case HTML: case UNKNOWN: return true; } return true; } + public static boolean isOpenInExternalTool(ResourceType type) { + switch (type) { + case SOUNDS: + case VIDEOS: + return true; + default: + return false; + } + } + public ResourceFile getResFile() { return resFile; } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java index 041d49ac9..315b1d5db 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -175,6 +175,7 @@ import jadx.gui.utils.dbg.UIWatchDog; import jadx.gui.utils.fileswatcher.LiveReloadWorker; import jadx.gui.utils.shortcut.ShortcutsController; import jadx.gui.utils.ui.ActionHandler; +import jadx.gui.utils.ui.FileOpenerHelper; import jadx.gui.utils.ui.NodeLabel; public class MainWindow extends JFrame { @@ -888,9 +889,15 @@ public class MainWindow extends JFrame { if (obj instanceof JResource) { JResource res = (JResource) obj; ResourceFile resFile = res.getResFile(); - if (resFile != null && JResource.isSupportedForView(resFile.getType())) { - tabsController.selectTab(res, true); - return true; + if (resFile != null) { + if (JResource.isOpenInExternalTool(resFile.getType())) { + FileOpenerHelper.openFile(this, res); + return true; + } + if (JResource.isSupportedForView(resFile.getType())) { + tabsController.selectTab(res, true); + return true; + } } } else if (obj instanceof JNode) { JNode treeNode = (JNode) obj; diff --git a/jadx-gui/src/main/java/jadx/gui/ui/panel/FontPanel.java b/jadx-gui/src/main/java/jadx/gui/ui/panel/FontPanel.java new file mode 100644 index 000000000..921721028 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/ui/panel/FontPanel.java @@ -0,0 +1,75 @@ +package jadx.gui.ui.panel; + +import java.awt.BorderLayout; +import java.awt.Font; +import java.awt.FontFormatException; +import java.io.ByteArrayInputStream; + +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; + +import jadx.api.ResourceFile; +import jadx.api.ResourcesLoader; +import jadx.core.utils.Utils; +import jadx.core.utils.exceptions.JadxRuntimeException; +import jadx.core.xmlgen.ResContainer; +import jadx.gui.treemodel.JResource; +import jadx.gui.ui.codearea.AbstractCodeArea; +import jadx.gui.ui.tab.TabbedPane; +import jadx.gui.utils.NLS; + +public class FontPanel extends ContentPanel { + private static final long serialVersionUID = 695370628262996993L; + private static final String DEFAULT_PREVIEW_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" + + "abcdefghijklmnopqrstuvwxyz\n" + + "1234567890!@#$%^&*()_-=+[]{}<,.>"; + + public FontPanel(TabbedPane panel, JResource res) { + super(panel, res); + setLayout(new BorderLayout()); + RSyntaxTextArea textArea = AbstractCodeArea.getDefaultArea(panel.getMainWindow()); + add(textArea, BorderLayout.CENTER); + try { + Font selectedFont = loadFont(res); + if (selectedFont.canDisplay(DEFAULT_PREVIEW_STRING.codePointAt(0))) { + textArea.setFont(selectedFont); + textArea.setText(DEFAULT_PREVIEW_STRING); + } else { + textArea.setText(NLS.str("message.unable_preview_font")); + } + } catch (Exception e) { + textArea.setText("Font load error:\n" + Utils.getStackTrace(e)); + } + } + + private Font loadFont(JResource res) { + ResourceFile resFile = res.getResFile(); + ResContainer resContainer = resFile.loadContent(); + ResContainer.DataType dataType = resContainer.getDataType(); + if (dataType == ResContainer.DataType.DECODED_DATA) { + try { + return Font.createFont(Font.TRUETYPE_FONT, new ByteArrayInputStream(resContainer.getDecodedData())).deriveFont(12f); + } catch (Exception e) { + throw new JadxRuntimeException("Failed to load font", e); + } + } else if (dataType == ResContainer.DataType.RES_LINK) { + try { + return ResourcesLoader.decodeStream(resFile, (size, is) -> { + try { + return Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(12f); + } catch (FontFormatException e) { + throw new JadxRuntimeException("Failed to load font", e); + } + }); + } catch (Exception e) { + throw new JadxRuntimeException("Failed to load font", e); + } + } else { + throw new JadxRuntimeException("Unsupported resource font data type: " + resFile); + } + } + + @Override + public void loadSettings() { + // no op + } +} diff --git a/jadx-gui/src/main/java/jadx/gui/ui/popupmenu/JResourcePopupMenu.java b/jadx-gui/src/main/java/jadx/gui/ui/popupmenu/JResourcePopupMenu.java index e6313d228..b618d7f1e 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/popupmenu/JResourcePopupMenu.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/popupmenu/JResourcePopupMenu.java @@ -1,7 +1,5 @@ package jadx.gui.ui.popupmenu; -import java.io.BufferedOutputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.Writer; import java.nio.charset.StandardCharsets; @@ -17,13 +15,13 @@ import javax.swing.JPopupMenu; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import jadx.api.ResourcesLoader; import jadx.api.plugins.utils.CommonFileUtils; import jadx.gui.treemodel.JResource; import jadx.gui.ui.MainWindow; import jadx.gui.ui.filedialog.FileDialogWrapper; import jadx.gui.ui.filedialog.FileOpenMode; import jadx.gui.utils.NLS; +import jadx.gui.utils.ui.FileOpenerHelper; public class JResourcePopupMenu extends JPopupMenu { private static final long serialVersionUID = -7781009781149260806L; @@ -141,7 +139,7 @@ public class JResourcePopupMenu extends JPopupMenu { exportString(resource, savePath); break; default: - exportBinary(resource, savePath); + FileOpenerHelper.exportBinary(resource, savePath); break; } } @@ -154,16 +152,4 @@ public class JResourcePopupMenu extends JPopupMenu { } } - private static void exportBinary(JResource resource, Path savePath) { - try (BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(savePath.toFile()))) { - byte[] bytes = ResourcesLoader.decodeStream(resource.getResFile(), (size, is) -> is.readAllBytes()); - - if (bytes == null) { - bytes = new byte[0]; - } - os.write(bytes); - } catch (Exception e) { - throw new RuntimeException("Error saving file " + resource.getName(), e); - } - } } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/tab/TabbedPane.java b/jadx-gui/src/main/java/jadx/gui/ui/tab/TabbedPane.java index de177b540..84fffabc7 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/tab/TabbedPane.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/tab/TabbedPane.java @@ -32,6 +32,7 @@ import jadx.gui.ui.codearea.ClassCodeContentPanel; import jadx.gui.ui.codearea.EditorViewState; import jadx.gui.ui.codearea.SmaliArea; import jadx.gui.ui.panel.ContentPanel; +import jadx.gui.ui.panel.FontPanel; import jadx.gui.ui.panel.HtmlPanel; import jadx.gui.ui.panel.IViewStateSupport; import jadx.gui.ui.panel.ImagePanel; @@ -577,6 +578,10 @@ public class TabbedPane extends JTabbedPane implements ITabStatesListener { pane.addFocusListener(INSTANCE); return; } + if (pane instanceof FontPanel) { + pane.addFocusListener(INSTANCE); + return; + } // throw new JadxRuntimeException("Add the new ContentPanel to TabbedPane.FocusManager: " + pane); } @@ -597,6 +602,10 @@ public class TabbedPane extends JTabbedPane implements ITabStatesListener { SwingUtilities.invokeLater(((ImagePanel) pane)::requestFocusInWindow); return; } + if (pane instanceof FontPanel) { + SwingUtilities.invokeLater(((FontPanel) pane)::requestFocusInWindow); + return; + } // throw new JadxRuntimeException("Add the new ContentPanel to TabbedPane.FocusManager: " + pane); } } diff --git a/jadx-gui/src/main/java/jadx/gui/utils/ui/FileOpenerHelper.java b/jadx-gui/src/main/java/jadx/gui/utils/ui/FileOpenerHelper.java new file mode 100644 index 000000000..253544c5b --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/utils/ui/FileOpenerHelper.java @@ -0,0 +1,75 @@ +package jadx.gui.utils.ui; + +import java.awt.Desktop; +import java.awt.Frame; +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jadx.api.ResourceFile; +import jadx.api.ResourcesLoader; +import jadx.core.plugins.files.TempFilesGetter; +import jadx.gui.treemodel.JResource; +import jadx.gui.utils.NLS; +import jadx.gui.utils.UiUtils; + +public class FileOpenerHelper { + private static final Logger LOG = LoggerFactory.getLogger(FileOpenerHelper.class); + + public static void exportBinary(JResource resource, Path savePath) { + try (BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(savePath.toFile()))) { + byte[] bytes = ResourcesLoader.decodeStream(resource.getResFile(), (size, is) -> is.readAllBytes()); + + if (bytes == null) { + bytes = new byte[0]; + } + os.write(bytes); + } catch (Exception e) { + throw new RuntimeException("Error saving file " + resource.getName(), e); + } + } + + public static void openFile(Frame frame, JResource res) { + if (Desktop.isDesktopSupported()) { + Desktop desktop = Desktop.getDesktop(); + Path tempDir = TempFilesGetter.INSTANCE.getTempDir(); + ResourceFile resFile = res.getResFile(); + Path path = Paths.get(resFile.getDeobfName()); + Path fileNamePath = path.getFileName(); + Path filePath = tempDir.resolve(fileNamePath); + exportBinary(res, filePath); + + if (!Files.exists(filePath)) { + UiUtils.errorMessage(frame, NLS.str("error_dialog.not_found_file", filePath)); + return; + } + if (Files.isDirectory(filePath)) { + UiUtils.errorMessage(frame, NLS.str("error_dialog.path_is_directory", filePath)); + return; + } + if (!Files.isReadable(filePath)) { + UiUtils.errorMessage(frame, NLS.str("error_dialog.cannot_read", filePath)); + return; + } + + try { + desktop.open(filePath.toFile()); + } catch (IOException ex) { + UiUtils.errorMessage(frame, NLS.str("error_dialog.open_failed", ex.getMessage())); + LOG.error("Unable to open file: {0}", ex); + } catch (IllegalArgumentException ex) { + UiUtils.errorMessage(frame, NLS.str("error_dialog.invalid_path_format", ex.getMessage())); + LOG.error("Invalid file path: {0}", ex); + } + + } else { + UiUtils.errorMessage(frame, NLS.str("error_dialog.desktop_unsupported")); + } + } +} diff --git a/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties b/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties index dae064370..9264e954c 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_de_DE.properties @@ -74,6 +74,12 @@ progress.canceling=Breche ab error_dialog.title=Fehler error_dialog.not_found=%s nicht gefunden +#error_dialog.not_found_file=File not found at path:\n%s +#error_dialog.path_is_directory=The specified path is a directory:\n%s +#error_dialog.cannot_read=Cannot read file:\n%s +#error_dialog.open_failed=Failed to open file:\n%s +#error_dialog.invalid_path_format=Invalid file path:\n%s +#error_dialog.desktop_unsupported=Desktop is not supported in this environment. search.previous=Vorheriges search.next=Nächstes @@ -125,6 +131,7 @@ message.confirm_remove_script=Willst du das Skript wirklich entfernen? message.desktop_entry_creation_error=Erstellen des Desktop-Eintrags fehlgeschlagen (Details findest du im Protokoll). message.desktop_entry_creation_success=Desktop-Eintrag erfolgreich erstellt! message.success_title=Erfolg +#message.unable_preview_font=Unable preview font heapUsage.text=JADX-Speicherauslastung: %.2f GB von %.2f GB diff --git a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties index 6006d0980..481a29f0f 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_en_US.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_en_US.properties @@ -74,6 +74,12 @@ progress.canceling=Canceling error_dialog.title=Error error_dialog.not_found=%s not found +error_dialog.not_found_file=File not found at path:\n%s +error_dialog.path_is_directory=The specified path is a directory:\n%s +error_dialog.cannot_read=Cannot read file:\n%s +error_dialog.open_failed=Failed to open file:\n%s +error_dialog.invalid_path_format=Invalid file path:\n%s +error_dialog.desktop_unsupported=Desktop is not supported in this environment. search.previous=Previous search.next=Next @@ -125,6 +131,7 @@ message.confirm_remove_script=Do you really want to remove script? message.desktop_entry_creation_error=Failed to create desktop entry (check log for details). message.desktop_entry_creation_success=Desktop entry created successfully! message.success_title=Success +message.unable_preview_font=Unable preview font heapUsage.text=JADX memory usage: %.2f GB of %.2f GB diff --git a/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties b/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties index 38dfdf8ae..6b12d4b22 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_es_ES.properties @@ -74,6 +74,12 @@ progress.decompile=Decompiling #error_dialog.title=Error #error_dialog.not_found=%s not found +#error_dialog.not_found_file=File not found at path:\n%s +#error_dialog.path_is_directory=The specified path is a directory:\n%s +#error_dialog.cannot_read=Cannot read file:\n%s +#error_dialog.open_failed=Failed to open file:\n%s +#error_dialog.invalid_path_format=Invalid file path:\n%s +#error_dialog.desktop_unsupported=Desktop is not supported in this environment. search.previous=Anterior search.next=Siguiente @@ -125,6 +131,7 @@ nav.forward=Adelante #message.desktop_entry_creation_error=Failed to create desktop entry (check log for details). #message.desktop_entry_creation_success=Desktop entry created successfully! #message.success_title=Success +#message.unable_preview_font=Unable preview font #heapUsage.text=JADX memory usage: %.2f GB of %.2f GB diff --git a/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties b/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties index e13886915..ebdcc0111 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_id_ID.properties @@ -74,6 +74,12 @@ progress.canceling=Membatalkan error_dialog.title=Kesalahan error_dialog.not_found=%s tidak ditemukan +#error_dialog.not_found_file=File not found at path:\n%s +#error_dialog.path_is_directory=The specified path is a directory:\n%s +#error_dialog.cannot_read=Cannot read file:\n%s +#error_dialog.open_failed=Failed to open file:\n%s +#error_dialog.invalid_path_format=Invalid file path:\n%s +#error_dialog.desktop_unsupported=Desktop is not supported in this environment. search.previous=Sebelumnya search.next=Berikutnya @@ -125,6 +131,7 @@ message.indexingClassesSkipped=JADX kekurangan memori. Oleh karena itu %d #message.desktop_entry_creation_error=Failed to create desktop entry (check log for details). #message.desktop_entry_creation_success=Desktop entry created successfully! #message.success_title=Success +#message.unable_preview_font=Unable preview font heapUsage.text=Penggunaan memori JADX: %.2f GB dari %.2f GB diff --git a/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties b/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties index 90c2ce004..24cf19cf1 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties @@ -74,6 +74,12 @@ progress.canceling=취소 중 error_dialog.title=오류 #error_dialog.not_found=%s not found +#error_dialog.not_found_file=File not found at path:\n%s +#error_dialog.path_is_directory=The specified path is a directory:\n%s +#error_dialog.cannot_read=Cannot read file:\n%s +#error_dialog.open_failed=Failed to open file:\n%s +#error_dialog.invalid_path_format=Invalid file path:\n%s +#error_dialog.desktop_unsupported=Desktop is not supported in this environment. search.previous=이전 search.next=다음 @@ -125,6 +131,7 @@ message.indexingClassesSkipped=Jadx의 메모리가 부족합니다. 따 #message.desktop_entry_creation_error=Failed to create desktop entry (check log for details). #message.desktop_entry_creation_success=Desktop entry created successfully! #message.success_title=Success +#message.unable_preview_font=Unable preview font heapUsage.text=JADX 메모리 사용량 : %.2f GB / %.2f GB diff --git a/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties b/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties index 09a6b4698..d877e1b2f 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_pt_BR.properties @@ -74,6 +74,12 @@ progress.canceling=Cancelando error_dialog.title=Erro #error_dialog.not_found=%s not found +#error_dialog.not_found_file=File not found at path:\n%s +#error_dialog.path_is_directory=The specified path is a directory:\n%s +#error_dialog.cannot_read=Cannot read file:\n%s +#error_dialog.open_failed=Failed to open file:\n%s +#error_dialog.invalid_path_format=Invalid file path:\n%s +#error_dialog.desktop_unsupported=Desktop is not supported in this environment. search.previous=Anterior search.next=Próximo @@ -125,6 +131,7 @@ message.indexingClassesSkipped=Jadx está rodando com pouca memória. Por #message.desktop_entry_creation_error=Failed to create desktop entry (check log for details). #message.desktop_entry_creation_success=Desktop entry created successfully! #message.success_title=Success +#message.unable_preview_font=Unable preview font heapUsage.text=Uso de memória do JADX: %.2f GB of %.2f GB diff --git a/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties b/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties index 820e8ecd3..03513d967 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_ru_RU.properties @@ -74,6 +74,12 @@ progress.canceling=Прерывание error_dialog.title=Ошибка error_dialog.not_found= %s не найден +#error_dialog.not_found_file=File not found at path:\n%s +#error_dialog.path_is_directory=The specified path is a directory:\n%s +#error_dialog.cannot_read=Cannot read file:\n%s +#error_dialog.open_failed=Failed to open file:\n%s +#error_dialog.invalid_path_format=Invalid file path:\n%s +#error_dialog.desktop_unsupported=Desktop is not supported in this environment. search.previous=Назад search.next=Вперед @@ -125,6 +131,7 @@ message.indexingClassesSkipped=JaDX запущен с малым коли #message.desktop_entry_creation_error=Failed to create desktop entry (check log for details). #message.desktop_entry_creation_success=Desktop entry created successfully! #message.success_title=Success +#message.unable_preview_font=Unable preview font heapUsage.text=JADX использует: %.2f ГБ из %.2f ГБ diff --git a/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties b/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties index 8e361ccb6..7168dac19 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties @@ -74,6 +74,12 @@ progress.canceling=正在取消 error_dialog.title=错误 error_dialog.not_found=未找到 %s +#error_dialog.not_found_file=File not found at path:\n%s +#error_dialog.path_is_directory=The specified path is a directory:\n%s +#error_dialog.cannot_read=Cannot read file:\n%s +#error_dialog.open_failed=Failed to open file:\n%s +#error_dialog.invalid_path_format=Invalid file path:\n%s +#error_dialog.desktop_unsupported=Desktop is not supported in this environment. search.previous=上一个 search.next=下一个 @@ -125,6 +131,7 @@ message.confirm_remove_script=您真的要删除脚本吗? message.desktop_entry_creation_error=创建桌面入口失败(请检查日志以了解详细信息)。 message.desktop_entry_creation_success=创建桌面入口创建成功! message.success_title=成功 +#message.unable_preview_font=Unable preview font heapUsage.text=JADX 内存使用率:%.2f GB / %.2f GB diff --git a/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties b/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties index 877f2757d..2c09a927c 100644 --- a/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties +++ b/jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties @@ -74,6 +74,12 @@ progress.canceling=正在取消 error_dialog.title=錯誤 error_dialog.not_found=找不到 %s +#error_dialog.not_found_file=File not found at path:\n%s +#error_dialog.path_is_directory=The specified path is a directory:\n%s +#error_dialog.cannot_read=Cannot read file:\n%s +#error_dialog.open_failed=Failed to open file:\n%s +#error_dialog.invalid_path_format=Invalid file path:\n%s +#error_dialog.desktop_unsupported=Desktop is not supported in this environment. search.previous=上一個 search.next=下一個 @@ -125,6 +131,7 @@ message.confirm_remove_script=您確定要移除指令碼嗎? message.desktop_entry_creation_error=建立桌面項目失敗(詳情請查閱日誌)。 message.desktop_entry_creation_success=成功建立桌面項目! message.success_title=成功 +#message.unable_preview_font=Unable preview font heapUsage.text=JADX 記憶體使用率:%.2f GB / %.2f GB diff --git a/jadx-gui/src/main/resources/icons/nodes/archive.svg b/jadx-gui/src/main/resources/icons/nodes/archive.svg new file mode 100644 index 000000000..4c3915cd9 --- /dev/null +++ b/jadx-gui/src/main/resources/icons/nodes/archive.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/jadx-gui/src/main/resources/icons/nodes/archiveApk.svg b/jadx-gui/src/main/resources/icons/nodes/archiveApk.svg new file mode 100644 index 000000000..22f8215de --- /dev/null +++ b/jadx-gui/src/main/resources/icons/nodes/archiveApk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/jadx-gui/src/main/resources/icons/nodes/audioFile.svg b/jadx-gui/src/main/resources/icons/nodes/audioFile.svg new file mode 100644 index 000000000..a58d7c5e4 --- /dev/null +++ b/jadx-gui/src/main/resources/icons/nodes/audioFile.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/jadx-gui/src/main/resources/icons/nodes/fontFile.svg b/jadx-gui/src/main/resources/icons/nodes/fontFile.svg new file mode 100644 index 000000000..9409fc27e --- /dev/null +++ b/jadx-gui/src/main/resources/icons/nodes/fontFile.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/jadx-gui/src/main/resources/icons/nodes/html.svg b/jadx-gui/src/main/resources/icons/nodes/html.svg new file mode 100644 index 000000000..c6f988bd2 --- /dev/null +++ b/jadx-gui/src/main/resources/icons/nodes/html.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/jadx-gui/src/main/resources/icons/nodes/json.svg b/jadx-gui/src/main/resources/icons/nodes/json.svg new file mode 100644 index 000000000..237e9f408 --- /dev/null +++ b/jadx-gui/src/main/resources/icons/nodes/json.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/jadx-gui/src/main/resources/icons/nodes/text.svg b/jadx-gui/src/main/resources/icons/nodes/text.svg new file mode 100644 index 000000000..2a243a7c8 --- /dev/null +++ b/jadx-gui/src/main/resources/icons/nodes/text.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/jadx-gui/src/main/resources/icons/nodes/videoFile.svg b/jadx-gui/src/main/resources/icons/nodes/videoFile.svg new file mode 100644 index 000000000..32cfeb4ac --- /dev/null +++ b/jadx-gui/src/main/resources/icons/nodes/videoFile.svg @@ -0,0 +1,4 @@ + + + +