diff --git a/modules/browser/src/main/kotlin/browser/detail/FlagsEditDialog.kt b/modules/browser/src/main/kotlin/browser/detail/FlagsEditDialog.kt index 63be8186..2cd5d678 100644 --- a/modules/browser/src/main/kotlin/browser/detail/FlagsEditDialog.kt +++ b/modules/browser/src/main/kotlin/browser/detail/FlagsEditDialog.kt @@ -60,14 +60,11 @@ class AccessFlagsEditDialog(selectedValue: Int, validFlags: Set, par ) { override fun getFlagText(flag: AccessFlag): String { @Suppress("HardCodedStringLiteral") - val extraText = " (0x" + "%04x".format(flag.flag) + (flag.sinceJava?.let { ", " + getString("since.0", it) } - ?: "") + ")" - return flag.getAccessFlagText() + extraText - } - - private fun AccessFlag.getAccessFlagText(): String = when (this) { - AccessFlag.SUPER -> "super (historical)" - else -> verbose + val extraText = " (0x" + "%04x".format(flag.flag) + + (flag.sinceJava?.let { ", " + getString("access.flag.since.0", it) } ?: "") + + (if (flag.historical) ", " + getString("access.flag.historical") else "") + + ")" + return flag.verbose + extraText } override fun composeFrom(keys: Set): Int = AccessFlag.composeFrom(keys) diff --git a/modules/browser/src/main/kotlin/browser/detail/attributes/code/ByteCodeDetailPane.kt b/modules/browser/src/main/kotlin/browser/detail/attributes/code/ByteCodeDetailPane.kt index 391da76d..cfa114d0 100644 --- a/modules/browser/src/main/kotlin/browser/detail/attributes/code/ByteCodeDetailPane.kt +++ b/modules/browser/src/main/kotlin/browser/detail/attributes/code/ByteCodeDetailPane.kt @@ -104,7 +104,7 @@ class ByteCodeDetailPane(services: BrowserServices, private val codeAttributeDet private fun replaceOpcode(instruction: Instruction) { val replacementOpcodes = getStackCompatibleReplacementOpcodes(instruction) if (replacementOpcodes.isEmpty()) { - GUIHelper.showMessage(this, "There are no compatible opcodes for the selected instruction", null, JOptionPane.WARNING_MESSAGE) + GUIHelper.showMessage(this, getString("no.compatible.opcode"), null, JOptionPane.WARNING_MESSAGE) } else { val opcode = instruction.opcode val newOpcode = JOptionPane.showInputDialog( diff --git a/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser.properties b/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser.properties index b6a4a674..bc7796a9 100644 --- a/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser.properties +++ b/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser.properties @@ -271,7 +271,7 @@ menu.const.name=Const name key.const.value=Const value: menu.resolution=Resolution menu.class=Class -since.0=since {0} +access.flag.since.0=since {0} action.show.jvm.spec=Show JVM Spec action.replace.opcode=Replace Opcode choose.compatible.opcode=Choose a compatible opcode that has the same size and the same stack modification behavior: @@ -310,3 +310,5 @@ message.connection.failed.0=Connection failed: {0} message.could.not.redefine.class.file=Could not redefine class file error.message.was.0=The error message was: {0} classes.attach.info=Note: Classes that are loaded in attach mode are reconstituted by the JVM and only contain information that is relevant at runtime +no.compatible.opcode=There are no compatible opcodes for the selected instruction +access.flag.historical=historical diff --git a/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_de.properties b/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_de.properties index d361ebc4..43ca30de 100644 --- a/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_de.properties +++ b/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_de.properties @@ -270,7 +270,7 @@ menu.const.name=Const-Name key.const.value=Const-Wert: menu.resolution=Resolution menu.class=Klasse -since.0=seit {0} +access.flag.since.0=seit {0} action.show.jvm.spec=Zeige JVM-Spec action.replace.opcode=Ersetze Opcode choose.compatible.opcode=Wähle einen kompatiblen Opcode, der die gleiche Größe hat und den Stack auf die gleiche Weise verändert: @@ -309,3 +309,5 @@ message.connection.failed.0=Verbindungsfehler: {0} message.could.not.redefine.class.file=Konnte Klasse nicht redefinieren error.message.was.0=Die Fehlermeldung war: {0} classes.attach.info=Achtung: Klassen, die im Attach-Modus geladen werden sind von der JVM wiederhergestellt worden und enthalten nur für die Laufzeit relevanten Informationen +no.compatible.opcode=There are no compatible opcodes for the selected instruction +access.flag.historical=historical diff --git a/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_pl.properties b/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_pl.properties index 12722687..1a7a565d 100644 --- a/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_pl.properties +++ b/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_pl.properties @@ -152,7 +152,7 @@ action.show.interface.method=Pokaż metodę interfejsu action.copy.all.signatures=Kopiuj sygnatury do schowka action.copy.signature=Kopiuj sygnaturę do schowka code.tab.bytecode=Kod bajtowy -code.tab.exception.table=Tablica Wyjątków +code.tab.exception.table=Tablica wyjątków code.tab.misc=Różne column.bootstrap.method=Metoda Bootstrap column.inner.class=Klasa Wewnętrzna @@ -225,86 +225,88 @@ message.invalid.constant.pool.reference=niepoprawna referencja do puli stałych message.invalid.constant.pool.entry=niepoprawny wpis w puli stałych menu.dark.mode=Tryb nocny menu.dark.mode.auto=Rozpoznaj automatycznie -chooser.jar.files.title=Choose JAR files -chooser.jar.files.and.directories.filter.name=JAR files and directories -chooser.directory.title=Choose a directory -chooser.jre.home.title=Choose the JRE home directory -tree.parameter.annotation=Parameter annotation -tree.annotation=Annotation -action.edit=Edit -key.edit.string.label=String value: -message.invalid.input=The input was invalid -button.discard=Discard -button.cancel=Cancel -message.class.file.modified.title=Class file is modified -message.class.file.modified=Discard all changes for the current class file? -message.class.files.modified.title=There are modified class files -message.class.files.modified=Discard all changes to modified class files? -action.save.modified.classes=Save modified class files -action.save.modified.classes.description=Save all modified class files back to their original location -key.edit.integer.label=Integer value: -key.edit.long.label=Long value: -key.edit.float.label=Float value: -key.edit.double.label=Double value: -message.jrt.read.only.title=The Java runtime is read-only -message.jrt.read.only=The Java runtime is stored in a read-only file system.\n\nDo you wish to save the class file to a regular file instead? -chooser.save.modified.classes.title=Save modified read-only classes to directory -message.constant.pool.type.edit.error=A constant pool entry of type {0} cannot be edited -menu.class.name=Class Name -menu.name=Name -menu.type=Type -menu.descriptor=Descriptor -menu.method.name=Method name -menu.reference.kind=Reference kind -menu.this.class=This class -menu.super.class=Super class -menu.major.version=Major version -menu.minor.version=Minor version -menu.access.flags=Access flags -valid.flags=The following flags are valid for this data structure: -menu.element.name=Element name -menu.value.tag=Value tag -menu.type.name=Type name -menu.const.name=Const name -key.const.value=Const value: +chooser.jar.files.title=Wybierz pliki JAR +chooser.jar.files.and.directories.filter.name=Pliki JAR i katalogi +chooser.directory.title=Wybierz katalog +chooser.jre.home.title=Wybierz katalog domowy JRE +tree.parameter.annotation=Adnotacja parametru +tree.annotation=Adnotacja +action.edit=Edytuj +key.edit.string.label=Ciąg znaków: +message.invalid.input=Wprowadzona wartość jest niepoprawna +button.discard=Porzuć zmiany +button.cancel=Anuluj +message.class.file.modified.title=Plik klasy jest zmodyfikowany +message.class.file.modified=Porzucić wszystkie zmiany w aktualnym pliku klasy? +message.class.files.modified.title=Pliki klas zostały zmodyfikowane +message.class.files.modified=Porzucić wszystkie zmiany w plikach klas? +action.save.modified.classes=Zapisz zmodyfikowane klasy +action.save.modified.classes.description=Zapisz wszystkie zmodyfikowane klasy do ich oryginalnych lokalizacji +key.edit.integer.label=Wartość całkowitoliczbowa (integer): +key.edit.long.label=Wartość całkowitoliczbowa (long): +key.edit.float.label=Wartość zmiennoprzecinkowa (float): +key.edit.double.label=Wartość zmiennoprzecinkowa (double): +message.jrt.read.only.title=Środowisko uruchomieniowe Java jest tylko do odczytu +message.jrt.read.only=Środowisko uruchomieniowe Java jest przechowywane w systemie plików tylko do odczytu.\n\nChcesz zapisać plik klasy do zwykłego pliku? +chooser.save.modified.classes.title=Zapisz zmodyfikowane klasy tylko do odczytu do katalogu +message.constant.pool.type.edit.error=Wpis w puli stałych typu {0} nie może być edytowany +menu.class.name=Nazwa Klasy +menu.name=Nazwa +menu.type=Typ +menu.descriptor=Deskryptor +menu.method.name=Nazwa metody +menu.reference.kind=Typ referencji +menu.this.class=Ta klasa +menu.super.class=Klasa bazowa +menu.major.version=Wersja major +menu.minor.version=Wersja minor +menu.access.flags=Flagi dostępu +valid.flags=Dostępne flagi dla tej struktury: +menu.element.name=Nazwa elementu +menu.value.tag=Tag wartości +menu.type.name=Nazwa typu +menu.const.name=Nazwa stałej +key.const.value=Wartość stałej: menu.resolution=Resolution -menu.class=Class -since.0=since {0} -action.show.jvm.spec=Show JVM Spec -action.replace.opcode=Replace Opcode -choose.compatible.opcode=Choose a compatible opcode that has the same size and the same stack modification behavior: -replace.opcode.title=Replace Opcode -key.byte.value=Byte value: -input.not.valid.byte=The input was not a valid byte value -key.short.value=Short value: -input.not.valid.short=The input was not a valid short value -key.integer.value=Integer value: -input.not.valid.integer=The input was not a valid integer value -action.edit.immediate.byte=Edit Immediate Byte -action.edit.index=Edit Index -action.edit.immediate.short=Edit Immediate Short -action.edit.constant=Edit Constant -action.edit.branch.offset=Edit Branch Offset -action.edit.dimensions=Edit Dimensions -action.edit.count=Edit Count -action.jump.offset.0=Jump Offset {0} -action.edit.jump.offsets=Edit Jump Offsets -action.jump.offset.for.match.0=Jump Offset For Match {0} -action.match.0=Match {0} -action.edit.matches=Edit Matches -action.edit.default.jump.offset=Edit Default Jump Offset -action.add.export=Add Export -action.add.opens=Add Opens -enter.package.name=Enter package name: -message.class.not.loaded=The class {0} has not been loaded. -action.attach.to.jvm=Attach To Running JVM -action.attach.to.jvm.description=Attach to a running JVM -action.detach.from.jvm=Detach From JVM -action.detach.from.jvm.description=Detach from the currently attached JVM -window.select.running.jvm=Select Running JVM -message.attach.failed.0=Attach failed: {0} -message.management.agent.error.0=Could not load management agent: {0} -message.connection.failed.0=Connection failed: {0} -message.could.not.redefine.class.file=Could not redefine class file -error.message.was.0=The error message was: {0} -classes.attach.info=Note: Classes that are loaded in attach mode are reconstituted by the JVM and and only contain information that is relevant at runtime +menu.class=Klasa +access.flag.since.0=dostępna od {0} +action.show.jvm.spec=Otwórz specyfikację JVM +action.replace.opcode=Zamień opcode +choose.compatible.opcode=Wybierz kompatybilny opcode, który ma taki sam rozmiar i modyfikuje stos w ten sam sposób: +replace.opcode.title=Zamień opcode +key.byte.value=Wartość całkowitoliczbowa (byte): +input.not.valid.byte=Wprowadzona wartość nie jest poprawną liczbą typu byte +key.short.value=Wartość całkowitoliczbowa (short): +input.not.valid.short=Wprowadzona wartość nie jest poprawną liczbą typu short +key.integer.value=Wartość całkowitoliczbowa (integer): +input.not.valid.integer=Wprowadzona wartość nie jest poprawną liczbą typu integer +action.edit.immediate.byte=Edytuj stałą bezpośrednią (byte) +action.edit.index=Edytuj indeks +action.edit.immediate.short=Edytuj stałą bezpośrednią (short) +action.edit.constant=Edytuj stałą +action.edit.branch.offset=Edytuj offset gałęzi +action.edit.dimensions=Edytuj liczbę wymiarów +action.edit.count=Edytuj count +action.jump.offset.0=Offset skoku {0} +action.edit.jump.offsets=Edytuj offsety skoków +action.jump.offset.for.match.0=Offset skoku dla dopasowania {0} +action.match.0=Dopasowanie {0} +action.edit.matches=Edytuj dopasowania +action.edit.default.jump.offset=Edytuj domyślny offset skoku +action.add.export=Dodaj exports +action.add.opens=Dodaj opens +enter.package.name=Nazwa paczki: +message.class.not.loaded=Klasa {0} nie została załadowana. +action.attach.to.jvm=Podłącz się do działającej JVM +action.attach.to.jvm.description=Podłącz się do działającej JVM +action.detach.from.jvm=Odłącz się od JVM +action.detach.from.jvm.description=Odłącz się od JVM, do której aktualnie jesteś podłączony +window.select.running.jvm=Wybierz działającą JVM +message.attach.failed.0=Próba podłączenia zakończona niepowodzeniem: {0} +message.management.agent.error.0=Nie można załadować management agenta: {0} +message.connection.failed.0=Połączenie nieudane: {0} +message.could.not.redefine.class.file=Nie udało się zredefiniować pliku klasy +error.message.was.0=Treść błędu: {0} +classes.attach.info=Uwaga: Klasy załadowane po podłączeniu się do JVM są odtworzone przez JVM i zawierają tylko informacje istotne w czasie wykonywania programu +no.compatible.opcode=Brak kompatybilnych opcode'ów dla wybranej instrukcji +access.flag.historical=historyczna diff --git a/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_zh_CN.properties b/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_zh_CN.properties index 442251c6..b23bedc6 100644 --- a/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_zh_CN.properties +++ b/modules/browser/src/main/resources/org/gjt/jclasslib/browser/messages/Browser_zh_CN.properties @@ -269,7 +269,7 @@ menu.const.name=Const name key.const.value=Const value: menu.resolution=Resolution menu.class=Class -since.0=since {0} +access.flag.since.0=since {0} action.show.jvm.spec=Show JVM Spec action.replace.opcode=Replace Opcode choose.compatible.opcode=Choose a compatible opcode that has the same size and the same stack modification behavior: @@ -307,4 +307,6 @@ message.management.agent.error.0=Could not load management agent: {0} message.connection.failed.0=Connection failed: {0} message.could.not.redefine.class.file=Could not redefine class file error.message.was.0=The error message was: {0} -classes.attach.info=Note: Classes that are loaded in attach mode are reconstituted by the JVM and and only contain information that is relevant at runtime +classes.attach.info=Note: Classes that are loaded in attach mode are reconstituted by the JVM and only contain information that is relevant at runtime +no.compatible.opcode=There are no compatible opcodes for the selected instruction +access.flag.historical=historical diff --git a/modules/data/src/main/kotlin/structures/AccessFlag.kt b/modules/data/src/main/kotlin/structures/AccessFlag.kt index afe52f42..cbdb8354 100644 --- a/modules/data/src/main/kotlin/structures/AccessFlag.kt +++ b/modules/data/src/main/kotlin/structures/AccessFlag.kt @@ -17,7 +17,11 @@ import java.util.* * @property sinceJava the first Java version that supports this access flag */ @Suppress("NOT_DOCUMENTED") -enum class AccessFlag(override val flag: Int, override val verbose: String, val sinceJava: String? = null): ClassFileFlag { +enum class AccessFlag( + override val flag: Int, + override val verbose: String, + val sinceJava: String? = null, + val historical: Boolean = false): ClassFileFlag { PUBLIC(0x0001, "public"), PRIVATE(0x0002, "private"), PROTECTED(0x0004, "protected"), @@ -27,7 +31,7 @@ enum class AccessFlag(override val flag: Int, override val verbose: String, val /** * For ClassFile structures, 0x0020 is ACC_SUPER, which has historical significance only */ - SUPER(0x0020, ""), + SUPER(0x0020, "super", historical=true), VOLATILE(0x0040, "volatile"), TRANSIENT(0x0080, "transient"), NATIVE(0x0100, "native"),