summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/gui
diff options
context:
space:
mode:
authorGravatar modmuss502020-03-05 22:17:08 +0000
committerGravatar GitHub2020-03-05 22:17:08 +0000
commit863d40a1c1f6591ef1ee8594b12ae4b0942fe810 (patch)
tree614c0e3bc842e1ab50413dcc18b450c96224db10 /src/main/java/cuchaz/enigma/gui
parentFix drop mappings not checking localVars (diff)
downloadenigma-fork-863d40a1c1f6591ef1ee8594b12ae4b0942fe810.tar.gz
enigma-fork-863d40a1c1f6591ef1ee8594b12ae4b0942fe810.tar.xz
enigma-fork-863d40a1c1f6591ef1ee8594b12ae4b0942fe810.zip
Made Enigma gui translatable (#193)
* made enigma gui translatable * key renamings * missed strings * string.format() & another missed string * cached content (thanks @liach) * added a dialog when changing language * better sentence * more %s * liach's requests * empty map * the last (?) missed strings * IT WORKS * French translation * Update fr_fr.json
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui')
-rw-r--r--src/main/java/cuchaz/enigma/gui/Gui.java49
-rw-r--r--src/main/java/cuchaz/enigma/gui/GuiController.java5
-rw-r--r--src/main/java/cuchaz/enigma/gui/dialog/AboutDialog.java5
-rw-r--r--src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java11
-rw-r--r--src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java9
-rw-r--r--src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java3
-rw-r--r--src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java3
-rw-r--r--src/main/java/cuchaz/enigma/gui/elements/MenuBar.java81
-rw-r--r--src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java21
-rw-r--r--src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java3
-rw-r--r--src/main/java/cuchaz/enigma/gui/panels/PanelIdentifier.java5
-rw-r--r--src/main/java/cuchaz/enigma/gui/panels/PanelObf.java3
-rw-r--r--src/main/java/cuchaz/enigma/gui/stats/StatsGenerator.java11
13 files changed, 125 insertions, 84 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java
index 1ea3e44..5eeb07d 100644
--- a/src/main/java/cuchaz/enigma/gui/Gui.java
+++ b/src/main/java/cuchaz/enigma/gui/Gui.java
@@ -36,6 +36,7 @@ import cuchaz.enigma.gui.util.History;
36import cuchaz.enigma.throwables.IllegalNameException; 36import cuchaz.enigma.throwables.IllegalNameException;
37import cuchaz.enigma.translation.mapping.*; 37import cuchaz.enigma.translation.mapping.*;
38import cuchaz.enigma.translation.representation.entry.*; 38import cuchaz.enigma.translation.representation.entry.*;
39import cuchaz.enigma.utils.I18n;
39import cuchaz.enigma.utils.Utils; 40import cuchaz.enigma.utils.Utils;
40import de.sciss.syntaxpane.DefaultSyntaxKit; 41import de.sciss.syntaxpane.DefaultSyntaxKit;
41 42
@@ -120,12 +121,12 @@ public class Gui {
120 this.controller = new GuiController(this, profile); 121 this.controller = new GuiController(this, profile);
121 122
122 // init file choosers 123 // init file choosers
123 this.jarFileChooser = new FileDialog(getFrame(), "Open Jar", FileDialog.LOAD); 124 this.jarFileChooser = new FileDialog(getFrame(), I18n.translate("menu.file.jar.open"), FileDialog.LOAD);
124 125
125 this.tinyMappingsFileChooser = new FileDialog(getFrame(), "Open tiny Mappings", FileDialog.LOAD); 126 this.tinyMappingsFileChooser = new FileDialog(getFrame(), "Open tiny Mappings", FileDialog.LOAD);
126 this.enigmaMappingsFileChooser = new FileChooserAny(); 127 this.enigmaMappingsFileChooser = new FileChooserAny();
127 this.exportSourceFileChooser = new FileChooserFolder(); 128 this.exportSourceFileChooser = new FileChooserFolder();
128 this.exportJarFileChooser = new FileDialog(getFrame(), "Export jar", FileDialog.SAVE); 129 this.exportJarFileChooser = new FileDialog(getFrame(), I18n.translate("menu.file.export.jar"), FileDialog.SAVE);
129 130
130 this.obfPanel = new PanelObf(this); 131 this.obfPanel = new PanelObf(this);
131 this.deobfPanel = new PanelDeobf(this); 132 this.deobfPanel = new PanelDeobf(this);
@@ -275,9 +276,9 @@ public class Gui {
275 centerPanel.add(sourceScroller, BorderLayout.CENTER); 276 centerPanel.add(sourceScroller, BorderLayout.CENTER);
276 tabs = new JTabbedPane(); 277 tabs = new JTabbedPane();
277 tabs.setPreferredSize(new Dimension(250, 0)); 278 tabs.setPreferredSize(new Dimension(250, 0));
278 tabs.addTab("Inheritance", inheritancePanel); 279 tabs.addTab(I18n.translate("info_panel.tree.inheritance"), inheritancePanel);
279 tabs.addTab("Implementations", implementationsPanel); 280 tabs.addTab(I18n.translate("info_panel.tree.implementations"), implementationsPanel);
280 tabs.addTab("Call Graph", callPanel); 281 tabs.addTab(I18n.translate("info_panel.tree.calls"), callPanel);
281 JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, centerPanel, tabs); 282 JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, centerPanel, tabs);
282 splitRight.setResizeWeight(1); // let the left side take all the slack 283 splitRight.setResizeWeight(1); // let the left side take all the slack
283 splitRight.resetToPreferredSizes(); 284 splitRight.resetToPreferredSizes();
@@ -458,33 +459,33 @@ public class Gui {
458 } 459 }
459 460
460 private void showLocalVariableEntry(LocalVariableEntry entry) { 461 private void showLocalVariableEntry(LocalVariableEntry entry) {
461 addNameValue(infoPanel, "Variable", entry.getName()); 462 addNameValue(infoPanel, I18n.translate("info_panel.identifier.variable"), entry.getName());
462 addNameValue(infoPanel, "Class", entry.getContainingClass().getFullName()); 463 addNameValue(infoPanel, I18n.translate("info_panel.identifier.class"), entry.getContainingClass().getFullName());
463 addNameValue(infoPanel, "Method", entry.getParent().getName()); 464 addNameValue(infoPanel, I18n.translate("info_panel.identifier.method"), entry.getParent().getName());
464 addNameValue(infoPanel, "Index", Integer.toString(entry.getIndex())); 465 addNameValue(infoPanel, I18n.translate("info_panel.identifier.index"), Integer.toString(entry.getIndex()));
465 } 466 }
466 467
467 private void showClassEntry(ClassEntry entry) { 468 private void showClassEntry(ClassEntry entry) {
468 addNameValue(infoPanel, "Class", entry.getFullName()); 469 addNameValue(infoPanel, I18n.translate("info_panel.identifier.class"), entry.getFullName());
469 addModifierComboBox(infoPanel, "Modifier", entry); 470 addModifierComboBox(infoPanel, I18n.translate("info_panel.identifier.modifier"), entry);
470 } 471 }
471 472
472 private void showFieldEntry(FieldEntry entry) { 473 private void showFieldEntry(FieldEntry entry) {
473 addNameValue(infoPanel, "Field", entry.getName()); 474 addNameValue(infoPanel, I18n.translate("info_panel.identifier.field"), entry.getName());
474 addNameValue(infoPanel, "Class", entry.getParent().getFullName()); 475 addNameValue(infoPanel, I18n.translate("info_panel.identifier.class"), entry.getParent().getFullName());
475 addNameValue(infoPanel, "TypeDescriptor", entry.getDesc().toString()); 476 addNameValue(infoPanel, I18n.translate("info_panel.identifier.type_descriptor"), entry.getDesc().toString());
476 addModifierComboBox(infoPanel, "Modifier", entry); 477 addModifierComboBox(infoPanel, I18n.translate("info_panel.identifier.modifier"), entry);
477 } 478 }
478 479
479 private void showMethodEntry(MethodEntry entry) { 480 private void showMethodEntry(MethodEntry entry) {
480 if (entry.isConstructor()) { 481 if (entry.isConstructor()) {
481 addNameValue(infoPanel, "Constructor", entry.getParent().getFullName()); 482 addNameValue(infoPanel, I18n.translate("info_panel.identifier.constructor"), entry.getParent().getFullName());
482 } else { 483 } else {
483 addNameValue(infoPanel, "Method", entry.getName()); 484 addNameValue(infoPanel, I18n.translate("info_panel.identifier.method"), entry.getName());
484 addNameValue(infoPanel, "Class", entry.getParent().getFullName()); 485 addNameValue(infoPanel, I18n.translate("info_panel.identifier.class"), entry.getParent().getFullName());
485 } 486 }
486 addNameValue(infoPanel, "MethodDescriptor", entry.getDesc().toString()); 487 addNameValue(infoPanel, I18n.translate("info_panel.identifier.method_descriptor"), entry.getDesc().toString());
487 addModifierComboBox(infoPanel, "Modifier", entry); 488 addModifierComboBox(infoPanel, I18n.translate("info_panel.identifier.modifier"), entry);
488 } 489 }
489 490
490 private void addNameValue(JPanel container, String name, String value) { 491 private void addNameValue(JPanel container, String name, String value) {
@@ -573,9 +574,9 @@ public class Gui {
573 this.popupMenu.toggleMappingMenu.setEnabled(isRenamable); 574 this.popupMenu.toggleMappingMenu.setEnabled(isRenamable);
574 575
575 if (isToken && !Objects.equals(referenceEntry, mapper.deobfuscate(referenceEntry))) { 576 if (isToken && !Objects.equals(referenceEntry, mapper.deobfuscate(referenceEntry))) {
576 this.popupMenu.toggleMappingMenu.setText("Reset to obfuscated"); 577 this.popupMenu.toggleMappingMenu.setText(I18n.translate("popup_menu.reset_obfuscated"));
577 } else { 578 } else {
578 this.popupMenu.toggleMappingMenu.setText("Mark as deobfuscated"); 579 this.popupMenu.toggleMappingMenu.setText(I18n.translate("popup_menu.mark_deobfuscated"));
579 } 580 }
580 } 581 }
581 582
@@ -794,7 +795,7 @@ public class Gui {
794 } 795 }
795 796
796 public void showDiscardDiag(Function<Integer, Void> callback, String... options) { 797 public void showDiscardDiag(Function<Integer, Void> callback, String... options) {
797 int response = JOptionPane.showOptionDialog(this.frame, "Your mappings have not been saved yet. Do you want to save?", "Save your changes?", JOptionPane.YES_NO_CANCEL_OPTION, 798 int response = JOptionPane.showOptionDialog(this.frame, I18n.translate("prompt.close.summary"), I18n.translate("prompt.close.title"), JOptionPane.YES_NO_CANCEL_OPTION,
798 JOptionPane.QUESTION_MESSAGE, null, options, options[2]); 799 JOptionPane.QUESTION_MESSAGE, null, options, options[2]);
799 callback.apply(response); 800 callback.apply(response);
800 } 801 }
@@ -820,7 +821,7 @@ public class Gui {
820 } 821 }
821 822
822 return null; 823 return null;
823 }, "Save and exit", "Discard changes", "Cancel"); 824 }, I18n.translate("prompt.close.save"), I18n.translate("prompt.close.discard"), I18n.translate("prompt.close.cancel"));
824 } 825 }
825 } 826 }
826 827
diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java
index 0b2fe27..dc5010c 100644
--- a/src/main/java/cuchaz/enigma/gui/GuiController.java
+++ b/src/main/java/cuchaz/enigma/gui/GuiController.java
@@ -32,6 +32,7 @@ import cuchaz.enigma.translation.representation.entry.ClassEntry;
32import cuchaz.enigma.translation.representation.entry.Entry; 32import cuchaz.enigma.translation.representation.entry.Entry;
33import cuchaz.enigma.translation.representation.entry.FieldEntry; 33import cuchaz.enigma.translation.representation.entry.FieldEntry;
34import cuchaz.enigma.translation.representation.entry.MethodEntry; 34import cuchaz.enigma.translation.representation.entry.MethodEntry;
35import cuchaz.enigma.utils.I18n;
35import cuchaz.enigma.utils.ReadableToken; 36import cuchaz.enigma.utils.ReadableToken;
36import cuchaz.enigma.utils.Utils; 37import cuchaz.enigma.utils.Utils;
37import org.objectweb.asm.Opcodes; 38import org.objectweb.asm.Opcodes;
@@ -391,7 +392,7 @@ public class GuiController {
391 boolean requiresDecompile = forceDecomp || currentSource == null || !currentSource.getEntry().equals(targetClass); 392 boolean requiresDecompile = forceDecomp || currentSource == null || !currentSource.getEntry().equals(targetClass);
392 if (requiresDecompile) { 393 if (requiresDecompile) {
393 currentSource = null; // Or the GUI may try to find a nonexistent token 394 currentSource = null; // Or the GUI may try to find a nonexistent token
394 gui.setEditorText("(decompiling...)"); 395 gui.setEditorText(I18n.translate("info_panel.editor.class.decompiling"));
395 } 396 }
396 397
397 DECOMPILER_SERVICE.submit(() -> { 398 DECOMPILER_SERVICE.submit(() -> {
@@ -413,7 +414,7 @@ public class GuiController {
413 try { 414 try {
414 CompilationUnit sourceTree = (CompilationUnit) sourceProvider.getSources(targetClass.getFullName()).clone(); 415 CompilationUnit sourceTree = (CompilationUnit) sourceProvider.getSources(targetClass.getFullName()).clone();
415 if (sourceTree == null) { 416 if (sourceTree == null) {
416 gui.setEditorText("Unable to find class: " + targetClass); 417 gui.setEditorText(I18n.translate("info_panel.editor.class.not_found") + " " + targetClass);
417 return DecompiledClassSource.text(targetClass, "Unable to find class"); 418 return DecompiledClassSource.text(targetClass, "Unable to find class");
418 } 419 }
419 420
diff --git a/src/main/java/cuchaz/enigma/gui/dialog/AboutDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/AboutDialog.java
index 7b3234d..82fd6a5 100644
--- a/src/main/java/cuchaz/enigma/gui/dialog/AboutDialog.java
+++ b/src/main/java/cuchaz/enigma/gui/dialog/AboutDialog.java
@@ -12,6 +12,7 @@
12package cuchaz.enigma.gui.dialog; 12package cuchaz.enigma.gui.dialog;
13 13
14import cuchaz.enigma.Constants; 14import cuchaz.enigma.Constants;
15import cuchaz.enigma.utils.I18n;
15import cuchaz.enigma.utils.Utils; 16import cuchaz.enigma.utils.Utils;
16 17
17import javax.swing.*; 18import javax.swing.*;
@@ -22,7 +23,7 @@ public class AboutDialog {
22 23
23 public static void show(JFrame parent) { 24 public static void show(JFrame parent) {
24 // init frame 25 // init frame
25 final JFrame frame = new JFrame(Constants.NAME + " - About"); 26 final JFrame frame = new JFrame(String.format(I18n.translate("menu.help.about.title"), Constants.NAME));
26 final Container pane = frame.getContentPane(); 27 final Container pane = frame.getContentPane();
27 pane.setLayout(new FlowLayout()); 28 pane.setLayout(new FlowLayout());
28 29
@@ -52,7 +53,7 @@ public class AboutDialog {
52 pane.add(linkPanel); 53 pane.add(linkPanel);
53 54
54 // show ok button 55 // show ok button
55 JButton okButton = new JButton("Ok"); 56 JButton okButton = new JButton(I18n.translate("menu.help.about.ok"));
56 pane.add(okButton); 57 pane.add(okButton);
57 okButton.addActionListener(arg0 -> frame.dispose()); 58 okButton.addActionListener(arg0 -> frame.dispose());
58 59
diff --git a/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java
index 04dd5d7..7e66ecd 100644
--- a/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java
+++ b/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java
@@ -12,6 +12,7 @@
12package cuchaz.enigma.gui.dialog; 12package cuchaz.enigma.gui.dialog;
13 13
14import cuchaz.enigma.Constants; 14import cuchaz.enigma.Constants;
15import cuchaz.enigma.utils.I18n;
15import cuchaz.enigma.utils.Utils; 16import cuchaz.enigma.utils.Utils;
16 17
17import javax.swing.*; 18import javax.swing.*;
@@ -28,11 +29,11 @@ public class CrashDialog {
28 29
29 private CrashDialog(JFrame parent) { 30 private CrashDialog(JFrame parent) {
30 // init frame 31 // init frame
31 frame = new JFrame(Constants.NAME + " - Crash Report"); 32 frame = new JFrame(String.format(I18n.translate("crash.title"), Constants.NAME));
32 final Container pane = frame.getContentPane(); 33 final Container pane = frame.getContentPane();
33 pane.setLayout(new BorderLayout()); 34 pane.setLayout(new BorderLayout());
34 35
35 JLabel label = new JLabel(Constants.NAME + " has crashed! =("); 36 JLabel label = new JLabel(String.format(I18n.translate("crash.summary"), Constants.NAME));
36 label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 37 label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
37 pane.add(label, BorderLayout.NORTH); 38 pane.add(label, BorderLayout.NORTH);
38 39
@@ -46,14 +47,14 @@ public class CrashDialog {
46 FlowLayout buttonsLayout = new FlowLayout(); 47 FlowLayout buttonsLayout = new FlowLayout();
47 buttonsLayout.setAlignment(FlowLayout.RIGHT); 48 buttonsLayout.setAlignment(FlowLayout.RIGHT);
48 buttonsPanel.setLayout(buttonsLayout); 49 buttonsPanel.setLayout(buttonsLayout);
49 buttonsPanel.add(Utils.unboldLabel(new JLabel("If you choose exit, you will lose any unsaved work."))); 50 buttonsPanel.add(Utils.unboldLabel(new JLabel(I18n.translate("crash.exit.warning"))));
50 JButton ignoreButton = new JButton("Ignore"); 51 JButton ignoreButton = new JButton(I18n.translate("crash.ignore"));
51 ignoreButton.addActionListener(event -> { 52 ignoreButton.addActionListener(event -> {
52 // close (hide) the dialog 53 // close (hide) the dialog
53 frame.setVisible(false); 54 frame.setVisible(false);
54 }); 55 });
55 buttonsPanel.add(ignoreButton); 56 buttonsPanel.add(ignoreButton);
56 JButton exitButton = new JButton("Exit"); 57 JButton exitButton = new JButton(I18n.translate("crash.exit"));
57 exitButton.addActionListener(event -> { 58 exitButton.addActionListener(event -> {
58 // exit enigma 59 // exit enigma
59 System.exit(1); 60 System.exit(1);
diff --git a/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java
index 84e4d8f..57811ee 100644
--- a/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java
+++ b/src/main/java/cuchaz/enigma/gui/dialog/JavadocDialog.java
@@ -11,6 +11,7 @@
11 11
12package cuchaz.enigma.gui.dialog; 12package cuchaz.enigma.gui.dialog;
13 13
14import cuchaz.enigma.utils.I18n;
14import cuchaz.enigma.utils.Utils; 15import cuchaz.enigma.utils.Utils;
15 16
16import javax.swing.*; 17import javax.swing.*;
@@ -26,7 +27,7 @@ public class JavadocDialog {
26 27
27 private JavadocDialog(JFrame parent, JTextArea text, Callback callback) { 28 private JavadocDialog(JFrame parent, JTextArea text, Callback callback) {
28 // init frame 29 // init frame
29 frame = new JFrame("Edit Javadocs"); 30 frame = new JFrame(I18n.translate("javadocs.edit"));
30 final Container pane = frame.getContentPane(); 31 final Container pane = frame.getContentPane();
31 pane.setLayout(new BorderLayout()); 32 pane.setLayout(new BorderLayout());
32 33
@@ -55,14 +56,14 @@ public class JavadocDialog {
55 FlowLayout buttonsLayout = new FlowLayout(); 56 FlowLayout buttonsLayout = new FlowLayout();
56 buttonsLayout.setAlignment(FlowLayout.RIGHT); 57 buttonsLayout.setAlignment(FlowLayout.RIGHT);
57 buttonsPanel.setLayout(buttonsLayout); 58 buttonsPanel.setLayout(buttonsLayout);
58 buttonsPanel.add(Utils.unboldLabel(new JLabel("Edit javadocs here."))); 59 buttonsPanel.add(Utils.unboldLabel(new JLabel(I18n.translate("javadocs.instruction"))));
59 JButton cancelButton = new JButton("Cancel"); 60 JButton cancelButton = new JButton(I18n.translate("javadocs.cancel"));
60 cancelButton.addActionListener(event -> { 61 cancelButton.addActionListener(event -> {
61 // close (hide) the dialog 62 // close (hide) the dialog
62 callback.closeUi(frame, false); 63 callback.closeUi(frame, false);
63 }); 64 });
64 buttonsPanel.add(cancelButton); 65 buttonsPanel.add(cancelButton);
65 JButton saveButton = new JButton("Save"); 66 JButton saveButton = new JButton(I18n.translate("javadocs.save"));
66 saveButton.addActionListener(event -> { 67 saveButton.addActionListener(event -> {
67 // exit enigma 68 // exit enigma
68 callback.closeUi(frame, true); 69 callback.closeUi(frame, true);
diff --git a/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java
index ae30667..6d9a419 100644
--- a/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java
+++ b/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java
@@ -13,6 +13,7 @@ package cuchaz.enigma.gui.dialog;
13 13
14import cuchaz.enigma.Constants; 14import cuchaz.enigma.Constants;
15import cuchaz.enigma.ProgressListener; 15import cuchaz.enigma.ProgressListener;
16import cuchaz.enigma.utils.I18n;
16import cuchaz.enigma.utils.Utils; 17import cuchaz.enigma.utils.Utils;
17 18
18import javax.swing.*; 19import javax.swing.*;
@@ -29,7 +30,7 @@ public class ProgressDialog implements ProgressListener, AutoCloseable {
29 public ProgressDialog(JFrame parent) { 30 public ProgressDialog(JFrame parent) {
30 31
31 // init frame 32 // init frame
32 this.frame = new JFrame(Constants.NAME + " - Operation in progress"); 33 this.frame = new JFrame(String.format(I18n.translate("progress.operation"), Constants.NAME));
33 final Container pane = this.frame.getContentPane(); 34 final Container pane = this.frame.getContentPane();
34 FlowLayout layout = new FlowLayout(); 35 FlowLayout layout = new FlowLayout();
35 layout.setAlignment(FlowLayout.LEFT); 36 layout.setAlignment(FlowLayout.LEFT);
diff --git a/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java
index 1657d7b..47f9149 100644
--- a/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java
+++ b/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java
@@ -14,6 +14,7 @@ package cuchaz.enigma.gui.dialog;
14import com.google.common.collect.Lists; 14import com.google.common.collect.Lists;
15import cuchaz.enigma.gui.Gui; 15import cuchaz.enigma.gui.Gui;
16import cuchaz.enigma.translation.representation.entry.ClassEntry; 16import cuchaz.enigma.translation.representation.entry.ClassEntry;
17import cuchaz.enigma.utils.I18n;
17import me.xdrop.fuzzywuzzy.FuzzySearch; 18import me.xdrop.fuzzywuzzy.FuzzySearch;
18import me.xdrop.fuzzywuzzy.model.ExtractedResult; 19import me.xdrop.fuzzywuzzy.model.ExtractedResult;
19 20
@@ -45,7 +46,7 @@ public class SearchDialog {
45 } 46 }
46 47
47 public void show() { 48 public void show() {
48 frame = new JFrame("Search"); 49 frame = new JFrame(I18n.translate("menu.view.search"));
49 frame.setVisible(false); 50 frame.setVisible(false);
50 JPanel pane = new JPanel(); 51 JPanel pane = new JPanel();
51 pane.setBorder(new EmptyBorder(5, 10, 5, 10)); 52 pane.setBorder(new EmptyBorder(5, 10, 5, 10));
diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
index cdcad05..50f0849 100644
--- a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
+++ b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
@@ -7,7 +7,7 @@ import cuchaz.enigma.gui.dialog.AboutDialog;
7import cuchaz.enigma.gui.dialog.SearchDialog; 7import cuchaz.enigma.gui.dialog.SearchDialog;
8import cuchaz.enigma.gui.stats.StatsMember; 8import cuchaz.enigma.gui.stats.StatsMember;
9import cuchaz.enigma.translation.mapping.serde.MappingFormat; 9import cuchaz.enigma.translation.mapping.serde.MappingFormat;
10import cuchaz.enigma.utils.Utils; 10import cuchaz.enigma.utils.I18n;
11 11
12import javax.swing.*; 12import javax.swing.*;
13import java.awt.*; 13import java.awt.*;
@@ -40,10 +40,10 @@ public class MenuBar extends JMenuBar {
40 this.gui = gui; 40 this.gui = gui;
41 41
42 { 42 {
43 JMenu menu = new JMenu("File"); 43 JMenu menu = new JMenu(I18n.translate("menu.file"));
44 this.add(menu); 44 this.add(menu);
45 { 45 {
46 JMenuItem item = new JMenuItem("Open Jar..."); 46 JMenuItem item = new JMenuItem(I18n.translate("menu.file.jar.open"));
47 menu.add(item); 47 menu.add(item);
48 item.addActionListener(event -> { 48 item.addActionListener(event -> {
49 this.gui.jarFileChooser.setVisible(true); 49 this.gui.jarFileChooser.setVisible(true);
@@ -54,19 +54,19 @@ public class MenuBar extends JMenuBar {
54 }); 54 });
55 } 55 }
56 { 56 {
57 JMenuItem item = new JMenuItem("Close Jar"); 57 JMenuItem item = new JMenuItem(I18n.translate("menu.file.jar.close"));
58 menu.add(item); 58 menu.add(item);
59 item.addActionListener(event -> this.gui.getController().closeJar()); 59 item.addActionListener(event -> this.gui.getController().closeJar());
60 this.closeJarMenu = item; 60 this.closeJarMenu = item;
61 } 61 }
62 menu.addSeparator(); 62 menu.addSeparator();
63 JMenu openMenu = new JMenu("Open Mappings..."); 63 JMenu openMenu = new JMenu(I18n.translate("menu.file.mappings.open"));
64 menu.add(openMenu); 64 menu.add(openMenu);
65 { 65 {
66 openMappingsMenus = new ArrayList<>(); 66 openMappingsMenus = new ArrayList<>();
67 for (MappingFormat format : MappingFormat.values()) { 67 for (MappingFormat format : MappingFormat.values()) {
68 if (format.getReader() != null) { 68 if (format.getReader() != null) {
69 JMenuItem item = new JMenuItem(Utils.caplisiseCamelCase(format.name())); 69 JMenuItem item = new JMenuItem(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)));
70 openMenu.add(item); 70 openMenu.add(item);
71 item.addActionListener(event -> { 71 item.addActionListener(event -> {
72 if (this.gui.enigmaMappingsFileChooser.showOpenDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { 72 if (this.gui.enigmaMappingsFileChooser.showOpenDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) {
@@ -79,7 +79,7 @@ public class MenuBar extends JMenuBar {
79 } 79 }
80 } 80 }
81 { 81 {
82 JMenuItem item = new JMenuItem("Save Mappings"); 82 JMenuItem item = new JMenuItem(I18n.translate("menu.file.mappings.save"));
83 menu.add(item); 83 menu.add(item);
84 item.addActionListener(event -> { 84 item.addActionListener(event -> {
85 this.gui.getController().saveMappings(this.gui.enigmaMappingsFileChooser.getSelectedFile().toPath()); 85 this.gui.getController().saveMappings(this.gui.enigmaMappingsFileChooser.getSelectedFile().toPath());
@@ -87,13 +87,13 @@ public class MenuBar extends JMenuBar {
87 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK)); 87 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
88 this.saveMappingsMenu = item; 88 this.saveMappingsMenu = item;
89 } 89 }
90 JMenu saveMenu = new JMenu("Save Mappings As..."); 90 JMenu saveMenu = new JMenu(I18n.translate("menu.file.mappings.save_as"));
91 menu.add(saveMenu); 91 menu.add(saveMenu);
92 { 92 {
93 saveMappingsMenus = new ArrayList<>(); 93 saveMappingsMenus = new ArrayList<>();
94 for (MappingFormat format : MappingFormat.values()) { 94 for (MappingFormat format : MappingFormat.values()) {
95 if (format.getWriter() != null) { 95 if (format.getWriter() != null) {
96 JMenuItem item = new JMenuItem(Utils.caplisiseCamelCase(format.name())); 96 JMenuItem item = new JMenuItem(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)));
97 saveMenu.add(item); 97 saveMenu.add(item);
98 item.addActionListener(event -> { 98 item.addActionListener(event -> {
99 // TODO: Use a specific file chooser for it 99 // TODO: Use a specific file chooser for it
@@ -107,7 +107,7 @@ public class MenuBar extends JMenuBar {
107 } 107 }
108 } 108 }
109 { 109 {
110 JMenuItem item = new JMenuItem("Close Mappings"); 110 JMenuItem item = new JMenuItem(I18n.translate("menu.file.mappings.close"));
111 menu.add(item); 111 menu.add(item);
112 item.addActionListener(event -> { 112 item.addActionListener(event -> {
113 if (this.gui.getController().isDirty()) { 113 if (this.gui.getController().isDirty()) {
@@ -118,7 +118,7 @@ public class MenuBar extends JMenuBar {
118 } else if (response == JOptionPane.NO_OPTION) 118 } else if (response == JOptionPane.NO_OPTION)
119 this.gui.getController().closeMappings(); 119 this.gui.getController().closeMappings();
120 return null; 120 return null;
121 }), "Save and close", "Discard changes", "Cancel"); 121 }), I18n.translate("prompt.close.save"), I18n.translate("prompt.close.discard"), I18n.translate("prompt.close.cancel"));
122 } else 122 } else
123 this.gui.getController().closeMappings(); 123 this.gui.getController().closeMappings();
124 124
@@ -126,14 +126,14 @@ public class MenuBar extends JMenuBar {
126 this.closeMappingsMenu = item; 126 this.closeMappingsMenu = item;
127 } 127 }
128 { 128 {
129 JMenuItem item = new JMenuItem("Drop Invalid Mappings"); 129 JMenuItem item = new JMenuItem(I18n.translate("menu.file.mappings.drop"));
130 menu.add(item); 130 menu.add(item);
131 item.addActionListener(event -> this.gui.getController().dropMappings()); 131 item.addActionListener(event -> this.gui.getController().dropMappings());
132 this.dropMappingsMenu = item; 132 this.dropMappingsMenu = item;
133 } 133 }
134 menu.addSeparator(); 134 menu.addSeparator();
135 { 135 {
136 JMenuItem item = new JMenuItem("Export Source..."); 136 JMenuItem item = new JMenuItem(I18n.translate("menu.file.export.source"));
137 menu.add(item); 137 menu.add(item);
138 item.addActionListener(event -> { 138 item.addActionListener(event -> {
139 if (this.gui.exportSourceFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { 139 if (this.gui.exportSourceFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) {
@@ -143,7 +143,7 @@ public class MenuBar extends JMenuBar {
143 this.exportSourceMenu = item; 143 this.exportSourceMenu = item;
144 } 144 }
145 { 145 {
146 JMenuItem item = new JMenuItem("Export Jar..."); 146 JMenuItem item = new JMenuItem(I18n.translate("menu.file.export.jar"));
147 menu.add(item); 147 menu.add(item);
148 item.addActionListener(event -> { 148 item.addActionListener(event -> {
149 this.gui.exportJarFileChooser.setVisible(true); 149 this.gui.exportJarFileChooser.setVisible(true);
@@ -156,22 +156,22 @@ public class MenuBar extends JMenuBar {
156 } 156 }
157 menu.addSeparator(); 157 menu.addSeparator();
158 { 158 {
159 JMenuItem stats = new JMenuItem("Mapping Stats..."); 159 JMenuItem stats = new JMenuItem(I18n.translate("menu.file.stats"));
160 160
161 stats.addActionListener(event -> { 161 stats.addActionListener(event -> {
162 JFrame frame = new JFrame("Choose Included Members"); 162 JFrame frame = new JFrame(I18n.translate("menu.file.stats.title"));
163 Container pane = frame.getContentPane(); 163 Container pane = frame.getContentPane();
164 pane.setLayout(new FlowLayout()); 164 pane.setLayout(new FlowLayout());
165 165
166 Map<StatsMember, JCheckBox> checkboxes = Arrays 166 Map<StatsMember, JCheckBox> checkboxes = Arrays
167 .stream(StatsMember.values()) 167 .stream(StatsMember.values())
168 .collect(Collectors.toMap(m -> m, m -> { 168 .collect(Collectors.toMap(m -> m, m -> {
169 JCheckBox checkbox = new JCheckBox(Utils.caplisiseCamelCase(m.name())); 169 JCheckBox checkbox = new JCheckBox(I18n.translate("type." + m.name().toLowerCase(Locale.ROOT)));
170 pane.add(checkbox); 170 pane.add(checkbox);
171 return checkbox; 171 return checkbox;
172 })); 172 }));
173 173
174 JButton button = new JButton("Generate Stats"); 174 JButton button = new JButton(I18n.translate("menu.file.stats.generate"));
175 175
176 button.addActionListener(e -> { 176 button.addActionListener(e -> {
177 Set<StatsMember> includedMembers = checkboxes 177 Set<StatsMember> includedMembers = checkboxes
@@ -195,24 +195,53 @@ public class MenuBar extends JMenuBar {
195 } 195 }
196 menu.addSeparator(); 196 menu.addSeparator();
197 { 197 {
198 JMenuItem item = new JMenuItem("Exit"); 198 JMenuItem item = new JMenuItem(I18n.translate("menu.file.exit"));
199 menu.add(item); 199 menu.add(item);
200 item.addActionListener(event -> this.gui.close()); 200 item.addActionListener(event -> this.gui.close());
201 } 201 }
202 } 202 }
203 { 203 {
204 JMenu menu = new JMenu("View"); 204 JMenu menu = new JMenu(I18n.translate("menu.view"));
205 this.add(menu); 205 this.add(menu);
206 { 206 {
207 JMenu themes = new JMenu("Themes"); 207 JMenu themes = new JMenu(I18n.translate("menu.view.themes"));
208 menu.add(themes); 208 menu.add(themes);
209 for (Config.LookAndFeel lookAndFeel : Config.LookAndFeel.values()) { 209 for (Config.LookAndFeel lookAndFeel : Config.LookAndFeel.values()) {
210 JMenuItem theme = new JMenuItem(lookAndFeel.getName()); 210 JMenuItem theme = new JMenuItem(I18n.translate("menu.view.themes." + lookAndFeel.name().toLowerCase(Locale.ROOT)));
211 themes.add(theme); 211 themes.add(theme);
212 theme.addActionListener(event -> Themes.setLookAndFeel(gui, lookAndFeel)); 212 theme.addActionListener(event -> Themes.setLookAndFeel(gui, lookAndFeel));
213 } 213 }
214
215 JMenu languages = new JMenu(I18n.translate("menu.view.languages"));
216 menu.add(languages);
217 for (String lang : I18n.getAvailableLanguages()) {
218 JMenuItem language = new JMenuItem(I18n.getLanguageName(lang));
219 languages.add(language);
220 language.addActionListener(event -> I18n.setLanguage(lang));
221 language.addActionListener(event -> {
222 JFrame frame = new JFrame(I18n.translate("menu.view.languages.title"));
223 Container pane = frame.getContentPane();
224 pane.setLayout(new FlowLayout());
225
226 JLabel text = new JLabel((I18n.translate("menu.view.languages.summary")));
227 text.setHorizontalAlignment(JLabel.CENTER);
228 pane.add(text);
229
230 JButton okButton = new JButton(I18n.translate("menu.view.languages.ok"));
231 okButton.setAlignmentX(JButton.CENTER_ALIGNMENT);
232 okButton.setHorizontalAlignment(JButton.CENTER);
233 pane.add(okButton);
234 okButton.addActionListener(arg0 -> frame.dispose());
235
236 frame.setSize(350, 110);
237 frame.setResizable(false);
238 frame.setLocationRelativeTo(this.gui.getFrame());
239 frame.setVisible(true);
240 frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
241 });
242 }
214 243
215 JMenuItem search = new JMenuItem("Search"); 244 JMenuItem search = new JMenuItem(I18n.translate("menu.view.search"));
216 search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK)); 245 search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK));
217 menu.add(search); 246 menu.add(search);
218 search.addActionListener(event -> { 247 search.addActionListener(event -> {
@@ -224,15 +253,15 @@ public class MenuBar extends JMenuBar {
224 } 253 }
225 } 254 }
226 { 255 {
227 JMenu menu = new JMenu("Help"); 256 JMenu menu = new JMenu(I18n.translate("menu.help"));
228 this.add(menu); 257 this.add(menu);
229 { 258 {
230 JMenuItem item = new JMenuItem("About"); 259 JMenuItem item = new JMenuItem(I18n.translate("menu.help.about"));
231 menu.add(item); 260 menu.add(item);
232 item.addActionListener(event -> AboutDialog.show(this.gui.getFrame())); 261 item.addActionListener(event -> AboutDialog.show(this.gui.getFrame()));
233 } 262 }
234 { 263 {
235 JMenuItem item = new JMenuItem("GitHub Page"); 264 JMenuItem item = new JMenuItem(I18n.translate("menu.help.github"));
236 menu.add(item); 265 menu.add(item);
237 item.addActionListener(event -> { 266 item.addActionListener(event -> {
238 try { 267 try {
diff --git a/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java
index b9d459f..b0fb2b0 100644
--- a/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java
+++ b/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java
@@ -1,6 +1,7 @@
1package cuchaz.enigma.gui.elements; 1package cuchaz.enigma.gui.elements;
2 2
3import cuchaz.enigma.gui.Gui; 3import cuchaz.enigma.gui.Gui;
4import cuchaz.enigma.utils.I18n;
4 5
5import javax.swing.*; 6import javax.swing.*;
6import java.awt.event.InputEvent; 7import java.awt.event.InputEvent;
@@ -21,7 +22,7 @@ public class PopupMenuBar extends JPopupMenu {
21 22
22 public PopupMenuBar(Gui gui) { 23 public PopupMenuBar(Gui gui) {
23 { 24 {
24 JMenuItem menu = new JMenuItem("Rename"); 25 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.rename"));
25 menu.addActionListener(event -> gui.startRename()); 26 menu.addActionListener(event -> gui.startRename());
26 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0)); 27 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0));
27 menu.setEnabled(false); 28 menu.setEnabled(false);
@@ -29,7 +30,7 @@ public class PopupMenuBar extends JPopupMenu {
29 this.renameMenu = menu; 30 this.renameMenu = menu;
30 } 31 }
31 { 32 {
32 JMenuItem menu = new JMenuItem("Edit Javadoc"); 33 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.javadoc"));
33 menu.addActionListener(event -> gui.startDocChange()); 34 menu.addActionListener(event -> gui.startDocChange());
34 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0)); 35 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0));
35 menu.setEnabled(false); 36 menu.setEnabled(false);
@@ -37,7 +38,7 @@ public class PopupMenuBar extends JPopupMenu {
37 this.editJavadocMenu = menu; 38 this.editJavadocMenu = menu;
38 } 39 }
39 { 40 {
40 JMenuItem menu = new JMenuItem("Show Inheritance"); 41 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.inheritance"));
41 menu.addActionListener(event -> gui.showInheritance()); 42 menu.addActionListener(event -> gui.showInheritance());
42 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, 0)); 43 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, 0));
43 menu.setEnabled(false); 44 menu.setEnabled(false);
@@ -45,7 +46,7 @@ public class PopupMenuBar extends JPopupMenu {
45 this.showInheritanceMenu = menu; 46 this.showInheritanceMenu = menu;
46 } 47 }
47 { 48 {
48 JMenuItem menu = new JMenuItem("Show Implementations"); 49 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.implementations"));
49 menu.addActionListener(event -> gui.showImplementations()); 50 menu.addActionListener(event -> gui.showImplementations());
50 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, 0)); 51 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, 0));
51 menu.setEnabled(false); 52 menu.setEnabled(false);
@@ -53,7 +54,7 @@ public class PopupMenuBar extends JPopupMenu {
53 this.showImplementationsMenu = menu; 54 this.showImplementationsMenu = menu;
54 } 55 }
55 { 56 {
56 JMenuItem menu = new JMenuItem("Show Calls"); 57 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.calls"));
57 menu.addActionListener(event -> gui.showCalls(true)); 58 menu.addActionListener(event -> gui.showCalls(true));
58 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, 0)); 59 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, 0));
59 menu.setEnabled(false); 60 menu.setEnabled(false);
@@ -61,7 +62,7 @@ public class PopupMenuBar extends JPopupMenu {
61 this.showCallsMenu = menu; 62 this.showCallsMenu = menu;
62 } 63 }
63 { 64 {
64 JMenuItem menu = new JMenuItem("Show Calls (Specific)"); 65 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.calls.specific"));
65 menu.addActionListener(event -> gui.showCalls(false)); 66 menu.addActionListener(event -> gui.showCalls(false));
66 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.SHIFT_DOWN_MASK)); 67 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.SHIFT_DOWN_MASK));
67 menu.setEnabled(false); 68 menu.setEnabled(false);
@@ -69,7 +70,7 @@ public class PopupMenuBar extends JPopupMenu {
69 this.showCallsSpecificMenu = menu; 70 this.showCallsSpecificMenu = menu;
70 } 71 }
71 { 72 {
72 JMenuItem menu = new JMenuItem("Go to Declaration"); 73 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.declaration"));
73 menu.addActionListener(event -> gui.getController().navigateTo(gui.cursorReference.entry)); 74 menu.addActionListener(event -> gui.getController().navigateTo(gui.cursorReference.entry));
74 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0)); 75 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0));
75 menu.setEnabled(false); 76 menu.setEnabled(false);
@@ -77,7 +78,7 @@ public class PopupMenuBar extends JPopupMenu {
77 this.openEntryMenu = menu; 78 this.openEntryMenu = menu;
78 } 79 }
79 { 80 {
80 JMenuItem menu = new JMenuItem("Go back"); 81 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.back"));
81 menu.addActionListener(event -> gui.getController().openPreviousReference()); 82 menu.addActionListener(event -> gui.getController().openPreviousReference());
82 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, 0)); 83 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, 0));
83 menu.setEnabled(false); 84 menu.setEnabled(false);
@@ -85,7 +86,7 @@ public class PopupMenuBar extends JPopupMenu {
85 this.openPreviousMenu = menu; 86 this.openPreviousMenu = menu;
86 } 87 }
87 { 88 {
88 JMenuItem menu = new JMenuItem("Go forward"); 89 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.forward"));
89 menu.addActionListener(event -> gui.getController().openNextReference()); 90 menu.addActionListener(event -> gui.getController().openNextReference());
90 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, 0)); 91 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, 0));
91 menu.setEnabled(false); 92 menu.setEnabled(false);
@@ -93,7 +94,7 @@ public class PopupMenuBar extends JPopupMenu {
93 this.openNextMenu = menu; 94 this.openNextMenu = menu;
94 } 95 }
95 { 96 {
96 JMenuItem menu = new JMenuItem("Mark as deobfuscated"); 97 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.mark_deobfuscated"));
97 menu.addActionListener(event -> gui.toggleMapping()); 98 menu.addActionListener(event -> gui.toggleMapping());
98 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, 0)); 99 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, 0));
99 menu.setEnabled(false); 100 menu.setEnabled(false);
diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java b/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java
index 2a4e2d7..c24226b 100644
--- a/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java
+++ b/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java
@@ -2,6 +2,7 @@ package cuchaz.enigma.gui.panels;
2 2
3import cuchaz.enigma.gui.ClassSelector; 3import cuchaz.enigma.gui.ClassSelector;
4import cuchaz.enigma.gui.Gui; 4import cuchaz.enigma.gui.Gui;
5import cuchaz.enigma.utils.I18n;
5 6
6import javax.swing.*; 7import javax.swing.*;
7import java.awt.*; 8import java.awt.*;
@@ -19,7 +20,7 @@ public class PanelDeobf extends JPanel {
19 this.deobfClasses.setRenameSelectionListener(gui::onPanelRename); 20 this.deobfClasses.setRenameSelectionListener(gui::onPanelRename);
20 21
21 this.setLayout(new BorderLayout()); 22 this.setLayout(new BorderLayout());
22 this.add(new JLabel("De-obfuscated Classes"), BorderLayout.NORTH); 23 this.add(new JLabel(I18n.translate("info_panel.classes.deobfuscated")), BorderLayout.NORTH);
23 this.add(new JScrollPane(this.deobfClasses), BorderLayout.CENTER); 24 this.add(new JScrollPane(this.deobfClasses), BorderLayout.CENTER);
24 } 25 }
25} 26}
diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelIdentifier.java b/src/main/java/cuchaz/enigma/gui/panels/PanelIdentifier.java
index 1bf6887..0cca40d 100644
--- a/src/main/java/cuchaz/enigma/gui/panels/PanelIdentifier.java
+++ b/src/main/java/cuchaz/enigma/gui/panels/PanelIdentifier.java
@@ -1,6 +1,7 @@
1package cuchaz.enigma.gui.panels; 1package cuchaz.enigma.gui.panels;
2 2
3import cuchaz.enigma.gui.Gui; 3import cuchaz.enigma.gui.Gui;
4import cuchaz.enigma.utils.I18n;
4import cuchaz.enigma.utils.Utils; 5import cuchaz.enigma.utils.Utils;
5 6
6import javax.swing.*; 7import javax.swing.*;
@@ -15,12 +16,12 @@ public class PanelIdentifier extends JPanel {
15 16
16 this.setLayout(new GridLayout(4, 1, 0, 0)); 17 this.setLayout(new GridLayout(4, 1, 0, 0));
17 this.setPreferredSize(new Dimension(0, 100)); 18 this.setPreferredSize(new Dimension(0, 100));
18 this.setBorder(BorderFactory.createTitledBorder("Identifier Info")); 19 this.setBorder(BorderFactory.createTitledBorder(I18n.translate("info_panel.identifier")));
19 } 20 }
20 21
21 public void clearReference() { 22 public void clearReference() {
22 this.removeAll(); 23 this.removeAll();
23 JLabel label = new JLabel("No identifier selected"); 24 JLabel label = new JLabel(I18n.translate("info_panel.identifier.none"));
24 Utils.unboldLabel(label); 25 Utils.unboldLabel(label);
25 label.setHorizontalAlignment(JLabel.CENTER); 26 label.setHorizontalAlignment(JLabel.CENTER);
26 this.add(label); 27 this.add(label);
diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java b/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java
index 8ee564b..dd7f9f9 100644
--- a/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java
+++ b/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java
@@ -3,6 +3,7 @@ package cuchaz.enigma.gui.panels;
3import cuchaz.enigma.gui.ClassSelector; 3import cuchaz.enigma.gui.ClassSelector;
4import cuchaz.enigma.gui.Gui; 4import cuchaz.enigma.gui.Gui;
5import cuchaz.enigma.translation.representation.entry.ClassEntry; 5import cuchaz.enigma.translation.representation.entry.ClassEntry;
6import cuchaz.enigma.utils.I18n;
6 7
7import javax.swing.*; 8import javax.swing.*;
8import java.awt.*; 9import java.awt.*;
@@ -30,7 +31,7 @@ public class PanelObf extends JPanel {
30 this.obfClasses.setRenameSelectionListener(gui::onPanelRename); 31 this.obfClasses.setRenameSelectionListener(gui::onPanelRename);
31 32
32 this.setLayout(new BorderLayout()); 33 this.setLayout(new BorderLayout());
33 this.add(new JLabel("Obfuscated Classes"), BorderLayout.NORTH); 34 this.add(new JLabel(I18n.translate("info_panel.classes.obfuscated")), BorderLayout.NORTH);
34 this.add(new JScrollPane(this.obfClasses), BorderLayout.CENTER); 35 this.add(new JScrollPane(this.obfClasses), BorderLayout.CENTER);
35 } 36 }
36} 37}
diff --git a/src/main/java/cuchaz/enigma/gui/stats/StatsGenerator.java b/src/main/java/cuchaz/enigma/gui/stats/StatsGenerator.java
index a6e465d..e783530 100644
--- a/src/main/java/cuchaz/enigma/gui/stats/StatsGenerator.java
+++ b/src/main/java/cuchaz/enigma/gui/stats/StatsGenerator.java
@@ -11,6 +11,7 @@ import cuchaz.enigma.translation.mapping.EntryResolver;
11import cuchaz.enigma.translation.mapping.ResolutionStrategy; 11import cuchaz.enigma.translation.mapping.ResolutionStrategy;
12import cuchaz.enigma.translation.representation.TypeDescriptor; 12import cuchaz.enigma.translation.representation.TypeDescriptor;
13import cuchaz.enigma.translation.representation.entry.*; 13import cuchaz.enigma.translation.representation.entry.*;
14import cuchaz.enigma.utils.I18n;
14 15
15import java.util.*; 16import java.util.*;
16 17
@@ -45,14 +46,14 @@ public class StatsGenerator {
45 totalWork += entryIndex.getClasses().size(); 46 totalWork += entryIndex.getClasses().size();
46 } 47 }
47 48
48 progress.init(totalWork, "Generating stats"); 49 progress.init(totalWork, I18n.translate("progress.stats"));
49 50
50 Map<String, Integer> counts = new HashMap<>(); 51 Map<String, Integer> counts = new HashMap<>();
51 52
52 int numDone = 0; 53 int numDone = 0;
53 if (includedMembers.contains(StatsMember.METHODS) || includedMembers.contains(StatsMember.PARAMETERS)) { 54 if (includedMembers.contains(StatsMember.METHODS) || includedMembers.contains(StatsMember.PARAMETERS)) {
54 for (MethodEntry method : entryIndex.getMethods()) { 55 for (MethodEntry method : entryIndex.getMethods()) {
55 progress.step(numDone++, "Methods"); 56 progress.step(numDone++, I18n.translate("type.methods"));
56 MethodEntry root = entryResolver 57 MethodEntry root = entryResolver
57 .resolveEntry(method, ResolutionStrategy.RESOLVE_ROOT) 58 .resolveEntry(method, ResolutionStrategy.RESOLVE_ROOT)
58 .stream() 59 .stream()
@@ -77,19 +78,19 @@ public class StatsGenerator {
77 78
78 if (includedMembers.contains(StatsMember.FIELDS)) { 79 if (includedMembers.contains(StatsMember.FIELDS)) {
79 for (FieldEntry field : entryIndex.getFields()) { 80 for (FieldEntry field : entryIndex.getFields()) {
80 progress.step(numDone++, "Fields"); 81 progress.step(numDone++, I18n.translate("type.fields"));
81 update(counts, field); 82 update(counts, field);
82 } 83 }
83 } 84 }
84 85
85 if (includedMembers.contains(StatsMember.CLASSES)) { 86 if (includedMembers.contains(StatsMember.CLASSES)) {
86 for (ClassEntry clazz : entryIndex.getClasses()) { 87 for (ClassEntry clazz : entryIndex.getClasses()) {
87 progress.step(numDone++, "Classes"); 88 progress.step(numDone++, I18n.translate("type.classes"));
88 update(counts, clazz); 89 update(counts, clazz);
89 } 90 }
90 } 91 }
91 92
92 progress.step(-1, "Generating data"); 93 progress.step(-1, I18n.translate("progress.stats.data"));
93 94
94 Tree<Integer> tree = new Tree<>(); 95 Tree<Integer> tree = new Tree<>();
95 96