summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/cuchaz/enigma/gui/Gui.java6
-rw-r--r--src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java50
-rw-r--r--src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java82
-rw-r--r--src/main/java/cuchaz/enigma/gui/elements/MenuBar.java123
-rw-r--r--src/main/resources/lang/en_us.json7
-rw-r--r--src/main/resources/lang/fr_fr.json13
6 files changed, 190 insertions, 91 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java
index 3adabaee..ed32469e 100644
--- a/src/main/java/cuchaz/enigma/gui/Gui.java
+++ b/src/main/java/cuchaz/enigma/gui/Gui.java
@@ -941,18 +941,18 @@ public class Gui {
941 public void moveClassTree(EntryReference<Entry<?>, Entry<?>> obfReference, boolean isOldOb, boolean isNewOb) { 941 public void moveClassTree(EntryReference<Entry<?>, Entry<?>> obfReference, boolean isOldOb, boolean isNewOb) {
942 ClassEntry classEntry = obfReference.entry.getContainingClass(); 942 ClassEntry classEntry = obfReference.entry.getContainingClass();
943 943
944 // Ob -> deob
945 List<ClassSelector.StateEntry> stateDeobf = this.deobfPanel.deobfClasses.getExpansionState(this.deobfPanel.deobfClasses); 944 List<ClassSelector.StateEntry> stateDeobf = this.deobfPanel.deobfClasses.getExpansionState(this.deobfPanel.deobfClasses);
946 List<ClassSelector.StateEntry> stateObf = this.obfPanel.obfClasses.getExpansionState(this.obfPanel.obfClasses); 945 List<ClassSelector.StateEntry> stateObf = this.obfPanel.obfClasses.getExpansionState(this.obfPanel.obfClasses);
947 946
948 if (isOldOb && !isNewOb) { 947 // Ob -> deob
948 if (!isNewOb) {
949 this.deobfPanel.deobfClasses.moveClassIn(classEntry); 949 this.deobfPanel.deobfClasses.moveClassIn(classEntry);
950 this.obfPanel.obfClasses.moveClassOut(classEntry); 950 this.obfPanel.obfClasses.moveClassOut(classEntry);
951 this.deobfPanel.deobfClasses.reload(); 951 this.deobfPanel.deobfClasses.reload();
952 this.obfPanel.obfClasses.reload(); 952 this.obfPanel.obfClasses.reload();
953 } 953 }
954 // Deob -> ob 954 // Deob -> ob
955 else if (isNewOb && !isOldOb) { 955 else if (!isOldOb) {
956 this.obfPanel.obfClasses.moveClassIn(classEntry); 956 this.obfPanel.obfClasses.moveClassIn(classEntry);
957 this.deobfPanel.deobfClasses.moveClassOut(classEntry); 957 this.deobfPanel.deobfClasses.moveClassOut(classEntry);
958 this.deobfPanel.deobfClasses.reload(); 958 this.deobfPanel.deobfClasses.reload();
diff --git a/src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java
new file mode 100644
index 00000000..64219ab8
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/gui/dialog/ChangeDialog.java
@@ -0,0 +1,50 @@
1package cuchaz.enigma.gui.dialog;
2
3import java.awt.BorderLayout;
4import java.awt.event.KeyAdapter;
5import java.awt.event.KeyEvent;
6
7import javax.swing.JButton;
8import javax.swing.JFrame;
9import javax.swing.JLabel;
10import javax.swing.JPanel;
11
12import cuchaz.enigma.gui.Gui;
13import cuchaz.enigma.utils.I18n;
14
15public class ChangeDialog {
16
17 public static void show(Gui gui) {
18 // init frame
19 JFrame frame = new JFrame(I18n.translate("menu.view.change.title"));
20 JPanel textPanel = new JPanel();
21 JPanel buttonPanel = new JPanel();
22 frame.setLayout(new BorderLayout());
23 frame.add(BorderLayout.NORTH, textPanel);
24 frame.add(BorderLayout.SOUTH, buttonPanel);
25
26 // show text
27 JLabel text = new JLabel((I18n.translate("menu.view.change.summary")));
28 text.setHorizontalAlignment(JLabel.CENTER);
29 textPanel.add(text);
30
31 // show ok button
32 JButton okButton = new JButton(I18n.translate("menu.view.change.ok"));
33 buttonPanel.add(okButton);
34 okButton.addActionListener(event -> frame.dispose());
35 okButton.addKeyListener(new KeyAdapter() {
36 @Override
37 public void keyPressed(KeyEvent e) {
38 if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
39 frame.dispose();
40 }
41 }
42 });
43
44 // show the frame
45 frame.pack();
46 frame.setVisible(true);
47 frame.setResizable(false);
48 frame.setLocationRelativeTo(gui.getFrame());
49 }
50}
diff --git a/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java
new file mode 100644
index 00000000..868eba79
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java
@@ -0,0 +1,82 @@
1package cuchaz.enigma.gui.dialog;
2
3import java.awt.BorderLayout;
4import java.util.Arrays;
5import java.util.Locale;
6import java.util.Map;
7import java.util.Set;
8import java.util.stream.Collectors;
9
10import javax.swing.JButton;
11import javax.swing.JCheckBox;
12import javax.swing.JFrame;
13import javax.swing.JPanel;
14
15import cuchaz.enigma.gui.Gui;
16import cuchaz.enigma.gui.stats.StatsMember;
17import cuchaz.enigma.gui.util.ScaleUtil;
18import cuchaz.enigma.utils.I18n;
19
20public class StatsDialog {
21
22 public static void show(Gui gui) {
23 // init frame
24 JFrame frame = new JFrame(I18n.translate("menu.file.stats.title"));
25 JPanel checkboxesPanel = new JPanel();
26 JPanel buttonPanel = new JPanel();
27 frame.setLayout(new BorderLayout());
28 frame.add(BorderLayout.NORTH, checkboxesPanel);
29 frame.add(BorderLayout.SOUTH, buttonPanel);
30
31 // show checkboxes
32 Map<StatsMember, JCheckBox> checkboxes = Arrays
33 .stream(StatsMember.values())
34 .collect(Collectors.toMap(m -> m, m -> {
35 JCheckBox checkbox = new JCheckBox(I18n.translate("type." + m.name().toLowerCase(Locale.ROOT)));
36 checkboxesPanel.add(checkbox);
37 return checkbox;
38 }));
39
40 // show generate button
41 JButton button = new JButton(I18n.translate("menu.file.stats.generate"));
42 buttonPanel.add(button);
43 button.setEnabled(false);
44 button.addActionListener(action -> {
45 frame.dispose();
46 generateStats(gui, checkboxes);
47 });
48
49 // add action listener to each checkbox
50 checkboxes.entrySet().forEach(checkbox -> {
51 checkbox.getValue().addActionListener(action -> {
52 if (!button.isEnabled()) {
53 button.setEnabled(true);
54 } else if (checkboxes.entrySet().stream().allMatch(entry -> !entry.getValue().isSelected())) {
55 button.setEnabled(false);
56 }
57 });
58 });
59
60 // show the frame
61 frame.pack();
62 frame.setVisible(true);
63 frame.setSize(ScaleUtil.getDimension(500, 120));
64 frame.setResizable(false);
65 frame.setLocationRelativeTo(gui.getFrame());
66 }
67
68 private static void generateStats(Gui gui, Map<StatsMember, JCheckBox> checkboxes) {
69 // get members from selected checkboxes
70 Set<StatsMember> includedMembers = checkboxes
71 .entrySet()
72 .stream()
73 .filter(entry -> entry.getValue().isSelected())
74 .map(Map.Entry::getKey)
75 .collect(Collectors.toSet());
76
77 // checks if a projet is open
78 if (gui.getController().project != null) {
79 gui.getController().openStats(includedMembers);
80 }
81 }
82}
diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
index f8e4f7e8..dc2cf8fd 100644
--- a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
+++ b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
@@ -4,18 +4,16 @@ import cuchaz.enigma.config.Config;
4import cuchaz.enigma.config.Themes; 4import cuchaz.enigma.config.Themes;
5import cuchaz.enigma.gui.Gui; 5import cuchaz.enigma.gui.Gui;
6import cuchaz.enigma.gui.dialog.AboutDialog; 6import cuchaz.enigma.gui.dialog.AboutDialog;
7import cuchaz.enigma.gui.dialog.ChangeDialog;
7import cuchaz.enigma.gui.dialog.ConnectToServerDialog; 8import cuchaz.enigma.gui.dialog.ConnectToServerDialog;
8import cuchaz.enigma.gui.dialog.CreateServerDialog; 9import cuchaz.enigma.gui.dialog.CreateServerDialog;
9import cuchaz.enigma.gui.dialog.SearchDialog; 10import cuchaz.enigma.gui.dialog.StatsDialog;
10import cuchaz.enigma.gui.stats.StatsMember;
11import cuchaz.enigma.gui.util.ScaleUtil; 11import cuchaz.enigma.gui.util.ScaleUtil;
12import cuchaz.enigma.translation.mapping.serde.MappingFormat; 12import cuchaz.enigma.translation.mapping.serde.MappingFormat;
13import cuchaz.enigma.utils.I18n; 13import cuchaz.enigma.utils.I18n;
14import cuchaz.enigma.utils.Pair; 14import cuchaz.enigma.utils.Pair;
15 15
16import java.awt.Container;
17import java.awt.Desktop; 16import java.awt.Desktop;
18import java.awt.FlowLayout;
19import java.awt.event.InputEvent; 17import java.awt.event.InputEvent;
20import java.awt.event.KeyEvent; 18import java.awt.event.KeyEvent;
21import java.io.File; 19import java.io.File;
@@ -31,17 +29,6 @@ import java.util.stream.Collectors;
31import java.util.stream.IntStream; 29import java.util.stream.IntStream;
32import javax.swing.*; 30import javax.swing.*;
33 31
34
35import javax.swing.*;
36
37import cuchaz.enigma.config.Config;
38import cuchaz.enigma.config.Themes;
39import cuchaz.enigma.gui.Gui;
40import cuchaz.enigma.gui.dialog.AboutDialog;
41import cuchaz.enigma.gui.stats.StatsMember;
42import cuchaz.enigma.translation.mapping.serde.MappingFormat;
43import cuchaz.enigma.utils.I18n;
44
45public class MenuBar extends JMenuBar { 32public class MenuBar extends JMenuBar {
46 33
47 public final JMenuItem closeJarMenu; 34 public final JMenuItem closeJarMenu;
@@ -185,42 +172,8 @@ public class MenuBar extends JMenuBar {
185 menu.addSeparator(); 172 menu.addSeparator();
186 { 173 {
187 JMenuItem stats = new JMenuItem(I18n.translate("menu.file.stats")); 174 JMenuItem stats = new JMenuItem(I18n.translate("menu.file.stats"));
188
189 stats.addActionListener(event -> {
190 JFrame frame = new JFrame(I18n.translate("menu.file.stats.title"));
191 Container pane = frame.getContentPane();
192 pane.setLayout(new FlowLayout());
193
194 Map<StatsMember, JCheckBox> checkboxes = Arrays
195 .stream(StatsMember.values())
196 .collect(Collectors.toMap(m -> m, m -> {
197 JCheckBox checkbox = new JCheckBox(I18n.translate("type." + m.name().toLowerCase(Locale.ROOT)));
198 pane.add(checkbox);
199 return checkbox;
200 }));
201
202 JButton button = new JButton(I18n.translate("menu.file.stats.generate"));
203
204 button.addActionListener(e -> {
205 Set<StatsMember> includedMembers = checkboxes
206 .entrySet()
207 .stream()
208 .filter(entry -> entry.getValue().isSelected())
209 .map(Map.Entry::getKey)
210 .collect(Collectors.toSet());
211
212 frame.setVisible(false);
213 frame.dispose();
214 gui.getController().openStats(includedMembers);
215 });
216
217 pane.add(button);
218 frame.pack();
219 frame.setLocationRelativeTo(this.gui.getFrame());
220 frame.setVisible(true);
221 });
222
223 menu.add(stats); 175 menu.add(stats);
176 stats.addActionListener(event -> StatsDialog.show(this.gui));
224 } 177 }
225 menu.addSeparator(); 178 menu.addSeparator();
226 { 179 {
@@ -235,12 +188,18 @@ public class MenuBar extends JMenuBar {
235 */ 188 */
236 { 189 {
237 JMenu menu = new JMenu(I18n.translate("menu.decompiler")); 190 JMenu menu = new JMenu(I18n.translate("menu.decompiler"));
238 add(menu); 191 this.add(menu);
192
193 ButtonGroup decompilerGroup = new ButtonGroup();
239 194
240 for (Config.Decompiler decompiler : Config.Decompiler.values()) { 195 for (Config.Decompiler decompiler : Config.Decompiler.values()) {
241 JMenuItem label = new JMenuItem(decompiler.name); 196 JRadioButtonMenuItem decompilerButton = new JRadioButtonMenuItem(decompiler.name);
242 menu.add(label); 197 decompilerGroup.add(decompilerButton);
243 label.addActionListener(event -> { 198 if (decompiler.equals(Config.getInstance().decompiler)) {
199 decompilerButton.setSelected(true);
200 }
201 menu.add(decompilerButton);
202 decompilerButton.addActionListener(event -> {
244 gui.getController().setDecompiler(decompiler.service); 203 gui.getController().setDecompiler(decompiler.service);
245 204
246 try { 205 try {
@@ -262,37 +221,35 @@ public class MenuBar extends JMenuBar {
262 { 221 {
263 JMenu themes = new JMenu(I18n.translate("menu.view.themes")); 222 JMenu themes = new JMenu(I18n.translate("menu.view.themes"));
264 menu.add(themes); 223 menu.add(themes);
224 ButtonGroup themeGroup = new ButtonGroup();
265 for (Config.LookAndFeel lookAndFeel : Config.LookAndFeel.values()) { 225 for (Config.LookAndFeel lookAndFeel : Config.LookAndFeel.values()) {
266 JMenuItem theme = new JMenuItem(I18n.translate("menu.view.themes." + lookAndFeel.name().toLowerCase(Locale.ROOT))); 226 JRadioButtonMenuItem themeButton = new JRadioButtonMenuItem(I18n.translate("menu.view.themes." + lookAndFeel.name().toLowerCase(Locale.ROOT)));
267 themes.add(theme); 227 themeGroup.add(themeButton);
268 theme.addActionListener(event -> Themes.setLookAndFeel(gui, lookAndFeel)); 228 if (lookAndFeel.equals(Config.getInstance().lookAndFeel)) {
229 themeButton.setSelected(true);
230 }
231 themes.add(themeButton);
232 themeButton.addActionListener(event -> Themes.setLookAndFeel(gui, lookAndFeel));
269 } 233 }
270 234 }
235 {
271 JMenu languages = new JMenu(I18n.translate("menu.view.languages")); 236 JMenu languages = new JMenu(I18n.translate("menu.view.languages"));
272 menu.add(languages); 237 menu.add(languages);
238 ButtonGroup languageGroup = new ButtonGroup();
273 for (String lang : I18n.getAvailableLanguages()) { 239 for (String lang : I18n.getAvailableLanguages()) {
274 JMenuItem language = new JMenuItem(I18n.getLanguageName(lang)); 240 JRadioButtonMenuItem languageButton = new JRadioButtonMenuItem(I18n.getLanguageName(lang));
275 languages.add(language); 241 languageGroup.add(languageButton);
276 language.addActionListener(event -> I18n.setLanguage(lang)); 242 if (lang.equals(Config.getInstance().language)) {
277 language.addActionListener(event -> { 243 languageButton.setSelected(true);
278 JFrame frame = new JFrame(I18n.translate("menu.view.languages.title")); 244 }
279 Container pane = frame.getContentPane(); 245 languages.add(languageButton);
280 pane.setLayout(new FlowLayout()); 246 languageButton.addActionListener(event -> {
281 247 I18n.setLanguage(lang);
282 JLabel text = new JLabel((I18n.translate("menu.view.languages.summary"))); 248 ChangeDialog.show(this.gui);
283 text.setHorizontalAlignment(JLabel.CENTER);
284 pane.add(text);
285
286 JButton okButton = new JButton(I18n.translate("menu.view.languages.ok"));
287 pane.add(okButton);
288 okButton.addActionListener(arg0 -> frame.dispose());
289
290 frame.pack();
291 frame.setLocationRelativeTo(this.gui.getFrame());
292 frame.setVisible(true);
293 }); 249 });
294 } 250 }
295 251 }
252 {
296 JMenu scale = new JMenu(I18n.translate("menu.view.scale")); 253 JMenu scale = new JMenu(I18n.translate("menu.view.scale"));
297 { 254 {
298 ButtonGroup scaleGroup = new ButtonGroup(); 255 ButtonGroup scaleGroup = new ButtonGroup();
@@ -301,6 +258,7 @@ public class MenuBar extends JMenuBar {
301 float realScaleFactor = scaleFactor / 100f; 258 float realScaleFactor = scaleFactor / 100f;
302 JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(String.format("%d%%", scaleFactor)); 259 JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(String.format("%d%%", scaleFactor));
303 menuItem.addActionListener(event -> ScaleUtil.setScaleFactor(realScaleFactor)); 260 menuItem.addActionListener(event -> ScaleUtil.setScaleFactor(realScaleFactor));
261 menuItem.addActionListener(event -> ChangeDialog.show(this.gui));
304 scaleGroup.add(menuItem); 262 scaleGroup.add(menuItem);
305 scale.add(menuItem); 263 scale.add(menuItem);
306 return new Pair<>(realScaleFactor, menuItem); 264 return new Pair<>(realScaleFactor, menuItem);
@@ -309,7 +267,7 @@ public class MenuBar extends JMenuBar {
309 267
310 JMenuItem customScale = new JMenuItem(I18n.translate("menu.view.scale.custom")); 268 JMenuItem customScale = new JMenuItem(I18n.translate("menu.view.scale.custom"));
311 customScale.addActionListener(event -> { 269 customScale.addActionListener(event -> {
312 String answer = (String) JOptionPane.showInputDialog(gui.getFrame(), "Custom Scale", "Custom Scale", 270 String answer = (String) JOptionPane.showInputDialog(gui.getFrame(), I18n.translate("menu.view.scale.custom.title"), I18n.translate("menu.view.scale.custom.title"),
313 JOptionPane.QUESTION_MESSAGE, null, null, Float.toString(ScaleUtil.getScaleFactor() * 100)); 271 JOptionPane.QUESTION_MESSAGE, null, null, Float.toString(ScaleUtil.getScaleFactor() * 100));
314 if (answer == null) return; 272 if (answer == null) return;
315 float newScale = 1.0f; 273 float newScale = 1.0f;
@@ -318,6 +276,7 @@ public class MenuBar extends JMenuBar {
318 } catch (NumberFormatException ignored) { 276 } catch (NumberFormatException ignored) {
319 } 277 }
320 ScaleUtil.setScaleFactor(newScale); 278 ScaleUtil.setScaleFactor(newScale);
279 ChangeDialog.show(this.gui);
321 }); 280 });
322 scale.add(customScale); 281 scale.add(customScale);
323 ScaleUtil.addListener((newScale, _oldScale) -> { 282 ScaleUtil.addListener((newScale, _oldScale) -> {
@@ -334,7 +293,9 @@ public class MenuBar extends JMenuBar {
334 } 293 }
335 } 294 }
336 menu.add(scale); 295 menu.add(scale);
337 296 }
297 menu.addSeparator();
298 {
338 JMenuItem search = new JMenuItem(I18n.translate("menu.view.search")); 299 JMenuItem search = new JMenuItem(I18n.translate("menu.view.search"));
339 search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK)); 300 search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK));
340 menu.add(search); 301 menu.add(search);
@@ -343,7 +304,6 @@ public class MenuBar extends JMenuBar {
343 this.gui.getSearchDialog().show(); 304 this.gui.getSearchDialog().show();
344 } 305 }
345 }); 306 });
346
347 } 307 }
348 } 308 }
349 309
@@ -399,6 +359,7 @@ public class MenuBar extends JMenuBar {
399 this.startServerMenu = item; 359 this.startServerMenu = item;
400 } 360 }
401 } 361 }
362
402 /* 363 /*
403 * Help menu 364 * Help menu
404 */ 365 */
diff --git a/src/main/resources/lang/en_us.json b/src/main/resources/lang/en_us.json
index 04f689c7..dbf4b935 100644
--- a/src/main/resources/lang/en_us.json
+++ b/src/main/resources/lang/en_us.json
@@ -35,11 +35,12 @@
35 "menu.view.themes.system": "System", 35 "menu.view.themes.system": "System",
36 "menu.view.themes.none": "None (JVM Default)", 36 "menu.view.themes.none": "None (JVM Default)",
37 "menu.view.languages": "Languages", 37 "menu.view.languages": "Languages",
38 "menu.view.languages.title": "Change language",
39 "menu.view.languages.summary": "The new language will be applied after the next restart.",
40 "menu.view.languages.ok": "Ok",
41 "menu.view.scale": "Scale", 38 "menu.view.scale": "Scale",
42 "menu.view.scale.custom": "Custom...", 39 "menu.view.scale.custom": "Custom...",
40 "menu.view.scale.custom.title": "Custom Scale",
41 "menu.view.change.title": "Changes",
42 "menu.view.change.summary": "Changes will be applied after the next restart.",
43 "menu.view.change.ok": "Ok",
43 "menu.view.search": "Search", 44 "menu.view.search": "Search",
44 "menu.collab": "Collab", 45 "menu.collab": "Collab",
45 "menu.collab.connect": "Connect to server", 46 "menu.collab.connect": "Connect to server",
diff --git a/src/main/resources/lang/fr_fr.json b/src/main/resources/lang/fr_fr.json
index a1d55a28..d169b9a0 100644
--- a/src/main/resources/lang/fr_fr.json
+++ b/src/main/resources/lang/fr_fr.json
@@ -35,9 +35,12 @@
35 "menu.view.themes.system": "Système", 35 "menu.view.themes.system": "Système",
36 "menu.view.themes.none": "Aucun (JVM par défaut)", 36 "menu.view.themes.none": "Aucun (JVM par défaut)",
37 "menu.view.languages": "Langues", 37 "menu.view.languages": "Langues",
38 "menu.view.languages.title": "Modifier la langue", 38 "menu.view.scale": "Échelle",
39 "menu.view.languages.summary": "La nouvelle langue sera appliquée lors du prochain redémarrage.", 39 "menu.view.scale.custom": "Personnalisée...",
40 "menu.view.languages.ok": "Ok", 40 "menu.view.scale.custom.title": "Échelle personnalisée",
41 "menu.view.change.title": "Modifications",
42 "menu.view.change.summary": "Les modifications seront appliquées lors du prochain redémarrage.",
43 "menu.view.change.ok": "Ok",
41 "menu.view.search": "Rechercher", 44 "menu.view.search": "Rechercher",
42 "menu.collab": "Collab", 45 "menu.collab": "Collab",
43 "menu.collab.connect": "Se connecter à un serveur", 46 "menu.collab.connect": "Se connecter à un serveur",
@@ -56,7 +59,7 @@
56 "popup_menu.javadoc": "Éditer le Javadoc", 59 "popup_menu.javadoc": "Éditer le Javadoc",
57 "popup_menu.inheritance": "Afficher l'héritage", 60 "popup_menu.inheritance": "Afficher l'héritage",
58 "popup_menu.implementations": "Afficher les implémentations", 61 "popup_menu.implementations": "Afficher les implémentations",
59 "popup_menu.calls": "Afficher les appels", 62 "popup_menu.calls": "Afficher les appels (tous)",
60 "popup_menu.calls.specific": "Afficher les appels (spécifiques)", 63 "popup_menu.calls.specific": "Afficher les appels (spécifiques)",
61 "popup_menu.declaration": "Aller à la déclaration", 64 "popup_menu.declaration": "Aller à la déclaration",
62 "popup_menu.back": "Annuler", 65 "popup_menu.back": "Annuler",
@@ -121,6 +124,8 @@
121 "prompt.close.save": "Enregistrer et fermer", 124 "prompt.close.save": "Enregistrer et fermer",
122 "prompt.close.discard": "Annuler les modifications", 125 "prompt.close.discard": "Annuler les modifications",
123 "prompt.close.cancel": "Annuler", 126 "prompt.close.cancel": "Annuler",
127 "prompt.open": "Ouvrir",
128 "prompt.cancel": "Annuler",
124 "prompt.connect.title": "Se connecter à un serveur", 129 "prompt.connect.title": "Se connecter à un serveur",
125 "prompt.connect.username": "Nom d'utilisateur", 130 "prompt.connect.username": "Nom d'utilisateur",
126 "prompt.connect.ip": "IP", 131 "prompt.connect.ip": "IP",