From e57ffc624c045675879c64f6f2d1ba844cf8e6e9 Mon Sep 17 00:00:00 2001 From: Darius Morawiec Date: Sun, 15 Sep 2013 19:45:11 +0200 Subject: [PATCH] Added Internationalization (i18n) --- app/src/processing/app/Base.java | 4 +- app/src/processing/app/Editor.java | 86 +++++++++---------- app/src/processing/app/EditorHeader.java | 15 ++-- app/src/processing/app/Language.java | 81 +++++++++++++++++ app/src/processing/app/Preferences.java | 44 +++++++++- .../processing/app/language/PDE.properties | 85 ++++++++++++++++++ .../processing/app/language/PDE_de.properties | 80 +++++++++++++++++ .../processing/app/language/PDE_en.properties | 5 ++ app/src/processing/app/tools/Archiver.java | 2 +- .../app/tools/InstallCommander.java | 3 +- app/src/processing/app/tools/SerialFixer.java | 3 +- app/src/processing/mode/java/JavaEditor.java | 32 +++---- app/src/processing/mode/java/JavaToolbar.java | 13 +-- build/shared/lib/language.txt | 1 + 14 files changed, 375 insertions(+), 79 deletions(-) create mode 100644 app/src/processing/app/Language.java create mode 100644 app/src/processing/app/language/PDE.properties create mode 100644 app/src/processing/app/language/PDE_de.properties create mode 100644 app/src/processing/app/language/PDE_en.properties create mode 100644 build/shared/lib/language.txt diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index ed3cdfa84..90a690ce1 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -166,7 +166,9 @@ public class Base { // Make sure a full JDK is installed initRequirements(); - + + Language.init(); + // run static initialization that grabs all the prefs Preferences.init(); diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index f0dfe17b2..5fddfdfb3 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -401,7 +401,7 @@ public abstract class Editor extends JFrame implements RunnerListener { } modeMenu.addSeparator(); - JMenuItem addLib = new JMenuItem("Add Mode..."); + JMenuItem addLib = new JMenuItem(Language.text("toolbar.add_mode")); addLib.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { base.handleOpenModeManager(); @@ -560,9 +560,9 @@ public abstract class Editor extends JFrame implements RunnerListener { protected JMenu buildFileMenu(JMenuItem[] exportItems) { JMenuItem item; - JMenu fileMenu = new JMenu("File"); + JMenu fileMenu = new JMenu(Language.text("menu.file")); - item = Toolkit.newJMenuItem("New", 'N'); + item = Toolkit.newJMenuItem(Language.text("menu.file.new"), 'N'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { base.handleNew(); @@ -570,7 +570,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); fileMenu.add(item); - item = Toolkit.newJMenuItem("Open...", 'O'); + item = Toolkit.newJMenuItem(Language.text("menu.file.open"), 'O'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { base.handleOpenPrompt(); @@ -581,7 +581,7 @@ public abstract class Editor extends JFrame implements RunnerListener { fileMenu.add(base.getSketchbookMenu()); // fileMenu.add(mode.getExamplesMenu()); - item = Toolkit.newJMenuItemShift("Examples...", 'O'); + item = Toolkit.newJMenuItemShift(Language.text("menu.file.examples"), 'O'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { mode.showExamplesFrame(); @@ -589,7 +589,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); fileMenu.add(item); - item = Toolkit.newJMenuItem("Close", 'W'); + item = Toolkit.newJMenuItem(Language.text("menu.file.close"), 'W'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { base.handleClose(Editor.this, false); @@ -597,7 +597,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); fileMenu.add(item); - item = Toolkit.newJMenuItem("Save", 'S'); + item = Toolkit.newJMenuItem(Language.text("menu.file.save"), 'S'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleSave(false); @@ -606,7 +606,7 @@ public abstract class Editor extends JFrame implements RunnerListener { // saveMenuItem = item; fileMenu.add(item); - item = Toolkit.newJMenuItemShift("Save As...", 'S'); + item = Toolkit.newJMenuItemShift(Language.text("menu.file.save_as"), 'S'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleSaveAs(); @@ -622,7 +622,7 @@ public abstract class Editor extends JFrame implements RunnerListener { } fileMenu.addSeparator(); - item = Toolkit.newJMenuItemShift("Page Setup", 'P'); + item = Toolkit.newJMenuItemShift(Language.text("menu.file.page_setup"), 'P'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handlePageSetup(); @@ -630,7 +630,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); fileMenu.add(item); - item = Toolkit.newJMenuItem("Print", 'P'); + item = Toolkit.newJMenuItem(Language.text("menu.file.print"), 'P'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handlePrint(); @@ -643,7 +643,7 @@ public abstract class Editor extends JFrame implements RunnerListener { if (!Base.isMacOS()) { fileMenu.addSeparator(); - item = Toolkit.newJMenuItem("Preferences", ','); + item = Toolkit.newJMenuItem(Language.text("menu.file.preferences"), ','); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { base.handlePrefs(); @@ -653,7 +653,7 @@ public abstract class Editor extends JFrame implements RunnerListener { fileMenu.addSeparator(); - item = Toolkit.newJMenuItem("Quit", 'Q'); + item = Toolkit.newJMenuItem(Language.text("menu.file.quit"), 'Q'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { base.handleQuit(); @@ -676,19 +676,19 @@ public abstract class Editor extends JFrame implements RunnerListener { protected JMenu buildEditMenu() { - JMenu menu = new JMenu("Edit"); + JMenu menu = new JMenu(Language.text("menu.edit")); JMenuItem item; - undoItem = Toolkit.newJMenuItem("Undo", 'Z'); + undoItem = Toolkit.newJMenuItem(Language.text("menu.edit.undo"), 'Z'); undoItem.addActionListener(undoAction = new UndoAction()); menu.add(undoItem); // Gotta follow them interface guidelines // http://code.google.com/p/processing/issues/detail?id=363 if (Base.isWindows()) { - redoItem = Toolkit.newJMenuItem("Redo", 'Y'); + redoItem = Toolkit.newJMenuItem(Language.text("menu.edit.redo"), 'Y'); } else { // Linux and OS X - redoItem = Toolkit.newJMenuItemShift("Redo", 'Z'); + redoItem = Toolkit.newJMenuItemShift(Language.text("menu.edit.redo"), 'Z'); } redoItem.addActionListener(redoAction = new RedoAction()); menu.add(redoItem); @@ -697,7 +697,7 @@ public abstract class Editor extends JFrame implements RunnerListener { // TODO "cut" and "copy" should really only be enabled // if some text is currently selected - item = Toolkit.newJMenuItem("Cut", 'X'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.cut"), 'X'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCut(); @@ -705,7 +705,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); menu.add(item); - item = Toolkit.newJMenuItem("Copy", 'C'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.copy"), 'C'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { textarea.copy(); @@ -713,7 +713,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); menu.add(item); - item = Toolkit.newJMenuItemShift("Copy as HTML", 'C'); + item = Toolkit.newJMenuItemShift(Language.text("menu.edit.copy_as_html"), 'C'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCopyAsHTML(); @@ -721,7 +721,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); menu.add(item); - item = Toolkit.newJMenuItem("Paste", 'V'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.paste"), 'V'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { textarea.paste(); @@ -730,7 +730,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); menu.add(item); - item = Toolkit.newJMenuItem("Select All", 'A'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.select_all"), 'A'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { textarea.selectAll(); @@ -770,7 +770,7 @@ public abstract class Editor extends JFrame implements RunnerListener { menu.addSeparator(); - item = Toolkit.newJMenuItem("Auto Format", 'T'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.auto_format"), 'T'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleAutoFormat(); @@ -778,7 +778,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); menu.add(item); - item = Toolkit.newJMenuItem("Comment/Uncomment", '/'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.comment_uncomment"), '/'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCommentUncomment(); @@ -786,7 +786,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); menu.add(item); - item = Toolkit.newJMenuItem("Increase Indent", ']'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.increase_indent"), ']'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleIndentOutdent(true); @@ -794,7 +794,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); menu.add(item); - item = Toolkit.newJMenuItem("Decrease Indent", '['); + item = Toolkit.newJMenuItem(Language.text("menu.edit.decrease_indent"), '['); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleIndentOutdent(false); @@ -804,7 +804,7 @@ public abstract class Editor extends JFrame implements RunnerListener { menu.addSeparator(); - item = Toolkit.newJMenuItem("Find...", 'F'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.find"), 'F'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (find == null) { @@ -818,7 +818,7 @@ public abstract class Editor extends JFrame implements RunnerListener { // TODO find next should only be enabled after a // search has actually taken place - item = Toolkit.newJMenuItem("Find Next", 'G'); + item = Toolkit.newJMenuItem(Language.text("menu.edit.find_next"), 'G'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (find != null) { @@ -828,7 +828,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); menu.add(item); - item = Toolkit.newJMenuItemShift("Find Previous", 'G'); + item = Toolkit.newJMenuItemShift(Language.text("menu.edit.find_previous"), 'G'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (find != null) { @@ -839,7 +839,7 @@ public abstract class Editor extends JFrame implements RunnerListener { menu.add(item); // For Arduino and Mac, this should be command-E, but that currently conflicts with Export Applet - item = Toolkit.newJMenuItemAlt("Use Selection for Find", 'F'); + item = Toolkit.newJMenuItemAlt(Language.text("menu.edit.use_selection_for_find"), 'F'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (find == null) { @@ -859,7 +859,7 @@ public abstract class Editor extends JFrame implements RunnerListener { protected JMenu buildSketchMenu(JMenuItem[] runItems) { JMenuItem item; - sketchMenu = new JMenu("Sketch"); + sketchMenu = new JMenu(Language.text("menu.sketch")); for (JMenuItem mi : runItems) { sketchMenu.add(mi); @@ -869,7 +869,7 @@ public abstract class Editor extends JFrame implements RunnerListener { sketchMenu.add(mode.getImportMenu()); - item = Toolkit.newJMenuItem("Show Sketch Folder", 'K'); + item = Toolkit.newJMenuItem(Language.text("menu.sketch.show_sketch_folder"), 'K'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Base.openFolder(sketch.getFolder()); @@ -878,7 +878,7 @@ public abstract class Editor extends JFrame implements RunnerListener { sketchMenu.add(item); item.setEnabled(Base.openFolderAvailable()); - item = new JMenuItem("Add File..."); + item = new JMenuItem(Language.text("menu.sketch.add_file")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { sketch.handleAddFile(); @@ -909,7 +909,7 @@ public abstract class Editor extends JFrame implements RunnerListener { public void rebuildToolMenu() { if (toolsMenu == null) { - toolsMenu = new JMenu("Tools"); + toolsMenu = new JMenu(Language.text("menu.tools")); } else { toolsMenu.removeAll(); } @@ -923,7 +923,7 @@ public abstract class Editor extends JFrame implements RunnerListener { addTools(toolsMenu, contribTools); toolsMenu.addSeparator(); - JMenuItem item = new JMenuItem("Add Tool..."); + JMenuItem item = new JMenuItem(Language.text("menu.tools.add_tool")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { base.handleOpenToolManager(); @@ -2520,7 +2520,7 @@ public abstract class Editor extends JFrame implements RunnerListener { public TextAreaPopup() { JMenuItem item; - cutItem = new JMenuItem("Cut"); + cutItem = new JMenuItem(Language.text("menu.edit.cut")); cutItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCut(); @@ -2528,7 +2528,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); this.add(cutItem); - copyItem = new JMenuItem("Copy"); + copyItem = new JMenuItem(Language.text("menu.edit.copy")); copyItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCopy(); @@ -2536,7 +2536,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); this.add(copyItem); - discourseItem = new JMenuItem("Copy as HTML"); + discourseItem = new JMenuItem(Language.text("menu.edit.copy_as_html")); discourseItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCopyAsHTML(); @@ -2544,7 +2544,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); this.add(discourseItem); - item = new JMenuItem("Paste"); + item = new JMenuItem(Language.text("menu.edit.paste")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handlePaste(); @@ -2552,7 +2552,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); this.add(item); - item = new JMenuItem("Select All"); + item = new JMenuItem(Language.text("menu.edit.select_all")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleSelectAll(); @@ -2562,7 +2562,7 @@ public abstract class Editor extends JFrame implements RunnerListener { this.addSeparator(); - item = new JMenuItem("Comment/Uncomment"); + item = new JMenuItem(Language.text("menu.edit.comment_uncomment")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleCommentUncomment(); @@ -2570,7 +2570,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); this.add(item); - item = new JMenuItem("Increase Indent"); + item = new JMenuItem(Language.text("menu.edit.increase_indent")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleIndentOutdent(true); @@ -2578,7 +2578,7 @@ public abstract class Editor extends JFrame implements RunnerListener { }); this.add(item); - item = new JMenuItem("Decrease Indent"); + item = new JMenuItem(Language.text("menu.edit.decrease_indent")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleIndentOutdent(false); @@ -2588,7 +2588,7 @@ public abstract class Editor extends JFrame implements RunnerListener { this.addSeparator(); - referenceItem = new JMenuItem("Find in Reference"); + referenceItem = new JMenuItem(Language.text("editor.popup.find_in_reference")); referenceItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleFindReference(); diff --git a/app/src/processing/app/EditorHeader.java b/app/src/processing/app/EditorHeader.java index 334d0e91d..671095f14 100644 --- a/app/src/processing/app/EditorHeader.java +++ b/app/src/processing/app/EditorHeader.java @@ -508,7 +508,7 @@ public class EditorHeader extends JComponent { */ //item = new JMenuItem("New Tab"); - item = Toolkit.newJMenuItemShift("New Tab", 'N'); + item = Toolkit.newJMenuItemShift(Language.text("editor.header.new_tab"), 'N'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { editor.getSketch().handleNewCode(); @@ -516,7 +516,7 @@ public class EditorHeader extends JComponent { }); menu.add(item); - item = new JMenuItem("Rename"); + item = new JMenuItem(Language.text("editor.header.rename")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { editor.getSketch().handleRenameCode(); @@ -530,16 +530,15 @@ public class EditorHeader extends JComponent { }); menu.add(item); - item = new JMenuItem("Delete"); + item = new JMenuItem(Language.text("editor.header.delete")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Sketch sketch = editor.getSketch(); if (!Base.isMacOS() && // ok on OS X editor.base.editors.size() == 1 && // mmm! accessor sketch.getCurrentCodeIndex() == 0) { - Base.showWarning("Yeah, no." , - "You can't delete the last tab " + - "of the last open sketch.", null); + Base.showWarning(Language.text("editor.header.delete.warning.title"), + Language.text("editor.header.delete.warning.text"), null); } else { editor.getSketch().handleDeleteCode(); } @@ -551,7 +550,7 @@ public class EditorHeader extends JComponent { // KeyEvent.VK_LEFT and VK_RIGHT will make Windows beep - item = new JMenuItem("Previous Tab"); + item = new JMenuItem(Language.text("editor.header.previous_tab")); KeyStroke ctrlAltLeft = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Toolkit.SHORTCUT_ALT_KEY_MASK); item.setAccelerator(ctrlAltLeft); @@ -565,7 +564,7 @@ public class EditorHeader extends JComponent { */ menu.add(item); - item = new JMenuItem("Next Tab"); + item = new JMenuItem(Language.text("editor.header.next_tab")); KeyStroke ctrlAltRight = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Toolkit.SHORTCUT_ALT_KEY_MASK); item.setAccelerator(ctrlAltRight); diff --git a/app/src/processing/app/Language.java b/app/src/processing/app/Language.java new file mode 100644 index 000000000..1772e5bf4 --- /dev/null +++ b/app/src/processing/app/Language.java @@ -0,0 +1,81 @@ +package processing.app; + +import java.io.File; +import java.util.HashMap; +import java.util.Locale; +import java.util.ResourceBundle; +import processing.core.PApplet; + + +/** + * Internationalization (i18n) + * @author Darius Morawiec + */ +public class Language { + + private static Language instance = null; + private String language; + private HashMap languages; + private ResourceBundle bundle; + + private Language() { + + this.language = Locale.getDefault().getLanguage(); + this.languages = new HashMap(); + this.languages.put("en", "English"); + this.languages.put("de", "Deutsch"); + + if(!this.languages.containsKey(this.language)){ + this.language = "en"; + } + + try { + File file = Base.getContentFile("lib/language.txt"); + if (file.exists()) { + String language = PApplet.loadStrings(file)[0]; + language = language.trim().toLowerCase(); + if(!language.equals("")) { + this.language = language; + } + } + Base.saveFile(this.language, file); + } catch (Exception e) { + e.printStackTrace(); + } + + this.bundle = ResourceBundle.getBundle("processing.app.language.PDE", new Locale(this.language)); + } + + /** + * Singleton + * @return + */ + public static synchronized Language init() { + if(instance == null) { + instance = new Language(); + } + return instance; + } + + public static String text(String text) { + return init().bundle.getString(text); + } + + public static HashMap getLanguages() { + return init().languages; + } + + public static String getLanguage() { + return init().language; + } + + public static void setLanguage(String language) { + try { + File file = Base.getContentFile("lib/language.txt"); + Base.saveFile(language, file); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/app/src/processing/app/Preferences.java b/app/src/processing/app/Preferences.java index 51a4d7127..5563868de 100644 --- a/app/src/processing/app/Preferences.java +++ b/app/src/processing/app/Preferences.java @@ -119,6 +119,7 @@ public class Preferences { JRadioButton bitsThirtyTwoButton; JRadioButton bitsSixtyFourButton; JComboBox displaySelectionBox; + JComboBox languageSelectionBox; int displayCount; @@ -293,6 +294,32 @@ public class Preferences { right = Math.max(right, h + d2.width + GUI_BIG); top += vmax + GUI_BETWEEN; + + // Language: [ English ] (requires restart of Processing) + + Container languageBox = Box.createHorizontalBox(); + JLabel languageLabel = new JLabel("Language "); + languageBox.add(languageLabel); + languageSelectionBox = new JComboBox(); + + HashMap languages = Language.getLanguages(); + String[] languageSelection = new String[languages.size()]; + languageSelection[0] = languages.get(Language.getLanguage()); + int i = 1; + for (Map.Entry lang : languages.entrySet()) { + if(!lang.getKey().equals(Language.getLanguage())){ + languageSelection[i++] = lang.getValue(); + } + } + languageSelectionBox.setModel(new DefaultComboBoxModel(languageSelection)); + languageBox.add(languageSelectionBox); + label = new JLabel(" (requires restart of Processing)"); + languageBox.add(label); + pain.add(languageBox); + d = languageBox.getPreferredSize(); + languageBox.setBounds(left, top, d.width, d.height); + top += d.height + GUI_BETWEEN; + // Editor font size [ ] @@ -438,7 +465,7 @@ public class Preferences { d = displayBox.getPreferredSize(); displayBox.setBounds(left, top, d.width, d.height); top += d.height + GUI_BETWEEN; - + // [ ] Automatically associate .pde files with Processing @@ -640,7 +667,20 @@ public class Preferences { // setBoolean("editor.external", externalEditorBox.isSelected()); setBoolean("update.check", checkUpdatesBox.isSelected()); //$NON-NLS-1$ - + + // Save Language + HashMap languages = Language.getLanguages(); + String language = ""; + for (Map.Entry lang : languages.entrySet()) { + if( lang.getValue().equals( String.valueOf(languageSelectionBox.getSelectedItem()) ) ){ + language = lang.getKey().trim().toLowerCase(); + break; + } + } + if(!language.equals(Language.getLanguage()) && !language.equals("")){ + Language.setLanguage(language); + } + int oldDisplayIndex = getInteger("run.display"); //$NON-NLS-1$ int displayIndex = 0; for (int d = 0; d < displaySelectionBox.getItemCount(); d++) { diff --git a/app/src/processing/app/language/PDE.properties b/app/src/processing/app/language/PDE.properties new file mode 100644 index 000000000..e1706417d --- /dev/null +++ b/app/src/processing/app/language/PDE.properties @@ -0,0 +1,85 @@ + + +# --------------------------------------- +# BASIC +# --------------------------------------- + + +menu.file = File +menu.file.new = New +menu.file.open = Open... +menu.file.sketchbook = Sketchbook +menu.file.recent = Recent +menu.file.examples = Examples... +menu.file.close = Close +menu.file.save = Save +menu.file.save_as = Save As... +menu.file.export_application = Export Application +menu.file.page_setup = Page Setup +menu.file.print = Print +menu.file.preferences = Preferences +menu.file.quit = Quit + +menu.edit = Edit +menu.edit.undo = Undo +menu.edit.redo = Redo +menu.edit.cut = Cut +menu.edit.copy = Copy +menu.edit.copy_as_html = Copy as HTML +menu.edit.paste = Paste +menu.edit.select_all = Select All +menu.edit.auto_format = Auto Format +menu.edit.comment_uncomment = Comment/Uncomment +menu.edit.increase_indent = Increase Indent +menu.edit.decrease_indent = Decrease Indent +menu.edit.find = Find... +menu.edit.find_next = Find Next +menu.edit.find_previous = Find Previous +menu.edit.use_selection_for_find = Use Selection for Find + +menu.sketch = Sketch +menu.sketch.show_sketch_folder = Show Sketch Folder +menu.sketch.add_file = Add File... + +menu.tools = Tools +menu.tools.archive_sketch = Archive Sketch +menu.tools.fix_the_serial_lbrary = Fix the Serial Library +menu.tools.install_processing_java = Install "processing-java" +menu.tools.add_tool = Add Tool... + +menu.help = Help +menu.help.about = About Processing +menu.help.environment = Environment +menu.help.reference = Reference +menu.help.find_in_reference = Find in Reference +menu.help.online = Online +menu.help.getting_started = Getting Started +menu.help.getting_started.url = http://processing.org/learning/gettingstarted/ +menu.help.troubleshooting = Troubleshooting +menu.help.troubleshooting.url = http://wiki.processing.org/w/Troubleshooting +menu.help.faq = Frequently Asked Questions +menu.help.faq.url = http://wiki.processing.org/w/FAQ +menu.help.foundation = The Processing Foundation +menu.help.foundation.url = http://processing.org/foundation/ +menu.help.visit = Visit Processing.org +menu.help.visit.url = http://processing.org/ + +toolbar.run = Run +toolbar.present = Present +toolbar.stop = Stop +toolbar.new = New +toolbar.open = Open +toolbar.save = Save +toolbar.export_application = Export Application +toolbar.add_mode = Add mode... + +editor.header.new_tab = New Tab +editor.header.rename = Rename +editor.header.delete = Delete +editor.header.previous_tab = Previous Tab +editor.header.next_tab = Next Tab + +editor.header.delete.warning.title = Yeah, no. +editor.header.delete.warning.text = You can't delete the last tab of the last open sketch. + +editor.popup.find_in_reference = Find in Reference \ No newline at end of file diff --git a/app/src/processing/app/language/PDE_de.properties b/app/src/processing/app/language/PDE_de.properties new file mode 100644 index 000000000..a67f224bb --- /dev/null +++ b/app/src/processing/app/language/PDE_de.properties @@ -0,0 +1,80 @@ + + +# --------------------------------------- +# DEUTSCH (de) +# --------------------------------------- + + +menu.file = Datei +menu.file.new = Neu... +menu.file.open = Öffnen... +menu.file.sketchbook = Sketchbook +menu.file.recent = Letzte Dateien öffnen +menu.file.examples = Beispiele... +menu.file.close = Schließen +menu.file.save = Speichern +menu.file.save_as = Speichern unter... +menu.file.export_application = Exportieren... +menu.file.page_setup = Eine Kopie drucken +menu.file.print = Drucken... +menu.file.preferences = Einstellungen +menu.file.quit = Beenden + +menu.edit = Bearbeiten +menu.edit.undo = Rückgängig +menu.edit.redo = Wiederholen +menu.edit.cut = Ausschneiden +menu.edit.copy = Kopieren +menu.edit.copy_as_html = Kopieren als HTML +menu.edit.paste = Einfügen +menu.edit.select_all = Alle auswählen +menu.edit.auto_format = Autoformatierung +menu.edit.comment_uncomment = Ein- und Auskommentieren +menu.edit.increase_indent = Einrücken +menu.edit.decrease_indent = Ausrücken +menu.edit.find = Suchen... +menu.edit.find_next = Weiter suchen... +menu.edit.find_previous = Vorher suchen... +menu.edit.use_selection_for_find = Suche in Auswahl + +menu.sketch = Sketch +menu.sketch.show_sketch_folder = Zeige Sketch Verzeichnis +menu.sketch.add_file = Datei hinzufügen... + +menu.tools = Tools +menu.tools.archive_sketch = Sketch archivieren... +menu.tools.fix_the_serial_lbrary = "Serial Library" beheben... +menu.tools.install_processing_java = "processing-java" installieren... +menu.tools.add_tool = Tool hinzufügen... + +menu.help = Hilfe +menu.help.about = Über Processing +menu.help.environment = Entwicklungsumgebung +menu.help.reference = Referenz +menu.help.find_in_reference = Suche in Referenz +menu.help.online = Online +menu.help.getting_started = Erste Schritte +menu.help.troubleshooting = Fehlerbehandlung +menu.help.faq = Häufig gestellte Fragen +menu.help.foundation = "The Processing Foundation" +menu.help.visit = Processing.org besuchen + +toolbar.run = Starten +toolbar.present = Starten in Vollbild +toolbar.stop = Stoppen +toolbar.new = Neu +toolbar.open = Öffnen +toolbar.save = Speichern +toolbar.export_application = Exportieren +toolbar.add_mode = Modus hinzufügen... + +editor.header.new_tab = Neuer Tab +editor.header.rename = Unbenennen +editor.header.delete = Löschen +editor.header.previous_tab = Nächster Tab +editor.header.next_tab = Vorheriger Tab + +editor.header.delete.warning.title = Yeah, nein. +editor.header.delete.warning.text = Du kannst nicht den letzten Tab des letzten Sketches löschen. + +editor.popup.find_in_reference = Suche in Referenz \ No newline at end of file diff --git a/app/src/processing/app/language/PDE_en.properties b/app/src/processing/app/language/PDE_en.properties new file mode 100644 index 000000000..ca9c83242 --- /dev/null +++ b/app/src/processing/app/language/PDE_en.properties @@ -0,0 +1,5 @@ + + +# --------------------------------------- +# ENGLISH (en) +# --------------------------------------- \ No newline at end of file diff --git a/app/src/processing/app/tools/Archiver.java b/app/src/processing/app/tools/Archiver.java index ab2a3e424..1c81e66ce 100644 --- a/app/src/processing/app/tools/Archiver.java +++ b/app/src/processing/app/tools/Archiver.java @@ -44,7 +44,7 @@ public class Archiver implements Tool { public String getMenuTitle() { - return "Archive Sketch"; + return Language.text("menu.tools.archive_sketch"); } diff --git a/app/src/processing/app/tools/InstallCommander.java b/app/src/processing/app/tools/InstallCommander.java index 461a80dba..d3eb69e4e 100644 --- a/app/src/processing/app/tools/InstallCommander.java +++ b/app/src/processing/app/tools/InstallCommander.java @@ -29,6 +29,7 @@ import javax.swing.JOptionPane; import processing.app.Base; import processing.app.Editor; +import processing.app.Language; import processing.core.PApplet; @@ -37,7 +38,7 @@ public class InstallCommander implements Tool { public String getMenuTitle() { - return "Install “processing-javaâ€"; + return Language.text("menu.tools.install_processing_java"); } diff --git a/app/src/processing/app/tools/SerialFixer.java b/app/src/processing/app/tools/SerialFixer.java index 7065b53bc..6e5e1612d 100644 --- a/app/src/processing/app/tools/SerialFixer.java +++ b/app/src/processing/app/tools/SerialFixer.java @@ -27,6 +27,7 @@ import javax.swing.JOptionPane; import processing.app.Base; import processing.app.Editor; +import processing.app.Language; import processing.core.PApplet; @@ -35,7 +36,7 @@ public class SerialFixer implements Tool { public String getMenuTitle() { - return "Fix the Serial Library"; + return Language.text("menu.tools.fix_the_serial_lbrary"); } diff --git a/app/src/processing/mode/java/JavaEditor.java b/app/src/processing/mode/java/JavaEditor.java index 38ef50e99..d51bbf040 100644 --- a/app/src/processing/mode/java/JavaEditor.java +++ b/app/src/processing/mode/java/JavaEditor.java @@ -96,12 +96,12 @@ public class JavaEditor extends Editor { public JMenu buildHelpMenu() { // To deal with a Mac OS X 10.5 bug, add an extra space after the name // so that the OS doesn't try to insert its slow help menu. - JMenu menu = new JMenu("Help "); + JMenu menu = new JMenu(Language.text("menu.help")+" "); JMenuItem item; // macosx already has its own about menu if (!Base.isMacOS()) { - item = new JMenuItem("About Processing"); + item = new JMenuItem(Language.text("menu.help.about")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new About(JavaEditor.this); @@ -110,7 +110,7 @@ public class JavaEditor extends Editor { menu.add(item); } - item = new JMenuItem("Environment"); + item = new JMenuItem(Language.text("menu.help.environment")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showReference("environment" + File.separator + "index.html"); @@ -118,7 +118,7 @@ public class JavaEditor extends Editor { }); menu.add(item); - item = new JMenuItem("Reference"); + item = new JMenuItem(Language.text("menu.help.reference")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showReference("index.html"); @@ -126,7 +126,7 @@ public class JavaEditor extends Editor { }); menu.add(item); - item = Toolkit.newJMenuItemShift("Find in Reference", 'F'); + item = Toolkit.newJMenuItemShift(Language.text("menu.help.find_in_reference"), 'F'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (textarea.isSelectionActive()) { @@ -137,46 +137,46 @@ public class JavaEditor extends Editor { menu.add(item); menu.addSeparator(); - item = new JMenuItem("Online"); + item = new JMenuItem(Language.text("menu.help.online")); item.setEnabled(false); menu.add(item); - item = new JMenuItem("Getting Started"); + item = new JMenuItem(Language.text("menu.help.getting_started")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - Base.openURL("http://processing.org/learning/gettingstarted/"); + Base.openURL(Language.text("menu.help.getting_started.url")); } }); menu.add(item); - item = new JMenuItem("Troubleshooting"); + item = new JMenuItem(Language.text("menu.help.troubleshooting")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - Base.openURL("http://wiki.processing.org/w/Troubleshooting"); + Base.openURL(Language.text("menu.help.troubleshooting.url")); } }); menu.add(item); - item = new JMenuItem("Frequently Asked Questions"); + item = new JMenuItem(Language.text("menu.help.faq")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - Base.openURL("http://wiki.processing.org/w/FAQ"); + Base.openURL(Language.text("menu.help.faq.url")); } }); menu.add(item); - item = new JMenuItem("The Processing Foundation"); + item = new JMenuItem(Language.text("menu.help.foundation")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - Base.openURL("http://processing.org/foundation/"); + Base.openURL(Language.text("menu.help.foundation.url")); } }); menu.add(item); - item = new JMenuItem("Visit Processing.org"); + item = new JMenuItem(Language.text("menu.help.visit")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - Base.openURL("http://processing.org/"); + Base.openURL(Language.text("menu.help.visit.url")); } }); menu.add(item); diff --git a/app/src/processing/mode/java/JavaToolbar.java b/app/src/processing/mode/java/JavaToolbar.java index 182e95c2b..7cf02a68b 100644 --- a/app/src/processing/mode/java/JavaToolbar.java +++ b/app/src/processing/mode/java/JavaToolbar.java @@ -27,6 +27,7 @@ import javax.swing.JPopupMenu; import processing.app.Base; import processing.app.Editor; import processing.app.EditorToolbar; +import processing.app.Language; public class JavaToolbar extends EditorToolbar { @@ -67,13 +68,13 @@ public class JavaToolbar extends EditorToolbar { static public String getTitle(int index, boolean shift) { switch (index) { - case RUN: return !shift ? "Run" : "Present"; - case STOP: return "Stop"; - case NEW: return "New"; - case OPEN: return "Open"; - case SAVE: return "Save"; + case RUN: return !shift ? Language.text("toolbar.run") : Language.text("toolbar.present"); + case STOP: return Language.text("toolbar.stop"); + case NEW: return Language.text("toolbar.new"); + case OPEN: return Language.text("toolbar.open"); + case SAVE: return Language.text("toolbar.save"); // case EXPORT: return !shift ? "Export Application" : "Export Applet"; - case EXPORT: return "Export Application"; + case EXPORT: return Language.text("toolbar.export_application"); } return null; } diff --git a/build/shared/lib/language.txt b/build/shared/lib/language.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/build/shared/lib/language.txt @@ -0,0 +1 @@ +