diff --git a/CHANGELOG.md b/CHANGELOG.md index e93506a..6595fa2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.2.0 (2022-06-18) +### Added + - US / ANSI style gate symbols and option to switch in the menu, thanks to Sett17 + ## 2.1.0 (2022-01-25) ### Fixed - Bumped launch4j to version 2.1.0 diff --git a/pom.xml b/pom.xml index e2e115e..2c68f3c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ lc.kra.jds jds - 2.1.0 + 2.2.0 JDigitalSimulator http://kra.lc/projects/jdigitalsimulator/ diff --git a/src/main/java/lc/kra/jds/Simulation.java b/src/main/java/lc/kra/jds/Simulation.java index 2864517..dd72d23 100644 --- a/src/main/java/lc/kra/jds/Simulation.java +++ b/src/main/java/lc/kra/jds/Simulation.java @@ -743,6 +743,7 @@ private void paintComponents(Graphics graphics, Collection components wire.paint(graphics); } private List paintComponent(Graphics graphics, Component component) { + component.checkSymbolStandard(); Point location = component.getLocation(); Dimension size = component.getSize(); graphics.setColor(Color.BLACK); diff --git a/src/main/java/lc/kra/jds/Utilities.java b/src/main/java/lc/kra/jds/Utilities.java index 2ae2a64..952df00 100644 --- a/src/main/java/lc/kra/jds/Utilities.java +++ b/src/main/java/lc/kra/jds/Utilities.java @@ -17,6 +17,11 @@ */ package lc.kra.jds; +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.DESKeySpec; +import javax.swing.JFileChooser; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; @@ -45,12 +50,6 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.DESKeySpec; -import javax.swing.JFileChooser; - public final class Utilities { public static enum TranslationType { TEXT, ALTERNATIVE, TITLE, EXTERNAL, TOOLTIP, DESCRIPTION; } @@ -58,6 +57,7 @@ public static enum TranslationType { TEXT, ALTERNATIVE, TITLE, EXTERNAL, TOOLTIP CONFIGURATION_LOCALIZATION_LANGUAGE = "localization.language", CONFIGURATION_LOOK_AND_FEEL_CLASS = "lookandfeel.class", CONFIGURATION_LOOK_AND_FEEL_NAME = "lookandfeel.name", + CONFIGURATION_ANSI_SYMBOLS = "symbols.ansi", CONFIGURATION_WINDOW_SIZE = "window.size", CONFIGURATION_WINDOW_LOCATION = "window.location", CONFIGURATION_WINDOW_MAXIMIZED = "window.maximized"; @@ -66,9 +66,11 @@ public static enum TranslationType { TEXT, ALTERNATIVE, TITLE, EXTERNAL, TOOLTIP private static Locale currentLocale = Locale.getDefault(); private static ResourceBundle translationBundle; private static SimpleClassLoader simpleClassLoader; - + private static Properties configuration = new Properties(); + private static boolean useAnsiSymbols = false; + public static Object copy(Object object) throws CloneNotSupportedException { //deep clone using serilization Object copy = null; FastByteArrayOutputStream byteOutput = new FastByteArrayOutputStream(); @@ -135,6 +137,13 @@ public static String getTranslation(String key, TranslationType type, Object... else return MessageFormat.format(bundle.getString(key), variables); } + public static boolean useAnsiSymbols(){ + return useAnsiSymbols; + } + public static void setUseAnsiSymbols(boolean value){ + useAnsiSymbols = value; + } + public static URL getResource(String name) { if(!name.startsWith("/")) name = "/lc/kra/jds/"+name; @@ -420,7 +429,7 @@ private Class loadClass(byte[] bytes) { return cls; } } - + public static class AlternateClassLoaderObjectInputStream extends ObjectInputStream { protected final ClassLoader alternateClassLoader; public AlternateClassLoaderObjectInputStream(InputStream in, ClassLoader alternateClassLoader) throws IOException { @@ -445,7 +454,7 @@ public static String replaceLegacyPackage(String name) { return name.replaceFirst("^(\\[L)?"+Pattern.quote(LEGACY_PACKAGE_PREFIX), "$1"+Matcher.quoteReplacement(PACKAGE_PREFIX)); } } - + public static URL getLocalPath() { URL path = Utilities.class.getProtectionDomain().getCodeSource().getLocation(); try { return new URL(URLDecoder.decode(path.toString(), "UTF-8")); } @@ -487,4 +496,4 @@ private static File getLastDirectory() { setConfiguration("directory", selected.getParentFile().toString()); } } -} \ No newline at end of file +} diff --git a/src/main/java/lc/kra/jds/components/Component.java b/src/main/java/lc/kra/jds/components/Component.java index bec70d9..c335871 100644 --- a/src/main/java/lc/kra/jds/components/Component.java +++ b/src/main/java/lc/kra/jds/components/Component.java @@ -57,10 +57,20 @@ public abstract class Component implements Paintable, Locatable, Moveable, Clone private Point location; protected PropertyChangeSupport change; + protected Boolean useAnsiSymbols; public Component() { this.location = new Point(); } public Component(Point location) { this.setLocation(location); } + public final void checkSymbolStandard() { + Boolean currentUseAnsiSymbols = Boolean.valueOf(useAnsiSymbols()); + if (!currentUseAnsiSymbols.equals(useAnsiSymbols)) { + useAnsiSymbols = currentUseAnsiSymbols; + changeSymbolStandard(); + } + } + protected void changeSymbolStandard() {} + public abstract Dimension getSize(); @Override public void moveTo(Point location) { this.setLocation(location); } @Override public void moveRelative(Point location) { diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/AbstractGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/AbstractGate.java index 4d4fc29..d9b6896 100644 --- a/src/main/java/lc/kra/jds/components/buildin/gate/AbstractGate.java +++ b/src/main/java/lc/kra/jds/components/buildin/gate/AbstractGate.java @@ -17,12 +17,6 @@ */ package lc.kra.jds.components.buildin.gate; -import java.awt.Graphics; -import java.awt.Point; -import java.beans.PropertyVetoException; -import java.util.HashMap; -import java.util.Map; - import lc.kra.jds.Utilities; import lc.kra.jds.components.Configurable; import lc.kra.jds.components.Configurable.Option.OptionType; @@ -32,6 +26,12 @@ import lc.kra.jds.contacts.InputContact; import lc.kra.jds.contacts.OutputContact; +import java.awt.Graphics; +import java.awt.Point; +import java.beans.PropertyVetoException; +import java.util.HashMap; +import java.util.Map; + /** * Abstract-Gate (build-in component) * @author Kristian Kraljic (kris@kra.lc) @@ -50,13 +50,30 @@ public AbstractGate() { contacts = ContactUtilities.concatenateContacts(output, inputs.toArray()); } + @Override + protected void changeSymbolStandard() { + super.changeSymbolStandard(); + if (inputs != null) + inputs.setContactLocations(); + if (output != null) + output.setLocation(new Point(this.size.width, this.size.height / 2)); + } + @Override public void paint(Graphics graphics) { super.paint(graphics); Class cls = this.getClass(); if(cls.equals(NandGate.class)||cls.equals(NorGate.class)||cls.equals(XnorGate.class)) - ContactUtilities.paintSolderingJoint(graphics, 5, 3, output); + ContactUtilities.paintSolderingJoint(graphics, 5, 3, output); else ContactUtilities.paintSolderingJoint(graphics, 5, 10, output); - inputs.paintSolderingJoints(graphics, 5, 10); + if (useAnsiSymbols) { + if (cls.equals(OrGate.class)||cls.equals(NorGate.class)||cls.equals(XorGate.class)||cls.equals(XnorGate.class)) { + inputs.paintSolderingJoints(graphics, 9, 10); + } else { + inputs.paintSolderingJoints(graphics, 5, 10); + } + } else { + inputs.paintSolderingJoints(graphics, 5, 10); + } } @Override public Contact[] getContacts() { return contacts; } @@ -75,4 +92,4 @@ public AbstractGate() { configuration.put(getOptions()[0], inputs.getContactsCount()); return configuration; } -} \ No newline at end of file +} diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/AndGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/AndGate.java index 0d6aca8..7723c6c 100644 --- a/src/main/java/lc/kra/jds/components/buildin/gate/AndGate.java +++ b/src/main/java/lc/kra/jds/components/buildin/gate/AndGate.java @@ -37,7 +37,13 @@ public class AndGate extends AbstractGate { @Override public void paint(Graphics graphics) { super.paint(graphics); - paintLabel(graphics, "&"); + if(useAnsiSymbols){ + int transition = size.width - size.height / 2 - 11; + graphics.drawPolyline(new int[]{transition, 5, 5, transition}, new int[]{0, 0, size.height, size.height}, 4); + graphics.drawArc(transition - size.height / 2, 0, size.height, size.height, 90, -180); + } else { + paintLabel(graphics, "&"); + } } @Override public void calculate() { diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/Gate.java b/src/main/java/lc/kra/jds/components/buildin/gate/Gate.java index f97ec51..c289693 100644 --- a/src/main/java/lc/kra/jds/components/buildin/gate/Gate.java +++ b/src/main/java/lc/kra/jds/components/buildin/gate/Gate.java @@ -17,14 +17,14 @@ */ package lc.kra.jds.components.buildin.gate; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; - import lc.kra.jds.components.Component; import lc.kra.jds.components.Sociable; import lc.kra.jds.contacts.Contact; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; + /** * Gate (build-in component) * @author Kristian Kraljic (kris@kra.lc) @@ -32,18 +32,32 @@ public abstract class Gate extends Component implements Sociable { private static final long serialVersionUID = 2l; + private static final Dimension ISO_SIZE = new Dimension(50, 48), ANSI_SIZE = new Dimension(55, 35); + protected Dimension size; - public Gate() { size = new Dimension(50, 48); } + public Gate() { + checkSymbolStandard(); + } + + protected void changeSymbolStandard() { + if (useAnsiSymbols) { + size = ANSI_SIZE; + } else { + size = ISO_SIZE; + } + } @Override public void paint(Graphics graphics) { graphics.setColor(Color.BLACK); - graphics.drawRect(5, 0, size.width-15, size.height); + if (!useAnsiSymbols) { + graphics.drawRect(5, 0, size.width-15, size.height); + } } protected void paintLabel(Graphics graphics, String label) { graphics.drawString(label, 5+(size.width-15)/2-graphics.getFontMetrics().stringWidth(label)/2, 15); } protected void paintNot(Graphics graphics) { graphics.drawOval(size.width-10, size.height/2-3, 6, 6); } @Override public abstract Contact[] getContacts(); - @Override public final Dimension getSize() { return size; } + @Override public Dimension getSize() { return size; } @Override public abstract void calculate(); -} \ No newline at end of file +} diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/NotGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/NotGate.java index 26b87b6..0865220 100644 --- a/src/main/java/lc/kra/jds/components/buildin/gate/NotGate.java +++ b/src/main/java/lc/kra/jds/components/buildin/gate/NotGate.java @@ -17,17 +17,18 @@ */ package lc.kra.jds.components.buildin.gate; -import static lc.kra.jds.Utilities.*; - -import java.awt.Graphics; -import java.awt.Point; - import lc.kra.jds.Utilities.TranslationType; import lc.kra.jds.contacts.Contact; import lc.kra.jds.contacts.ContactUtilities; import lc.kra.jds.contacts.InputContact; import lc.kra.jds.contacts.OutputContact; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Point; + +import static lc.kra.jds.Utilities.getTranslation; + /** * NOT-Gate (build-in component) * @author Kristian Kraljic (kris@kra.lc) @@ -38,6 +39,7 @@ public class NotGate extends Gate { private static final String KEY; static { KEY = "component.gate."+NotGate.class.getSimpleName().toLowerCase(); } public static final ComponentAttributes componentAttributes = new ComponentAttributes(KEY, getTranslation(KEY), "group.gate", getTranslation(KEY, TranslationType.DESCRIPTION), "Kristian Kraljic (kris@kra.lc)", 1); + private static final Dimension ANSI_SIZE = new Dimension(45, 35); private InputContact input; private OutputContact output; @@ -50,15 +52,31 @@ public NotGate() { contacts = new Contact[]{input, output}; } + @Override + protected void changeSymbolStandard() { + super.changeSymbolStandard(); + if (useAnsiSymbols) + size = ANSI_SIZE; + if (input != null) + input.setLocation(new Point(0, this.size.height / 2)); + if (output != null) + output.setLocation(new Point(this.size.width, this.size.height / 2)); + } + @Override public void paint(Graphics graphics) { super.paint(graphics); ContactUtilities.paintSolderingJoints(graphics, contacts); - paintLabel(graphics, "1"); + if (useAnsiSymbols) { + graphics.drawPolyline(new int[]{5, size.width - 11, 5, 5}, new int[]{0, size.height / 2, size.height, 0}, 4); + } else { + paintLabel(graphics, "1"); + } paintNot(graphics); } @Override public Contact[] getContacts() { return contacts; } + @Override public Dimension getSize() { return size; } @Override public void calculate() { output.setCharged(!input.isCharged()); } -} \ No newline at end of file +} diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/OrGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/OrGate.java index 91cc46a..40115ae 100644 --- a/src/main/java/lc/kra/jds/components/buildin/gate/OrGate.java +++ b/src/main/java/lc/kra/jds/components/buildin/gate/OrGate.java @@ -37,7 +37,13 @@ public class OrGate extends AbstractGate { @Override public void paint(Graphics graphics) { super.paint(graphics); - paintLabel(graphics, "\u22651"); + if(useAnsiSymbols){ + graphics.drawArc(5 - (size.height / 3) / 2, 0, size.height / 3, size.height, 90, -180); + graphics.drawArc(5 - ((int) (size.width * 1.6)) / 2, 0, (int) (size.width * 1.6), (int) (size.height * 1.7), 90, -65); + graphics.drawArc(5 - ((int) (size.width * 1.6)) / 2, size.height - ((int) (size.height * 1.7)), (int) (size.width * 1.6), (int) (size.height * 1.7), -90, 65); + } else { + paintLabel(graphics, "\u22651"); + } } @Override public void calculate() { diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/XorGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/XorGate.java index 1caeff2..dea29d5 100644 --- a/src/main/java/lc/kra/jds/components/buildin/gate/XorGate.java +++ b/src/main/java/lc/kra/jds/components/buildin/gate/XorGate.java @@ -38,7 +38,14 @@ public class XorGate extends AbstractGate { @Override public void paint(Graphics graphics) { super.paint(graphics); - paintLabel(graphics, "=1"); + if (useAnsiSymbols) { + graphics.drawArc(5 - (size.height / 3) / 2, 0, size.height / 3, size.height, 90, -180); + graphics.drawArc(1 - (size.height / 3) / 2, 0, size.height / 3, size.height, 90, -180); + graphics.drawArc(5 - ((int) (size.width * 1.6)) / 2, 0, (int) (size.width * 1.6), (int) (size.height * 1.7), 90, -65); + graphics.drawArc(5 - ((int) (size.width * 1.6)) / 2, size.height - ((int) (size.height * 1.7)), (int) (size.width * 1.6), (int) (size.height * 1.7), -90, 65); + } else { + paintLabel(graphics, "=1"); + } } @Override public void calculate() { diff --git a/src/main/java/lc/kra/jds/contacts/ComponentContact.java b/src/main/java/lc/kra/jds/contacts/ComponentContact.java index 7a566f3..ed2fd13 100644 --- a/src/main/java/lc/kra/jds/contacts/ComponentContact.java +++ b/src/main/java/lc/kra/jds/contacts/ComponentContact.java @@ -21,6 +21,7 @@ import java.awt.Point; import lc.kra.jds.components.Component; +import lc.kra.jds.components.Wire; import lc.kra.jds.exceptions.LocationOutOfBoundsException; public abstract class ComponentContact extends Contact implements Cloneable { @@ -39,9 +40,14 @@ public ComponentContact(Component component, Point location) { @Override public Component getComponent() { return component; } @Override public Point getLocation() { return this.location; } @Override public void setLocation(Point location) throws LocationOutOfBoundsException { - this.location = location; - if(location.x+location.y!=0) - validateLocation(); //store location but throw a exception + if (!location.equals(this.location)) { + this.location = location; + if(location.x+location.y!=0) + validateLocation(); //store location but throw a exception + for(Wire wire:getWires()) { + wire.revalidate(); + } + } } @Override protected void validateLocation() throws LocationOutOfBoundsException { diff --git a/src/main/java/lc/kra/jds/gui/Application.java b/src/main/java/lc/kra/jds/gui/Application.java index 6a2ef01..6d8f46c 100644 --- a/src/main/java/lc/kra/jds/gui/Application.java +++ b/src/main/java/lc/kra/jds/gui/Application.java @@ -140,7 +140,7 @@ /** * JDigitalSimulator * @author Kristian Kraljic - * @version 2.1.0 + * @version 2.2.0 */ public class Application extends JFrame { private static final long serialVersionUID = -4693271310855486553L; @@ -148,7 +148,7 @@ public class Application extends JFrame { public static final String FILE_EXTENSION = "jdsim"; public static File pluginDirectory, currentDirectory; - private static final String VERSION = "2.1.0", COPYRIGHT = "2010-2022", LINES_OF_CODE = "9.509", WORDS_OF_CODE = "36.133", PAGES_OF_CODE = "245"; + private static final String VERSION = "2.2.0", COPYRIGHT = "2010-2022", LINES_OF_CODE = "9.509", WORDS_OF_CODE = "36.133", PAGES_OF_CODE = "245"; private static final String[] TOOLBAR_FRAME_FOCUS = new String[]{"save", "print", "print_level", "simulate", "left", "right", "up", "down", "grid", "secure", "zoom_default", "zoom", "zoom_in", "zoom_out"}, @@ -586,6 +586,16 @@ public void actionPerformed(ActionEvent event) { lookAndFeel.setSelectedItem(UIManager.getLookAndFeel().getName()); centerPane.add(lookAndFeelPane); + centerPane.add(javax.swing.Box.createVerticalStrut(20)); + + centerPane.add(Guitilities.createSeparator(getTranslation("properties.symbols"))); + javax.swing.JPanel symbolStandardPane = new javax.swing.JPanel(new java.awt.GridBagLayout()); + final javax.swing.JComboBox symbolStandard = Guitilities.addGridPairLine(symbolStandardPane, 0, new javax.swing.JLabel(getTranslation("properties.symbols.name")), new javax.swing.JComboBox()); + symbolStandard.addItem("IEC 60617-12 : 1997"); + symbolStandard.addItem("ANSI/IEEE Std 91/91a-1991"); + symbolStandard.setSelectedIndex(useAnsiSymbols() ? 1 : 0); + centerPane.add(symbolStandardPane); + JPanel bottomPane = Guitilities.createGradientFooter(); final ActionListener cancelListener = new ActionListener() { @Override public void actionPerformed(ActionEvent event) { dialog.dispose(); } @@ -607,6 +617,15 @@ public void actionPerformed(ActionEvent event) { SwingUtilities.updateComponentTreeUI(dialog); SwingUtilities.updateComponentTreeUI(Application.this); } + boolean useAnsiSymbols = symbolStandard.getSelectedIndex() == 1; + if (useAnsiSymbols != useAnsiSymbols()) { + setUseAnsiSymbols(useAnsiSymbols); + Utilities.setConfiguration(Utilities.CONFIGURATION_ANSI_SYMBOLS, Boolean.toString(useAnsiSymbols)); + for(ComponentButton button:componentButtons) + button.refreshIcon(); + } + revalidate(); + repaint(); } }; bottomPane.add(Guitilities.createButton(getTranslation("properties.okay"), new ActionListener() { @@ -1028,9 +1047,9 @@ protected class ComponentButton extends JButton { public ComponentButton(ComponentAttributes attributes, final Class cls) throws InstantiationException, IllegalAccessException { this.component = createComponent(cls); - setText(attributes.name); + setText((this.attributes = attributes).name); setToolTipText(attributes.description); - setIcon(icon=createComponentImage(component, attributes.description)); + refreshIcon(); setIconTextGap(10); setHorizontalTextPosition(JButton.TRAILING); setHorizontalAlignment(JButton.LEADING); @@ -1075,15 +1094,20 @@ public ComponentButton(ComponentAttributes attributes, final Class cls) throws InstantiationException, IllegalAccessException { return cls.newInstance(); } private ImageIcon createComponentImage(Component component, String tooltip) { + component.checkSymbolStandard(); Dimension size = component.getSize(); Image image = Guitilities.createTranslucentImage(size.width+1, size.height+1); Graphics2D graphics = (Graphics2D) image.getGraphics(); @@ -1319,6 +1343,7 @@ public static void main(String[] args) { for(Locale locale:Utilities.SUPPORTED_LOCALES) if(locale.getLanguage().equals(localizationLanguage)) Utilities.setCurrentLocale(locale); + setUseAnsiSymbols(Boolean.parseBoolean(lc.kra.jds.Utilities.getConfiguration(CONFIGURATION_ANSI_SYMBOLS))); Application application = new Application(); if(args.length!=0) try { application.openWorksheet(new File(args[0])); } diff --git a/src/main/resources/lc/kra/jds/TranslationBundle.properties b/src/main/resources/lc/kra/jds/TranslationBundle.properties index 5266062..fc11a88 100644 --- a/src/main/resources/lc/kra/jds/TranslationBundle.properties +++ b/src/main/resources/lc/kra/jds/TranslationBundle.properties @@ -302,6 +302,8 @@ properties.localization.language = Language: properties.localization.info = Note: You will have to restart the JDigitalSimulator in order to complete the change of the default display language completely. properties.lookandfeel = Look and feel properties.lookandfeel.name = Preferred design: +properties.symbols = Symbols +properties.symbols.name = Preferred standard: properties.okay = Okay properties.cancel = Cancel properties.apply = Apply diff --git a/src/main/resources/lc/kra/jds/TranslationBundle_de.properties b/src/main/resources/lc/kra/jds/TranslationBundle_de.properties index f651ef4..a670050 100644 --- a/src/main/resources/lc/kra/jds/TranslationBundle_de.properties +++ b/src/main/resources/lc/kra/jds/TranslationBundle_de.properties @@ -1,6 +1,6 @@ # This is the German TranslationBundle_de.properties file translation.author = Kristian Kraljic -translation.title = - Übersetzt durch Kristian Kraljic +translation.title = - Ãœbersetzt durch Kristian Kraljic translation.version = 1.0 menubar.file = Datei @@ -12,7 +12,7 @@ menubar.help = Hilfe toolbar = Werkzeugleiste toolbar.new = Neu -toolbar.open = Öffnen +toolbar.open = Öffnen toolbar.save = Speichern toolbar.exit = Beenden toolbar.print = Drucken @@ -56,20 +56,20 @@ toolbar.fullscreen.tooltip = In Vollbildansicht wechseln toolbar.properties.tooltip = Eigenschaften anzeigen menu.file.new = Neu -menu.file.open = Öffnen +menu.file.open = Öffnen menu.file.close = Schliessen menu.file.save = Speichern menu.file.save_as = Speichern unter menu.file.print = Drucken menu.file.print_level = Pegelschreiber drucken menu.file.exit = Beenden -menu.edit.undo = Rückgängig +menu.edit.undo = Rückgängig menu.edit.redo = Wiederherstellen menu.edit.cut = Ausschneiden menu.edit.copy = Kopieren -menu.edit.paste = Einfügen -menu.edit.delete = Löschen -menu.edit.select_all = Alles Auswählen +menu.edit.paste = Einfügen +menu.edit.delete = Löschen +menu.edit.select_all = Alles Auswählen menu.edit.front = Nach Vorne menu.edit.back = Nach Hinten menu.properties.worksheet = Arbeitsblatt Einstellungen @@ -79,10 +79,10 @@ menu.display.zoom_in = Hinein Zoomen menu.display.zoom_out = Heraus Zoomen menu.display.fullscreen = Vollbild menu.window.cascade = Kacheln -menu.window.tile = Übereinander -menu.help.about = Über -menu.oscilloscope.direction = Richtung ändern -menu.oscilloscope.clear = Rücksetzen +menu.window.tile = Ãœbereinander +menu.help.about = Ãœber +menu.oscilloscope.direction = Richtung ändern +menu.oscilloscope.clear = Rücksetzen menu.oscilloscope.save = Als Bild speichern menu.file.new.tooltip = Eine neue Datei erstellen @@ -95,8 +95,8 @@ menu.file.print_level.tooltip = Pegelschreiber drucken menu.file.exit.tooltip = Programm beenden menu.edit.cut.tooltip = Schneidet die selektierten Komponenten aus menu.edit.copy.tooltip = Kopiert die selektierten Komponenten -menu.edit.paste.tooltip = Fügt alle Komponenten aus der Zwischenablage ein -menu.edit.delete.tooltip = Löscht alle selektierten Komponenten +menu.edit.paste.tooltip = Fügt alle Komponenten aus der Zwischenablage ein +menu.edit.delete.tooltip = Löscht alle selektierten Komponenten menu.edit.select_all.tooltip = Seketiert alle Komponenten menu.edit.front.tooltip = In den Vordergrund bringen menu.edit.back.tooltip = In den Hintergrund schieben @@ -108,23 +108,23 @@ menu.display.zoom_out.tooltip = Raus Zoomen menu.display.fullscreen.tooltip = In Vollbildansicht wechseln menu.window.cascade.tooltip = Kachelt die Fenster im Arbeitsbereich menu.window.tile.tooltip = Ordnet die Fenster im Arbeitsbereich nebeneinander an -menu.help.about.tooltip = Zeigt informationen über das Programm und den Author an -menu.oscilloscope.clear.tooltip = Setzt die aktuellen Werte des Pegelschreibers zurück +menu.help.about.tooltip = Zeigt informationen über das Programm und den Author an +menu.oscilloscope.clear.tooltip = Setzt die aktuellen Werte des Pegelschreibers zurück menu.component.properties = Eigenschaften -menu.component.delete = Löschen -menu.component.open.simulation = Simulation Öffnen -menu.wire.add.junction = Knotenpunkt hinzufügen -menu.wire.add.voltmeter = Spannungsmessgerät hinzufügen +menu.component.delete = Löschen +menu.component.open.simulation = Simulation Öffnen +menu.wire.add.junction = Knotenpunkt hinzufügen +menu.wire.add.voltmeter = Spannungsmessgerät hinzufügen -menu.display.fullscreen.not_supported = Eine Vollbildschirmdarstellung ist nicht möglich. +menu.display.fullscreen.not_supported = Eine Vollbildschirmdarstellung ist nicht möglich. oscilloscope.save.error = Der Pegelschreiber konnte nicht in eine Datei gespeichert werden. components.title = Komponenten components.load.error = Einige der eingebauten Komponenten konnten nicht korrekt geladen werden.\nBitte versuchen sie es erneut oder kontaktieren sie den Entwickler um einen Fehler zu melden. components.load.error.title = Fehler beim laden einiger eingebauten Komponenten -components.load.plugin.error = Einige der zusätzlichen Komponenten konnte nicht korrekt geladen werden.\nBitte prüfen sie Ihr Plugin-Verzeichniss und versuchen sie es erneut. -components.load.plugin.error.title = Fehler beim laden einiger zusätzlichen Komponenten +components.load.plugin.error = Einige der zusätzlichen Komponenten konnte nicht korrekt geladen werden.\nBitte prüfen sie Ihr Plugin-Verzeichniss und versuchen sie es erneut. +components.load.plugin.error.title = Fehler beim laden einiger zusätzlichen Komponenten component.configuration = {0} component.configuration.title = Komponenten Einstellungen @@ -136,28 +136,28 @@ component.configuration.error.number = Mindestens ein Eingabefeld erlaubt nur di component.connector.name = Name component.connector.name.default = Stecker -component.connector.name.error = Bitte geben sie einen Namen für diesen Stecker an. +component.connector.name.error = Bitte geben sie einen Namen für diesen Stecker an. component.simulation.file = Datei component.simulation.file.unknown = Unbekannte Datei -component.simulation.file.choose = Datei auswählen +component.simulation.file.choose = Datei auswählen component.voltmeter.name = Name: component.voltmeter.name.default = V-{0} -component.voltmeter.name.error = The Spannungsmessgerät braucht einen Namen. +component.voltmeter.name.error = The Spannungsmessgerät braucht einen Namen. component.text.default = Text component.text.text = Text: -component.text.size = Größe: +component.text.size = Größe: component.text.text.error = Bitte geben sie eien Text an. -component.text.size.minimum = Die Mindestgröße für Schrift ist {0}. -component.text.size.maximum = Die Maximalgröße für Schrift ist {0}. +component.text.size.minimum = Die Mindestgröße für Schrift ist {0}. +component.text.size.maximum = Die Maximalgröße für Schrift ist {0}. component.clock.low = Low-Pegel (Hunderstelsekunde) component.clock.high = High-Pegel (Hunderstelsekunde) component.clock.minimum = Die kleinste Tacktzeit ist eine Hunderstelsekunde. -component.switch.position = Standardmäßig auf An +component.switch.position = Standardmäßig auf An component.flipflop.tigger = Taktart component.flipflop.masterslave = Master/Slave @@ -172,8 +172,8 @@ component.alu.halfadder = Halb-Addierer component.alu.alu74181 = ALU 74181 component.converter.bytetodecimalconverter = Byte nach Dezimal Konverter component.converter.bytetosevensegmentconverter = Byte nach Siebensegment Konverter -component.counter.binarycounter = Binär Zähler -component.counter.loadablebinarycounter = Ladbarer Binär Zähler +component.counter.binarycounter = Binär Zähler +component.counter.loadablebinarycounter = Ladbarer Binär Zähler component.display.binarydisplay = Anzeige component.display.displayarray = Anzeigen component.display.sevensegmentdisplay = Sieben-Segment Anzeige @@ -194,13 +194,13 @@ component.gate.notgate = NOT-Gatter component.gate.orgate = OR-Gatter component.gate.xnorgate = XNOR-Gatter component.gate.xorgate = XOR-Gatter -component.general.junction = Verbindungsstück +component.general.junction = Verbindungsstück component.general.text = Text -component.register.loadableregister = Ladbares Binäres Register +component.register.loadableregister = Ladbares Binäres Register component.register.loadableshiftregister = Ladbares Schiebe-Register component.register.shiftregister = Schiebe-Register component.memory.bitmemory = n-Bit Speicher -component.memory.guardedbitmemory = Geschützter n-Bit Speicher +component.memory.guardedbitmemory = Geschützter n-Bit Speicher component.memory.randomaccessmemory = Random-Access Memory (RAM) component.switches.clock = Takt component.switches.gnd = Gnd @@ -214,8 +214,8 @@ component.alu.halfadder.description = Halb-Addierer component.alu.alu74181.description = ALU 74181 component.converter.bytetodecimalconverter.description = Byte nach Dezimal Konverter component.converter.bytetosevensegmentconverter.description = Byte nach Siebensegment Konverter -component.counter.binarycounter.description = Binär Zähler -component.counter.loadablebinarycounter.description = Ladbarer Binär Zähler +component.counter.binarycounter.description = Binär Zähler +component.counter.loadablebinarycounter.description = Ladbarer Binär Zähler component.display.binarydisplay.description = Anzeige component.display.displayarray.description = Anzeigen component.display.sevensegmentdisplay.description = Sieben-Segment Anzeige @@ -236,13 +236,13 @@ component.gate.notgate.description = NOT-Gatter component.gate.orgate.description = OR-Gatter component.gate.xnorgate.description = XNOR-Gatter component.gate.xorgate.description = XOR-Gatter -component.general.junction.description = Verbindungsstück +component.general.junction.description = Verbindungsstück component.general.text.description = Text -component.register.loadableregister.description = Ladbares Binäres Register +component.register.loadableregister.description = Ladbares Binäres Register component.register.loadableshiftregister.description = Ladbares Schiebe-Register component.register.shiftregister.description = Schiebe-Register component.memory.bitmemory.description = n-Bit Speicher -component.memory.guardedbitmemory.description = Geschützter n-Bit Speicher +component.memory.guardedbitmemory.description = Geschützter n-Bit Speicher component.memory.randomaccessmemory.description = Random-Access Memory (RAM) component.switches.clock.description = Takt component.switches.gnd.description = Erde @@ -251,22 +251,22 @@ component.switches.switch.description = Schalter component.switches.vcc.description = Positive Versorgungsspannung component.memory.address.count = Adressbits -component.memory.address.count.minimum = Es müssen mindestens {0} Addressbits gewählt werden. -component.memory.address.count.maximum = Es sind höchstens {0} Adressbits zugelassen -component.memory.word.size = Wortgröße -component.memory.word.size.mimimum = Die Wortgröße muss mindestens {0} Bit betragen. -component.memory.word.size.maximum = Es ist höchstens eine Wortgröße von {0} Bit zugelassen. -component.memory.size.overflow = Die Speichergröße ist auf {0} Bit limitiert, aktuelle Größe {1} Bit. +component.memory.address.count.minimum = Es müssen mindestens {0} Addressbits gewählt werden. +component.memory.address.count.maximum = Es sind höchstens {0} Adressbits zugelassen +component.memory.word.size = Wortgröße +component.memory.word.size.mimimum = Die Wortgröße muss mindestens {0} Bit betragen. +component.memory.word.size.maximum = Es ist höchstens eine Wortgröße von {0} Bit zugelassen. +component.memory.size.overflow = Die Speichergröße ist auf {0} Bit limitiert, aktuelle Größe {1} Bit. contact.count = Anzahl Kontakte -contact.minimum = Es müssen mindestens {0} Kontakte sein. -contact.maximum = Es sind höchstens {0} Kontakte zugelassen. +contact.minimum = Es müssen mindestens {0} Kontakte sein. +contact.maximum = Es sind höchstens {0} Kontakte zugelassen. contact.input.count = Anzahl Eingangskontakte -contact.input.minimum = Es müssen mindestens {0} Eingangskontakte sein. -contact.input.maximum = Es sind höchstens {0} Eingangskontakte zugelassen. +contact.input.minimum = Es müssen mindestens {0} Eingangskontakte sein. +contact.input.maximum = Es sind höchstens {0} Eingangskontakte zugelassen. contact.output.count = Anzahl Ausgangskontakte -contact.output.minimum = Es müssen mindestens {0} Ausgangskontakte sein. -contact.output.maximum = Es sind höchstens {0} Ausgangskontakte zugelassen. +contact.output.minimum = Es müssen mindestens {0} Ausgangskontakte sein. +contact.output.maximum = Es sind höchstens {0} Ausgangskontakte zugelassen. group.images = Bilder anzeigen group.expand = Klicken um diese Gruppe zusammenzuklappen oder zu erweitern @@ -279,10 +279,10 @@ group.register = Register group.register = Speicher group.selector = Selektoren group.alu = ALU -group.counter = Zähler +group.counter = Zähler group.converter = Konverter group.interface = Interface -group.additional = Zusätzliche +group.additional = Zusätzliche group.others = Weitere group.external = Extern @@ -299,45 +299,47 @@ properties.circuit.description = Beschreibung: properties.circuit.version = Version: properties.localization = Spracheinstellungen properties.localization.language = Sprache: -properties.localization.info = Hinweis: Sie müssen den JDigitalSimulator neustarten damit die Sprachänderungen vollständig wirksam werden. +properties.localization.info = Hinweis: Sie müssen den JDigitalSimulator neustarten damit die Sprachänderungen vollständig wirksam werden. properties.lookandfeel = Erscheinungsbild properties.lookandfeel.name = Bevorzugtes Aussehen: +properties.symbols = Symbole +properties.symbols.name = Bevorzugter Standard: properties.okay = Okay properties.cancel = Abbrechen -properties.apply = Übernehmen +properties.apply = Ãœbernehmen properties.secure = Datei Sichern persist.filter.description = Simulation (*.jdsim) -persist.changes = Wollen sie die Änderungen an ''{0}'' speichern? -persist.changes.title = Änderungen speichern? -persist.overwrite = {0} ist bereits vorhanden.\nMöchten Sie sie ersetzen? -persist.overwrite.title = Überschreiben bestätigen -persist.error.save = Beim Sichern des Arbeitsblattes trat ein Fehler auf.\nDas Arbeitsblatt konnte nicht gespeichert werden.\n\nBitte überprüfen sie das Speichermedium und versuchen sie es erneut. +persist.changes = Wollen sie die Änderungen an ''{0}'' speichern? +persist.changes.title = Änderungen speichern? +persist.overwrite = {0} ist bereits vorhanden.\nMöchten Sie sie ersetzen? +persist.overwrite.title = Ãœberschreiben bestätigen +persist.error.save = Beim Sichern des Arbeitsblattes trat ein Fehler auf.\nDas Arbeitsblatt konnte nicht gespeichert werden.\n\nBitte überprüfen sie das Speichermedium und versuchen sie es erneut. persist.error.save.title = Fehler beim speichern der Datei. -persist.error.load = Beim Laden des Arbeitsblattes kam es zu einem Fehler.\nDas Arbeitsblatt konnte nicht geladen werden.\n\nBitte überprüfen sie ob die Datei fehlerfrei vorliegt und versuchen sie es erneut. +persist.error.load = Beim Laden des Arbeitsblattes kam es zu einem Fehler.\nDas Arbeitsblatt konnte nicht geladen werden.\n\nBitte überprüfen sie ob die Datei fehlerfrei vorliegt und versuchen sie es erneut. persist.error.load.title = Fehler beim laden der Datei. -password.enter = Diese Arbeitsmappe scheint mit einem Passwort geschützt zu sein.\n\nBitte geben sie das Kennwort für dieses Arbeitsblatt ein: -password.enter.old = Bitte geben sie das alte Kennwort für dieses Arbeitsblatt ein: -password.enter.new = Bitte geben sie das neue Kennwort für dieses Arbeitsblatt ein:\n(Oder brechen sie ab um das Kennwort zu entfernen) +password.enter = Diese Arbeitsmappe scheint mit einem Passwort geschützt zu sein.\n\nBitte geben sie das Kennwort für dieses Arbeitsblatt ein: +password.enter.old = Bitte geben sie das alte Kennwort für dieses Arbeitsblatt ein: +password.enter.new = Bitte geben sie das neue Kennwort für dieses Arbeitsblatt ein:\n(Oder brechen sie ab um das Kennwort zu entfernen) password.enter.title = Bitte geben sie ein Kennwort ein. password.wrong = Anscheinend haben sie das falsche Passwort angegeben. Bitte versuchen sie es erneut. -password.wrong_file = Es war nicht möglich das Arbeitsblatt Fehlerfrei zu lesen.\nVielleicht haben sie das falsche Passwort eingegeben oder die Datei liegt in einem nicht kompatiblen Format vor.\n\nBitte versuchen sie es erneut (Hinweis: Bei der Passworteingabe auf Groß-/Kleinschreibung achten). +password.wrong_file = Es war nicht möglich das Arbeitsblatt Fehlerfrei zu lesen.\nVielleicht haben sie das falsche Passwort eingegeben oder die Datei liegt in einem nicht kompatiblen Format vor.\n\nBitte versuchen sie es erneut (Hinweis: Bei der Passworteingabe auf Groß-/Kleinschreibung achten). password.wrong.title = Falsches Passswort eingegeben. -password.changed = Das Passwort wurde erfogreich geändert. +password.changed = Das Passwort wurde erfogreich geändert. password.removed = Das Passwort wurde erfogreich entfernt. password.error.title = Fehler bei der Passworteingabe -password.error.missing = Es war leider nicht möglich das Arbeitsblatt ohne Kennwort zu laden.\n\nBitte versuchen sie es unter angabe eines Passworts erneut. +password.error.missing = Es war leider nicht möglich das Arbeitsblatt ohne Kennwort zu laden.\n\nBitte versuchen sie es unter angabe eines Passworts erneut. password.error.security = Es kam zu einem Problem die Sicherheitseinstellungen zu initialisieren. Bitte versuchen sie es erneut. clipboard.copy.error = Die Selektion konnte nicht in die Zwischenablage kopiert werden. -clipboard.copy.error.title = Kopieren in die Zwischenablage nicht möglich. +clipboard.copy.error.title = Kopieren in die Zwischenablage nicht möglich. clipboard.cut.error = Die Selektion konnte nicht in die Zwischenablage verschoben werden. clipboard.cut.error.title = Die Selektion konnte nicht in die Zwischenablage verschoben werden. -clipboard.paste.error = Die Seketion in der Zwischenablage konnte nicht eingefügt werden. -clipboard.paste.error.title = Einfügen von der Zwischenablage nicht möglich. +clipboard.paste.error = Die Seketion in der Zwischenablage konnte nicht eingefügt werden. +clipboard.paste.error.title = Einfügen von der Zwischenablage nicht möglich. -about.title = Über - JDigitalSimulator +about.title = Ãœber - JDigitalSimulator about.donate = Spenden about.close = Schliessen