diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index b674d3caa..78ffce980 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -1177,8 +1177,6 @@ main.menu.analyze.optimization = Rocket optimization main.menu.analyze.optimization.desc = General rocket design optimization main.menu.analyze.customExpressions = Custom expressions main.menu.analyze.customExpressions.desc = Define new flight data types by writing custom mathematical expressions -main.menu.analyze.photo = 3D Rendering -main.menu.analyze.photo.desc = Create realistic 3D images of the rocket main.menu.help = Help main.menu.help.desc = Information about OpenRocket @@ -1894,3 +1892,56 @@ SeparationSelectionDialog.opt.override = Override for the {0} flight configurati MotorConfigurationPanel.description = Select the motors and motor ignition events of the selected flight configuration.
Motor mounts: Select which components function as motor mounts.
Motor configurations: Select the motor and ignition event for each motor mount. MotorDescriptionSubstitutor.description = Motors in the configuration + + +!Photo Panel +PhotoFrame.title = Photo Studio +PhotoFrame.desc = Create realistic 3D images of the rocket +PhotoFrame.menu.file.save = Save Image... +PhotoFrame.fileFilter.png = PNG Image +PhotoFrame.menu.edit.copy = Copy Image +PhotoFrame.menu.edit.copy.desc = Copy image to clipboard +PhotoFrame.menu.edit.settings = Photo Settings +PhotoFrame.menu.window = Window +PhotoFrame.menu.window.size = Size +PhotoFrame.menu.window.size.portrait = {0} Portrait + +!Photo Settings +PhotoSettingsConfig.title = Settings +PhotoSettingsConfig.colorChooser.title = Color Chooser + +PhotoSettingsConfig.tab.orientation = Orientation +PhotoSettingsConfig.lbl.rocket = Rocket +PhotoSettingsConfig.lbl.pitch = Pitch +PhotoSettingsConfig.lbl.yaw = Yaw +PhotoSettingsConfig.lbl.roll = Roll +PhotoSettingsConfig.lbl.advance = Advance +PhotoSettingsConfig.lbl.camera = Camera +PhotoSettingsConfig.lbl.vAz = View Azimuth +PhotoSettingsConfig.lbl.vAlt = View Altitude +PhotoSettingsConfig.lbl.vDist = View Distance +PhotoSettingsConfig.lbl.fov = FoV + +PhotoSettingsConfig.tab.environment = Environment +PhotoSettingsConfig.lbl.light = Light +PhotoSettingsConfig.lbl.sun = Sun Light +PhotoSettingsConfig.lbl.amb = Ambiance +PhotoSettingsConfig.lbl.lightAz = Light Azimuth +PhotoSettingsConfig.lbl.lightAlt = Light Altitude +PhotoSettingsConfig.lbl.sky = Sky +PhotoSettingsConfig.lbl.skyColor = Sky Color +PhotoSettingsConfig.lbl.skyImage = Sky Image +PhotoSettingsConfig.lbl.skyCredit = Image Credit: + +PhotoSettingsConfig.tab.effects = Effects +PhotoSettingsConfig.lbl.smokeFlame = Smoke & Flame +PhotoSettingsConfig.lbl.smoke = Smoke +PhotoSettingsConfig.lbl.smokeOpacity = Smoke Opacity +PhotoSettingsConfig.lbl.flame = Flame +PhotoSettingsConfig.lbl.flameAspect = Flame Aspect Ratio +PhotoSettingsConfig.lbl.sparks = Sparks +PhotoSettingsConfig.lbl.sparkConcentration = Spark Concentration +PhotoSettingsConfig.lbl.sparkWeight = Spark Weight +PhotoSettingsConfig.lbl.exhaustScale = Exhaust Scale +PhotoSettingsConfig.lbl.effects = Effects +PhotoSettingsConfig.lbl.speed = Speed diff --git a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java index 1ddc41cc2..e6bba6cda 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java @@ -61,7 +61,7 @@ public class PhotoFrame extends JFrame { public PhotoFrame(OpenRocketDocument document, Window parent) { this(false); - setTitle("Photo - " + document.getRocket().getName()); + setTitle(trans.get("PhotoFrame.title") + " - " + document.getRocket().getName()); photoPanel.setDoc(document); } @@ -77,7 +77,7 @@ public class PhotoFrame extends JFrame { GUIUtil.rememberWindowPosition(this); GUIUtil.setWindowIcons(this); - settings = new JDialog(this, "Settings") { + settings = new JDialog(this, trans.get("PhotoSettingsConfig.title")) { { setContentPane(new PhotoSettingsConfig(photoPanel.getSettings())); pack(); @@ -142,11 +142,10 @@ public class PhotoFrame extends JFrame { menu.add(item); } - item = new JMenuItem("Save Image...", KeyEvent.VK_S); // TODO Trans + item = new JMenuItem(trans.get("PhotoFrame.menu.file.save"), KeyEvent.VK_S); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, SHORTCUT_KEY)); // // Open a rocket design - item.getAccessibleContext().setAccessibleDescription("Save Image"); // TODO - // Trans + item.getAccessibleContext().setAccessibleDescription(trans.get("PhotoFrame.menu.file.save")); item.setIcon(Icons.FILE_OPEN); item.addActionListener(new ActionListener() { @Override @@ -160,8 +159,8 @@ public class PhotoFrame extends JFrame { public void run() { log.info("Got image {} to save...", image); - final FileFilter png = new SimpleFileFilter("PNG Image", ".png"); // TODO - // Trans + final FileFilter png = new SimpleFileFilter(trans.get("PhotoFrame.fileFilter.png"), + ".png"); final JFileChooser chooser = new JFileChooser(); @@ -210,7 +209,7 @@ public class PhotoFrame extends JFrame { menu.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.menu.Rocketedt")); menubar.add(menu); - Action action = new AbstractAction("Copy") { + Action action = new AbstractAction(trans.get("PhotoFrame.menu.edit.copy")) { @Override public void actionPerformed(ActionEvent e) { photoPanel.addImageCallback(new PhotoPanel.ImageCallback() { @@ -253,10 +252,10 @@ public class PhotoFrame extends JFrame { item = new JMenuItem(action); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, SHORTCUT_KEY)); item.setMnemonic(KeyEvent.VK_C); - item.getAccessibleContext().setAccessibleDescription("Copy image to clipboard"); + item.getAccessibleContext().setAccessibleDescription(trans.get("PhotoFrame.menu.edit.copy.desc")); menu.add(item); - menu.add(new JMenuItem(new AbstractAction("Photo Settings") { + menu.add(new JMenuItem(new AbstractAction(trans.get("PhotoSettingsConfig.title")) { @Override public void actionPerformed(ActionEvent e) { settings.setVisible(true); @@ -264,9 +263,9 @@ public class PhotoFrame extends JFrame { })); // Window - menu = new JMenu("Window"); + menu = new JMenu(trans.get("PhotoFrame.menu.window")); menubar.add(menu); - JMenu sizeMenu = new JMenu("Size"); + JMenu sizeMenu = new JMenu(trans.get("PhotoFrame.menu.window.size")); menu.add(sizeMenu); sizeMenu.add(new JMenuItem(new SizeAction(320, 240, "QVGA"))); @@ -275,9 +274,10 @@ public class PhotoFrame extends JFrame { sizeMenu.addSeparator(); - sizeMenu.add(new JMenuItem(new SizeAction(240, 320, "QVGA Portrait"))); - sizeMenu.add(new JMenuItem(new SizeAction(480, 640, "VGA Portrait"))); - sizeMenu.add(new JMenuItem(new SizeAction(768, 1024, "XGA Portrait"))); + final String s = trans.get("PhotoFrame.menu.window.size.portrait"); + sizeMenu.add(new JMenuItem(new SizeAction(240, 320, s.replace("{0}", "QVGA")))); + sizeMenu.add(new JMenuItem(new SizeAction(480, 640, s.replace("{0}", "VGA")))); + sizeMenu.add(new JMenuItem(new SizeAction(768, 1024, s.replace("{0}", "XGA")))); sizeMenu.addSeparator(); diff --git a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoSettingsConfig.java b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoSettingsConfig.java index 736a528fc..91cff9807 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoSettingsConfig.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoSettingsConfig.java @@ -37,23 +37,26 @@ import net.sf.openrocket.gui.figure3d.photo.sky.builtin.Mountains; import net.sf.openrocket.gui.figure3d.photo.sky.builtin.Orbit; import net.sf.openrocket.gui.figure3d.photo.sky.builtin.Storm; import net.sf.openrocket.gui.util.ColorConversion; +import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.StateChangeListener; @SuppressWarnings("serial") public class PhotoSettingsConfig extends JTabbedPane { + private final Translator trans = Application.getTranslator(); + private static final JColorChooser colorChooser = new JColorChooser(); - + private class ColorActionListener implements ActionListener { private final String valueName; private final Object o; - + ColorActionListener(final Object o, final String valueName) { this.valueName = valueName; this.o = o; } - + @Override public void actionPerformed(ActionEvent colorClickEvent) { try { @@ -63,7 +66,7 @@ public class PhotoSettingsConfig extends JTabbedPane { Color awtColor = ColorConversion.toAwtColor(c); colorChooser.setColor(awtColor); JDialog d = JColorChooser.createDialog(PhotoSettingsConfig.this, - "Color Chooser", true, colorChooser, new ActionListener() { + trans.get("PhotoSettingsConfig.colorChooser.title"), true, colorChooser, new ActionListener() { @Override public void actionPerformed(ActionEvent okEvent) { Color selected = colorChooser.getColor(); @@ -82,29 +85,29 @@ public class PhotoSettingsConfig extends JTabbedPane { } } } - + public PhotoSettingsConfig(final PhotoSettings p) { super(); - + setPreferredSize(new Dimension(240, 320)); - + final JButton sunLightColorButton = new JButton(); sunLightColorButton.setMaximumSize(new Dimension(35, 25)); - + final JButton skyColorButton = new JButton(); skyColorButton.setMaximumSize(new Dimension(35, 25)); - + final JButton smokeColorButton = new JButton(); smokeColorButton.setMaximumSize(new Dimension(35, 25)); - + final JButton flameColorButton = new JButton(); flameColorButton.setMaximumSize(new Dimension(35, 25)); - + p.addChangeListener(new StateChangeListener() { { stateChanged(null); } - + @Override public void stateChanged(EventObject e) { sunLightColorButton.setIcon(new ColorIcon(p.getSunlight())); @@ -117,97 +120,88 @@ public class PhotoSettingsConfig extends JTabbedPane { skyColorButton.addActionListener(new ColorActionListener(p, "SkyColor")); smokeColorButton.addActionListener(new ColorActionListener(p, "SmokeColor")); flameColorButton.addActionListener(new ColorActionListener(p, "FlameColor")); - - - - addTab("Orientation", new JPanel(new MigLayout("fill")) { + + addTab(trans.get("PhotoSettingsConfig.tab.orientation"), new JPanel(new MigLayout("fill")) { { - add(new StyledLabel("Rocket", Style.BOLD)); + add(new StyledLabel(trans.get("PhotoSettingsConfig.lbl.rocket"), Style.BOLD)); add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx"); - - add(new JLabel("Pitch")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.pitch"))); DoubleModel pitchModel = new DoubleModel(p, "Pitch", UnitGroup.UNITS_ANGLE); add(new JSpinner(pitchModel.getSpinnerModel()), "w 40"); add(new UnitSelector(pitchModel), "wrap"); - - add(new JLabel("Yaw")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.yaw"))); DoubleModel yawModel = new DoubleModel(p, "Yaw", UnitGroup.UNITS_ANGLE); add(new JSpinner(yawModel.getSpinnerModel()), "w 40"); add(new UnitSelector(yawModel), "wrap"); - - add(new JLabel("Roll")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.roll"))); DoubleModel rollModel = new DoubleModel(p, "Roll", UnitGroup.UNITS_ANGLE); add(new JSpinner(rollModel.getSpinnerModel()), "w 40"); add(new UnitSelector(rollModel), "wrap"); - - add(new JLabel("Advance")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.advance"))); DoubleModel advanceModel = new DoubleModel(p, "Advance", UnitGroup.UNITS_LENGTH); add(new JSpinner(advanceModel.getSpinnerModel()), "w 40"); add(new UnitSelector(advanceModel), "wrap"); - - add(new StyledLabel("Camera", Style.BOLD)); + + add(new StyledLabel(trans.get("PhotoSettingsConfig.lbl.camera"), Style.BOLD)); add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx"); - - add(new JLabel("View Azimuth")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.vAz"))); DoubleModel viewAzModel = new DoubleModel(p, "ViewAz", UnitGroup.UNITS_ANGLE); add(new JSpinner(viewAzModel.getSpinnerModel()), "w 40"); add(new UnitSelector(viewAzModel), "wrap"); - - add(new JLabel("View Altitude")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.vAlt"))); DoubleModel viewAltModle = new DoubleModel(p, "ViewAlt", UnitGroup.UNITS_ANGLE); add(new JSpinner(viewAltModle.getSpinnerModel()), "w 40"); add(new UnitSelector(viewAltModle), "wrap"); - - add(new JLabel("View Distance")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.vDist"))); DoubleModel viewDistanceModel = new DoubleModel(p, "ViewDistance", UnitGroup.UNITS_LENGTH); add(new JSpinner(viewDistanceModel.getSpinnerModel()), "w 40"); add(new UnitSelector(viewDistanceModel), "wrap"); - - add(new JLabel("FoV")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.fov"))); DoubleModel fovModel = new DoubleModel(p, "Fov", UnitGroup.UNITS_ANGLE); add(new JSpinner(fovModel.getSpinnerModel()), "w 40"); add(new UnitSelector(fovModel), "wrap"); } }); - - addTab("Environment", new JPanel(new MigLayout("fill")) { + + addTab(trans.get("PhotoSettingsConfig.tab.environment"), new JPanel(new MigLayout("fill")) { { - add(new StyledLabel("Light", Style.BOLD)); + add(new StyledLabel(trans.get("PhotoSettingsConfig.lbl.light"), Style.BOLD)); add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx"); - - add(new JLabel("Sun Light")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.sun"))); add(sunLightColorButton, "wrap"); - - add(new JLabel("Ambiance")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.amb"))); DoubleModel ambianceModel = new DoubleModel(p, "Ambiance", 100, UnitGroup.UNITS_NONE, 0, 100); add(new JSpinner(ambianceModel.getSpinnerModel()), "wrap"); - - add(new JLabel("Light Azimuth")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.lightAz"))); DoubleModel lightAzModel = new DoubleModel(p, "LightAz", UnitGroup.UNITS_ANGLE); add(new JSpinner(lightAzModel.getSpinnerModel()), "w 40"); add(new UnitSelector(lightAzModel), "wrap"); - - add(new JLabel("Light Altitude")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.lightAlt"))); DoubleModel lightAltModle = new DoubleModel(p, "LightAlt", UnitGroup.UNITS_ANGLE); add(new JSpinner(lightAltModle.getSpinnerModel()), "wrap"); - - add(new StyledLabel("Sky", Style.BOLD)); + + add(new StyledLabel(trans.get("PhotoSettingsConfig.lbl.sky"), Style.BOLD)); add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx"); - - add(new JLabel("Sky Color")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.skyColor"))); add(skyColorButton, "wrap"); - - add(new JLabel("Sky Image")); - - add(new JComboBox(new DefaultComboBoxModel(new Object[] { - null, - Mountains.instance, - Meadow.instance, - Storm.instance, - Lake.instance, - Orbit.instance, - Miramar.instance - }) { + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.skyImage"))); + + add(new JComboBox(new DefaultComboBoxModel(new Object[] { null, Mountains.instance, Meadow.instance, + Storm.instance, Lake.instance, Orbit.instance, Miramar.instance }) { }) { { addActionListener(new ActionListener() { @@ -223,14 +217,14 @@ public class PhotoSettingsConfig extends JTabbedPane { } } }); - + setSelectedItem(p.getSky()); } }, "wrap"); - - final JLabel creditLabel = new JLabel("Image Credit:"); + + final JLabel creditLabel = new JLabel(trans.get("PhotoSettingsConfig.lbl.skyCredit")); add(creditLabel, "wrap"); - + final JTextArea credit = new JTextArea(); credit.setEditable(false); credit.setCursor(null); @@ -238,7 +232,7 @@ public class PhotoSettingsConfig extends JTabbedPane { credit.setFocusable(false); credit.setFont(creditLabel.getFont()); add(credit, "span, gap left 10px"); - + final StateChangeListener skyChange = new StateChangeListener() { @Override public void stateChanged(EventObject e) { @@ -250,81 +244,74 @@ public class PhotoSettingsConfig extends JTabbedPane { } }; p.addChangeListener(skyChange); - + skyChange.stateChanged(null); - + } }); - - addTab("Effects", new JPanel(new MigLayout("fill")) { + + addTab(trans.get("PhotoSettingsConfig.tab.effects"), new JPanel(new MigLayout("fill")) { { - add(new StyledLabel("Smoke & Flame", Style.BOLD)); + add(new StyledLabel(trans.get("PhotoSettingsConfig.lbl.smokeFlame"), Style.BOLD)); add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx"); - - add(new JLabel("Smoke")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.smoke"))); BooleanModel smokeModel = new BooleanModel(p, "Smoke"); add(new JCheckBox(smokeModel), "split 2, w 15"); - + add(smokeColorButton, "wrap"); smokeModel.addEnableComponent(smokeColorButton); - - add(new JLabel("Smoke Opacity")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.smokeOpacity"))); DoubleModel smokeAlphaModel = new DoubleModel(p, "SmokeAlpha", 100, UnitGroup.UNITS_NONE, 0, 100); JSpinner opacitySpinner = new JSpinner(smokeAlphaModel.getSpinnerModel()); add(opacitySpinner, "wrap"); smokeModel.addEnableComponent(opacitySpinner); - - add(new JLabel("Flame")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.flame"))); BooleanModel fireModel = new BooleanModel(p, "Flame"); add(new JCheckBox(fireModel), "split 2, w 15"); - + add(flameColorButton, "wrap"); fireModel.addEnableComponent(flameColorButton); - - add(new JLabel("Flame Aspect Ratio")); - DoubleModel flameAspectModel = new DoubleModel(p, "FlameAspectRatio", 100, UnitGroup.UNITS_NONE, 25, 250); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.flameAspect"))); + DoubleModel flameAspectModel = new DoubleModel(p, "FlameAspectRatio", 100, UnitGroup.UNITS_NONE, 25, + 250); JSpinner flameAspectSpinner = new JSpinner(flameAspectModel.getSpinnerModel()); add(flameAspectSpinner, "wrap"); fireModel.addEnableComponent(flameAspectSpinner); - - add(new JLabel("Sparks")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.sparks"))); BooleanModel sparksModel = new BooleanModel(p, "Sparks"); JCheckBox sparksCheck = new JCheckBox(sparksModel); add(sparksCheck, "wrap"); fireModel.addEnableComponent(sparksCheck); - - add(new JLabel("Spark Concentration")); - DoubleModel sparkConcentrationModel = new DoubleModel(p, "SparkConcentration", 100, UnitGroup.UNITS_NONE, 0, 100); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.sparkConcentration"))); + DoubleModel sparkConcentrationModel = new DoubleModel(p, "SparkConcentration", 100, + UnitGroup.UNITS_NONE, 0, 100); JSpinner sparkConcentrationSpinner = new JSpinner(sparkConcentrationModel.getSpinnerModel()); add(sparkConcentrationSpinner, "wrap"); sparksModel.addEnableComponent(sparkConcentrationSpinner); - - add(new JLabel("Spark Weight")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.sparkWeight"))); DoubleModel sparkWeightModel = new DoubleModel(p, "SparkWeight", 100, UnitGroup.UNITS_NONE, 0, 100); JSpinner sparkWeightSpinner = new JSpinner(sparkWeightModel.getSpinnerModel()); add(sparkWeightSpinner, "wrap"); sparksModel.addEnableComponent(sparkWeightSpinner); - - - - - - - - - - - add(new JLabel("Exhaust Scale")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.exhaustScale"))); DoubleModel exhaustScaleModel = new DoubleModel(p, "ExhaustScale", 100, UnitGroup.UNITS_NONE, 0, 1000); add(new JSpinner(exhaustScaleModel.getSpinnerModel()), "wrap"); - - add(new StyledLabel("Effects", Style.BOLD)); + + add(new StyledLabel(trans.get("PhotoSettingsConfig.lbl.effects"), Style.BOLD)); add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx"); - - add(new JLabel("Speed")); + + add(new JLabel(trans.get("PhotoSettingsConfig.lbl.speed"))); add(new JCheckBox(new BooleanModel(p, "MotionBlurred")), "wrap"); } }); - + } } diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index a00303abe..fd8c11272 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -686,8 +686,8 @@ public class BasicFrame extends JFrame { }); menu.add(item); - item = new JMenuItem(trans.get("main.menu.analyze.photo"), KeyEvent.VK_P); - item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.analyze.photo.desc")); + item = new JMenuItem(trans.get("PhotoFrame.title"), KeyEvent.VK_P); + item.getAccessibleContext().setAccessibleDescription(trans.get("PhotoFrame.desc")); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) {