#
# English base translation file
#
+# Should you need to add new logical keys here is the proposed method
+#
+# className.ComponantType.componantName
+#
+
! Set to the name of the current translation file (used for debugging purposes)
debug.currentFile = messages.properties
+! RocketActions
+RocketActions.checkbox.Donotaskmeagain = Do not ask me again
+RocketActions.lbl.Youcanchangedefop = You can change the default operation in the preferences.
+RocketActions.showConfirmDialog.lbl1 = Delete the selected simulations?
+RocketActions.showConfirmDialog.lbl2 = <html><i>This operation cannot be undone.</i>
+RocketActions.showConfirmDialog.title = Delete simulations
+RocketActions.DelCompAct.Delete = Delete
+RocketActions.DelCompAct.ttip.Delete = Delete the selected component.
+RocketActions.DelSimuAct.Delete = Delete
+RocketActions.DelSimuAct.ttip.Delete = Delete the selected simulation.
+RocketActions.DelAct.Delete = Delete
+RocketActions.DelAct.ttip.Delete = Delete the selected component or simulation.
+RocketActions.CutAction.Cut = Cut
+RocketActions.CutAction.ttip.Cut = Cut this component or simulation to the clipboard and remove from this design
+RocketActions.CopyAct.Copy = Copy
+RocketActions.CopyAct.ttip.Copy = Copy this component (and subcomponents) to the clipboard.
+RocketActions.PasteAct.Paste = Paste
+RocketActions.PasteAct.ttip.Paste = Paste the component or simulation on the clipboard to the design.
+RocketActions.EditAct.Edit = Edit
+RocketActions.EditAct.ttip.Edit = Edit the selected component.
+RocketActions.NewStageAct.Newstage = New stage
+RocketActions.NewStageAct.ttip.Newstage = Add a new stage to the rocket design.
+RocketActions.ActBoosterstage = Booster stage
+RocketActions.MoveUpAct.Moveup = Move up
+RocketActions.MoveUpAct.ttip.Moveup = Move this component upwards.
+RocketActions.MoveDownAct.Movedown = Move down
+RocketActions.MoveDownAct.ttip.Movedown = Move this component downwards.
+
+! RocketPanel
+RocketPanel.FigTypeAct.Sideview = Side view
+RocketPanel.FigTypeAct.ttip.Sideview = Side view
+RocketPanel.FigTypeAct.Backview = Back view
+RocketPanel.FigTypeAct.ttip.Backview = Rear view
+RocketPanel.lbl.Motorcfg = Motor configuration:
+RocketPanel.lbl.infoMessage = <html>Click to select Shift+click to select other Double-click to edit Click+drag to move
+
+
+! BasicFrame
+BasicFrame.SimpleFileFilter1 = All rocket designs (*.ork; *.rkt)
+BasicFrame.SimpleFileFilter2 = OpenRocket designs (*.ork)
+BasicFrame.SimpleFileFilter3 = RockSim designs (*.rkt)
+BasicFrame.tab.Rocketdesign = Rocket design
+BasicFrame.tab.Flightsim = Flight simulations
+BasicFrame.title.Addnewcomp = Add new component
+BasicFrame.item.Openrocketdesign = Open a rocket design
+BasicFrame.item.Openexamplerocketdesign = Open an example rocket design
+BasicFrame.item.SavecurRocketdesign = Save the current rocket design
+BasicFrame.item.SavecurRocketdesnewfile = Save the current rocket design to a new file
+BasicFrame.item.Printpart = Print parts list and fin template
+BasicFrame.item.Closedesign = Close the current rocket design
+BasicFrame.item.Quitprogram = Quit the program
+BasicFrame.menu.Rocketedt = Rocket editing
+BasicFrame.dlg.lbl1 = Design '
+BasicFrame.dlg.lbl2 = ' has not been saved.
+BasicFrame.dlg.lbl3 = Do you want to save it?
+BasicFrame.dlg.title = Design not saved
! Labels used in buttons of dialog windows
button.ok = OK
button.cancel = Cancel
button.close = Close
+! Common labels used in buttons of dialog windows
+dlg.but.ok = OK
+dlg.but.cancel = Cancel
+dlg.but.close = Close
+
+! About Dialog
+about.dlg.but.close = Close
+about.dlg.lbl.translation =
+about.dlg.lbl.transwebsite =
+
+! Bug Report dialog
+bugreport.dlg.title = Bug report
+bugreport.dlg.but.Sendbugreport = Send bug report
+bugreport.dlg.but.Sendbugreport.Ttip = Automatically send the bug report to the OpenRocket developers.
+bugreport.dlg.successmsg1 = Bug report successfully sent.
+bugreport.dlg.successmsg2 = Thank you for helping make OpenRocket better!
+bugreport.dlg.successmsg3 = Bug report sent
+
+! Debug log dialog
+debuglogdlg.but.clear = Clear
+debuglogdlg.OpenRocketdebuglog = OpenRocket debug log
+debuglogdlg.Displayloglines = Display log lines:
+debuglogdlg.Follow = Follow
+debuglogdlg.col.Time = Time
+debuglogdlg.col.Level = Level
+debuglogdlg.col.Location = Location
+debuglogdlg.col.Message = Message
+debuglogdlg.lbl.Loglinenbr = Log line number:
+debuglogdlg.lbl.Time = Time:
+debuglogdlg.lbl.Level = Level:
+
+
+! Edit Motor configuration dialog
+edtmotorconfdlg.but.removemotor = Remove motor
+edtmotorconfdlg.but.Selectmotor = Select motor
+edtmotorconfdlg.but.Removeconfiguration = Remove configuration
+edtmotorconfdlg.but.Newconfiguration = New configuration
+edtmotorconfdlg.lbl.Motormounts = <html><b>Motor mounts:</b>
+edtmotorconfdlg.title.Editmotorconf = Edit motor configurations
+edtmotorconfdlg.selectcomp = <html>Select which components function as motor mounts:
+edtmotorconfdlg.lbl.Motorconfig = <html><b>Motor configurations:</b>
+edtmotorconfdlg.lbl.Configname = Configuration name:
+edtmotorconfdlg.lbl.Leavenamedefault = Leave name empty for default.
+
+! Example design dialog
+exdesigndlg.but.open = Open
+
+! Print panel dialog
+printdlg.but.saveaspdf = Save as PDF
+printdlg.but.preview = Preview
+printdlg.but.settings = Settings
+
+! Material edit panel
+matedtpan.but.new = New
+matedtpan.but.edit = Edit
+matedtpan.but.delete = Delete
+matedtpan.but.revertall = Revert all
+matedtpan.col.Material = Material
+matedtpan.col.Type = Type
+matedtpan.col.Density = Density
+matedtpan.col.but.ttip.New = Add a new material
+matedtpan.title.Addcustmaterial = Add a custom material
+matedtpan.but.ttip.edit = Edit an existing material
+matedtpan.title.Editmaterial = Edit material
+matedtpan.title2.Editmaterial = The built-in materials cannot be modified.
+matedtpan.but.ttip.delete = Delete a user-defined material
+matedtpan.but.ttip.revertall = Delete all user-defined materials
+matedtpan.title.Deletealluser-defined = Delete all user-defined materials?
+matedtpan.title.Revertall = Revert all?
+matedtpan.lbl.edtmaterials = <html><i>Editing materials will not affect existing rocket designs.</i>
+
+!MaterialModel
+MaterialModel.title.Material = Material
+MaterialModel.title.Defcustmat = Define custom material
+
+
+! Preference dialog
+pref.dlg.but.add = Add
+pref.dlg.but.reset = Reset
+pref.dlg.but.checknow = Check now
+pref.dlg.but.defaultmetric = Default metric
+pref.dlg.but.defaultimperial = Default imperial
+pref.dlg.title.Preferences = Preferences
+pref.dlg.tab.Units = Units
+pref.dlg.tab.Defaultunits = Default units
+pref.dlg.tab.Materials = Materials
+pref.dlg.tab.Custommaterials = Custom materials
+pref.dlg.tab.Options = Options
+pref.dlg.tab.Miscellaneousoptions = Miscellaneous options
+pref.dlg.lbl.Positiontoinsert = Position to insert new body components:
+pref.dlg.lbl.Confirmdeletion = Confirm deletion of simulations:
+pref.dlg.lbl.User-definedthrust = User-defined thrust curves:
+pref.dlg.Allthrustcurvefiles = All thrust curve files (*.eng; *.rse; *.zip; directories)
+pref.dlg.RASPfiles = RASP motor files (*.eng)
+pref.dlg.RockSimfiles = RockSim engine files (*.rse)
+pref.dlg.ZIParchives = ZIP archives (*.zip)
+pref.dlg.checkbox.Checkupdates = Check for software updates at startup
+pref.dlg.ttip.Checkupdatesnow = Check for software updates now
+pref.dlg.lbl.Selectprefunits = Select your preferred units:
+pref.dlg.lbl.Rocketdimensions = Rocket dimensions:
+pref.dlg.lbl.Linedensity = Line density:
+pref.dlg.lbl.Motordimensions = Motor dimensions:
+pref.dlg.lbl.Surfacedensity = Surface density:
+pref.dlg.lbl.Distance = Distance:
+pref.dlg.lbl.Bulkdensity = Bulk density::
+pref.dlg.lbl.Velocity = Velocity:
+pref.dlg.lbl.Surfaceroughness = Surface roughness:
+pref.dlg.lbl.Acceleration = Acceleration:
+pref.dlg.lbl.Area = Area:
+pref.dlg.lbl.Mass = Mass:
+pref.dlg.lbl.Angle = Angle:
+pref.dlg.lbl.Force = Force:
+pref.dlg.lbl.Rollrate = Roll rate:
+pref.dlg.lbl.Totalimpulse = Total impulse:
+pref.dlg.lbl.Temperature = Temperature:
+pref.dlg.lbl.Momentofinertia = Moment of inertia:
+pref.dlg.lbl.Pressure = Pressure:
+pref.dlg.lbl.Stability = Stability:
+pref.dlg.lbl.effect1 = The effects will take place the next time you open a window.
+pref.dlg.lbl.Checkingupdates = Checking for updates...
+pref.dlg.lbl.msg1 = An error occurred while communicating with the server.
+pref.dlg.lbl.msg2 = Unable to retrieve update information
+pref.dlg.lbl.msg3 = You are running the latest version of OpenRocket.
+pref.dlg.lbl.msg4 = No updates available
+
+! Simulation edit dialog
+simedtdlg.but.runsimulation = Run simulation
+simedtdlg.but.resettodefault = Reset to default
+simedtdlg.but.add = Add
+simedtdlg.but.remove = Remove
+simedtdlg.title.Editsim = Edit simulation
+simedtdlg.lbl.Simname = Simulation name:
+simedtdlg.tab.Launchcond = Launch conditions
+simedtdlg.tab.Simopt = Simulation options
+simedtdlg.tab.Plotdata = Plot data
+simedtdlg.tab.Exportdata = Export data
+simedtdlg.lbl.Motorcfg = Motor configuration:
+simedtdlg.lbl.ttip.Motorcfg = Select the motor configuration to use.
+simedtdlg.combo.ttip.motorconf = Select the motor configuration to use.
+simedtdlg.lbl.Wind = Wind
+simedtdlg.lbl.Averwindspeed = Average windspeed:
+simedtdlg.lbl.ttip.Averwindspeed = The average windspeed relative to the ground.
+simedtdlg.lbl.Stddeviation = Standard deviation:
+simedtdlg.lbl.ttip.Stddeviation = <html>The standard deviation of the windspeed.<br>The windspeed is within twice the standard deviation from the average for 95% of the time.
+simedtdlg.lbl.Turbulenceintensity = Turbulence intensity:
+simedtdlg.lbl.ttip.Turbulenceintensity1 = <html>The turbulence intensity is the standard deviation divided by the average windspeed.<br>
+simedtdlg.lbl.ttip.Turbulenceintensity2 = Typical values range from
+simedtdlg.lbl.ttip.Turbulenceintensity3 = to
+simedtdlg.border.Atmoscond = Atmospheric conditions
+simedtdlg.checkbox.InterStdAtmosphere = Use International Standard Atmosphere
+simedtdlg.checkbox.ttip.InterStdAtmosphere1 = <html>Select to use the International Standard Atmosphere model.<br>This model has a temperature of
+simedtdlg.checkbox.ttip.InterStdAtmosphere2 = and a pressure of
+simedtdlg.checkbox.ttip.InterStdAtmosphere3 = at sea level.
+simedtdlg.lbl.Temperature = Temperature:
+simedtdlg.lbl.ttip.Temperature = The temperature at the launch site.
+simedtdlg.lbl.Pressure = Pressure:
+simedtdlg.lbl.ttip.Pressure = The atmospheric pressure at the launch site.
+simedtdlg.lbl.Launchsite = Launch site
+simedtdlg.lbl.Latitude = Latitude:
+simedtdlg.lbl.ttip.Latitude = <html>The launch site latitude affects the gravitational pull of Earth.<br>Positive values are on the Northern hemisphere, negative values on the Southern hemisphere.
+simedtdlg.lbl.Altitude = Altitude:
+simedtdlg.lbl.ttip.Altitude = <html>The launch altitude above mean sea level.<br>This affects the position of the rocket in the atmospheric model.
+simedtdlg.border.Launchrod = Launch rod
+simedtdlg.lbl.Length = Length:
+simedtdlg.lbl.ttip.Length = The length of the launch rod.
+simedtdlg.lbl.Angle = Angle:
+simedtdlg.lbl.ttip.Angle = The angle of the launch rod from vertical.
+simedtdlg.lbl.Direction = Direction:
+simedtdlg.lbl.ttip.Direction1 = <html>Direction of the launch rod relative to the wind.<br>
+simedtdlg.lbl.ttip.Direction2 = = towards the wind,
+simedtdlg.lbl.ttip.Direction3 = = downwind.
+simedtdlg.border.Simopt = Simulator options
+simedtdlg.lbl.Calcmethod = Calculation method:
+simedtdlg.lbl.ttip.Calcmethod = <html>The Extended Barrowman method calculates aerodynamic forces according <br>to the Barrowman equations extended to accommodate more components.
+simedtdlg.lbl.ExtBarrowman = Extended Barrowman
+simedtdlg.lbl.Simmethod = Simulation method:
+simedtdlg.lbl.ttip.Simmethod1 = <html>The six degree-of-freedom simulator allows the rocket total freedom during flight.<br>
+simedtdlg.lbl.ttip.Simmethod2 = Integration is performed using a 4<sup>th</sup> order Runge-Kutta 4 numerical integration.
+simedtdlg.lbl.Timestep = Time step:
+simedtdlg.lbl.ttip.Timestep1 = <html>The time between simulation steps.<br>A smaller time step results in a more accurate but slower simulation.<br>
+simedtdlg.lbl.ttip.Timestep2 = The 4<sup>th</sup> order simulation method is quite accurate with a time step of
+simedtdlg.but.ttip.resettodefault = Reset the time step to its default value (
+simedtdlg.border.Simlist = Simulator listeners
+simedtdlg.txt.longA1 = <html><i>Simulation listeners</i> is an advanced feature that allows user-written code to listen to and interact with the simulation.
+simedtdlg.txt.longA2 = For details on writing simulation listeners, see the OpenRocket technical documentation.
+simedtdlg.lbl.Curlist = Current listeners:
+simedtdlg.lbl.Addsimlist = Add simulation listener
+simedtdlg.lbl.Noflightdata = No flight data available.
+simedtdlg.lbl.runsimfirst = Please run the simulation first.
+simedtdlg.chart.Simflight = Simulated flight
+simedtdlg.dlg.Simres = Simulation results
+
+
+
+! Simulation Panel
+simpanel.but.newsimulation = New simulation
+simpanel.but.editsimulation = Edit simulation
+simpanel.but.runsimulations = Run simulations
+simpanel.but.deletesimulations = Delete simulations
+simpanel.but.plotexport = Plot / export
+simpanel.but.ttip.newsimulation = Add a new simulation
+simpanel.but.ttip.editsim = Edit the selected simulation
+simpanel.but.ttip.runsimu = Re-run the selected simulations
+simpanel.but.ttip.deletesim = Delete the selected simulations
+simpanel.checkbox.donotask = Do not ask me again
+simpanel.lbl.defpref = You can change the default operation in the preferences.
+simpanel.dlg.lbl.DeleteSim1 = Delete the selected simulations?
+simpanel.dlg.lbl.DeleteSim2 = <html><i>This operation cannot be undone.</i>
+simpanel.dlg.lbl.DeleteSim3 = Delete simulations
+simpanel.col.Name = Name
+simpanel.col.Motors = Motors
+simpanel.col.Apogee = Apogee
+simpanel.col.Maxvelocity = Max. velocity
+simpanel.col.Maxacceleration = Max. acceleration
+simpanel.col.Timetoapogee = Time to apogee
+simpanel.col.Flighttime = Flight time
+simpanel.col.Groundhitvelocity = Ground hit velocity
+
+! SimulationRunDialog
+SimuRunDlg.title.RunSim = Running simulations...
+SimuRunDlg.lbl.Running = Running ...
+SimuRunDlg.lbl.Simutime = Simulation time:
+SimuRunDlg.lbl.Altitude = Altitude:
+SimuRunDlg.lbl.Velocity = Velocity:
+SimuRunDlg.msg.Unabletosim = Unable to simulate:
+SimuRunDlg.msg.errorOccurred = An error occurred during the simulation:
+SimuRunDlg.msg.AnException1 = An exception occurred during the simulation:
+SimuRunDlg.msg.AnException2 = Please report this as a bug along with the details below.
+SimuRunDlg.msg.AssertionError1 = A computation error occurred during the simulation.
+SimuRunDlg.msg.AssertionError2 = Please report this as a bug along with the details below.
+SimuRunDlg.msg.unknownerror1 = An unknown error was encountered during the simulation.
+SimuRunDlg.msg.unknownerror2 = The program may be unstable, you should save all your designs and restart OpenRocket now!
+
+
+
+! SimulationExportPanel
+SimExpPan.desc = Comma Separated Files (*.csv)
+SimExpPan.border.Vartoexport = Variables to export
+SimExpPan.but.Selectall = Select all
+SimExpPan.but.Selectnone = Select none
+SimExpPan.border.Fieldsep = Field separator
+SimExpPan.lbl.Fieldsepstr = Field separator string:
+SimExpPan.lbl.longA1 = <html>The string used to separate the fields in the exported file.<br>
+SimExpPan.lbl.longA2 = Use ',' for a Comma Separated Values (CSV) file.
+SimExpPan.checkbox.Includesimudesc = Include simulation description
+SimExpPan.checkbox.ttip.Includesimudesc = Include a comment at the beginning of the file describing the simulation.
+SimExpPan.border.Comments = Comments
+SimExpPan.checkbox.Includefielddesc = Include field descriptions
+SimExpPan.checkbox.ttip.Includefielddesc = Include a comment line with the descriptions of the exported variables.
+SimExpPan.checkbox.Incflightevents = Include flight events
+SimExpPan.checkbox.ttip.Incflightevents = Include a comment line for every flight event.
+SimExpPan.lbl.Commentchar = Comment character:
+SimExpPan.lbl.ttip.Commentchar = The character(s) that mark a comment line.
+SimExpPan.but.Exporttofile = Export to file...
+
+! MotorPlot
+MotorPlot.title.Motorplot = Motor plot
+MotorPlot.but.Select = Select
+MotorPlot.Chart.Motorthrustcurve = Motor thrust curve
+MotorPlot.Chart.Time = Time / s
+MotorPlot.Chart.Thrust = Thrust / N
+MotorPlot.txt.Designation = Designation:
+MotorPlot.txt.Manufacturer = Manufacturer:
+MotorPlot.txt.Type = Type:
+MotorPlot.txt.Delays = Delays:
+MotorPlot.txt.Comment = Comment:\n
+
+
+
+! Simulation plot panel
+simplotpanel.lbl.Presetplotconf = Preset plot configurations:
+simplotpanel.lbl.Xaxistype = X axis type:
+simplotpanel.lbl.Unit = Unit:
+simplotpanel.lbl.Yaxistypes = Y axis types:
+simplotpanel.lbl.Flightevents = Flight events:
+simplotpanel.but.All = All
+simplotpanel.but.None = None
+simplotpanel.but.NewYaxisplottype = New Y axis plot type
+simplotpanel.but.Plotflight = Plot flight
+simplotpanel.lbl.Axis = Axis:
+simplotpanel.but.ttip.Removethisplot = Remove this plot
+simplotpanel.Desc = The data will be plotted in time order even if the X axis type is not time.
+simplotpanel.OptionPane.lbl1 = A maximum of 15 plots is allowed.
+simplotpanel.OptionPane.lbl2 = Cannot add plot
+
+
+! Component add buttons
+compaddbuttons.Bodycompandfinsets = Body components and fin sets
+compaddbuttons.Nosecone = Nose cone
+compaddbuttons.Bodytube = Body tube
+compaddbuttons.Transition = Transition
+compaddbuttons.Trapezoidal = Trapezoidal
+compaddbuttons.Elliptical = Elliptical
+compaddbuttons.Freeform = Freeform
+compaddbuttons.Launchlug = Launch lug
+compaddbuttons.Innercomponent = Inner component
+compaddbuttons.Innertube = Inner tube
+compaddbuttons.Coupler = Coupler
+compaddbuttons.Centeringring = Centering\nring
+compaddbuttons.Bulkhead = Bulkhead
+compaddbuttons.Engineblock = Engine\nblock
+compaddbuttons.Massobjects = Mass objects
+compaddbuttons.Parachute = Parachute
+compaddbuttons.Streamer = Streamer
+compaddbuttons.Shockcord = Shock cord
+compaddbuttons.Masscomponent = Mass\ncomponent
+compaddbuttons.Donotaskmeagain = Do not ask me again
+compaddbuttons.Selectcomppos = Select component position
+compaddbuttons.lbl.Youcanchange = You can change the default operation in the preferences.
+compaddbuttons.lbl.insertcomp = Insert the component after the current component or as the last component?
+compaddbuttons.askPosition.Inserthere = Insert here
+compaddbuttons.askPosition.Addtotheend = Add to the end
+compaddbuttons.askPosition.Cancel = Cancel
+
+! Component Analysis Dialog
+componentanalysisdlg.componentanalysis = Component analysis
+componentanalysisdlg.lbl.winddir = Wind direction:
+componentanalysisdlg.TitledBorder.warnings = Warnings:
+componentanalysisdlg.ToggleBut.worst = Worst
+componentanalysisdlg.lbl.angleofattack = Angle of attack:
+componentanalysisdlg.lbl.machnumber = Mach number:
+componentanalysisdlg.lbl.rollrate = Roll rate:
+componentanalysisdlg.lbl.activestages = Active stages:
+componentanalysisdlg.lbl.motorconf = Motor configuration:
+componentanalysisdlg.TabStability.Col = Component
+componentanalysisdlg.TabStability = Stability
+componentanalysisdlg.TabStability.ttip = Stability information
+componentanalysisdlg.dragTableModel.Col.Component = Component
+componentanalysisdlg.dragTableModel.Col.Pressure = <html>Pressure C<sub>D</sub>
+componentanalysisdlg.dragTableModel.Col.Base = <html>Base C<sub>D</sub>
+componentanalysisdlg.dragTableModel.Col.friction = <html>Friction C<sub>D</sub>
+componentanalysisdlg.dragTableModel.Col.total = <html>Total C<sub>D</sub>
+componentanalysisdlg.dragTabchar = Drag characteristics
+componentanalysisdlg.dragTabchar.ttip = Drag characteristics
+componentanalysisdlg.rollTableModel.Col.component = Component
+componentanalysisdlg.rollTableModel.Col.rollforc = Roll forcing coefficient
+componentanalysisdlg.rollTableModel.Col.rolldamp = Roll damping coefficient
+componentanalysisdlg.rollTableModel.Col.total = <html>Total C<sub>l</sub>
+componentanalysisdlg.rollTableModel = Roll dynamics
+componentanalysisdlg.rollTableModel.ttip = Roll dynamics
+componentanalysisdlg.println.closingmethod = Closing method called:
+componentanalysisdlg.println.settingnam = SETTING NAN VALUES
+componentanalysisdlg.lbl.reflenght = Reference length:
+componentanalysisdlg.lbl.refarea = Reference area:
+!componentanalysisdlg.But.close =Close
+
+! Custom Material dialog
+custmatdlg.title.Custommaterial = Custom material
+custmatdlg.lbl.Materialname = Material name:
+custmatdlg.lbl.Materialtype = Material type:
+custmatdlg.lbl.Materialdensity = Material density:
+custmatdlg.checkbox.Addmaterial = Add material to database
+
+
+! Ring Component Config
+ringcompcfg.OuterRadius = OuterRadius
+ringcompcfg.Automatic = Automatic
+ringcompcfg.InnerRadius = InnerRadius
+ringcompcfg.Thickness = Thickness
+ringcompcfg.Length = Length
+ringcompcfg.Positionrelativeto = Position relative to:
+ringcompcfg.plus = plus
+ringcompcfg.PositionValue = PositionValue
+ringcompcfg.Radialdistance = Radial distance:
+ringcompcfg.Distancefrom = Distance from the rocket centerline
+ringcompcfg.Radialdirection = Radial direction
+ringcompcfg.radialdirectionfrom = The radial direction from the rocket centerline
+ringcompcfg.but.Reset = Reset
+ringcompcfg.but.Resetcomponant = Reset the component to the rocket centerline
+
+! Body Tube Config
+BodyTubecfg.lbl.Bodytubelength = Body tube length:
+BodyTubecfg.lbl.Outerdiameter = Outer diameter:
+BodyTubecfg.lbl.Innerdiameter = Inner diameter:
+BodyTubecfg.lbl.Wallthickness = Wall thickness:
+BodyTubecfg.tab.General = General
+BodyTubecfg.tab.Generalproperties = General properties
+BodyTubecfg.tab.Motor = Motor
+BodyTubecfg.tab.Motormountconf = Motor mount configuration
+BodyTubecfg.checkbox.Automatic = Automatic
+BodyTubecfg.checkbox.Filled = Filled
+
+! FinSetConfig
+FinSetConfig.tab.Fintabs = Fin tabs
+FinSetConfig.tab.Through-the-wall = Through-the-wall fin tabs
+FinSetConfig.but.Converttofreeform = Convert to freeform
+FinSetConfig.but.Converttofreeform.ttip = Convert this fin set into a freeform fin set
+FinSetConfig.Convertfinset = Convert fin set
+FinSetConfig.but.Splitfins = Split fins
+FinSetConfig.but.Splitfins.ttip = Split the fin set into separate fins
+FinSetConfig.lbl.Through-the-wall = Through-the-wall fin tabs:
+FinSetConfig.lbl.Tablength = Tab length:
+FinSetConfig.ttip.Tablength = The length of the fin tab.
+FinSetConfig.lbl.Tabheight = Tab height:
+FinSetConfig.ttip.Tabheight = The spanwise height of the fin tab.
+FinSetConfig.lbl.Tabposition = Tab position:
+FinSetConfig.ttip.Tabposition = The position of the fin tab.
+FinSetConfig.lbl.relativeto = relative to
+
+! MotorDatabaseLoadingDialog
+MotorDbLoadDlg.title = Loading motors
+MotorDbLoadDlg.Loadingmotors = Loading motors...
+
+! RocketConfig
+RocketCfg.lbl.Designname = Design name:
+RocketCfg.lbl.Designer = Designer:
+RocketCfg.lbl.Comments = Comments:
+RocketCfg.lbl.Revisionhistory = Revision history:
+RocketCfg.lbl.Material = Material:
+
+! ShockCordConfig
+ShockCordCfg.lbl.Shockcordlength = Shock cord length
+
+! RocketComponentConfig
+RocketCompCfg.lbl.Componentname = Component name:
+RocketCompCfg.ttip.Thecomponentname = The component name.
+RocketCompCfg.tab.Override = Override
+RocketCompCfg.tab.MassandCGoverride = Mass and CG override options
+RocketCompCfg.tab.Figure = Figure
+RocketCompCfg.tab.Figstyleopt = Figure style options
+RocketCompCfg.tab.Comment = Comment
+RocketCompCfg.tab.Specifyacomment = Specify a comment for the component
+RocketCompCfg.lbl.Mass = Mass:
+RocketCompCfg.lbl.Componentmass = Component mass:
+RocketCompCfg.lbl.overriddento = (overridden to
+RocketCompCfg.lbl.overriddenby = (overridden by
+RocketCompCfg.lbl.Componentmaterial = Component material:
+RocketCompCfg.lbl.Componentfinish = Component finish:
+RocketCompCfg.lbl.ttip.componentmaterialaffects = The component material affects the weight of the component.
+RocketCompCfg.combo.ttip.componentmaterialaffects = The component material affects the weight of the component.
+RocketCompCfg.lbl.longA1 = <html>The component finish affects the aerodynamic drag of the component.<br>
+RocketCompCfg.lbl.longA2 = The value indicated is the average roughness height of the surface.
+RocketCompCfg.but.Setforall = Set for all
+RocketCompCfg.but.ttip.Setforall = Set this finish for all components of the rocket.
+RocketCompCfg.lbl.Overridemassorcenter = Override the mass or center of gravity of the
+RocketCompCfg.checkbox.Overridemass = Override mass:
+RocketCompCfg.checkbox.Overridecenterofgrav = Override center of gravity:
+RocketCompCfg.checkbox.OverridemassandCG = Override mass and CG of all subcomponents
+RocketCompCfg.lbl.longB1 = <html>The overridden mass does not include motors.<br>
+RocketCompCfg.lbl.longB2 = The center of gravity is measured from the front end of the
+RocketCompCfg.lbl.Commentsonthe = Comments on the
+RocketCompCfg.lbl.Figurestyle = Figure style:
+RocketCompCfg.lbl.Componentcolor = Component color:
+RocketCompCfg.lbl.Choosecolor = Choose color
+RocketCompCfg.checkbox.Usedefaultcolor = Use default color
+RocketCompCfg.lbl.Complinestyle = Component line style:
+RocketCompCfg.but.Saveasdefstyle = Save as default style
+RocketCompCfg.lbl.Diameter = Diameter:
+RocketCompCfg.lbl.Length = Length:
+RocketCompCfg.lbl.Thickness = Thickness:
+RocketCompCfg.checkbox.Endcapped = End capped
+RocketCompCfg.ttip.Endcapped = Whether the end of the shoulder is capped.
+RocketCompCfg.title.Noseconeshoulder = Nose cone shoulder
+RocketCompCfg.title.Aftshoulder = Aft shoulder
+RocketCompCfg.border.Foreshoulder = Fore shoulder
+!RocketCompCfg.lbl.Length = Length:
+
+! BulkheadConfig
+BulkheadCfg.tab.Radius = Radius:
+BulkheadCfg.tab.Thickness = Thickness:
+BulkheadCfg.tab.General = General
+BulkheadCfg.tab.Generalproperties = General properties
+
+!CenteringRingConfig
+CenteringRingCfg.tab.Outerdiam = Outer diameter:
+CenteringRingCfg.tab.Innerdiam = Inner diameter:
+CenteringRingCfg.tab.Thickness = Thickness:
+CenteringRingCfg.tab.General = General
+CenteringRingCfg.tab.Generalproperties = General properties
+
+!ComponentConfigDialog
+ComponentCfgDlg.configuration = configuration
+ComponentCfgDlg.Modify = Modify
+
+!EllipticalFinSetConfig
+EllipticalFinSetCfg.Nbroffins = Number of fins:
+EllipticalFinSetCfg.Rotation = Rotation:
+EllipticalFinSetCfg.Fincant = Fin cant:
+EllipticalFinSetCfg.Rootchord = Root chord:
+EllipticalFinSetCfg.Height = Height:
+EllipticalFinSetCfg.Positionrelativeto = Position relative to:
+EllipticalFinSetCfg.plus = plus
+EllipticalFinSetCfg.FincrossSection = Fin cross section:
+EllipticalFinSetCfg.Thickness = Thickness:
+EllipticalFinSetCfg.General = General
+EllipticalFinSetCfg.Generalproperties = General properties
+EllipticalFinSetCfg.ttip.Fincant = The angle that the fins are canted with respect to the rocket body.
+
+!FreeformFinSetConfig
+FreeformFinSetCfg.tab.General = General
+FreeformFinSetCfg.tab.ttip.General = General properties
+FreeformFinSetCfg.tab.Shape = Shape
+FreeformFinSetCfg.tab.ttip.Finshape = Fin shape
+FreeformFinSetCfg.lbl.Numberoffins = Number of fins:
+FreeformFinSetCfg.lbl.Finrotation = Fin rotation:
+FreeformFinSetCfg.lbl.Fincant = Fin cant:
+FreeformFinSetCfg.lbl.ttip.Fincant = The angle that the fins are canted with respect to the rocket body.
+FreeformFinSetCfg.lbl.Posrelativeto = Position relative to:
+FreeformFinSetCfg.lbl.plus = plus
+FreeformFinSetCfg.lbl.FincrossSection = Fin cross section:
+FreeformFinSetCfg.lbl.Thickness = Thickness:
+
+!InnerTubeConfig
+InnerTubeCfg.tab.Motor = Motor
+InnerTubeCfg.tab.ttip.Motor = Motor mount configuration
+InnerTubeCfg.tab.Cluster = Cluster
+InnerTubeCfg.tab.ttip.Cluster = Cluster configuration
+InnerTubeCfg.tab.Radialpos = Radial position
+InnerTubeCfg.tab.ttip.Radialpos = Radial position
+InnerTubeCfg.lbl.Selectclustercfg = Select cluster configuration:
+InnerTubeCfg.lbl.TubeSep = Tube separation:
+InnerTubeCfg.lbl.ttip.TubeSep = The separation of the tubes, 1.0 = touching each other
+InnerTubeCfg.lbl.Rotation = Rotation:
+InnerTubeCfg.lbl.ttip.Rotation = Rotation angle of the cluster configuration
+InnerTubeCfg.lbl.Rotangle = Rotation angle of the cluster configuration
+InnerTubeCfg.but.Splitcluster = Split cluster
+InnerTubeCfg.lbl.longA1 = <html>Split the cluster into separate components.<br>
+InnerTubeCfg.lbl.longA2 = This also duplicates all components attached to this inner tube.
+InnerTubeCfg.but.Resetsettings = Reset settings
+InnerTubeCfg.but.ttip.Resetsettings = Reset the separation and rotation to the default values
+
+! LaunchLugConfig
+LaunchLugCfg.lbl.Length = Length:
+LaunchLugCfg.lbl.Outerdiam = Outer diameter:
+LaunchLugCfg.lbl.Innerdiam = Inner diameter:
+LaunchLugCfg.lbl.Thickness = Thickness:
+LaunchLugCfg.lbl.Radialpos = Radial position:
+LaunchLugCfg.lbl.Posrelativeto = Position relative to:
+LaunchLugCfg.lbl.plus = plus
+LaunchLugCfg.tab.General = General
+LaunchLugCfg.tab.Generalprop = General properties
+
+! MassComponentConfig
+MassComponentCfg.lbl.Mass = Mass
+MassComponentCfg.lbl.Length = Length
+MassComponentCfg.lbl.Diameter = Diameter
+MassComponentCfg.lbl.PosRelativeto = Position relative to:
+MassComponentCfg.lbl.plus = plus
+MassComponentCfg.tab.General = General
+MassComponentCfg.tab.ttip.General = General properties
+MassComponentCfg.tab.Radialpos = Radial position
+MassComponentCfg.tab.ttip.Radialpos = Radial position configuration
+MassComponentCfg.lbl.Radialdistance = Radial distance:
+MassComponentCfg.lbl.Radialdirection = Radial direction:
+MassComponentCfg.but.Reset = Reset
+
+! MotorConfig
+MotorCfg.checkbox.compmotormount = This component is a motor mount
+MotorCfg.lbl.Motorcfg = Motor configuration:
+MotorCfg.but.New = New
+MotorCfg.lbl.Currentmotor = Current motor:
+MotorCfg.lbl.Motoroverhang = Motor overhang:
+MotorCfg.lbl.Ignitionat = Ignition at:
+MotorCfg.lbl.plus = plus
+MotorCfg.lbl.seconds = seconds
+MotorCfg.lbl.longA1 = The current design has only one stage.
+MotorCfg.lbl.longA2 = Stages can be added by clicking \"New stage\".
+MotorCfg.lbl.longB1 = The current design has
+MotorCfg.lbl.longB2 = stages.
+MotorCfg.but.Selectmotor = Select motor
+MotorCfg.but.Removemotor = Remove motor
+MotorCfg.lbl.motorLabel = None
+
+! NoseConeConfig
+NoseConeCfg.lbl.Noseconeshape = Nose cone shape:
+NoseConeCfg.lbl.Shapeparam = Shape parameter:
+NoseConeCfg.lbl.Noseconelength = Nose cone length:
+NoseConeCfg.lbl.Basediam = Base diameter:
+NoseConeCfg.checkbox.Automatic = Automatic
+NoseConeCfg.lbl.Wallthickness = Wall thickness:
+NoseConeCfg.checkbox.Filled = Filled
+NoseConeCfg.tab.General = General
+NoseConeCfg.tab.ttip.General = General properties
+NoseConeCfg.tab.Shoulder = Shoulder
+NoseConeCfg.tab.ttip.Shoulder = Shoulder properties
+
+! ParachuteConfig
+ParachuteCfg.lbl.Canopy = Canopy:
+ParachuteCfg.lbl.Diameter = Diameter:
+ParachuteCfg.lbl.Material = Material:
+ParachuteCfg.combo.MaterialModel = The component material affects the weight of the component.
+ParachuteCfg.lbl.longA1 = <html>Drag coefficient C<sub>D</sub>:
+ParachuteCfg.lbl.longB1 = <html>The drag coefficient relative to the total area of the parachute.<br>
+ParachuteCfg.lbl.longB2 = A larger drag coefficient yields a slowed descent rate.
+ParachuteCfg.lbl.longB3 = A typical value for parachutes is 0.8.
+ParachuteCfg.but.Reset = Reset
+ParachuteCfg.lbl.Shroudlines = Shroud lines:
+ParachuteCfg.lbl.Numberoflines = Number of lines:
+ParachuteCfg.lbl.Linelength = Line length:
+ParachuteCfg.lbl.Material = Material:
+ParachuteCfg.lbl.Posrelativeto = Position relative to:
+ParachuteCfg.lbl.plus = plus
+ParachuteCfg.lbl.Packedlength = Packed length:
+ParachuteCfg.lbl.Packeddiam = Packed diameter:
+ParachuteCfg.lbl.Deploysat = Deploys at:
+ParachuteCfg.lbl.seconds = seconds
+ParachuteCfg.lbl.Altitude = Altitude:
+ParachuteCfg.tab.General = General
+ParachuteCfg.tab.ttip.General = General properties
+ParachuteCfg.tab.Radialpos = Radial position
+ParachuteCfg.tab.ttip.Radialpos = Radial position configuration
+ParachuteCfg.lbl.Radialdistance = Radial distance:
+ParachuteCfg.lbl.Radialdirection = Radial direction:
+ParachuteCfg.but.Reset = Reset
+
+! ShockCordConfig
+ShockCordCfg.lbl.Shockcordlength = Shock cord length
+ShockCordCfg.lbl.Shockcordmaterial = Shock cord material:
+ShockCordCfg.lbl.Posrelativeto = Position relative to:
+ShockCordCfg.lbl.plus = plus
+ShockCordCfg.lbl.Packedlength = Packed length:
+ShockCordCfg.lbl.Packeddiam = Packed diameter:
+ShockCordCfg.tab.General = General
+ShockCordCfg.tab.ttip.General = General properties
+
+!SleeveConfig
+SleeveCfg.tab.Outerdiam = Outer diameter:
+SleeveCfg.tab.Innerdiam = Inner diameter:
+SleeveCfg.tab.Wallthickness = Wall thickness:
+SleeveCfg.tab.Length = Length:
+SleeveCfg.tab.General = General
+SleeveCfg.tab.Generalproperties = General properties
+
+! StreamerConfig
+StreamerCfg.lbl.Striplength = Strip length:
+StreamerCfg.lbl.Stripwidth = Strip width:
+StreamerCfg.lbl.Striparea = Strip area:
+StreamerCfg.lbl.Aspectratio = Aspect ratio:
+StreamerCfg.lbl.Material = Material:
+StreamerCfg.combo.ttip.MaterialModel = The component material affects the weight of the component.
+StreamerCfg.lbl.longA1 = <html>Drag coefficient C<sub>D</sub>:
+StreamerCfg.lbl.longB1 = <html>The drag coefficient relative to the total area of the streamer.<br>
+StreamerCfg.lbl.longB2 = A larger drag coefficient yields a slowed descent rate.
+StreamerCfg.lbl.Automatic = Automatic
+StreamerCfg.lbl.longC1 = The drag coefficient is relative to the area of the streamer.
+StreamerCfg.lbl.Posrelativeto = Position relative to:
+StreamerCfg.lbl.plus = plus
+StreamerCfg.lbl.Packedlength = Packed length:
+StreamerCfg.lbl.Packeddiam = Packed diameter:
+StreamerCfg.lbl.Deploysat = Deploys at:
+StreamerCfg.lbl.seconds = seconds
+StreamerCfg.lbl.Altitude = Altitude:
+StreamerCfg.tab.General = General
+StreamerCfg.tab.ttip.General = General properties
+StreamerCfg.tab.Radialpos = Radial position
+StreamerCfg.tab.ttip.Radialpos = Radial position configuration
+StreamerCfg.lbl.Radialdistance = Radial distance:
+StreamerCfg.lbl.Radialdirection = Radial direction:
+StreamerCfg.but.Reset = Reset
+
+! ThicknessRingComponentConfig
+ThicknessRingCompCfg.tab.Outerdiam = Outer diameter:
+ThicknessRingCompCfg.tab.Innerdiam = Inner diameter:
+ThicknessRingCompCfg.tab.Wallthickness = Wall thickness:
+ThicknessRingCompCfg.tab.Length = Length:
+ThicknessRingCompCfg.tab.General = General
+ThicknessRingCompCfg.tab.Generalprop = General properties
+
+! TransitionConfig
+TransitionCfg.lbl.Transitionshape = Transition shape:
+TransitionCfg.checkbox.Clipped = Clipped
+TransitionCfg.lbl.Shapeparam = Shape parameter:
+TransitionCfg.lbl.Transitionlength = Transition length:
+TransitionCfg.lbl.Forediam = Fore diameter:
+TransitionCfg.checkbox.Automatic = Automatic
+TransitionCfg.lbl.Aftdiam = Aft diameter:
+TransitionCfg.lbl.Wallthickness = Wall thickness:
+TransitionCfg.checkbox.Filled = Filled
+TransitionCfg.tab.General = General
+TransitionCfg.tab.Generalproperties = General properties
+TransitionCfg.tab.Shoulder = Shoulder
+TransitionCfg.tab.Shoulderproperties = Shoulder properties
+
+! TrapezoidFinSetConfig
+TrapezoidFinSetCfg.lbl.Nbroffins = Number of fins:
+TrapezoidFinSetCfg.lbl.ttip.Nbroffins = The number of fins in the fin set.
+TrapezoidFinSetCfg.lbl.Finrotation = Fin rotation:
+TrapezoidFinSetCfg.lbl.ttip.Finrotation = The angle of the first fin in the fin set.
+TrapezoidFinSetCfg.lbl.Fincant = Fin cant:
+TrapezoidFinSetCfg.lbl.ttip.Fincant =The angle that the fins are canted with respect to the rocket body.
+TrapezoidFinSetCfg.lbl.Rootchord = Root chord:
+TrapezoidFinSetCfg.lbl.Tipchord = Tip chord:
+TrapezoidFinSetCfg.lbl.Height = Height:
+TrapezoidFinSetCfg.lbl.Sweeplength = Sweep length:
+TrapezoidFinSetCfg.lbl.Sweepangle = Sweep angle:
+TrapezoidFinSetCfg.lbl.FincrossSection = Fin cross section:
+TrapezoidFinSetCfg.lbl.Thickness = Thickness:
+TrapezoidFinSetCfg.lbl.Posrelativeto = Position relative to:
+TrapezoidFinSetCfg.lbl.plus = plus
+TrapezoidFinSetCfg.tab.General = General
+TrapezoidFinSetCfg.tab.Generalproperties = General properties
+
+!MotorConfigurationModel
+MotorCfgModel.Editcfg = Edit configurations
+
+! StorageOptionChooser
+StorageOptChooser.lbl.Simdatatostore = Simulated data to store:
+StorageOptChooser.rdbut.Allsimdata = All simulated data
+StorageOptChooser.lbl.longA1 = <html>Store all simulated data.<br>
+StorageOptChooser.lbl.longA2 = This can result in very large files!
+StorageOptChooser.rdbut.Every = Every
+StorageOptChooser.lbl.longB1 = <html>Store plottable values approximately this far apart.<br>
+StorageOptChooser.lbl.longB2 = Larger values result in smaller files.
+StorageOptChooser.lbl.seconds = seconds
+StorageOptChooser.rdbut.Onlyprimfig = Only primary figures
+StorageOptChooser.lbl.longC1 = <html>Store only the values shown in the summary table.<br>
+StorageOptChooser.lbl.longC2 = This results in the smallest files.
+StorageOptChooser.checkbox.Compfile = Compress file
+StorageOptChooser.lbl.UsingComp = Using compression reduces the file size significantly.
+StorageOptChooser.lbl.longD1 = An estimate on how large the resulting file would be with the present options.
+StorageOptChooser.ttip.Saveopt = Save options
+StorageOptChooser.lbl.Estfilesize = Estimated file size:
+StorageOptChooser.lbl.Saveopt = Save options
+
+! ThrustCurveMotorSelectionPanel
+TCMotorSelPan.lbl.Selrocketmotor = Select rocket motor:
+TCMotorSelPan.checkbox.hideSimilar = Hide very similar thrust curves
+
+! PlotDialog
+PlotDialog.title.Flightdataplot = Flight data plot
+PlotDialog.Chart.Simulatedflight = Simulated flight
+PlotDialog.CheckBox.Showdatapoints = Show data points
+PlotDialog.lbl.Chart = Click+drag down+right to zoom in, up+left to zoom out
+
! "main" prefix is used for the main application dialog
main.menu.file.openExample = Open example...
main.menu.file.save = Save
main.menu.file.saveAs = Save as...
+main.menu.file.print = Print...
main.menu.file.close = Close
main.menu.file.quit = Quit
main.menu.help.license = License
main.menu.help.bugReport = Bug report
main.menu.help.debugLog = Debug log
-main.menu.help. = About
-
-
+main.menu.help.about = About
+main.menu.debug = Debug
+main.menu.debug.whatisthismenu = What is this menu?
+main.menu.debug.createtestrocket = Create test rocket
--- /dev/null
+\r
+#\r
+# French base translation file\r
+# Translated by Tripoli France\r
+\r
+\r
+! Set to the name of the current translation file (used for debugging purposes)\r
+debug.currentFile = messages_fr.properties\r
+\r
+! RocketActions\r
+RocketActions.checkbox.Donotaskmeagain = Ne plus me demander\r
+RocketActions.lbl.Youcanchangedefop = Vous pouvez changer le mode opératoire par defaut dans les préferences.\r
+RocketActions.showConfirmDialog.lbl1 = Effacer les simulations sélectionnées?\r
+RocketActions.showConfirmDialog.lbl2 = <html><i>Cette opération n'est pas réversible.</i>\r
+RocketActions.showConfirmDialog.title = Effacer les simulations\r
+RocketActions.DelCompAct.Delete = Effacer\r
+RocketActions.DelCompAct.ttip.Delete = Effacer la pièce sélectionnée.\r
+RocketActions.DelSimuAct.Delete = Effacer\r
+RocketActions.DelSimuAct.ttip.Delete = Effacer la simulation sélectionnée.\r
+RocketActions.DelAct.Delete = Effacer \r
+RocketActions.DelAct.ttip.Delete = Effacer la pièce ou la simulation sélectionnée.\r
+RocketActions.CutAction.Cut = Couper\r
+RocketActions.CutAction.ttip.Cut = Couper cette pièce ou simulation, l'ajouter au presse papier et l'enlever du projet\r
+RocketActions.CopyAct.Copy = Copier\r
+RocketActions.CopyAct.ttip.Copy = Copier les pièces (et les pièces liées) dans le presse papier.\r
+RocketActions.PasteAct.Paste = Coller\r
+RocketActions.PasteAct.ttip.Paste = Coller la pièce ou simulation présente dans le presse papier dans le projet.\r
+RocketActions.EditAct.Edit = Modifier\r
+RocketActions.EditAct.ttip.Edit = Modifier la pièce sélectionnée.\r
+RocketActions.NewStageAct.Newstage = Nouvel étage\r
+RocketActions.NewStageAct.ttip.Newstage = Ajouter un nouvel étage au projet.\r
+RocketActions.ActBoosterstage = Etage Booster\r
+RocketActions.MoveUpAct.Moveup = Monter\r
+RocketActions.MoveUpAct.ttip.Moveup = Monter la pièce.\r
+RocketActions.MoveDownAct.Movedown = Descendre\r
+RocketActions.MoveDownAct.ttip.Movedown = Descendre la pièce.\r
+\r
+! RocketPanel\r
+RocketPanel.FigTypeAct.Sideview = Vue de coté\r
+RocketPanel.FigTypeAct.ttip.Sideview = Vue de coté\r
+RocketPanel.FigTypeAct.Backview = Vue arrière\r
+RocketPanel.FigTypeAct.ttip.Backview = Vue arrière \r
+RocketPanel.lbl.Motorcfg = Configuration Moteur:\r
+RocketPanel.lbl.infoMessage = <html>Cliquer pour sélectionner Shift+cliquer pour sélectionner plusieur Double-cliquer pour modifier Click+déplacer pour déplacer\r
+\r
+\r
+! BasicFrame\r
+BasicFrame.SimpleFileFilter1 = Tous les fichiers fusée (*.ork; *.rkt)\r
+BasicFrame.SimpleFileFilter2 = Fichiers OpenRocket (*.ork)\r
+BasicFrame.SimpleFileFilter3 = Fichiers RockSim (*.rkt)\r
+BasicFrame.tab.Rocketdesign = Projet fusée\r
+BasicFrame.tab.Flightsim = Simulations de vol\r
+BasicFrame.title.Addnewcomp = Ajouter une nouvelle pièce\r
+BasicFrame.item.Openrocketdesign = Ouvrir un projet fusée\r
+BasicFrame.item.Openexamplerocketdesign = Ouvrir un exemple de projet fusée\r
+BasicFrame.item.SavecurRocketdesign = Sauvegarder le projet fusée courant\r
+BasicFrame.item.SavecurRocketdesnewfile = Sauvegarder le projet fusée courant dans un nouveau fichier\r
+BasicFrame.item.Printpart = Imprimer la liste des pièces et les modèles d'ailerons\r
+BasicFrame.item.Closedesign = Fermer le projet fusée courant\r
+BasicFrame.item.Quitprogram = Quitter le programme\r
+BasicFrame.menu.Rocketedt = Modification de la fusée\r
+BasicFrame.dlg.lbl1 = Le projet '\r
+BasicFrame.dlg.lbl2 = ' N'a pas été sauvegardé.\r
+BasicFrame.dlg.lbl3 = Voulez vous le sauvegarder?\r
+BasicFrame.dlg.title = Projet non sauvegardé\r
+\r
+! Labels used in buttons of dialog windows\r
+button.ok = OK\r
+button.cancel = Annuler\r
+button.close = Fermer\r
+\r
+! Common labels used in buttons of dialog windows\r
+dlg.but.ok = Accepter\r
+dlg.but.cancel = Annuler\r
+dlg.but.close = Fermer\r
+\r
+! About Dialog\r
+about.dlg.but.close = Fermer\r
+about.dlg.lbl.translation = Traduit en français par Tripoli France\r
+about.dlg.lbl.transwebsite = http://tripoli.france.free.fr/\r
+\r
+! Bug Report dialog\r
+bugreport.dlg.title = Rapport d'erreurs\r
+bugreport.dlg.but.Sendbugreport = Envoyer un rapport d'erreurs\r
+bugreport.dlg.but.Sendbugreport.Ttip = Envoyer automatiquement un rapport d'erreurs aux developpeurs d'OpenRocket\r
+bugreport.dlg.successmsg1 = Rapport d'erreurs envoyé avec succès.\r
+bugreport.dlg.successmsg2 = Merci d'avoir contribué à l'amélioration d'OpenRocket!\r
+bugreport.dlg.successmsg3 = Rapport d'erreurs envoyé\r
+\r
+! Debug log dialog\r
+debuglogdlg.but.clear = Effacer\r
+debuglogdlg.OpenRocketdebuglog = Fichier debug d'OpenRocket\r
+debuglogdlg.Displayloglines = Afficher les numéros des lignes:\r
+debuglogdlg.Follow = Suivre\r
+debuglogdlg.col.Time = Heure\r
+debuglogdlg.col.Level = Niveau\r
+debuglogdlg.col.Location = Emplacement\r
+debuglogdlg.col.Message = Message\r
+debuglogdlg.lbl.Loglinenbr = Numéro de la ligne:\r
+debuglogdlg.lbl.Time = Heure:\r
+debuglogdlg.lbl.Level = Niveau:\r
+\r
+\r
+! Edit Motor configuration dialog\r
+edtmotorconfdlg.but.removemotor = Enlever le moteur\r
+edtmotorconfdlg.but.Selectmotor = Choisir le moteur\r
+edtmotorconfdlg.but.Removeconfiguration = Supprimer la configuration\r
+edtmotorconfdlg.but.Newconfiguration = Nouvelle configuration\r
+edtmotorconfdlg.lbl.Motormounts = <html><b>Portes moteur:</b>\r
+edtmotorconfdlg.title.Editmotorconf = Changer la configuration moteur\r
+edtmotorconfdlg.selectcomp = <html>Choisir les pièces utilisées par le porte moteur:\r
+edtmotorconfdlg.lbl.Motorconfig = <html><b>Configurations moteur:</b>\r
+edtmotorconfdlg.lbl.Configname = Nom de la configuration:\r
+edtmotorconfdlg.lbl.Leavenamedefault = Laisser le champ vide par défaut.\r
+\r
+! Example design dialog\r
+exdesigndlg.but.open = Ouvrir\r
+\r
+! Print panel dialog\r
+printdlg.but.saveaspdf = Sauvegarder en PDF\r
+printdlg.but.preview = Prévisualisation\r
+printdlg.but.settings = Configuration\r
+\r
+! Material edit panel\r
+matedtpan.but.new = Nouveau\r
+matedtpan.but.edit = Editer\r
+matedtpan.but.delete = Effacer\r
+matedtpan.but.revertall = Revenir aux valeurs précédente\r
+matedtpan.col.Material = Matériaux\r
+matedtpan.col.Type = Type\r
+matedtpan.col.Density = Densité\r
+matedtpan.col.but.ttip.New = Ajouter un nouveau matériau\r
+matedtpan.title.Addcustmaterial = Ajouter un matériau personnalisé\r
+matedtpan.but.ttip.edit = Modifier un matériau existant\r
+matedtpan.title.Editmaterial = Modifier un matériau\r
+matedtpan.title2.Editmaterial = Les matériaux prédéfini ne peuvent pas être modifiés.\r
+matedtpan.but.ttip.delete = Effacer un matériau personnalisé\r
+matedtpan.but.ttip.revertall = Effacer tous les materiaux personnalisés\r
+matedtpan.title.Deletealluser-defined = Effacer tous les matériaux personalisés?\r
+matedtpan.title.Revertall = Revenir aux valeurs précédente?\r
+matedtpan.lbl.edtmaterials = <html><i>Modifier les matériaux n'affectera pas les projets fusée existant.</i>\r
+\r
+!MaterialModel\r
+MaterialModel.title.Material = Matériau\r
+MaterialModel.title.Defcustmat = Définir un matériau personnalisé\r
+\r
+\r
+! Preference dialog\r
+pref.dlg.but.add = Ajouter\r
+pref.dlg.but.reset = Réinitialiser\r
+pref.dlg.but.checknow = Vérifier maintenant\r
+pref.dlg.but.defaultmetric = Système métrique\r
+pref.dlg.but.defaultimperial = Système imperial\r
+pref.dlg.title.Preferences = Préférences \r
+pref.dlg.tab.Units = Unités\r
+pref.dlg.tab.Defaultunits = Unités par défaut\r
+pref.dlg.tab.Materials = Matériaux\r
+pref.dlg.tab.Custommaterials = Matériaux personnalisé\r
+pref.dlg.tab.Options = Options\r
+pref.dlg.tab.Miscellaneousoptions = Autres options\r
+pref.dlg.lbl.Positiontoinsert = Position pour insérer des composants internes:\r
+pref.dlg.lbl.Confirmdeletion = Confirmer l'effacement des simulations:\r
+pref.dlg.lbl.User-definedthrust = Courbes de poussée personnalisées:\r
+pref.dlg.Allthrustcurvefiles = Tous les fichiers de courbes de poussée (*.eng; *.rse; *.zip; répertoires)\r
+pref.dlg.RASPfiles = Fichiers moteur RASP (*.eng)\r
+pref.dlg.RockSimfiles = Fichiers moteur RockSim (*.rse)\r
+pref.dlg.ZIParchives = Archives ZIP (*.zip)\r
+pref.dlg.checkbox.Checkupdates = Rechercher les mises à jour au démarrage\r
+pref.dlg.ttip.Checkupdatesnow = Recherchez les mises à jour maintenant\r
+pref.dlg.lbl.Selectprefunits = Choisissez vos unités favorites:\r
+pref.dlg.lbl.Rocketdimensions = Dimensions de la fusée:\r
+pref.dlg.lbl.Linedensity = Epaisseur des lignes:\r
+pref.dlg.lbl.Motordimensions = Dimensions du moteur:\r
+pref.dlg.lbl.Surfacedensity = Densité de la Surface:\r
+pref.dlg.lbl.Distance = Distance:\r
+pref.dlg.lbl.Bulkdensity = Bulk density:\r
+pref.dlg.lbl.Velocity = Vélocité:\r
+pref.dlg.lbl.Surfaceroughness = Rugosité de la Surface:\r
+pref.dlg.lbl.Acceleration = Accélération:\r
+pref.dlg.lbl.Area = Aire:\r
+pref.dlg.lbl.Mass = Masse:\r
+pref.dlg.lbl.Angle = Angle:\r
+pref.dlg.lbl.Force = Force:\r
+pref.dlg.lbl.Rollrate = Taux de roulis:\r
+pref.dlg.lbl.Totalimpulse = Impulsion totale:\r
+pref.dlg.lbl.Temperature = Température:\r
+pref.dlg.lbl.Momentofinertia = Moment d'inertie:\r
+pref.dlg.lbl.Pressure = Pression:\r
+pref.dlg.lbl.Stability = Stabilité:\r
+pref.dlg.lbl.effect1 = Les changements prendront effet la prochaine fois que vous ouvrirez une fenêtre.\r
+pref.dlg.lbl.Checkingupdates = Recherche des mises à jour...\r
+pref.dlg.lbl.msg1 = Une erreur est survenue durant la communication avec le serveur.\r
+pref.dlg.lbl.msg2 = Incapable de récupérer les informations de mise à jour\r
+pref.dlg.lbl.msg3 = Vous utilisez la dernière version d'OpenRocket.\r
+pref.dlg.lbl.msg4 = Pas de mises à jour disponible\r
+\r
+! Simulation edit dialog\r
+simedtdlg.but.runsimulation = Lancer la simulation\r
+simedtdlg.but.resettodefault = Restaurer les paramètres par défaut\r
+simedtdlg.but.add = Ajouter\r
+simedtdlg.but.remove = Enlever\r
+simedtdlg.title.Editsim = Modifier la simulation\r
+simedtdlg.lbl.Simname = Nom de la simulation:\r
+simedtdlg.tab.Launchcond = Conditions de lancement\r
+simedtdlg.tab.Simopt = Options de simulation\r
+simedtdlg.tab.Plotdata = Tracer les données\r
+simedtdlg.tab.Exportdata = Exporter les données\r
+simedtdlg.lbl.Motorcfg = Configuration moteur:\r
+simedtdlg.lbl.ttip.Motorcfg = Choisir la configuration moteur à utiliser.\r
+simedtdlg.combo.ttip.motorconf = Choisir la configuration moteur à utiliser.\r
+simedtdlg.lbl.Wind = Vent\r
+simedtdlg.lbl.Averwindspeed = Vitesse moyenne du vent:\r
+simedtdlg.lbl.ttip.Averwindspeed = Vitesse moyenne du vent par rapport au sol.\r
+simedtdlg.lbl.Stddeviation = Dérive standard:\r
+simedtdlg.lbl.ttip.Stddeviation = <html>La dérive standard de la vitesse du vent.<br>La vitesse du vent est le double de l'écart-type de la moyenne dans 95% des cas.\r
+simedtdlg.lbl.Turbulenceintensity = Intensité de la turbulence:\r
+simedtdlg.lbl.ttip.Turbulenceintensity1 = <html>L'intensité de la turbulence résulte de la division de la dérive par la vitesse moyenne de vent.<br>\r
+simedtdlg.lbl.ttip.Turbulenceintensity2 = Les valeurs typiques vont de \r
+simedtdlg.lbl.ttip.Turbulenceintensity3 = Ã \r
+simedtdlg.border.Atmoscond = Conditions atmosphérique\r
+simedtdlg.checkbox.InterStdAtmosphere = Utiliser les paramètres de l'Atmosphère Standard\r
+simedtdlg.checkbox.ttip.InterStdAtmosphere1 = <html>Sélectionner pour utiliser les paramètres de l'Atmosphère Standard.<br>Ce modèle à une température de\r
+simedtdlg.checkbox.ttip.InterStdAtmosphere2 = et une pression de \r
+simedtdlg.checkbox.ttip.InterStdAtmosphere3 = au niveau de la mer.\r
+simedtdlg.lbl.Temperature = Température:\r
+simedtdlg.lbl.ttip.Temperature = Température du site de lancement.\r
+simedtdlg.lbl.Pressure = Pression:\r
+simedtdlg.lbl.ttip.Pressure = Pression atmosphérique du site de lancement.\r
+simedtdlg.lbl.Launchsite = Site de lancement\r
+simedtdlg.lbl.Latitude = Latitude:\r
+simedtdlg.lbl.ttip.Latitude = <html>La latitude du site de lancement affecte l'attraction gravitationnelle de la Terre.<br>> Les valeurs positives sont dans l'hémisphère Nord, les valeurs négatives sur l'hémisphère Sud.\r
+simedtdlg.lbl.Altitude = Altitude:\r
+simedtdlg.lbl.ttip.Altitude = <html>Altitude du site de lancement par rapport au niveau de la mer.<br>Cela affecte la position de la fusée dans le modèle atmosphérique.\r
+simedtdlg.border.Launchrod = Rampe de lancement\r
+simedtdlg.lbl.Length = Longueur:\r
+simedtdlg.lbl.ttip.Length = Longueur de la rampe.\r
+simedtdlg.lbl.Angle = Angle:\r
+simedtdlg.lbl.ttip.Angle = Angle de la rampe de lancement par rapport à la verticale.\r
+simedtdlg.lbl.Direction = Direction:\r
+simedtdlg.lbl.ttip.Direction1 = <html>Direction de la rampe de lance par rapport au vent.<br>\r
+simedtdlg.lbl.ttip.Direction2 = = Face au vent,\r
+simedtdlg.lbl.ttip.Direction3 = = vent arrière.\r
+simedtdlg.border.Simopt = Options de simulation\r
+simedtdlg.lbl.Calcmethod = Méthode de calcul:\r
+simedtdlg.lbl.ttip.Calcmethod = <html>The Extended Barrowman method calculates aerodynamic forces according <br>to the Barrowman equations extended to accommodate more components.\r
+simedtdlg.lbl.ExtBarrowman = Barrowman étendu\r
+simedtdlg.lbl.Simmethod = Méthode de Simulation:\r
+simedtdlg.lbl.ttip.Simmethod1 = <html>Le simulateur de six degrés de liberté permet la liberté totale de fusée en vol.<br>\r
+simedtdlg.lbl.ttip.Simmethod2 = Integration is performed using a 4<sup>th</sup> order Runge-Kutta 4 numerical integration.\r
+simedtdlg.lbl.Timestep = Règlage du pas de temps:\r
+simedtdlg.lbl.ttip.Timestep1 = <html>Le temps entre les étapes de la simulation.<br>Avec un pas de temps plus petit la simulation est plus lente mais également plus précise.<br>\r
+simedtdlg.lbl.ttip.Timestep2 = The 4<sup>th</sup> order simulation method is quite accurate with a time step of\r
+simedtdlg.but.ttip.resettodefault = Réinitialiser le pas de temps à sa valeur par défaut (\r
+simedtdlg.border.Simlist = Simulator listeners\r
+simedtdlg.txt.longA1 = <html><i>Simulation listeners</i> is an advanced feature that allows user-written code to listen to and interact with the simulation. \r
+simedtdlg.txt.longA2 = For details on writing simulation listeners, see the OpenRocket technical documentation.\r
+simedtdlg.lbl.Curlist = Current listeners:\r
+simedtdlg.lbl.Addsimlist = Add simulation listener\r
+simedtdlg.lbl.Noflightdata = Aucune donnée de vol disponible.\r
+simedtdlg.lbl.runsimfirst = S'il vous plait faites tourner la simulation d'abord.\r
+simedtdlg.chart.Simflight = Vol simulé\r
+simedtdlg.dlg.Simres = Résultats de la simulation\r
+\r
+\r
+\r
+\r
+! Simulation Panel\r
+simpanel.but.newsimulation = Nouvelle simulation\r
+simpanel.but.editsimulation = Modifier la simulation\r
+simpanel.but.runsimulations = Lancer les simulations\r
+simpanel.but.deletesimulations = Effacer les simulations\r
+simpanel.but.plotexport = Tracer / exporter\r
+simpanel.but.ttip.newsimulation = Ajouter une nouvelle simulation\r
+simpanel.but.ttip.editsim = Modifier la simulation sélectionnée\r
+simpanel.but.ttip.runsimu = Recommencer la simulation sélectionnée\r
+simpanel.but.ttip.deletesim = Effacer les simulations sélectionnées\r
+simpanel.checkbox.donotask = Ne plus me demander\r
+simpanel.lbl.defpref = Vous pouvez changer le mode opératoire par défaut dans préferences.\r
+simpanel.dlg.lbl.DeleteSim1 = Effacer les simulations sélectionnées?\r
+simpanel.dlg.lbl.DeleteSim2 = <html><i>Cette opération n'est pas réversible.</i>\r
+simpanel.dlg.lbl.DeleteSim3 = Effacer les simulations\r
+simpanel.col.Name = Nom\r
+simpanel.col.Motors = Moteurs\r
+simpanel.col.Apogee = Apogée\r
+simpanel.col.Maxvelocity = Vélocité Max.\r
+simpanel.col.Maxacceleration = Accélération Max.\r
+simpanel.col.Timetoapogee = Temps pour atteindre l'apogée\r
+simpanel.col.Flighttime = Temps de vol\r
+\r
+! SimulationRunDialog\r
+SimuRunDlg.title.RunSim = Simulations en cour...\r
+SimuRunDlg.lbl.Running = En cour ...\r
+SimuRunDlg.lbl.Simutime = Temps de simulation:\r
+SimuRunDlg.lbl.Altitude = Altitude:\r
+SimuRunDlg.lbl.Velocity = Vélocité:\r
+SimuRunDlg.msg.Unabletosim = Impossible de simuler:\r
+SimuRunDlg.msg.errorOccurred = Une erreur s'est produite durant la simulation:\r
+SimuRunDlg.msg.AnException1 = Une exception s'est produite lors de la simulation:\r
+SimuRunDlg.msg.AnException2 = S'il vous plaît faites un rapport d'erreurs avec les détails ci-dessous.\r
+SimuRunDlg.msg.AssertionError1 = Une erreur de calcul s'est produite lors de la simulation.\r
+SimuRunDlg.msg.AssertionError2 = S'il vous plaît faites un rapport d'erreurs avec les détails ci-dessous.\r
+SimuRunDlg.msg.unknownerror1 = Une erreur inconue s'est produite lors de la simulation.\r
+SimuRunDlg.msg.unknownerror2 = Le programme peut être instable, vous devez enregistrer toutes vos créations et redémarrez OpenRocket maintenant!\r
+\r
+\r
+! SimulationExportPanel\r
+SimExpPan.desc = Fichiers dont les données sont séparées par une virgule (*.csv)\r
+SimExpPan.border.Vartoexport = Variables à exporter\r
+SimExpPan.but.Selectall = Tout sélectionner\r
+SimExpPan.but.Selectnone = Ne rien sélectionner\r
+SimExpPan.border.Fieldsep = Séparateur de champ\r
+SimExpPan.lbl.Fieldsepstr = Séparateur de champ:\r
+SimExpPan.lbl.longA1 = <html>La chaîne utilisée pour séparer les champs dans le fichier exporté.<br>\r
+SimExpPan.lbl.longA2 = Utiliser ',' pour un fichier (CSV).\r
+SimExpPan.checkbox.Includesimudesc = Inclure la description de la simulation\r
+SimExpPan.checkbox.ttip.Includesimudesc = Inclure un commentaire au début du fichier pour décrire la simulation.\r
+SimExpPan.border.Comments = Commentaires\r
+SimExpPan.checkbox.Includefielddesc = Inclure les descriptions des champs\r
+SimExpPan.checkbox.ttip.Includefielddesc = Inclure une ligne de commentaire avec la description des variables exportées.\r
+SimExpPan.checkbox.Incflightevents = Inclure les évenements de vol\r
+SimExpPan.checkbox.ttip.Incflightevents = Inclure une ligne de commentaire pour chaque évènement de vol.\r
+SimExpPan.lbl.Commentchar = Symbole pour les commentaires:\r
+SimExpPan.lbl.ttip.Commentchar = Le symbole utilisé pour une ligne de commentaires.\r
+SimExpPan.but.Exporttofile = Exporter dans un fichier...\r
+\r
+! MotorPlot\r
+MotorPlot.title.Motorplot = Courbe du moteur\r
+MotorPlot.but.Select = Selection\r
+MotorPlot.Chart.Motorthrustcurve = Courbe de poussée moteur\r
+MotorPlot.Chart.Time = Temps / s\r
+MotorPlot.Chart.Thrust = Poussée / N\r
+MotorPlot.txt.Designation = Désignation:\r
+MotorPlot.txt.Manufacturer = Manufacturer:\r
+MotorPlot.txt.Type = Type:\r
+MotorPlot.txt.Delays = Retards:\r
+MotorPlot.txt.Comment = Commentaires:\n\r
+\r
+\r
+\r
+! Simulation plot panel\r
+simplotpanel.lbl.Presetplotconf = Prédéfinir les paramètres du tracé:\r
+simplotpanel.lbl.Xaxistype = Axe des X:\r
+simplotpanel.lbl.Unit = Unités:\r
+simplotpanel.lbl.Yaxistypes = Axe des Y:\r
+simplotpanel.lbl.Flightevents = Evénements du vol:\r
+simplotpanel.but.All = Tous\r
+simplotpanel.but.None = Aucun\r
+simplotpanel.but.NewYaxisplottype = Nouveau type de tracé de l'axe Y\r
+simplotpanel.but.Plotflight = Tracer le vol\r
+simplotpanel.lbl.Axis = Axes:\r
+simplotpanel.but.ttip.Removethisplot = Effacer le tracé\r
+simplotpanel.Desc = The data will be plotted in time order even if the X axis type is not time.\r
+simplotpanel.OptionPane.lbl1 = Un maximum de 15 tracés est permis. \r
+simplotpanel.OptionPane.lbl2 = Impossible d'ajouter le tracé\r
+\r
+\r
+\r
+! Component add buttons\r
+compaddbuttons.Bodycompandfinsets = Pièces du corps et ailerons\r
+compaddbuttons.Nosecone = Nez de\nfusée\r
+compaddbuttons.Bodytube = Tube du\ncorps\r
+compaddbuttons.Transition = Transition\r
+compaddbuttons.Trapezoidal = Trapézoïdale\r
+compaddbuttons.Elliptical = Elliptique\r
+compaddbuttons.Freeform = Forme libre\r
+compaddbuttons.Launchlug = Tube de\nguidage\r
+compaddbuttons.Innercomponent = Pièces internes\r
+compaddbuttons.Innertube = Tube interne\r
+compaddbuttons.Coupler = Coupleur\r
+compaddbuttons.Centeringring = Anneau\nde centrage\r
+compaddbuttons.Bulkhead = Cloison\r
+compaddbuttons.Engineblock = Bague de\nrétention\nmoteur\r
+compaddbuttons.Massobjects = Pièces pleines\r
+compaddbuttons.Parachute = Parachute\r
+compaddbuttons.Streamer = Banderole\r
+compaddbuttons.Shockcord = Cordon\namortisseur\r
+compaddbuttons.Masscomponent = Poids\r
+compaddbuttons.Donotaskmeagain = Ne plus me poser la question\r
+compaddbuttons.Selectcomppos = Position de la pièce\r
+compaddbuttons.lbl.Youcanchange = Vous pouvez modifier le fonctionnement par défaut dans les préférences.\r
+compaddbuttons.lbl.insertcomp = Insérez la pièce après l'élément actuel ou en tant que dernier élément?\r
+compaddbuttons.askPosition.Inserthere = Ajouter ici\r
+compaddbuttons.askPosition.Addtotheend = Ajouter à la fin\r
+compaddbuttons.askPosition.Cancel = Annuler\r
+\r
+! Component Analysis Dialog\r
+componentanalysisdlg.Componentanalysis = Analyse pièce\r
+componentanalysisdlg.lbl.winddir = Direction du vent:\r
+componentanalysisdlg.TitledBorder.warnings = Avertissements:\r
+componentanalysisdlg.ToggleBut.worst = Pire\r
+componentanalysisdlg.lbl.angleofattack = Angle d'attaque:\r
+componentanalysisdlg.lbl.machnumber = Mach number:\r
+componentanalysisdlg.lbl.rollrate = Taux de roulis:\r
+componentanalysisdlg.lbl.activestages = Etages actif:\r
+componentanalysisdlg.lbl.motorconf = Configuration moteur:\r
+componentanalysisdlg.TabStability.Col.Component = Pièce\r
+componentanalysisdlg.TabStability = Stabilité\r
+componentanalysisdlg.TabStability.ttip = Information de stabilité\r
+componentanalysisdlg.dragTableModel.Col.Component = Pièce\r
+componentanalysisdlg.dragTableModel.Col.Pressure = <html>Pression C<sub>D</sub>\r
+componentanalysisdlg.dragTableModel.Col.Base = <html>Base C<sub>D</sub>\r
+componentanalysisdlg.dragTableModel.Col.friction = <html>Friction C<sub>D</sub>\r
+componentanalysisdlg.dragTableModel.Col.total = <html>Total C<sub>D</sub>\r
+componentanalysisdlg.dragTabchar = Caractéristiques de traînée\r
+componentanalysisdlg.dragTabchar.ttip = Caractéristiques de traînée\r
+componentanalysisdlg.rollTableModel.Col.component = Pièce\r
+componentanalysisdlg.rollTableModel.Col.rollforc = Roll forcing coefficient\r
+componentanalysisdlg.rollTableModel.Col.rolldamp = Roll damping coefficient\r
+componentanalysisdlg.rollTableModel.Col.total = <html>Total C<sub>l</sub>\r
+componentanalysisdlg.rollTableModel = Roll dynamics\r
+componentanalysisdlg.rollTableModel.ttip = Roll dynamics\r
+componentanalysisdlg.println.closingmethod = Méthode de clôture appelée:\r
+componentanalysisdlg.println.settingnam = SETTING NAN VALUES\r
+componentanalysisdlg.lbl.reflenght = Longueur de référence: \r
+componentanalysisdlg.lbl.refarea = Aire de référence: \r
+!componentanalysisdlg.but.close =Fermer\r
+\r
+! Custom Material dialog\r
+custmatdlg.title.Custommaterial = Matériau personalisé\r
+custmatdlg.lbl.Materialname = Nom du matériau: \r
+custmatdlg.lbl.Materialtype = Type de matériau :\r
+custmatdlg.lbl.Materialdensity = Densité du matériau:\r
+custmatdlg.checkbox.Addmaterial = Ajouter la pièce dans la base de données\r
+\r
+\r
+! Ring Component Config\r
+ringcompcfg.OuterRadius = Diamètre extérieur\r
+ringcompcfg.Automatic = Automatique\r
+ringcompcfg.InnerRadius = Diamètre intérieur\r
+ringcompcfg.Thickness = Epaisseur\r
+ringcompcfg.Length = Longueur\r
+ringcompcfg.Positionrelativeto = Position relative à :\r
+ringcompcfg.plus = plus\r
+!ringcompcfg.PositionValue = PositionValue\r
+ringcompcfg.Radialdistance = Rayon:\r
+ringcompcfg.Distancefrom = Distance de l'axe central de la fusée\r
+ringcompcfg.Radialdirection = Azimut\r
+ringcompcfg.radialdirectionfrom = Sens par rapport à l'axe central de la fusée\r
+ringcompcfg.but.Reset = Réinitialisation\r
+ringcompcfg.but.Resetcomponant = Réinitialiser la pièce à l'axe de la fusée\r
+\r
+! Body Tube Config\r
+BodyTubecfg.lbl.Bodytubelength = Longueur du tube:\r
+BodyTubecfg.lbl.Outerdiameter = Diamètre externe:\r
+BodyTubecfg.lbl.Innerdiameter = Diamètre interne:\r
+BodyTubecfg.lbl.Wallthickness = Epaisseur des parois:\r
+BodyTubecfg.tab.General = Général\r
+BodyTubecfg.tab.Generalproperties = Propriétés générales\r
+BodyTubecfg.tab.Motor = Moteur\r
+BodyTubecfg.tab.Motormountconf = Configuration porte moteur\r
+BodyTubecfg.checkbox.Automatic = Automatique\r
+!BodyTubecfg.checkbox.Filled = Remplie\r
+\r
+! FinSetConfig\r
+FinSetConfig.tab.Fintabs = Fin tabs\r
+FinSetConfig.tab.Through-the-wall = Ailerons traversant le fuselage\r
+FinSetConfig.but.Converttofreeform = Convertir en forme libre\r
+FinSetConfig.but.Converttofreeform.ttip = Convertir ce jeux d'ailerons en forme libre\r
+FinSetConfig.Convertfinset = Convertir le jeux d'ailerons\r
+FinSetConfig.but.Splitfins = Séparer les ailerons\r
+FinSetConfig.but.Splitfins.ttip = Diviser le jeux d'ailerons en aileron indépendant\r
+FinSetConfig.lbl.Through-the-wall = Ailerons traversant le fuselage:\r
+FinSetConfig.lbl.Tablength = Tab length:\r
+FinSetConfig.ttip.Tablength = The length of the fin tab.\r
+FinSetConfig.lbl.Tabheight = Tab height:\r
+FinSetConfig.ttip.Tabheight = The spanwise height of the fin tab.\r
+FinSetConfig.lbl.Tabposition = Tab position:\r
+FinSetConfig.ttip.Tabposition = The position of the fin tab.\r
+FinSetConfig.lbl.relativeto = relative à \r
+\r
+! MotorDatabaseLoadingDialog\r
+MotorDbLoadDlg.title = Chargement des moteurs\r
+MotorDbLoadDlg.Loadingmotors = Chargement des moteurs...\r
+\r
+! RocketConfig\r
+RocketCfg.lbl.Designname = Nom du projet:\r
+RocketCfg.lbl.Designer = Concepteur:\r
+RocketCfg.lbl.Comments = Commentaires:\r
+RocketCfg.lbl.Revisionhistory = Historique des modifications:\r
+RocketCfg.lbl.Material = Matériaux:\r
+\r
+! ShockCordConfig\r
+ShockCordCfg.lbl.Shockcordlength = Longueur du cordon amortisseur\r
+\r
+! RocketComponentConfig\r
+RocketCompCfg.lbl.Componentname = Nom de la pièce:\r
+RocketCompCfg.ttip.Thecomponentname = Le nom de la pièce.\r
+RocketCompCfg.tab.Override = Forcer la valeur\r
+RocketCompCfg.tab.MassandCGoverride = Forçage de la Masse et du CG\r
+RocketCompCfg.tab.Figure = Forme\r
+RocketCompCfg.tab.Figstyleopt = Options de la forme\r
+RocketCompCfg.tab.Comment = Commentaires\r
+RocketCompCfg.tab.Specifyacomment = Commentaires concernant la pièce\r
+RocketCompCfg.lbl.Mass = Masse:\r
+RocketCompCfg.lbl.Componentmass = Masse de la pièce:\r
+RocketCompCfg.lbl.overriddento = (forcé à \r
+RocketCompCfg.lbl.overriddenby = (forcé par\r
+RocketCompCfg.lbl.Componentmaterial = Matériaux composant la pièce:\r
+RocketCompCfg.lbl.Componentfinish = Finition de la pièce:\r
+RocketCompCfg.lbl.ttip.componentmaterialaffects = Les matériaux utilisés pour la pièce affectent le poid de la pièce.\r
+RocketCompCfg.combo.ttip.componentmaterialaffects = Les matériaux utilisés pour la pièce affectent le poid de la pièce.\r
+RocketCompCfg.lbl.longA1 = <html>La finition de la pièce affecte l'aérodynamisme de la pièce.<br>\r
+RocketCompCfg.lbl.longA2 = La valeur indiquée est la hauteur moyenne de la rugosité de la surface.\r
+RocketCompCfg.but.Setforall = Appliquer à tous\r
+RocketCompCfg.but.ttip.Setforall = Régler la finition pour tous les composants de la fusée.\r
+RocketCompCfg.lbl.Overridemassorcenter = Forcer la masse ou le centre de gravité du \r
+RocketCompCfg.checkbox.Overridemass = Forcer la masse:\r
+RocketCompCfg.checkbox.Overridecenterofgrav = Forcer le centre de gravité:\r
+RocketCompCfg.checkbox.OverridemassandCG = Forcer la masse et le centre de gravité de tous les sous composants\r
+RocketCompCfg.lbl.longB1 = <html>Le forçage de la masse n'inclus pas le ou les moteurs.<br>\r
+RocketCompCfg.lbl.longB2 = Le centre de gravité est mesuré à partir de l'extrémité avant de la fusée\r
+RocketCompCfg.lbl.Commentsonthe = Commentaires à propos du \r
+RocketCompCfg.lbl.Figurestyle = Modèle de forme:\r
+RocketCompCfg.lbl.Componentcolor = Couleur de la pièce:\r
+RocketCompCfg.lbl.Choosecolor = Choisir la couleur\r
+RocketCompCfg.checkbox.Usedefaultcolor = Utiliser la couleur par défaut\r
+RocketCompCfg.lbl.Complinestyle = Style de lignes pour les pièces:\r
+RocketCompCfg.but.Saveasdefstyle = Sauver le modèle par défaut\r
+RocketCompCfg.lbl.Diameter = Diamètre:\r
+RocketCompCfg.lbl.Length = Longueur:\r
+RocketCompCfg.lbl.Thickness = Epaisseur:\r
+RocketCompCfg.checkbox.Endcapped = Arrière clos \r
+RocketCompCfg.ttip.Endcapped = Whether the end of the shoulder is capped.\r
+RocketCompCfg.title.Noseconeshoulder = accotement du cône\r
+RocketCompCfg.title.Aftshoulder = accotement arrière\r
+RocketCompCfg.border.Foreshoulder = Fore shoulder \r
+!RocketCompCfg.lbl.Length = Length:\r
+\r
+! BulkheadConfig\r
+BulkheadCfg.tab.Radius = Rayon:\r
+BulkheadCfg.tab.Thickness = Epaisseur:\r
+BulkheadCfg.tab.General = Général\r
+BulkheadCfg.tab.Generalproperties = Propriétés générales\r
+\r
+!CenteringRingConfig\r
+CenteringRingCfg.tab.Outerdiam = Diamètre externe:\r
+CenteringRingCfg.tab.Innerdiam = Diamètre interne:\r
+CenteringRingCfg.tab.Thickness = Epaisseur:\r
+CenteringRingCfg.tab.General = Général\r
+CenteringRingCfg.tab.Generalproperties = Propriétés Générales\r
+\r
+!ComponentConfigDialog\r
+ComponentCfgDlg.configuration = configuration\r
+ComponentCfgDlg.Modify = Modifier\r
+\r
+!EllipticalFinSetConfig\r
+EllipticalFinSetCfg.Nbroffins = Nombre d'ailerons:\r
+EllipticalFinSetCfg.Rotation = Rotation:\r
+EllipticalFinSetCfg.Fincant = Inclinaison de l'aileron:\r
+EllipticalFinSetCfg.Rootchord = Emplanture:\r
+EllipticalFinSetCfg.Height = Hauteur:\r
+EllipticalFinSetCfg.Positionrelativeto = Position relative à :\r
+EllipticalFinSetCfg.plus = plus\r
+EllipticalFinSetCfg.FincrossSection = Coupe de l'aileron:\r
+EllipticalFinSetCfg.Thickness = Epaisseur:\r
+EllipticalFinSetCfg.General = Général\r
+EllipticalFinSetCfg.Generalproperties = Propriétés Générales\r
+EllipticalFinSetCfg.ttip.Fincant = Angle d'inclinaison des ailerons par rapport au corps de la fusée\r
+\r
+!FreeformFinSetConfig\r
+FreeformFinSetCfg.tab.General = Général\r
+FreeformFinSetCfg.tab.ttip.General = Propriétés générales\r
+FreeformFinSetCfg.tab.Shape = Forme\r
+FreeformFinSetCfg.tab.ttip.Finshape = Forme de l'aileron\r
+FreeformFinSetCfg.lbl.Numberoffins = Nombre d'ailerons:\r
+FreeformFinSetCfg.lbl.Finrotation = Rotation des ailerons:\r
+FreeformFinSetCfg.lbl.Fincant = Inclinaison de l'aileron:\r
+FreeformFinSetCfg.lbl.ttip.Fincant = angle d'inclinaison des ailerons par rapport au corps de la fusée.\r
+FreeformFinSetCfg.lbl.Posrelativeto = Position par rapport à :\r
+FreeformFinSetCfg.lbl.plus = plus\r
+FreeformFinSetCfg.lbl.FincrossSection = Coupe de l'aileron:\r
+FreeformFinSetCfg.lbl.Thickness = Epaisseur:\r
+\r
+!InnerTubeConfig\r
+InnerTubeCfg.tab.Motor = Moteur\r
+InnerTubeCfg.tab.ttip.Motor = Configuration du porte moteur\r
+InnerTubeCfg.tab.Cluster = Cluster\r
+InnerTubeCfg.tab.ttip.Cluster = Configuration du cluster\r
+InnerTubeCfg.tab.Radialpos = Position circulaire\r
+InnerTubeCfg.tab.ttip.Radialpos = Position circulaire\r
+InnerTubeCfg.lbl.Selectclustercfg = Choisir la configuration du cluster:\r
+InnerTubeCfg.lbl.TubeSep = Séparation du tube:\r
+InnerTubeCfg.lbl.ttip.TubeSep = La Séparation des tubes, 1.0 = chacun se touche\r
+InnerTubeCfg.lbl.Rotation = Rotation:\r
+InnerTubeCfg.lbl.ttip.Rotation = Angle de rotation du cluster\r
+InnerTubeCfg.lbl.Rotangle = Angle de rotation de la configuration du cluster\r
+InnerTubeCfg.but.Splitcluster = Séparer le cluster\r
+InnerTubeCfg.lbl.longA1 = <html>séparer le cluster en pièces distinctes.<br>\r
+InnerTubeCfg.lbl.longA2 = Cela duplique également tous les composants rattacher à ce tube interne.\r
+InnerTubeCfg.but.Resetsettings = Réinitialiser les réglages\r
+InnerTubeCfg.but.ttip.Resetsettings = Réinitialiser la séparation et la rotation aux valeurs par défauts\r
+\r
+! LaunchLugConfig\r
+LaunchLugCfg.lbl.Length = Longueur:\r
+LaunchLugCfg.lbl.Outerdiam = Diamètre externe:\r
+LaunchLugCfg.lbl.Innerdiam = Diamètre interne:\r
+LaunchLugCfg.lbl.Thickness = Epaisseur:\r
+LaunchLugCfg.lbl.Radialpos = Position circulaire:\r
+LaunchLugCfg.lbl.Posrelativeto = Position relative à :\r
+LaunchLugCfg.lbl.plus = plus\r
+LaunchLugCfg.tab.General = Général\r
+LaunchLugCfg.tab.Generalprop = Propriétés Générales\r
+\r
+! MassComponentConfig\r
+MassComponentCfg.lbl.Mass = Masse\r
+MassComponentCfg.lbl.Length = Longueur\r
+MassComponentCfg.lbl.Diameter = Diamètre\r
+MassComponentCfg.lbl.PosRelativeto = Position relative à :\r
+MassComponentCfg.lbl.plus = plus\r
+MassComponentCfg.tab.General = Général\r
+MassComponentCfg.tab.ttip.General = Propriétés Générales\r
+MassComponentCfg.tab.Radialpos = Position sur le périmètre\r
+MassComponentCfg.tab.ttip.Radialpos = Configuration de la position sur le périmètre\r
+MassComponentCfg.lbl.Radialdistance = Rayon:\r
+MassComponentCfg.lbl.Radialdirection = Azimut:\r
+MassComponentCfg.but.Reset = Réinitialiser\r
+\r
+! MotorConfig\r
+MotorCfg.checkbox.compmotormount = Cette pièce est un porte moteur\r
+MotorCfg.lbl.Motorcfg = Configuration du moteur:\r
+MotorCfg.but.New = Nouveau\r
+MotorCfg.lbl.Currentmotor = Moteur actuel:\r
+MotorCfg.lbl.Motoroverhang = Surplomb du moteur:\r
+MotorCfg.lbl.Ignitionat = Allumage à :\r
+MotorCfg.lbl.plus = plus\r
+MotorCfg.lbl.seconds = secondes\r
+MotorCfg.lbl.longA1 = Le projet actuel n'a qu'un étage.\r
+MotorCfg.lbl.longA2 = Des étages peuvent-être ajoutés en cliquant \"Nouvel étage\".\r
+MotorCfg.lbl.longB1 = Le projet actuel a\r
+MotorCfg.lbl.longB2 = étage(s).\r
+MotorCfg.but.Selectmotor = Choisir le moteur\r
+MotorCfg.but.Removemotor = Enlever le moteur\r
+MotorCfg.lbl.motorLabel = Aucun\r
+\r
+! NoseConeConfig\r
+NoseConeCfg.lbl.Noseconeshape = Forme du nez de la fusée:\r
+NoseConeCfg.lbl.Shapeparam = Paramètre de la forme:\r
+NoseConeCfg.lbl.Noseconelength = Longueur du nez de la fusée:\r
+NoseConeCfg.lbl.Basediam = Diamètre de la base:\r
+NoseConeCfg.checkbox.Automatic = Automatique\r
+NoseConeCfg.lbl.Wallthickness = Epaisseur de la paroi:\r
+!NoseConeCfg.checkbox.Filled = Remplie\r
+NoseConeCfg.tab.General = Général\r
+NoseConeCfg.tab.ttip.General = Propriétés générales\r
+NoseConeCfg.tab.Shoulder = Accotement\r
+NoseConeCfg.tab.ttip.Shoulder = Propriétés de l'accotement\r
+\r
+! ParachuteConfig\r
+ParachuteCfg.lbl.Canopy = Canopée:\r
+ParachuteCfg.lbl.Diameter = Diamètre:\r
+ParachuteCfg.lbl.Material = Matériau:\r
+ParachuteCfg.combo.MaterialModel = Le matériau de la pièce affecte son poids.\r
+ParachuteCfg.lbl.longA1 = <html>Coefficient de traînée C<sub>D</sub>:\r
+ParachuteCfg.lbl.longB1 = <html>Le coefficient de traînée dépend de la surface totale du parachute.<br>\r
+ParachuteCfg.lbl.longB2 = Un plus grand coefficient de trainée produit une descente plus lente. \r
+ParachuteCfg.lbl.longB3 = Une valeur standard pour le parachute est 0.8.\r
+ParachuteCfg.but.Reset = Réinitialiser\r
+ParachuteCfg.lbl.Shroudlines = Suspentes:\r
+ParachuteCfg.lbl.Numberoflines = Nombre de suspentes:\r
+ParachuteCfg.lbl.Linelength = Longueur des suspentes:\r
+ParachuteCfg.lbl.Material = Matériau:\r
+ParachuteCfg.lbl.Posrelativeto = Position relative à :\r
+ParachuteCfg.lbl.plus = plus\r
+ParachuteCfg.lbl.Packedlength = Longueur emballé:\r
+ParachuteCfg.lbl.Packeddiam = Diamètre emballé:\r
+ParachuteCfg.lbl.Deploysat = Déploiement à :\r
+ParachuteCfg.lbl.seconds = secondes\r
+ParachuteCfg.lbl.Altitude = Altitude:\r
+ParachuteCfg.tab.General = Général\r
+ParachuteCfg.tab.ttip.General = Propriétés générales\r
+ParachuteCfg.tab.Radialpos = Position sur le périmètre\r
+ParachuteCfg.tab.ttip.Radialpos = Configuration de la position radial\r
+ParachuteCfg.lbl.Radialdistance = Rayon:\r
+ParachuteCfg.lbl.Radialdirection = Azimut:\r
+ParachuteCfg.but.Reset = Réinitialiser\r
+\r
+! ShockCordConfig \r
+ShockCordCfg.lbl.Shockcordlength = Longueur du cordon amortisseur\r
+ShockCordCfg.lbl.Shockcordmaterial = Matériau du cordon amortisseur:\r
+ShockCordCfg.lbl.Posrelativeto = Position relative à :\r
+ShockCordCfg.lbl.plus = plus\r
+ShockCordCfg.lbl.Packedlength = Longueur emballé:\r
+ShockCordCfg.lbl.Packeddiam = Diamètre emballé:\r
+ShockCordCfg.tab.General = Général\r
+ShockCordCfg.tab.ttip.General = Propriétés générales\r
+\r
+!SleeveConfig\r
+SleeveCfg.tab.Outerdiam = Diamètre externe:\r
+SleeveCfg.tab.Innerdiam = Diamètre interne:\r
+SleeveCfg.tab.Wallthickness = Epaisseur des parois:\r
+SleeveCfg.tab.Length = Longueur:\r
+SleeveCfg.tab.General = Général\r
+SleeveCfg.tab.Generalproperties = Propriétés générales\r
+\r
+! StreamerConfig\r
+StreamerCfg.lbl.Striplength = Longueur de la bande:\r
+StreamerCfg.lbl.Stripwidth = Largeur de la bande:\r
+StreamerCfg.lbl.Striparea = Surface de la bande:\r
+StreamerCfg.lbl.Aspectratio = Aspect ratio:\r
+StreamerCfg.lbl.Material = Matériau:\r
+StreamerCfg.combo.ttip.MaterialModel = La nature du matériau affect le poids de la pièce.\r
+StreamerCfg.lbl.longA1 = <html>Coefficient de traînée C<sub>D</sub>:\r
+StreamerCfg.lbl.longB1 = <html>Le coefficient de trainée dépend de la surface totale de la banderole.<br>\r
+StreamerCfg.lbl.longB2 = Un plus grand coefficient de trainée produit une descente plus lente.\r
+StreamerCfg.lbl.Automatic = Automatique\r
+StreamerCfg.lbl.longC1 = le coefficient de trainée dépend de la surface totale de la banderole.\r
+StreamerCfg.lbl.Posrelativeto = Position relative à :\r
+StreamerCfg.lbl.plus = plus\r
+StreamerCfg.lbl.Packedlength = Longueur emballé:\r
+StreamerCfg.lbl.Packeddiam = Diamètre emballé:\r
+StreamerCfg.lbl.Deploysat = Déploiement à :\r
+StreamerCfg.lbl.seconds = secondes\r
+StreamerCfg.lbl.Altitude = Altitude:\r
+StreamerCfg.tab.General = Général\r
+StreamerCfg.tab.ttip.General = Propriétés générales\r
+StreamerCfg.tab.Radialpos = Position sur le périmètre\r
+StreamerCfg.tab.ttip.Radialpos = Configuration de la position sur le périmètre\r
+StreamerCfg.lbl.Radialdistance = Rayon:\r
+StreamerCfg.lbl.Radialdirection = Azimut:\r
+StreamerCfg.but.Reset = Réinitialiser\r
+\r
+! ThicknessRingComponentConfig\r
+ThicknessRingCompCfg.tab.Outerdiam = Diamètre externe:\r
+ThicknessRingCompCfg.tab.Innerdiam = Diamètre interne:\r
+ThicknessRingCompCfg.tab.Wallthickness = Epaisseur de la paroi:\r
+ThicknessRingCompCfg.tab.Length = Longueur:\r
+ThicknessRingCompCfg.tab.General = Général\r
+ThicknessRingCompCfg.tab.Generalprop = Propriétés générales\r
+\r
+! TransitionConfig\r
+TransitionCfg.lbl.Transitionshape = Forme de la transition:\r
+TransitionCfg.checkbox.Clipped = Clipped\r
+TransitionCfg.lbl.Shapeparam = Paramètre de la forme:\r
+TransitionCfg.lbl.Transitionlength = Longueur de la transition:\r
+TransitionCfg.lbl.Forediam = Diamètre avant:\r
+TransitionCfg.checkbox.Automatic = Automatique\r
+TransitionCfg.lbl.Aftdiam = Diamètre arrière:\r
+TransitionCfg.lbl.Wallthickness = Epaisseur de la paroi:\r
+!TransitionCfg.checkbox.Filled = Remplie\r
+TransitionCfg.tab.General = Général\r
+TransitionCfg.tab.Generalproperties = Propriétés Générales\r
+TransitionCfg.tab.Shoulder = Accotement\r
+TransitionCfg.tab.Shoulderproperties = Propriétés de l'accotement \r
+\r
+! TrapezoidFinSetConfig\r
+TrapezoidFinSetCfg.lbl.Nbroffins = Nombre d'ailerons:\r
+TrapezoidFinSetCfg.lbl.ttip.Nbroffins = Le nombre d'ailerons composant le jeux.\r
+TrapezoidFinSetCfg.lbl.Finrotation = Rotation de l'aileron:\r
+TrapezoidFinSetCfg.lbl.ttip.Finrotation = Angle du premier aileron dans le jeux.\r
+TrapezoidFinSetCfg.lbl.Fincant = Inclinaison de l'aileron:\r
+TrapezoidFinSetCfg.lbl.ttip.Fincant = The angle that the fins are canted with respect to the rocket body.\r
+TrapezoidFinSetCfg.lbl.Rootchord = Longueur de la base de l'aileron:\r
+TrapezoidFinSetCfg.lbl.Tipchord = Longueur du bout de l'aileron:\r
+TrapezoidFinSetCfg.lbl.Height = Hauteur:\r
+TrapezoidFinSetCfg.lbl.Sweeplength = Longueur du bord d'attaque:\r
+TrapezoidFinSetCfg.lbl.Sweepangle = Angle du bord d'attaque:\r
+TrapezoidFinSetCfg.lbl.FincrossSection = Coupe de l'aileron:\r
+TrapezoidFinSetCfg.lbl.Thickness = Epaisseur:\r
+TrapezoidFinSetCfg.lbl.Posrelativeto = Position relative à :\r
+TrapezoidFinSetCfg.lbl.plus = plus\r
+TrapezoidFinSetCfg.tab.General = Général\r
+TrapezoidFinSetCfg.tab.Generalproperties = Propriétés générales\r
+\r
+!MotorConfigurationModel\r
+MotorCfgModel.Editcfg = Modifier les configurations\r
+\r
+! StorageOptionChooser\r
+StorageOptChooser.lbl.Simdatatostore = Données simulées à stocker:\r
+StorageOptChooser.rdbut.Allsimdata = Toutes les données des simulations\r
+StorageOptChooser.lbl.longA1 = <html>Enregistrer toutes les données des simulations.<br>\r
+StorageOptChooser.lbl.longA2 = Cela peut entraîner de très gros fichiers!\r
+StorageOptChooser.rdbut.Every = Every\r
+StorageOptChooser.lbl.longB1 = <html>Store plottable values approximately this far apart.<br>\r
+StorageOptChooser.lbl.longB2 = Larger values result in smaller files.\r
+StorageOptChooser.lbl.seconds = secondes\r
+StorageOptChooser.rdbut.Onlyprimfig = Only primary figures\r
+StorageOptChooser.lbl.longC1 = <html>Stocker seulement les valeurs montrées dans le tableau récapitulatif.<br>\r
+StorageOptChooser.lbl.longC2 = Cela produira des fichiers plus petit.\r
+StorageOptChooser.checkbox.Compfile = Compresse le fichier\r
+StorageOptChooser.lbl.UsingComp = Utiliser la compression réduit significativement la taille du fichier.\r
+StorageOptChooser.lbl.longD1 = Une estimation sur la taille qu'aurai le fichier résultant avec les options actuelles.\r
+StorageOptChooser.ttip.Saveopt = Options de sauvegarde\r
+StorageOptChooser.lbl.Estfilesize = Taille estimé du fichier:\r
+StorageOptChooser.lbl.Saveopt = Options de sauvegarde\r
+\r
+! ThrustCurveMotorSelectionPanel\r
+TCMotorSelPan.lbl.Selrocketmotor = Choisir le moteur fusée:\r
+TCMotorSelPan.checkbox.hideSimilar = Cacher les courbes de pousées similaires\r
+\r
+! PlotDialog\r
+PlotDialog.title.Flightdataplot = Flight data plot\r
+PlotDialog.Chart.Simulatedflight = Simulated flight\r
+PlotDialog.CheckBox.Showdatapoints = Show data points\r
+PlotDialog.lbl.Chart = Click+drag down+right to zoom in, up+left to zoom out\r
+\r
+! "main" prefix is used for the main application dialog\r
+\r
+main.menu.file = Fichier\r
+main.menu.file.new = Nouveau\r
+main.menu.file.open = Ouvrir...\r
+main.menu.file.openExample = Ouvrir exemple...\r
+main.menu.file.save = Sauvegarder\r
+main.menu.file.saveAs = Sauvegarder sous...\r
+main.menu.file.print = Imprimer...\r
+main.menu.file.close = Fermer\r
+main.menu.file.quit = Quitter\r
+\r
+main.menu.edit = Editer\r
+main.menu.edit.undo = Annuler modification\r
+main.menu.edit.redo = Refaire modification\r
+main.menu.edit.cut = Couper\r
+main.menu.edit.copy = Copier\r
+main.menu.edit.paste = Coller\r
+main.menu.edit.delete = Effacer\r
+main.menu.edit.preferences = Préférences\r
+\r
+main.menu.analyze = Analyse\r
+main.menu.analyze.componentAnalysis = Analyse des Pièces\r
+\r
+main.menu.help = Aide\r
+main.menu.help.license = Licence\r
+main.menu.help.bugReport = Rapport d'erreurs\r
+main.menu.help.debugLog = Debug log\r
+main.menu.help.about = A propos\r
+\r
+main.menu.debug = Debug\r
+main.menu.debug.whatisthismenu = Quel est ce menu?\r
+main.menu.debug.createtestrocket = Créer une fusée test\r
+\r
import net.sf.openrocket.document.StorageOptions;
import net.sf.openrocket.file.RocketSaver;
import net.sf.openrocket.file.openrocket.OpenRocketSaver;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.simulation.FlightData;
import net.sf.openrocket.simulation.FlightDataBranch;
+import net.sf.openrocket.startup.Application;
public class StorageOptionChooser extends JPanel {
private boolean artificialEvent = false;
+ private static final Translator trans = Application.getTranslator();
public StorageOptionChooser(OpenRocketDocument doc, StorageOptions opts) {
super(new MigLayout());
ButtonGroup buttonGroup = new ButtonGroup();
String tip;
- this.add(new JLabel("Simulated data to store:"), "spanx, wrap unrel");
+ //// Simulated data to store:
+ this.add(new JLabel(trans.get("StorageOptChooser.lbl.Simdatatostore")), "spanx, wrap unrel");
- allButton = new JRadioButton("All simulated data");
- allButton.setToolTipText("<html>Store all simulated data.<br>" +
- "This can result in very large files!");
+ //// All simulated data
+ allButton = new JRadioButton(trans.get("StorageOptChooser.rdbut.Allsimdata"));
+ //// <html>Store all simulated data.<br>
+ //// This can result in very large files!
+ allButton.setToolTipText(trans.get("StorageOptChooser.lbl.longA1") +
+ trans.get("StorageOptChooser.lbl.longA2"));
buttonGroup.add(allButton);
allButton.addActionListener(actionUpdater);
this.add(allButton, "spanx, wrap rel");
-
- someButton = new JRadioButton("Every");
- tip = "<html>Store plottable values approximately this far apart.<br>" +
- "Larger values result in smaller files.";
+ //// Every
+ someButton = new JRadioButton(trans.get("StorageOptChooser.rdbut.Every"));
+ //// <html>Store plottable values approximately this far apart.<br>"
+ //// Larger values result in smaller files.
+ tip = trans.get("StorageOptChooser.lbl.longB1") +
+ trans.get("StorageOptChooser.lbl.longB2");
someButton.setToolTipText(tip);
buttonGroup.add(someButton);
someButton.addActionListener(actionUpdater);
this.add(timeSpinner, "wmin 55lp");
timeSpinner.addChangeListener(changeUpdater);
- JLabel label = new JLabel("seconds");
+ //// seconds
+ JLabel label = new JLabel(trans.get("StorageOptChooser.lbl.seconds"));
label.setToolTipText(tip);
this.add(label, "wrap rel");
-
- noneButton = new JRadioButton("Only primary figures");
- noneButton.setToolTipText("<html>Store only the values shown in the summary table.<br>" +
- "This results in the smallest files.");
+ //// Only primary figures
+ noneButton = new JRadioButton(trans.get("StorageOptChooser.rdbut.Onlyprimfig"));
+ //// <html>Store only the values shown in the summary table.<br>
+ //// This results in the smallest files.
+ noneButton.setToolTipText(trans.get("StorageOptChooser.lbl.longC1") +
+ trans.get("StorageOptChooser.lbl.longC2"));
buttonGroup.add(noneButton);
noneButton.addActionListener(actionUpdater);
this.add(noneButton, "spanx, wrap 20lp");
-
- compressButton = new JCheckBox("Compress file");
- compressButton.setToolTipText("Using compression reduces the file size significantly.");
+ //// Compress file
+ compressButton = new JCheckBox(trans.get("StorageOptChooser.checkbox.Compfile"));
+ //// Using compression reduces the file size significantly.
+ compressButton.setToolTipText(trans.get("StorageOptChooser.lbl.UsingComp"));
compressButton.addActionListener(actionUpdater);
this.add(compressButton, "spanx, wrap para");
// Estimate is updated in loadOptions(opts)
estimateLabel = new JLabel("");
- estimateLabel.setToolTipText("An estimate on how large the resulting file would " +
- "be with the present options.");
+ //// An estimate on how large the resulting file would
+ //// be with the present options.
+ estimateLabel.setToolTipText(trans.get("StorageOptChooser.lbl.longD1"));
this.add(estimateLabel, "spanx");
this.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(0, 10, 0, 0),
- BorderFactory.createTitledBorder("Save options")));
+ //// Save options
+ BorderFactory.createTitledBorder(trans.get("StorageOptChooser.ttip.Saveopt"))));
loadOptions(opts);
}
formatted = size + " kB";
}
- estimateLabel.setText("Estimated file size: " + formatted);
+ //// Estimated file size:
+ estimateLabel.setText(trans.get("StorageOptChooser.lbl.Estfilesize") + " " + formatted);
}
StorageOptionChooser chooser = new StorageOptionChooser(document, options);
- if (JOptionPane.showConfirmDialog(parent, chooser, "Save options",
+ //// Save options
+ if (JOptionPane.showConfirmDialog(parent, chooser, trans.get("StorageOptChooser.lbl.Saveopt"),
JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) !=
JOptionPane.OK_OPTION) {
// User cancelled
import net.sf.openrocket.database.DatabaseListener;
import net.sf.openrocket.database.Databases;
import net.sf.openrocket.gui.dialogs.CustomMaterialDialog;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.Reflection;
public class MaterialModel extends AbstractListModel implements
private final Reflection.Method getMethod;
private final Reflection.Method setMethod;
+ private static final Translator trans = Application.getTranslator();
public MaterialModel(Component parent, RocketComponent component, Material.Type type) {
+ //// Material
+ //this(parent, component, type, trans.get("MaterialModel.title.Material"));
this(parent, component, type, "Material");
}
CustomMaterialDialog dialog = new CustomMaterialDialog(
SwingUtilities.getWindowAncestor(parentComponent),
(Material) getSelectedItem(), true,
- "Define custom material");
+ //// Define custom material
+ trans.get("MaterialModel.title.Defcustmat"));
dialog.setVisible(true);
import net.sf.openrocket.gui.dialogs.EditMotorConfigurationDialog;
import net.sf.openrocket.gui.main.BasicFrame;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.rocketcomponent.Rocket;
+import net.sf.openrocket.startup.Application;
public class MotorConfigurationModel implements ComboBoxModel, ChangeListener {
+ private static final Translator trans = Application.getTranslator();
- private static final String EDIT = "Edit configurations";
+ private static final String EDIT = trans.get("MotorCfgModel.Editcfg");
private EventListenerList listenerList = new EventListenerList();
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.document.Simulation;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.simulation.FlightData;
import net.sf.openrocket.simulation.FlightDataBranch;
import net.sf.openrocket.simulation.FlightDataType;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.GUIUtil;
private static final String SPACE = "SPACE";
private static final String TAB = "TAB";
+ private static final Translator trans = Application.getTranslator();
private static final FileFilter CSV_FILE_FILTER = new FileFilter() {
@Override
public String getDescription() {
- return "Comma Separated Files (*.csv)";
+ //// Comma Separated Files (*.csv)
+ return trans.get("SimExpPan.desc");
}
@Override
public boolean accept(File f) {
// Add table
panel = new JPanel(new MigLayout("fill"));
- panel.setBorder(BorderFactory.createTitledBorder("Variables to export"));
+ panel.setBorder(BorderFactory.createTitledBorder(trans.get("SimExpPan.border.Vartoexport")));
panel.add(new JScrollPane(table), "wmin 300lp, width 300lp, height 1, grow 100, wrap");
// Select all/none buttons
- button = new JButton("Select all");
+ button = new JButton(trans.get("SimExpPan.but.Selectall"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
panel.add(button, "split 2, growx 1, sizegroup selectbutton");
- button = new JButton("Select none");
+ button = new JButton(trans.get("SimExpPan.but.Selectnone"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Field separator panel
panel = new JPanel(new MigLayout("fill"));
- panel.setBorder(BorderFactory.createTitledBorder("Field separator"));
+ panel.setBorder(BorderFactory.createTitledBorder(trans.get("SimExpPan.border.Fieldsep")));
- label = new JLabel("Field separator string:");
- tip = "<html>The string used to separate the fields in the exported file.<br>" +
- "Use ',' for a Comma Separated Values (CSV) file.";
+ label = new JLabel(trans.get("SimExpPan.lbl.Fieldsepstr"));
+ //// <html>The string used to separate the fields in the exported file.<br>
+ //// Use ',' for a Comma Separated Values (CSV) file.
+ tip = trans.get("SimExpPan.lbl.longA1") +
+ trans.get("SimExpPan.lbl.longA2");
label.setToolTipText(tip);
panel.add(label);
// Comments separator panel
panel = new JPanel(new MigLayout("fill"));
- panel.setBorder(BorderFactory.createTitledBorder("Comments"));
+ //// Comments
+ panel.setBorder(BorderFactory.createTitledBorder(trans.get("SimExpPan.border.Comments")));
- simulationComments = new JCheckBox("Include simulation description");
- simulationComments.setToolTipText("Include a comment at the beginning of the file " +
- "describing the simulation.");
+ //// Include simulation description
+ simulationComments = new JCheckBox(trans.get("SimExpPan.checkbox.Includesimudesc"));
+ //// Include a comment at the beginning of the file describing the simulation.
+ simulationComments.setToolTipText(trans.get("SimExpPan.checkbox.ttip.Includesimudesc"));
simulationComments.setSelected(Prefs.getBoolean(Prefs.EXPORT_SIMULATION_COMMENT,
true));
panel.add(simulationComments, "wrap");
-
- fieldNameComments = new JCheckBox("Include field descriptions");
- fieldNameComments.setToolTipText("Include a comment line with the descriptions of " +
- "the exported variables.");
+ //// Include field descriptions
+ fieldNameComments = new JCheckBox(trans.get("SimExpPan.checkbox.Includefielddesc"));
+ //// Include a comment line with the descriptions of the exported variables.
+ fieldNameComments.setToolTipText(trans.get("SimExpPan.checkbox.ttip.Includefielddesc"));
fieldNameComments.setSelected(Prefs.getBoolean(Prefs.EXPORT_FIELD_NAME_COMMENT, true));
panel.add(fieldNameComments, "wrap");
- eventComments = new JCheckBox("Include flight events");
- eventComments.setToolTipText("Include a comment line for every flight event.");
+ eventComments = new JCheckBox(trans.get("SimExpPan.checkbox.Incflightevents"));
+ eventComments.setToolTipText(trans.get("SimExpPan.checkbox.ttip.Incflightevents"));
eventComments.setSelected(Prefs.getBoolean(Prefs.EXPORT_EVENT_COMMENTS, true));
panel.add(eventComments, "wrap");
- label = new JLabel("Comment character:");
- tip = "The character(s) that mark a comment line.";
+ label = new JLabel(trans.get("SimExpPan.lbl.Commentchar"));
+ tip = trans.get("SimExpPan.lbl.ttip.Commentchar");
label.setToolTipText(tip);
panel.add(label, "split 2");
// Export button
- button = new JButton("Export to file...");
+ button = new JButton(trans.get("SimExpPan.but.Exporttofile"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.sf.openrocket.gui.adaptors.DoubleModel;
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.BodyTube;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import javax.swing.JCheckBox;
public class BodyTubeConfig extends RocketComponentConfig {
private MotorConfig motorConfigPane = null;
+ private static final Translator trans = Application.getTranslator();
public BodyTubeConfig(RocketComponent c) {
super(c);
JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::][]",""));
//// Body tube length
- panel.add(new JLabel("Body tube length:"));
+ panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Bodytubelength")));
DoubleModel m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
//// Body tube diameter
- panel.add(new JLabel("Outer diameter:"));
+ panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Outerdiameter")));
DoubleModel od = new DoubleModel(component,"OuterRadius",2,UnitGroup.UNITS_LENGTH,0);
// Diameter = 2*Radius
panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap 0px");
JCheckBox check = new JCheckBox(od.getAutomaticAction());
- check.setText("Automatic");
+ //// Automatic
+ check.setText(trans.get("BodyTubecfg.checkbox.Automatic"));
panel.add(check,"skip, span 2, wrap");
//// Inner diameter
- panel.add(new JLabel("Inner diameter:"));
+ panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Innerdiameter")));
// Diameter = 2*Radius
m = new DoubleModel(component,"InnerRadius",2,UnitGroup.UNITS_LENGTH,0);
//// Wall thickness
- panel.add(new JLabel("Wall thickness:"));
+ panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Wallthickness")));
m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
panel.add(new UnitSelector(m),"growx");
panel.add(new BasicSlider(m.getSliderModel(0,0.01)),"w 100lp, wrap 0px");
-
+ //// Filled
check = new JCheckBox(new BooleanModel(component,"Filled"));
- check.setText("Filled");
+ check.setText(trans.get("BodyTubecfg.checkbox.Filled"));
panel.add(check,"skip, span 2, wrap");
panel.add(materialPanel(new JPanel(new MigLayout()), Material.Type.BULK),
"cell 4 0, gapleft paragraph, aligny 0%, spany");
-
- tabbedPane.insertTab("General", null, panel, "General properties", 0);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("BodyTubecfg.tab.General"), null, panel,
+ trans.get("BodyTubecfg.tab.Generalproperties"), 0);
motorConfigPane = new MotorConfig((BodyTube)c);
- tabbedPane.insertTab("Motor", null, motorConfigPane, "Motor mount configuration", 1);
+ //// Motor and Motor mount configuration
+ tabbedPane.insertTab(trans.get("BodyTubecfg.tab.Motor"), null, motorConfigPane,
+ trans.get("BodyTubecfg.tab.Motormountconf"), 1);
tabbedPane.setSelectedIndex(0);
}
import javax.swing.JPanel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
public class BulkheadConfig extends RingComponentConfig {
+ private static final Translator trans = Application.getTranslator();
public BulkheadConfig(RocketComponent c) {
super(c);
JPanel tab;
- tab = generalTab("Radius:", null, null, "Thickness:");
- tabbedPane.insertTab("General", null, tab, "General properties", 0);
+ //// Radius: and "Thickness:
+ tab = generalTab(trans.get("BulkheadCfg.tab.Radius"), null, null,
+ trans.get("BulkheadCfg.tab.Thickness"));
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("BulkheadCfg.tab.General"), null, tab,
+ trans.get("BulkheadCfg.tab.Generalproperties"), 0);
tabbedPane.setSelectedIndex(0);
}
import javax.swing.JPanel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
public class CenteringRingConfig extends RingComponentConfig {
+ private static final Translator trans = Application.getTranslator();
public CenteringRingConfig(RocketComponent c) {
super(c);
JPanel tab;
- tab = generalTab("Outer diameter:", "Inner diameter:", null, "Thickness:");
- tabbedPane.insertTab("General", null, tab, "General properties", 0);
+ //// Outer diameter: and Inner diameter: and Thickness:
+ tab = generalTab(trans.get("CenteringRingCfg.tab.Outerdiam"),
+ trans.get("CenteringRingCfg.tab.Innerdiam"), null,
+ trans.get("CenteringRingCfg.tab.Thickness"));
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("CenteringRingCfg.tab.General"), null, tab,
+ trans.get("CenteringRingCfg.tab.Generalproperties"), 0);
tabbedPane.setSelectedIndex(0);
}
import javax.swing.JDialog;
import net.sf.openrocket.document.OpenRocketDocument;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.GUIUtil;
import net.sf.openrocket.util.Prefs;
private RocketComponentConfig configurator = null;
private final Window parent;
-
+ private static final Translator trans = Application.getTranslator();
+
private ComponentConfigDialog(Window parent, OpenRocketDocument document,
RocketComponent component) {
super(parent);
this.setContentPane(configurator);
configurator.updateFields();
- setTitle(component.getComponentName() + " configuration");
+ //// configuration
+ setTitle(component.getComponentName() + " " + trans.get("ComponentCfgDlg.configuration"));
// Dimension pref = getPreferredSize();
// Dimension real = getSize();
dialog = new ComponentConfigDialog(parent, document, component);
dialog.setVisible(true);
- document.addUndoPosition("Modify " + component.getComponentName());
+ ////Modify
+ document.addUndoPosition(trans.get("ComponentCfgDlg.Modify") + " " + component.getComponentName());
}
import net.sf.openrocket.gui.adaptors.IntegerModel;
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class EllipticalFinSetConfig extends FinSetConfig {
+ private static final Translator trans = Application.getTranslator();
public EllipticalFinSetConfig(final RocketComponent component) {
super(component);
JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::]",""));
//// Number of fins
- panel.add(new JLabel("Number of fins:"));
+ panel.add(new JLabel(trans.get("EllipticalFinSetCfg.Nbroffins")));
IntegerModel im = new IntegerModel(component,"FinCount",1,8);
//// Base rotation
- panel.add(new JLabel("Rotation:"));
+ panel.add(new JLabel(trans.get("EllipticalFinSetCfg.Rotation")));
m = new DoubleModel(component, "BaseRotation", UnitGroup.UNITS_ANGLE,-Math.PI,Math.PI);
//// Fin cant
- JLabel label = new JLabel("Fin cant:");
- label.setToolTipText("The angle that the fins are canted with respect to the rocket " +
- "body.");
+ JLabel label = new JLabel(trans.get("EllipticalFinSetCfg.Fincant"));
+ //// "The angle that the fins are canted with respect to the rocket
+ label.setToolTipText(trans.get("EllipticalFinSetCfg.ttip.Fincant"));
panel.add(label);
m = new DoubleModel(component, "CantAngle", UnitGroup.UNITS_ANGLE,
//// Root chord
- panel.add(new JLabel("Root chord:"));
+ panel.add(new JLabel(trans.get("EllipticalFinSetCfg.Rootchord")));
m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
//// Height
- panel.add(new JLabel("Height:"));
+ panel.add(new JLabel(trans.get("EllipticalFinSetCfg.Height")));
m = new DoubleModel(component,"Height",UnitGroup.UNITS_LENGTH,0);
//// Position
-
- panel.add(new JLabel("Position relative to:"));
+ //// Position relative to:
+ panel.add(new JLabel(trans.get("EllipticalFinSetCfg.Positionrelativeto")));
combo = new JComboBox(
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
}));
panel.add(combo,"spanx, growx, wrap");
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel(trans.get("EllipticalFinSetCfg.plus")),"right");
m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
spin = new JSpinner(m.getSpinnerModel());
//// Cross section
- panel.add(new JLabel("Fin cross section:"),"span, split");
+ //// Fin cross section:
+ panel.add(new JLabel(trans.get("EllipticalFinSetCfg.FincrossSection")),"span, split");
combo = new JComboBox(
new EnumModel<FinSet.CrossSection>(component,"CrossSection"));
panel.add(combo,"growx, wrap unrel");
- //// Thickness
- panel.add(new JLabel("Thickness:"));
+ //// Thickness:
+ panel.add(new JLabel(trans.get("EllipticalFinSetCfg.Thickness")));
m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
addFinSetButtons();
-
- tabbedPane.insertTab("General", null, mainPanel, "General properties", 0);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("EllipticalFinSetCfg.General"), null, mainPanel,
+ trans.get("EllipticalFinSetCfg.Generalproperties"), 0);
tabbedPane.setSelectedIndex(0);
}
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.StyledLabel.Style;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.FreeformFinSet;
public abstract class FinSetConfig extends RocketComponentConfig {
private static final LogHelper log = Application.getLogger();
-
+ private static final Translator trans = Application.getTranslator();
+
private JButton split = null;
public FinSetConfig(RocketComponent component) {
super(component);
- tabbedPane.insertTab("Fin tabs", null, finTabPanel(), "Through-the-wall fin tabs", 0);
+ //// Fin tabs and Through-the-wall fin tabs
+ tabbedPane.insertTab(trans.get("FinSetConfig.tab.Fintabs"), null, finTabPanel(),
+ trans.get("FinSetConfig.tab.Through-the-wall"), 0);
}
//// Convert buttons
if (!(component instanceof FreeformFinSet)) {
- convert = new JButton("Convert to freeform");
- convert.setToolTipText("Convert this fin set into a freeform fin set");
+ //// Convert to freeform
+ convert = new JButton(trans.get("FinSetConfig.but.Converttofreeform"));
+ //// Convert this fin set into a freeform fin set
+ convert.setToolTipText(trans.get("FinSetConfig.but.Converttofreeform.ttip"));
convert.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
- ComponentConfigDialog.addUndoPosition("Convert fin set");
+ //// Convert fin set
+ ComponentConfigDialog.addUndoPosition(trans.get("FinSetConfig.Convertfinset"));
RocketComponent freeform =
FreeformFinSet.convertFinSet((FinSet) component);
ComponentConfigDialog.showDialog(freeform);
});
}
- split = new JButton("Split fins");
- split.setToolTipText("Split the fin set into separate fins");
+ //// Split fins
+ split = new JButton(trans.get("FinSetConfig.but.Splitfins"));
+ //// Split the fin set into separate fins
+ split.setToolTipText(trans.get("FinSetConfig.but.Splitfins.ttip"));
split.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// JPanel panel = new JPanel(new MigLayout("fillx, align 20% 20%, gap rel unrel",
// "[40lp][80lp::][30lp::][100lp::]",""));
- panel.add(new StyledLabel("Through-the-wall fin tabs:", Style.BOLD),
+ //// Through-the-wall fin tabs:
+ panel.add(new StyledLabel(trans.get("FinSetConfig.lbl.Through-the-wall"), Style.BOLD),
"spanx, wrap 30lp");
JLabel label;
register(length_2);
//// Tab length
- label = new JLabel("Tab length:");
- label.setToolTipText("The length of the fin tab.");
+ //// Tab length:
+ label = new JLabel(trans.get("FinSetConfig.lbl.Tablength"));
+ //// The length of the fin tab.
+ label.setToolTipText(trans.get("FinSetConfig.ttip.Tablength"));
panel.add(label, "gapleft para, gapright 40lp, growx 1");
m = new DoubleModel(component, "TabLength", UnitGroup.UNITS_LENGTH, 0);
//// Tab length
- label = new JLabel("Tab height:");
- label.setToolTipText("The spanwise height of the fin tab.");
+ //// Tab height:
+ label = new JLabel(trans.get("FinSetConfig.lbl.Tabheight"));
+ //// The spanwise height of the fin tab.
+ label.setToolTipText(trans.get("FinSetConfig.ttip.Tabheight"));
panel.add(label, "gapleft para");
m = new DoubleModel(component, "TabHeight", UnitGroup.UNITS_LENGTH, 0);
"w 100lp, growx 5, wrap para");
- //// Tab position
- label = new JLabel("Tab position:");
- label.setToolTipText("The position of the fin tab.");
+ //// Tab position:
+ label = new JLabel(trans.get("FinSetConfig.lbl.Tabposition"));
+ //// The position of the fin tab.
+ label.setToolTipText(trans.get("FinSetConfig.ttip.Tabposition"));
panel.add(label, "gapleft para");
m = new DoubleModel(component, "TabShift", UnitGroup.UNITS_LENGTH);
panel.add(new BasicSlider(m.getSliderModel(length_2, length2)), "w 100lp, growx 5, wrap");
-
- label = new JLabel("relative to");
+ //// relative to
+ label = new JLabel(trans.get("FinSetConfig.lbl.relativeto"));
panel.add(label, "right, gapright unrel");
EnumModel<FinSet.TabRelativePosition> em =
import net.sf.openrocket.gui.scalefigure.FinPointFigure;
import net.sf.openrocket.gui.scalefigure.ScaleScrollPane;
import net.sf.openrocket.gui.scalefigure.ScaleSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.FreeformFinSet;
import net.sf.openrocket.rocketcomponent.IllegalFinPointException;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.Coordinate;
private FinPointTableModel tableModel = null;
private FinPointFigure figure = null;
-
+ private static final Translator trans = Application.getTranslator();
+
public FreeformFinSetConfig(RocketComponent component) {
super(component);
this.finset = (FreeformFinSet)component;
-
- tabbedPane.insertTab("General", null, generalPane(), "General properties", 0);
- tabbedPane.insertTab("Shape", null, shapePane(), "Fin shape", 1);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("FreeformFinSetCfg.tab.General"), null, generalPane(),
+ trans.get("FreeformFinSetCfg.tab.ttip.General"), 0);
+ //// Shape and Fin shape
+ tabbedPane.insertTab(trans.get("FreeformFinSetCfg.tab.Shape"), null, shapePane(),
+ trans.get("FreeformFinSetCfg.tab.ttip.Finshape"), 1);
tabbedPane.setSelectedIndex(0);
addFinSetButtons();
- //// Number of fins
- panel.add(new JLabel("Number of fins:"));
+ //// Number of fins:
+ panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Numberoffins")));
IntegerModel im = new IntegerModel(component,"FinCount",1,8);
//// Base rotation
- panel.add(new JLabel("Fin rotation:"));
+ panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Finrotation")));
m = new DoubleModel(component, "BaseRotation", UnitGroup.UNITS_ANGLE,-Math.PI,Math.PI);
//// Fin cant
- JLabel label = new JLabel("Fin cant:");
- label.setToolTipText("The angle that the fins are canted with respect to the rocket " +
- "body.");
+ JLabel label = new JLabel(trans.get("FreeformFinSetCfg.lbl.Fincant"));
+ //// The angle that the fins are canted with respect to the rocket body.
+ label.setToolTipText(trans.get("FreeformFinSetCfg.lbl.ttip.Fincant"));
panel.add(label);
m = new DoubleModel(component, "CantAngle", UnitGroup.UNITS_ANGLE,
//// Position
- panel.add(new JLabel("Position relative to:"));
+ //// Position relative to:
+ panel.add(new JLabel("FreeformFinSetCfg.lbl.Posrelativeto"));
combo = new JComboBox(
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
RocketComponent.Position.ABSOLUTE
}));
panel.add(combo,"spanx 3, growx, wrap");
-
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel("FreeformFinSetCfg.lbl.plus"),"right");
m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
spin = new JSpinner(m.getSpinnerModel());
//// Cross section
- panel.add(new JLabel("Fin cross section:"),"span, split");
+ //// Fin cross section:
+ panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.FincrossSection")),"span, split");
combo = new JComboBox(
new EnumModel<FinSet.CrossSection>(component,"CrossSection"));
panel.add(combo,"growx, wrap unrel");
- //// Thickness
- panel.add(new JLabel("Thickness:"));
+ //// Thickness:
+ panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Thickness")));
m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
import net.sf.openrocket.gui.adaptors.DoubleModel;
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.ClusterConfiguration;
import net.sf.openrocket.rocketcomponent.Clusterable;
import net.sf.openrocket.rocketcomponent.InnerTube;
import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.Coordinate;
public class InnerTubeConfig extends ThicknessRingComponentConfig {
+ private static final Translator trans = Application.getTranslator();
public InnerTubeConfig(RocketComponent c) {
JPanel tab;
tab = new MotorConfig((MotorMount) c);
- tabbedPane.insertTab("Motor", null, tab, "Motor mount configuration", 1);
+ //// Motor and Motor mount configuration
+ tabbedPane.insertTab(trans.get("InnerTubeCfg.tab.Motor"), null, tab,
+ trans.get("InnerTubeCfg.tab.ttip.Motor"), 1);
tab = clusterTab();
- tabbedPane.insertTab("Cluster", null, tab, "Cluster configuration", 2);
+ //// Cluster and Cluster configuration
+ tabbedPane.insertTab(trans.get("InnerTubeCfg.tab.Cluster"), null, tab,
+ trans.get("InnerTubeCfg.tab.ttip.Cluster"), 2);
tab = positionTab();
- tabbedPane.insertTab("Radial position", null, tab, "Radial position", 3);
+ //// Radial position
+ tabbedPane.insertTab(trans.get("InnerTubeCfg.tab.Radialpos"), null, tab,
+ trans.get("InnerTubeCfg.tab.ttip.Radialpos"), 3);
tabbedPane.setSelectedIndex(0);
}
JPanel subPanel = new JPanel(new MigLayout());
// Cluster type selection
- subPanel.add(new JLabel("Select cluster configuration:"), "spanx, wrap");
+ //// Select cluster configuration:
+ subPanel.add(new JLabel(trans.get("InnerTubeCfg.lbl.Selectclustercfg")), "spanx, wrap");
subPanel.add(new ClusterSelectionPanel((InnerTube) component), "spanx, wrap");
// JPanel clusterSelection = new ClusterSelectionPanel((InnerTube)component);
// clusterSelection.setBackground(Color.blue);
subPanel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]"));
// Tube separation scale
- JLabel l = new JLabel("Tube separation:");
- l.setToolTipText("The separation of the tubes, 1.0 = touching each other");
+ //// Tube separation:
+ JLabel l = new JLabel(trans.get("InnerTubeCfg.lbl.TubeSep"));
+ //// The separation of the tubes, 1.0 = touching each other
+ l.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.TubeSep"));
subPanel.add(l);
DoubleModel dm = new DoubleModel(component, "ClusterScale", 1, UnitGroup.UNITS_NONE, 0);
JSpinner spin = new JSpinner(dm.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
- spin.setToolTipText("The separation of the tubes, 1.0 = touching each other");
+ //// The separation of the tubes, 1.0 = touching each other
+ spin.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.TubeSep"));
subPanel.add(spin, "growx");
BasicSlider bs = new BasicSlider(dm.getSliderModel(0, 1, 4));
- bs.setToolTipText("The separation of the tubes, 1.0 = touching each other");
+ //// The separation of the tubes, 1.0 = touching each other
+ bs.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.TubeSep"));
subPanel.add(bs, "skip,w 100lp, wrap");
- // Rotation
- l = new JLabel("Rotation:");
- l.setToolTipText("Rotation angle of the cluster configuration");
+ // Rotation:
+ l = new JLabel(trans.get("InnerTubeCfg.lbl.Rotation"));
+ //// Rotation angle of the cluster configuration
+ l.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.Rotation"));
subPanel.add(l);
dm = new DoubleModel(component, "ClusterRotation", 1, UnitGroup.UNITS_ANGLE,
-Math.PI, Math.PI);
spin = new JSpinner(dm.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
- spin.setToolTipText("Rotation angle of the cluster configuration");
+ //// Rotation angle of the cluster configuration
+ spin.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.Rotation"));
subPanel.add(spin, "growx");
subPanel.add(new UnitSelector(dm), "growx");
bs = new BasicSlider(dm.getSliderModel(-Math.PI, 0, Math.PI));
- bs.setToolTipText("Rotation angle of the cluster configuration");
+ //// Rotation angle of the cluster configuration
+ bs.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.Rotation"));
subPanel.add(bs, "w 100lp, wrap para");
// Split button
- JButton split = new JButton("Split cluster");
- split.setToolTipText("<html>Split the cluster into separate components.<br>" +
- "This also duplicates all components attached to this inner tube.");
+ //// Split cluster
+ JButton split = new JButton(trans.get("InnerTubeCfg.but.Splitcluster"));
+ //// <html>Split the cluster into separate components.<br>
+ //// This also duplicates all components attached to this inner tube.
+ split.setToolTipText(trans.get("InnerTubeCfg.lbl.longA1") +
+ trans.get("InnerTubeCfg.lbl.longA2"));
split.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Reset button
- JButton reset = new JButton("Reset settings");
- reset.setToolTipText("Reset the separation and rotation to the default values");
+ ///// Reset settings
+ JButton reset = new JButton(trans.get("InnerTubeCfg.but.Resetsettings"));
+ //// Reset the separation and rotation to the default values
+ reset.setToolTipText(trans.get("InnerTubeCfg.but.ttip.Resetsettings"));
reset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
import net.sf.openrocket.gui.adaptors.EnumModel;
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import javax.swing.JComboBox;
public class LaunchLugConfig extends RocketComponentConfig {
private MotorConfig motorConfigPane = null;
+ private static final Translator trans = Application.getTranslator();
public LaunchLugConfig(RocketComponent c) {
super(c);
JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::][]",""));
//// Body tube length
- panel.add(new JLabel("Length:"));
+ //// Length:
+ panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Length")));
DoubleModel m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
//// Body tube diameter
- panel.add(new JLabel("Outer diameter:"));
+ //// Outer diameter:
+ panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Outerdiam")));
DoubleModel od = new DoubleModel(component,"OuterRadius",2,UnitGroup.UNITS_LENGTH,0);
// Diameter = 2*Radius
panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap rel");
- //// Inner diameter
- panel.add(new JLabel("Inner diameter:"));
+ //// Inner diameter:
+ panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Innerdiam")));
// Diameter = 2*Radius
m = new DoubleModel(component,"InnerRadius",2,UnitGroup.UNITS_LENGTH,0);
//// Wall thickness
- panel.add(new JLabel("Thickness:"));
+ //// Thickness:
+ panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Thickness")));
m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
panel.add(new BasicSlider(m.getSliderModel(0,0.01)),"w 100lp, wrap 20lp");
- //// Radial direction
- panel.add(new JLabel("Radial position:"));
+ //// Radial position:
+ panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Radialpos")));
m = new DoubleModel(component,"RadialDirection",UnitGroup.UNITS_ANGLE,
-Math.PI, Math.PI);
-
- panel.add(new JLabel("Position relative to:"));
+ //// Position relative to:
+ panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Posrelativeto")));
JComboBox combo = new JComboBox(
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
}));
panel.add(combo,"spanx, growx, wrap");
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.plus")),"right");
m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
spin = new JSpinner(m.getSpinnerModel());
primary.add(panel,"grow");
-
- tabbedPane.insertTab("General", null, primary, "General properties", 0);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("LaunchLugCfg.tab.General"), null, primary,
+ trans.get("LaunchLugCfg.tab.Generalprop"), 0);
tabbedPane.setSelectedIndex(0);
}
import net.sf.openrocket.gui.adaptors.EnumModel;
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.MassComponent;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class MassComponentConfig extends RocketComponentConfig {
+ private static final Translator trans = Application.getTranslator();
public MassComponentConfig(RocketComponent component) {
super(component);
//// Mass
- panel.add(new JLabel("Mass"));
+ panel.add(new JLabel(trans.get("MassComponentCfg.lbl.Mass")));
DoubleModel m = new DoubleModel(component,"ComponentMass",UnitGroup.UNITS_MASS,0);
//// Mass length
- panel.add(new JLabel("Length"));
+ //// Length
+ panel.add(new JLabel(trans.get("MassComponentCfg.lbl.Length")));
m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
//// Tube diameter
- panel.add(new JLabel("Diameter:"));
+ //// Diameter:
+ panel.add(new JLabel(trans.get("MassComponentCfg.lbl.Diameter")));
DoubleModel od = new DoubleModel(component,"Radius",2,UnitGroup.UNITS_LENGTH,0);
// Diameter = 2*Radius
//// Position
-
- panel.add(new JLabel("Position relative to:"));
+ //// Position relative to:
+ panel.add(new JLabel(trans.get("MassComponentCfg.lbl.PosRelativeto")));
JComboBox combo = new JComboBox(
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
RocketComponent.Position.ABSOLUTE
}));
panel.add(combo,"spanx, growx, wrap");
-
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel(trans.get("MassComponentCfg.lbl.plus")),"right");
m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
spin = new JSpinner(m.getSpinnerModel());
new DoubleModel(component.getParent(), "Length"))),
"w 100lp, wrap");
-
- tabbedPane.insertTab("General", null, panel, "General properties", 0);
- tabbedPane.insertTab("Radial position", null, positionTab(),
- "Radial position configuration", 1);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("MassComponentCfg.tab.General"), null, panel,
+ trans.get("MassComponentCfg.tab.ttip.General"), 0);
+ //// Radial position and Radial position configuration
+ tabbedPane.insertTab(trans.get("MassComponentCfg.tab.Radialpos"), null, positionTab(),
+ trans.get("MassComponentCfg.tab.ttip.Radialpos"), 1);
tabbedPane.setSelectedIndex(0);
}
JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::]",""));
//// Radial position
- panel.add(new JLabel("Radial distance:"));
+ //// Radial distance:
+ panel.add(new JLabel(trans.get("MassComponentCfg.lbl.Radialdistance")));
DoubleModel m = new DoubleModel(component,"RadialPosition",UnitGroup.UNITS_LENGTH,0);
panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)),"w 100lp, wrap");
- //// Radial direction
- panel.add(new JLabel("Radial direction:"));
+ //// Radial direction:
+ panel.add(new JLabel(trans.get("MassComponentCfg.lbl.Radialdirection")));
m = new DoubleModel(component,"RadialDirection",UnitGroup.UNITS_ANGLE,0);
//// Reset button
- JButton button = new JButton("Reset");
+ JButton button = new JButton(trans.get("MassComponentCfg.but.Reset"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.UnitSelector;
import net.sf.openrocket.gui.dialogs.motor.MotorChooserDialog;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.ThrustCurveMotor;
import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class MotorConfig extends JPanel {
private final Configuration configuration;
private JPanel panel;
private JLabel motorLabel;
-
+ private static final Translator trans = Application.getTranslator();
+
public MotorConfig(MotorMount motorMount) {
super(new MigLayout("fill"));
model = new BooleanModel(motorMount, "MotorMount");
JCheckBox check = new JCheckBox(model);
- check.setText("This component is a motor mount");
+ ////This component is a motor mount
+ check.setText(trans.get("MotorCfg.checkbox.compmotormount"));
this.add(check, "wrap");
// Motor configuration selector
- panel.add(new JLabel("Motor configuration:"), "shrink");
+ //// Motor configuration:
+ panel.add(new JLabel(trans.get("MotorCfg.lbl.Motorcfg")), "shrink");
JComboBox combo = new JComboBox(new MotorConfigurationModel(configuration));
panel.add(combo, "growx");
}
});
- JButton button = new JButton("New");
+ //// New button
+ JButton button = new JButton(trans.get("MotorCfg.but.New"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panel.add(button, "wrap unrel");
- // Current motor
- panel.add(new JLabel("Current motor:"), "shrink");
+ // Current motor:
+ panel.add(new JLabel(trans.get("MotorCfg.lbl.Currentmotor")), "shrink");
motorLabel = new JLabel();
motorLabel.setFont(motorLabel.getFont().deriveFont(Font.BOLD));
// Overhang
- panel.add(new JLabel("Motor overhang:"));
+ //// Motor overhang:
+ panel.add(new JLabel(trans.get("MotorCfg.lbl.Motoroverhang")));
DoubleModel dm = new DoubleModel(motorMount, "MotorOverhang", UnitGroup.UNITS_LENGTH);
// Select ignition event
- panel.add(new JLabel("Ignition at:"), "");
+ //// Ignition at:
+ panel.add(new JLabel(trans.get("MotorCfg.lbl.Ignitionat")), "");
combo = new JComboBox(new EnumModel<IgnitionEvent>(mount, "IgnitionEvent"));
panel.add(combo, "growx, wrap");
// ... and delay
- panel.add(new JLabel("plus"), "gap indent, skip 1, span, split");
+ //// plus
+ panel.add(new JLabel(trans.get("MotorCfg.lbl.plus")), "gap indent, skip 1, span, split");
dm = new DoubleModel(mount, "IgnitionDelay", 0);
spin = new JSpinner(dm.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
panel.add(spin, "gap rel rel");
- panel.add(new JLabel("seconds"), "wrap unrel");
+ //// seconds
+ panel.add(new JLabel(trans.get("MotorCfg.lbl.seconds")), "wrap unrel");
int stages = c.getChildCount();
if (stages == 1) {
- panel.add(new StyledLabel("The current design has only one stage. " +
- "Stages can be added by clicking \"New stage\".", -1),
+ //// The current design has only one stage.
+ //// Stages can be added by clicking \"New stage\".
+
+ panel.add(new StyledLabel(trans.get("MotorCfg.lbl.longA1") +
+ trans.get("MotorCfg.lbl.longA2"), -1),
"spanx, right, wrap para");
} else {
- panel.add(new StyledLabel("The current design has " + stages + " stages.", -1),
+ //// The current design has
+ //// stages.
+ panel.add(new StyledLabel(trans.get("MotorCfg.lbl.longB1") + " " + stages +" " +
+ trans.get("MotorCfg.lbl.longB2"), -1),
"skip 1, spanx, wrap para");
}
// Select etc. buttons
- button = new JButton("Select motor");
+ //// Select motor
+ button = new JButton(trans.get("MotorCfg.but.Selectmotor"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
panel.add(button, "span, split, growx");
- button = new JButton("Remove motor");
+ //// Remove motor
+ button = new JButton(trans.get("MotorCfg.but.Removemotor"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String id = configuration.getMotorConfigurationID();
Motor m = mount.getMotor(id);
if (m == null) {
- motorLabel.setText("None");
+ //// None
+ motorLabel.setText(trans.get("MotorCfg.lbl.motorLabel"));
} else {
String str = "";
if (m instanceof ThrustCurveMotor)
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.DescriptionArea;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.NoseCone;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.Transition;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class NoseConeConfig extends RocketComponentConfig {
private JLabel shapeLabel;
private JSpinner shapeSpinner;
private JSlider shapeSlider;
-
+ private static final Translator trans = Application.getTranslator();
+
// Prepended to the description from NoseCone.DESCRIPTIONS
private static final String PREDESC = "<html>";
//// Shape selection
-
- panel.add(new JLabel("Nose cone shape:"));
+ //// Nose cone shape:
+ panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Noseconeshape")));
Transition.Shape selected = ((NoseCone)component).getType();
Transition.Shape[] typeList = Transition.Shape.values();
//// Shape parameter
- shapeLabel = new JLabel("Shape parameter:");
+ //// Shape parameter:
+ shapeLabel = new JLabel(trans.get("NoseConeCfg.lbl.Shapeparam"));
panel.add(shapeLabel);
m = new DoubleModel(component,"ShapeParameter");
//// Length
-
- panel.add(new JLabel("Nose cone length:"));
+ //// Nose cone length:
+ panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Noseconelength")));
m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
JSpinner spin = new JSpinner(m.getSpinnerModel());
panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.7)),"w 100lp, wrap");
//// Diameter
-
- panel.add(new JLabel("Base diameter:"));
+ //// Base diameter:
+ panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Basediam")));
m = new DoubleModel(component,"AftRadius",2.0,UnitGroup.UNITS_LENGTH,0); // Diameter = 2*Radius
spin = new JSpinner(m.getSpinnerModel());
panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap 0px");
JCheckBox check = new JCheckBox(m.getAutomaticAction());
- check.setText("Automatic");
+ //// Automatic
+ check.setText(trans.get("NoseConeCfg.checkbox.Automatic"));
panel.add(check,"skip, span 2, wrap");
- //// Wall thickness
- panel.add(new JLabel("Wall thickness:"));
+ //// Wall thickness:
+ panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Wallthickness")));
m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
check = new JCheckBox(new BooleanModel(component,"Filled"));
- check.setText("Filled");
+ //// Filled
+ check.setText(trans.get("NoseConeCfg.checkbox.Filled"));
panel.add(check,"skip, span 2, wrap");
panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany");
-
- tabbedPane.insertTab("General", null, panel, "General properties", 0);
- tabbedPane.insertTab("Shoulder", null, shoulderTab(), "Shoulder properties", 1);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("NoseConeCfg.tab.General"), null, panel,
+ trans.get("NoseConeCfg.tab.ttip.General"), 0);
+ //// Shoulder and Shoulder properties
+ tabbedPane.insertTab(trans.get("NoseConeCfg.tab.Shoulder"), null, shoulderTab(),
+ trans.get("NoseConeCfg.tab.ttip.Shoulder"), 1);
tabbedPane.setSelectedIndex(0);
}
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.UnitSelector;
import net.sf.openrocket.gui.components.StyledLabel.Style;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.MassObject;
import net.sf.openrocket.rocketcomponent.Parachute;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class ParachuteConfig extends RecoveryDeviceConfig {
+ private static final Translator trans = Application.getTranslator();
public ParachuteConfig(final RocketComponent component) {
super(component);
//// Canopy
- panel.add(new StyledLabel("Canopy:", Style.BOLD), "wrap unrel");
+ panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Canopy"), Style.BOLD), "wrap unrel");
-
- panel.add(new JLabel("Diameter:"));
+ //// Diameter:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Diameter")));
DoubleModel m = new DoubleModel(component,"Diameter",UnitGroup.UNITS_LENGTH,0);
panel.add(new UnitSelector(m),"growx");
panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)),"w 100lp, wrap");
-
- panel.add(new JLabel("Material:"));
+ //// Material:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
JComboBox combo = new JComboBox(new MaterialModel(panel, component,
Material.Type.SURFACE));
- combo.setToolTipText("The component material affects the weight of the component.");
+ //// The component material affects the weight of the component.
+ combo.setToolTipText(trans.get("ParachuteCfg.combo.MaterialModel"));
panel.add(combo,"spanx 3, growx, wrap paragraph");
// materialPanel(panel, Material.Type.SURFACE, "Material:", null);
// CD
- JLabel label = new HtmlLabel("<html>Drag coefficient C<sub>D</sub>:");
- String tip = "<html>The drag coefficient relative to the total area of the parachute.<br>" +
- "A larger drag coefficient yields a slowed descent rate. " +
- "A typical value for parachutes is 0.8.";
+ //// <html>Drag coefficient C<sub>D</sub>:
+ JLabel label = new HtmlLabel(trans.get("ParachuteCfg.lbl.longA1"));
+ String tip = trans.get("ParachuteCfg.lbl.longB1") +
+ trans.get("ParachuteCfg.lbl.longB2") + " " +
+ trans.get("ParachuteCfg.lbl.longB3");
label.setToolTipText(tip);
panel.add(label);
spin.setEditor(new SpinnerEditor(spin));
panel.add(spin,"growx");
- JButton button = new JButton("Reset");
+ //// Reset button
+ JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//// Shroud lines
- panel.add(new StyledLabel("Shroud lines:", Style.BOLD), "wrap unrel");
-
+ panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Shroudlines"), Style.BOLD), "wrap unrel");
- panel.add(new JLabel("Number of lines:"));
+ //// Number of lines:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Numberoflines")));
IntegerModel im = new IntegerModel(component,"LineCount",0);
spin = new JSpinner(im.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
panel.add(spin,"growx, wrap");
-
- panel.add(new JLabel("Line length:"));
+ //// Line length:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Linelength")));
m = new DoubleModel(component,"LineLength",UnitGroup.UNITS_LENGTH,0);
panel.add(new UnitSelector(m),"growx");
panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)),"w 100lp, wrap");
-
- panel.add(new JLabel("Material:"));
+ //// Material:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
combo = new JComboBox(new MaterialModel(panel, component, Material.Type.LINE,
"LineMaterial"));
//// Position
-
- panel.add(new JLabel("Position relative to:"));
+ //// Position relative to:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Posrelativeto")));
combo = new JComboBox(
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
}));
panel.add(combo,"spanx, growx, wrap");
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")),"right");
m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
spin = new JSpinner(m.getSpinnerModel());
//// Spatial length
- panel.add(new JLabel("Packed length:"));
+ //// Packed length:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packedlength")));
m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
//// Tube diameter
- panel.add(new JLabel("Packed diameter:"));
+ //// Packed diameter:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packeddiam")));
DoubleModel od = new DoubleModel(component,"Radius",2,UnitGroup.UNITS_LENGTH,0);
// Diameter = 2*Radius
//// Deployment
-
- panel.add(new JLabel("Deploys at:"),"");
+ //// Deploys at:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Deploysat")),"");
combo = new JComboBox(new EnumModel<IgnitionEvent>(component, "DeployEvent"));
panel.add(combo,"spanx 3, growx, wrap");
// ... and delay
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")),"right");
m = new DoubleModel(component,"DeployDelay",0);
spin = new JSpinner(m.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
panel.add(spin,"spanx, split");
- panel.add(new JLabel("seconds"),"wrap paragraph");
+ //// seconds
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.seconds")),"wrap paragraph");
- // Altitude
- label = new JLabel("Altitude:");
+ // Altitude:
+ label = new JLabel(trans.get("ParachuteCfg.lbl.Altitude"));
altitudeComponents.add(label);
panel.add(label);
updateFields();
- tabbedPane.insertTab("General", null, primary, "General properties", 0);
- tabbedPane.insertTab("Radial position", null, positionTab(),
- "Radial position configuration", 1);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("ParachuteCfg.tab.General"), null, primary, trans.get("ParachuteCfg.tab.ttip.General"), 0);
+ //// Radial position and Radial position configuration
+ tabbedPane.insertTab(trans.get("ParachuteCfg.tab.Radialpos"), null, positionTab(),
+ trans.get("ParachuteCfg.tab.ttip.Radialpos"), 1);
tabbedPane.setSelectedIndex(0);
}
JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::]",""));
//// Radial position
- panel.add(new JLabel("Radial distance:"));
+ //// Radial distance:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdistance")));
DoubleModel m = new DoubleModel(component,"RadialPosition",UnitGroup.UNITS_LENGTH,0);
panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)),"w 100lp, wrap");
- //// Radial direction
- panel.add(new JLabel("Radial direction:"));
+ //// Radial direction:
+ panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdirection")));
m = new DoubleModel(component,"RadialDirection",UnitGroup.UNITS_ANGLE,0);
//// Reset button
- JButton button = new JButton("Reset");
+ JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.DescriptionArea;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.EngineBlock;
import net.sf.openrocket.rocketcomponent.RingComponent;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class RingComponentConfig extends RocketComponentConfig {
+ private static final Translator trans = Application.getTranslator();
public RingComponentConfig(RocketComponent component) {
super(component);
if (outer != null) {
panel.add(new JLabel(outer));
+ //// OuterRadius
od = new DoubleModel(component,"OuterRadius",2,UnitGroup.UNITS_LENGTH,0);
// Diameter = 2*Radius
if (od.isAutomaticAvailable()) {
JCheckBox check = new JCheckBox(od.getAutomaticAction());
- check.setText("Automatic");
+ //// Automatic
+ check.setText(trans.get("ringcompcfg.Automatic"));
panel.add(check,"skip, span 2, wrap");
}
}
if (inner != null) {
panel.add(new JLabel(inner));
+ //// InnerRadius
m = new DoubleModel(component,"InnerRadius",2,UnitGroup.UNITS_LENGTH,0);
spin = new JSpinner(m.getSpinnerModel());
if (m.isAutomaticAvailable()) {
JCheckBox check = new JCheckBox(m.getAutomaticAction());
- check.setText("Automatic");
+ //// Automatic
+ check.setText(trans.get("ringcompcfg.Automatic"));
panel.add(check,"skip, span 2, wrap");
}
}
if (thickness != null) {
panel.add(new JLabel(thickness));
+ //// Thickness
m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
spin = new JSpinner(m.getSpinnerModel());
if (length != null) {
panel.add(new JLabel(length));
+ //// Length
m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
spin = new JSpinner(m.getSpinnerModel());
//// Position
- panel.add(new JLabel("Position relative to:"));
+ //// Position relative to:
+ panel.add(new JLabel(trans.get("ringcompcfg.Positionrelativeto")));
JComboBox combo = new JComboBox(
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
}));
panel.add(combo,"spanx 3, growx, wrap");
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel(trans.get("ringcompcfg.plus")),"right");
+ //// PositionValue
m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
spin = new JSpinner(m.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
"[][65lp::][30lp::]",""));
//// Radial position
- JLabel l = new JLabel("Radial distance:");
- l.setToolTipText("Distance from the rocket centerline");
+ JLabel l = new JLabel(trans.get("ringcompcfg.Radialdistance"));
+ //// Distance from the rocket centerline
+ l.setToolTipText(trans.get("ringcompcfg.Distancefrom"));
panel.add(l);
DoubleModel m = new DoubleModel(component,"RadialPosition",UnitGroup.UNITS_LENGTH,0);
JSpinner spin = new JSpinner(m.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
- spin.setToolTipText("Distance from the rocket centerline");
+ //// Distance from the rocket centerline
+ spin.setToolTipText(trans.get("ringcompcfg.Distancefrom"));
panel.add(spin,"growx");
panel.add(new UnitSelector(m),"growx");
BasicSlider bs = new BasicSlider(m.getSliderModel(0, 0.1, 1.0));
- bs.setToolTipText("Distance from the rocket centerline");
+ //// Distance from the rocket centerline
+ bs.setToolTipText(trans.get("ringcompcfg.Distancefrom"));
panel.add(bs,"w 100lp, wrap");
//// Radial direction
- l = new JLabel("Radial direction:");
- l.setToolTipText("The radial direction from the rocket centerline");
+ l = new JLabel(trans.get("ringcompcfg.Radialdirection"));
+ //// The radial direction from the rocket centerline
+ l.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom"));
panel.add(l);
m = new DoubleModel(component,"RadialDirection",UnitGroup.UNITS_ANGLE,0);
spin = new JSpinner(m.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
- spin.setToolTipText("The radial direction from the rocket centerline");
+ //// The radial direction from the rocket centerline
+ spin.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom"));
panel.add(spin,"growx");
panel.add(new UnitSelector(m),"growx");
bs = new BasicSlider(m.getSliderModel(-Math.PI, Math.PI));
- bs.setToolTipText("The radial direction from the rocket centerline");
+ //// The radial direction from the rocket centerline
+ bs.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom"));
panel.add(bs,"w 100lp, wrap");
//// Reset button
- JButton button = new JButton("Reset");
- button.setToolTipText("Reset the component to the rocket centerline");
+ JButton button = new JButton(trans.get("ringcompcfg.but.Reset"));
+ //// Reset the component to the rocket centerline
+ button.setToolTipText(trans.get("ringcompcfg.but.Resetcomponant"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.StyledLabel.Style;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.ComponentAssembly;
import net.sf.openrocket.rocketcomponent.ExternalComponent;
import net.sf.openrocket.rocketcomponent.NoseCone;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.GUIUtil;
import net.sf.openrocket.util.Invalidatable;
public class RocketComponentConfig extends JPanel {
+ private static final Translator trans = Application.getTranslator();
+
protected final RocketComponent component;
protected final JTabbedPane tabbedPane;
setLayout(new MigLayout("fill", "[grow, fill]"));
this.component = component;
- JLabel label = new JLabel("Component name:");
- label.setToolTipText("The component name.");
+ //// Component name:
+ JLabel label = new JLabel(trans.get("RocketCompCfg.lbl.Componentname"));
+ //// The component name.
+ label.setToolTipText(trans.get("RocketCompCfg.ttip.Thecomponentname"));
this.add(label, "split, gapright 10");
componentNameField = new JTextField(15);
textFieldListener = new TextFieldListener();
componentNameField.addActionListener(textFieldListener);
componentNameField.addFocusListener(textFieldListener);
- componentNameField.setToolTipText("The component name.");
+ //// The component name.
+ componentNameField.setToolTipText(trans.get("RocketCompCfg.ttip.Thecomponentname"));
this.add(componentNameField, "growx, growy 0, wrap");
tabbedPane = new JTabbedPane();
this.add(tabbedPane, "growx, growy 1, wrap");
- tabbedPane.addTab("Override", null, overrideTab(), "Mass and CG override options");
+ //// Override and Mass and CG override options
+ tabbedPane.addTab(trans.get("RocketCompCfg.tab.Override"), null, overrideTab(),
+ trans.get("RocketCompCfg.tab.MassandCGoverride"));
if (component.isMassive())
- tabbedPane.addTab("Figure", null, figureTab(), "Figure style options");
- tabbedPane.addTab("Comment", null, commentTab(), "Specify a comment for the component");
+ //// Figure and Figure style options
+ tabbedPane.addTab(trans.get("RocketCompCfg.tab.Figure"), null, figureTab(),
+ trans.get("RocketCompCfg.tab.Figstyleopt"));
+ //// Comment and Specify a comment for the component
+ tabbedPane.addTab(trans.get("RocketCompCfg.tab.Comment"), null, commentTab(),
+ trans.get("RocketCompCfg.tab.Specifyacomment"));
addButtons();
buttonPanel = new JPanel(new MigLayout("fill, ins 0"));
- massLabel = new StyledLabel("Mass: ", -1);
+ //// Mass:
+ massLabel = new StyledLabel(trans.get("RocketCompCfg.lbl.Mass") + " ", -1);
buttonPanel.add(massLabel, "growx");
for (JButton b : buttons) {
buttonPanel.add(b, "right, gap para");
}
- JButton closeButton = new JButton("Close");
+ //// Close button
+ JButton closeButton = new JButton(trans.get("dlg.but.close"));
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// Mass label
if (component.isMassive()) {
- String text = "Component mass: ";
+ //// Component mass:
+ String text = trans.get("RocketCompCfg.lbl.Componentmass") + " ";
text += UnitGroup.UNITS_MASS.getDefaultUnit().toStringUnit(
component.getComponentMass());
String overridetext = null;
if (component.isMassOverridden()) {
- overridetext = "(overridden to " + UnitGroup.UNITS_MASS.getDefaultUnit().
+ //// (overridden to
+ overridetext = trans.get("RocketCompCfg.lbl.overriddento")+" " + UnitGroup.UNITS_MASS.getDefaultUnit().
toStringUnit(component.getOverrideMass()) + ")";
}
for (RocketComponent c = component.getParent(); c != null; c = c.getParent()) {
if (c.isMassOverridden() && c.getOverrideSubcomponents()) {
- overridetext = "(overridden by " + c.getName() + ")";
+ ///// (overridden by
+ overridetext = trans.get("RocketCompCfg.lbl.overriddenby")+" " + c.getName() + ")";
}
}
protected JPanel materialPanel(JPanel panel, Material.Type type) {
- return materialPanel(panel, type, "Component material:", "Component finish:");
+ ////Component material: and Component finish:
+ return materialPanel(panel, type, trans.get("RocketCompCfg.lbl.Componentmaterial"),
+ trans.get("RocketCompCfg.lbl.Componentfinish"));
}
protected JPanel materialPanel(JPanel panel, Material.Type type,
String materialString, String finishString) {
JLabel label = new JLabel(materialString);
- label.setToolTipText("The component material affects the weight of the component.");
+ //// The component material affects the weight of the component.
+ label.setToolTipText(trans.get("RocketCompCfg.lbl.ttip.componentmaterialaffects"));
panel.add(label, "spanx 4, wrap rel");
JComboBox combo = new JComboBox(new MaterialModel(panel, component, type));
- combo.setToolTipText("The component material affects the weight of the component.");
+ //// The component material affects the weight of the component.
+ combo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects"));
panel.add(combo, "spanx 4, growx, wrap paragraph");
if (component instanceof ExternalComponent) {
label = new JLabel(finishString);
- String tip = "<html>The component finish affects the aerodynamic drag of the "
- + "component.<br>"
- + "The value indicated is the average roughness height of the surface.";
+ ////<html>The component finish affects the aerodynamic drag of the component.<br>
+ String tip = trans.get("RocketCompCfg.lbl.longA1")
+ //// The value indicated is the average roughness height of the surface.
+ + trans.get("RocketCompCfg.lbl.longA2");
label.setToolTipText(tip);
panel.add(label, "spanx 4, wmin 220lp, wrap rel");
combo.setToolTipText(tip);
panel.add(combo, "spanx 4, growx, split");
- JButton button = new JButton("Set for all");
- button.setToolTipText("Set this finish for all components of the rocket.");
+ //// Set for all
+ JButton button = new JButton(trans.get("RocketCompCfg.but.Setforall"));
+ //// Set this finish for all components of the rocket.
+ button.setToolTipText(trans.get("RocketCompCfg.but.ttip.Setforall"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
private JPanel overrideTab() {
JPanel panel = new JPanel(new MigLayout("align 50% 20%, fillx, gap rel unrel",
"[][65lp::][30lp::][]", ""));
-
- panel.add(new StyledLabel("Override the mass or center of gravity of the " +
+ //// Override the mass or center of gravity of the
+ panel.add(new StyledLabel(trans.get("RocketCompCfg.lbl.Overridemassorcenter") + " " +
component.getComponentName() + ":", Style.BOLD), "spanx, wrap 20lp");
JCheckBox check;
//// Mass
bm = new BooleanModel(component, "MassOverridden");
check = new JCheckBox(bm);
- check.setText("Override mass:");
+ //// Override mass:
+ check.setText(trans.get("RocketCompCfg.checkbox.Overridemass"));
panel.add(check, "growx 1, gapright 20lp");
DoubleModel m = new DoubleModel(component, "OverrideMass", UnitGroup.UNITS_MASS, 0);
//// CG override
bm = new BooleanModel(component, "CGOverridden");
check = new JCheckBox(bm);
- check.setText("Override center of gravity:");
+ //// Override center of gravity:"
+ check.setText(trans.get("RocketCompCfg.checkbox.Overridecenterofgrav"));
panel.add(check, "growx 1, gapright 20lp");
m = new DoubleModel(component, "OverrideCGX", UnitGroup.UNITS_LENGTH, 0);
// Override subcomponents checkbox
bm = new BooleanModel(component, "OverrideSubcomponents");
check = new JCheckBox(bm);
- check.setText("Override mass and CG of all subcomponents");
+ //// Override mass and CG of all subcomponents
+ check.setText(trans.get("RocketCompCfg.checkbox.OverridemassandCG"));
panel.add(check, "gap para, spanx, wrap para");
-
- panel.add(new StyledLabel("<html>The overridden mass does not include motors.<br>" +
- "The center of gravity is measured from the front end of the " +
+ //// <html>The overridden mass does not include motors.<br>
+ panel.add(new StyledLabel(trans.get("RocketCompCfg.lbl.longB1") +
+ //// The center of gravity is measured from the front end of the
+ trans.get("RocketCompCfg.lbl.longB2") +" " +
component.getComponentName().toLowerCase() + ".", -1),
"spanx, wrap, gap para, height 0::30lp");
private JPanel commentTab() {
JPanel panel = new JPanel(new MigLayout("fill"));
- panel.add(new StyledLabel("Comments on the " + component.getComponentName() + ":",
+ //// Comments on the
+ panel.add(new StyledLabel(trans.get("RocketCompCfg.lbl.Commentsonthe") +" " + component.getComponentName() + ":",
Style.BOLD), "wrap");
// TODO: LOW: Changes in comment from other sources not reflected in component
private JPanel figureTab() {
JPanel panel = new JPanel(new MigLayout("align 20% 20%"));
- panel.add(new StyledLabel("Figure style:", Style.BOLD), "wrap para");
+ //// Figure style:
+ panel.add(new StyledLabel(trans.get("RocketCompCfg.lbl.Figurestyle"), Style.BOLD), "wrap para");
-
- panel.add(new JLabel("Component color:"), "gapleft para, gapright 10lp");
+ //// Component color:
+ panel.add(new JLabel(trans.get("RocketCompCfg.lbl.Componentcolor")), "gapleft para, gapright 10lp");
colorButton = new JButton(new ColorIcon(component.getColor()));
colorButton.addActionListener(new ActionListener() {
c = Prefs.getDefaultColor(component.getClass());
}
- c = JColorChooser.showDialog(tabbedPane, "Choose color", c);
+ //// Choose color
+ c = JColorChooser.showDialog(tabbedPane, trans.get("RocketCompCfg.lbl.Choosecolor"), c);
if (c != null) {
component.setColor(c);
}
});
panel.add(colorButton, "gapright 10lp");
- colorDefault = new JCheckBox("Use default color");
+ //// Use default color
+ colorDefault = new JCheckBox(trans.get("RocketCompCfg.checkbox.Usedefaultcolor"));
if (component.getColor() == null)
colorDefault.setSelected(true);
colorDefault.addActionListener(new ActionListener() {
});
panel.add(colorDefault, "wrap para");
-
- panel.add(new JLabel("Component line style:"), "gapleft para, gapright 10lp");
+ //// Component line style:
+ panel.add(new JLabel(trans.get("RocketCompCfg.lbl.Complinestyle")), "gapleft para, gapright 10lp");
LineStyle[] list = new LineStyle[LineStyle.values().length + 1];
System.arraycopy(LineStyle.values(), 0, list, 1, LineStyle.values().length);
list, "Default style"));
panel.add(combo, "spanx 2, growx, wrap 50lp");
-
- JButton button = new JButton("Save as default style");
+ //// Save as default style
+ JButton button = new JButton(trans.get("RocketCompCfg.but.Saveasdefstyle"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!(component instanceof NoseCone)) {
sub = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", ""));
- sub.setBorder(BorderFactory.createTitledBorder("Fore shoulder"));
+ //// Fore shoulder
+ sub.setBorder(BorderFactory.createTitledBorder(trans.get("RocketCompCfg.border.Foreshoulder")));
//// Radius
- sub.add(new JLabel("Diameter:"));
+ //// Diameter:
+ sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Diameter")));
m = new DoubleModel(component, "ForeShoulderRadius", 2, UnitGroup.UNITS_LENGTH, 0);
m2 = new DoubleModel(component, "ForeRadius", 2, UnitGroup.UNITS_LENGTH);
sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap");
- //// Length
- sub.add(new JLabel("Length:"));
+ //// Length:
+ sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Length")));
m = new DoubleModel(component, "ForeShoulderLength", UnitGroup.UNITS_LENGTH, 0);
sub.add(new BasicSlider(m.getSliderModel(0, 0.02, 0.2)), "w 100lp, wrap");
- //// Thickness
- sub.add(new JLabel("Thickness:"));
+ //// Thickness:
+ sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Thickness")));
m = new DoubleModel(component, "ForeShoulderThickness", UnitGroup.UNITS_LENGTH, 0);
m2 = new DoubleModel(component, "ForeShoulderRadius", UnitGroup.UNITS_LENGTH);
//// Capped
bm = new BooleanModel(component, "ForeShoulderCapped");
check = new JCheckBox(bm);
- check.setText("End capped");
- check.setToolTipText("Whether the end of the shoulder is capped.");
+ //// End capped
+ check.setText(trans.get("RocketCompCfg.checkbox.Endcapped"));
+ //// Whether the end of the shoulder is capped.
+ check.setToolTipText(trans.get("RocketCompCfg.ttip.Endcapped"));
sub.add(check, "spanx");
sub = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", ""));
if (component instanceof NoseCone)
- sub.setBorder(BorderFactory.createTitledBorder("Nose cone shoulder"));
+ //// Nose cone shoulder
+ sub.setBorder(BorderFactory.createTitledBorder(trans.get("RocketCompCfg.title.Noseconeshoulder")));
else
- sub.setBorder(BorderFactory.createTitledBorder("Aft shoulder"));
+ //// Aft shoulder
+ sub.setBorder(BorderFactory.createTitledBorder(trans.get("RocketCompCfg.title.Aftshoulder")));
//// Radius
- sub.add(new JLabel("Diameter:"));
+ //// Diameter:
+ sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Diameter")));
m = new DoubleModel(component, "AftShoulderRadius", 2, UnitGroup.UNITS_LENGTH, 0);
m2 = new DoubleModel(component, "AftRadius", 2, UnitGroup.UNITS_LENGTH);
sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap");
- //// Length
- sub.add(new JLabel("Length:"));
+ //// Length:
+ sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Length")));
m = new DoubleModel(component, "AftShoulderLength", UnitGroup.UNITS_LENGTH, 0);
sub.add(new BasicSlider(m.getSliderModel(0, 0.02, 0.2)), "w 100lp, wrap");
- //// Thickness
- sub.add(new JLabel("Thickness:"));
+ //// Thickness:
+ sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Thickness")));
m = new DoubleModel(component, "AftShoulderThickness", UnitGroup.UNITS_LENGTH, 0);
m2 = new DoubleModel(component, "AftShoulderRadius", UnitGroup.UNITS_LENGTH);
//// Capped
bm = new BooleanModel(component, "AftShoulderCapped");
check = new JCheckBox(bm);
- check.setText("End capped");
- check.setToolTipText("Whether the end of the shoulder is capped.");
+ //// End capped
+ check.setText(trans.get("RocketCompCfg.checkbox.Endcapped"));
+ //// Whether the end of the shoulder is capped.
+ check.setToolTipText(trans.get("RocketCompCfg.ttip.Endcapped"));
sub.add(check, "spanx");
import javax.swing.JTextArea;
import net.miginfocom.swing.MigLayout;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.GUIUtil;
public class RocketConfig extends RocketComponentConfig {
+ private static final Translator trans = Application.getTranslator();
private TextFieldListener textFieldListener;
this.removeAll();
setLayout(new MigLayout("fill"));
- this.add(new JLabel("Design name:"), "top, pad 4lp, gapright 10lp");
+ //// Design name:
+ this.add(new JLabel(trans.get("RocketCfg.lbl.Designname")), "top, pad 4lp, gapright 10lp");
this.add(componentNameField, "growx, wrap para");
-
- this.add(new JLabel("Designer:"), "top, pad 4lp, gapright 10lp");
+ //// Designer:
+ this.add(new JLabel(trans.get("RocketCfg.lbl.Designer")), "top, pad 4lp, gapright 10lp");
textFieldListener = new TextFieldListener();
designerTextArea = new JTextArea(rocket.getDesigner());
designerTextArea.addFocusListener(textFieldListener);
this.add(new JScrollPane(designerTextArea), "wmin 400lp, height 60lp:60lp:, grow 30, wrap para");
-
- this.add(new JLabel("Comments:"), "top, pad 4lp, gapright 10lp");
+ //// Comments:
+ this.add(new JLabel(trans.get("RocketCfg.lbl.Comments")), "top, pad 4lp, gapright 10lp");
this.add(new JScrollPane(commentTextArea), "wmin 400lp, height 155lp:155lp:, grow 100, wrap para");
-
- this.add(new JLabel("Revision history:"), "top, pad 4lp, gapright 10lp");
+ //// Revision history:
+ this.add(new JLabel(trans.get("RocketCfg.lbl.Material")), "top, pad 4lp, gapright 10lp");
revisionTextArea = new JTextArea(rocket.getRevision());
revisionTextArea.setLineWrap(true);
revisionTextArea.setWrapStyleWord(true);
import net.sf.openrocket.gui.adaptors.EnumModel;
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class ShockCordConfig extends RocketComponentConfig {
-
+ private static final Translator trans = Application.getTranslator();
public ShockCordConfig(RocketComponent component) {
super(component);
////// Left side
// Cord length
- label = new JLabel("Shock cord length");
+ //// Shock cord length
+ label = new JLabel(trans.get("ShockCordCfg.lbl.Shockcordlength"));
panel.add(label);
m = new DoubleModel(component,"CordLength",UnitGroup.UNITS_LENGTH,0);
// Material
- materialPanel(panel, Material.Type.LINE, "Shock cord material:", null);
+ //// Shock cord material:
+ materialPanel(panel, Material.Type.LINE, trans.get("ShockCordCfg.lbl.Shockcordmaterial"), null);
//// Position
-
- panel2.add(new JLabel("Position relative to:"));
+ //// Position relative to:
+ panel2.add(new JLabel(trans.get("ShockCordCfg.lbl.Posrelativeto")));
JComboBox combo = new JComboBox(
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
}));
panel2.add(combo,"spanx, growx, wrap");
- panel2.add(new JLabel("plus"),"right");
+ //// plus
+ panel2.add(new JLabel(trans.get("ShockCordCfg.lbl.plus")),"right");
m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
spin = new JSpinner(m.getSpinnerModel());
//// Spatial length
- panel2.add(new JLabel("Packed length:"));
+ //// Packed length:
+ panel2.add(new JLabel(trans.get("ShockCordCfg.lbl.Packedlength")));
m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
//// Tube diameter
- panel2.add(new JLabel("Packed diameter:"));
+ //// Packed diameter:
+ panel2.add(new JLabel(trans.get("ShockCordCfg.lbl.Packeddiam")));
DoubleModel od = new DoubleModel(component,"Radius",2,UnitGroup.UNITS_LENGTH,0);
// Diameter = 2*Radius
-
- tabbedPane.insertTab("General", null, panel, "General properties", 0);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("ShockCordCfg.tab.General"), null, panel, trans.get("ShockCordCfg.tab.ttip.General"), 0);
// tabbedPane.insertTab("Radial position", null, positionTab(),
// "Radial position configuration", 1);
tabbedPane.setSelectedIndex(0);
import javax.swing.JPanel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
public class SleeveConfig extends RingComponentConfig {
-
+ private static final Translator trans = Application.getTranslator();
+
public SleeveConfig(RocketComponent c) {
super(c);
JPanel tab;
-
- tab = generalTab("Outer diameter:", "Inner diameter:", "Wall thickness:", "Length:");
- tabbedPane.insertTab("General", null, tab, "General properties", 0);
+ //// Outer diameter:
+ //// Inner diameter:
+ //// Wall thickness:
+ //// Length:
+ tab = generalTab(trans.get("SleeveCfg.tab.Outerdiam"), trans.get("SleeveCfg.tab.Innerdiam"),
+ trans.get("SleeveCfg.tab.Wallthickness"), trans.get("SleeveCfg.tab.Length"));
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("SleeveCfg.tab.General"), null, tab,
+ trans.get("SleeveCfg.tab.Generalproperties"), 0);
tabbedPane.setSelectedIndex(0);
}
import net.sf.openrocket.gui.components.HtmlLabel;
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.MassComponent;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class StreamerConfig extends RecoveryDeviceConfig {
-
+ private static final Translator trans = Application.getTranslator();
+
public StreamerConfig(final RocketComponent component) {
super(component);
JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::][]",""));
-
- panel.add(new JLabel("Strip length:"));
+ //// Strip length:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Striplength")));
DoubleModel m = new DoubleModel(component,"StripLength",UnitGroup.UNITS_LENGTH,0);
panel.add(new UnitSelector(m),"growx");
panel.add(new BasicSlider(m.getSliderModel(0, 0.6, 1.5)),"w 100lp, wrap");
-
- panel.add(new JLabel("Strip width:"));
+ //// Strip width:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Stripwidth")));
m = new DoubleModel(component,"StripWidth",UnitGroup.UNITS_LENGTH,0);
-
- panel.add(new JLabel("Strip area:"));
+ //// Strip area:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Striparea")));
m = new DoubleModel(component,"Area",UnitGroup.UNITS_AREA,0);
panel.add(new UnitSelector(m),"growx");
panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.25)),"w 100lp, wrap");
-
- panel.add(new JLabel("Aspect ratio:"));
+ //// Aspect ratio:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Aspectratio")));
m = new DoubleModel(component,"AspectRatio",UnitGroup.UNITS_NONE,0);
panel.add(new BasicSlider(m.getSliderModel(2, 15)),"skip, w 100lp, wrap 20lp");
-
- panel.add(new JLabel("Material:"));
+ //// Material:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Material")));
JComboBox combo = new JComboBox(new MaterialModel(panel, component,
Material.Type.SURFACE));
- combo.setToolTipText("The component material affects the weight of the component.");
+ //// The component material affects the weight of the component.
+ combo.setToolTipText(trans.get("StreamerCfg.combo.ttip.MaterialModel"));
panel.add(combo,"spanx 3, growx, wrap 20lp");
// CD
- JLabel label = new HtmlLabel("<html>Drag coefficient C<sub>D</sub>:");
- String tip = "<html>The drag coefficient relative to the total area of the streamer.<br>" +
- "A larger drag coefficient yields a slowed descent rate.";
+ //// <html>Drag coefficient C<sub>D</sub>:
+ JLabel label = new HtmlLabel(trans.get("StreamerCfg.lbl.longA1"));
+ //// <html>The drag coefficient relative to the total area of the streamer.<br>
+ String tip = trans.get("StreamerCfg.lbl.longB1") +
+ //// "A larger drag coefficient yields a slowed descent rate.
+ trans.get("StreamerCfg.lbl.longB2");
label.setToolTipText(tip);
panel.add(label);
panel.add(spin,"growx");
JCheckBox check = new JCheckBox(m.getAutomaticAction());
- check.setText("Automatic");
+ //// Automatic
+ check.setText(trans.get("StreamerCfg.lbl.Automatic"));
panel.add(check,"skip, span, wrap");
- panel.add(new StyledLabel("The drag coefficient is relative to the area of the streamer.",
+ //// The drag coefficient is relative to the area of the streamer.
+ panel.add(new StyledLabel(trans.get("StreamerCfg.lbl.longC1"),
-2), "span, wrap");
//// Position
-
- panel.add(new JLabel("Position relative to:"));
+ //// Position relative to:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Posrelativeto")));
combo = new JComboBox(
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
}));
panel.add(combo,"spanx, growx, wrap");
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.plus")),"right");
m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
spin = new JSpinner(m.getSpinnerModel());
"w 100lp, wrap");
- //// Spatial length
- panel.add(new JLabel("Packed length:"));
+ //// Spatial length:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Packedlength")));
m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
//// Tube diameter
- panel.add(new JLabel("Packed diameter:"));
+ //// Packed diameter:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Packeddiam")));
DoubleModel od = new DoubleModel(component,"Radius",2,UnitGroup.UNITS_LENGTH,0);
// Diameter = 2*Radius
//// Deployment
-
- panel.add(new JLabel("Deploys at:"),"");
+ //// Deploys at:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Deploysat")),"");
combo = new JComboBox(new EnumModel<IgnitionEvent>(component, "DeployEvent"));
panel.add(combo,"spanx 3, growx, wrap");
// ... and delay
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.plus")),"right");
m = new DoubleModel(component,"DeployDelay",0);
spin = new JSpinner(m.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
panel.add(spin,"spanx, split");
- panel.add(new JLabel("seconds"),"wrap paragraph");
+ //// seconds
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.seconds")),"wrap paragraph");
- // Altitude
- label = new JLabel("Altitude:");
+ // Altitude:
+ label = new JLabel(trans.get("StreamerCfg.lbl.Altitude"));
altitudeComponents.add(label);
panel.add(label);
primary.add(panel, "grow");
updateFields();
-
- tabbedPane.insertTab("General", null, primary, "General properties", 0);
- tabbedPane.insertTab("Radial position", null, positionTab(),
- "Radial position configuration", 1);
+
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("StreamerCfg.tab.General"), null, primary,
+ trans.get("StreamerCfg.tab.ttip.General"), 0);
+ //// Radial position and Radial position configuration
+ tabbedPane.insertTab(trans.get("StreamerCfg.tab.Radialpos"), null, positionTab(),
+ trans.get("StreamerCfg.tab.ttip.Radialpos"), 1);
tabbedPane.setSelectedIndex(0);
}
JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::]",""));
//// Radial position
- panel.add(new JLabel("Radial distance:"));
+ //// Radial distance:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Radialdistance")));
DoubleModel m = new DoubleModel(component,"RadialPosition",UnitGroup.UNITS_LENGTH,0);
//// Radial direction
- panel.add(new JLabel("Radial direction:"));
+ //// Radial direction:
+ panel.add(new JLabel(trans.get("StreamerCfg.lbl.Radialdirection")));
m = new DoubleModel(component,"RadialDirection",UnitGroup.UNITS_ANGLE,0);
//// Reset button
- JButton button = new JButton("Reset");
+ JButton button = new JButton(trans.get("StreamerCfg.but.Reset"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import javax.swing.JPanel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
public class ThicknessRingComponentConfig extends RingComponentConfig {
-
+ private static final Translator trans = Application.getTranslator();
+
public ThicknessRingComponentConfig(RocketComponent c) {
super(c);
JPanel tab;
- tab = generalTab("Outer diameter:", "Inner diameter:", "Wall thickness:", "Length:");
- tabbedPane.insertTab("General", null, tab, "General properties", 0);
+ //// Outer diameter:
+ //// Inner diameter:
+ //// Wall thickness:
+ //// Length:
+ tab = generalTab(trans.get("ThicknessRingCompCfg.tab.Outerdiam"),
+ trans.get("ThicknessRingCompCfg.tab.Innerdiam"),
+ trans.get("ThicknessRingCompCfg.tab.Wallthickness"), trans.get("ThicknessRingCompCfg.tab.Length"));
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("ThicknessRingCompCfg.tab.General"), null, tab,
+ trans.get("ThicknessRingCompCfg.tab.Generalprop"), 0);
tabbedPane.setSelectedIndex(0);
}
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.DescriptionArea;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.Transition;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class TransitionConfig extends RocketComponentConfig {
+ private static final Translator trans = Application.getTranslator();
private JComboBox typeBox;
//private JLabel description;
//// Shape selection
-
- panel.add(new JLabel("Transition shape:"));
+ //// Transition shape:
+ panel.add(new JLabel(trans.get("TransitionCfg.lbl.Transitionshape")));
Transition.Shape selected = ((Transition)component).getType();
Transition.Shape[] typeList = Transition.Shape.values();
});
panel.add(typeBox,"span, split 2");
-
- checkbox = new JCheckBox(new BooleanModel(component,"Clipped"));
- checkbox.setText("Clipped");
+ //// Clipped
+ checkbox = new JCheckBox(new BooleanModel(component,trans.get("TransitionCfg.checkbox.Clipped")));
+ //// Clipped
+ checkbox.setText(trans.get("TransitionCfg.checkbox.Clipped"));
panel.add(checkbox,"wrap");
- //// Shape parameter
- shapeLabel = new JLabel("Shape parameter:");
+ //// Shape parameter:
+ shapeLabel = new JLabel(trans.get("TransitionCfg.lbl.Shapeparam"));
panel.add(shapeLabel);
m = new DoubleModel(component,"ShapeParameter");
//// Length
- panel.add(new JLabel("Transition length:"));
+ //// Transition length:
+ panel.add(new JLabel(trans.get("TransitionCfg.lbl.Transitionlength")));
m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
//// Transition diameter 1
- panel.add(new JLabel("Fore diameter:"));
+ //// Fore diameter:
+ panel.add(new JLabel(trans.get("TransitionCfg.lbl.Forediam")));
DoubleModel od = new DoubleModel(component,"ForeRadius",2,UnitGroup.UNITS_LENGTH,0);
// Diameter = 2*Radius
panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap 0px");
checkbox = new JCheckBox(od.getAutomaticAction());
- checkbox.setText("Automatic");
+ //// Automatic
+ checkbox.setText(trans.get("TransitionCfg.checkbox.Automatic"));
panel.add(checkbox,"skip, span 2, wrap");
//// Transition diameter 2
- panel.add(new JLabel("Aft diameter:"));
+ //// Aft diameter:
+ panel.add(new JLabel(trans.get("TransitionCfg.lbl.Aftdiam")));
od = new DoubleModel(component,"AftRadius",2,UnitGroup.UNITS_LENGTH,0);
// Diameter = 2*Radius
panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap 0px");
checkbox = new JCheckBox(od.getAutomaticAction());
- checkbox.setText("Automatic");
+ //// Automatic
+ checkbox.setText(trans.get("TransitionCfg.checkbox.Automatic"));
panel.add(checkbox,"skip, span 2, wrap");
- //// Wall thickness
- panel.add(new JLabel("Wall thickness:"));
+ //// Wall thickness:
+ panel.add(new JLabel(trans.get("TransitionCfg.lbl.Wallthickness")));
m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
panel.add(new UnitSelector(m),"growx");
panel.add(new BasicSlider(m.getSliderModel(0,0.01)),"w 100lp, wrap 0px");
-
- checkbox = new JCheckBox(new BooleanModel(component,"Filled"));
- checkbox.setText("Filled");
+ //// Filled
+ checkbox = new JCheckBox(new BooleanModel(component,trans.get("TransitionCfg.checkbox.Filled")));
+ //// Filled
+ checkbox.setText(trans.get("TransitionCfg.checkbox.Filled"));
panel.add(checkbox,"skip, span 2, wrap");
materialPanel(panel2, Material.Type.BULK);
panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany");
-
- tabbedPane.insertTab("General", null, panel, "General properties", 0);
- tabbedPane.insertTab("Shoulder", null, shoulderTab(), "Shoulder properties", 1);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("TransitionCfg.tab.General"), null, panel,
+ trans.get("TransitionCfg.tab.Generalproperties"), 0);
+ //// Shoulder and Shoulder properties
+ tabbedPane.insertTab(trans.get("TransitionCfg.tab.Shoulder"), null, shoulderTab(),
+ trans.get("TransitionCfg.tab.Shoulderproperties"), 1);
tabbedPane.setSelectedIndex(0);
}
import net.sf.openrocket.gui.adaptors.IntegerModel;
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.TrapezoidFinSet;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class TrapezoidFinSetConfig extends FinSetConfig {
-
+ private static final Translator trans = Application.getTranslator();
+
public TrapezoidFinSetConfig(final RocketComponent component) {
super(component);
JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::]",""));
- //// Number of fins
- JLabel label = new JLabel("Number of fins:");
- label.setToolTipText("The number of fins in the fin set.");
+ //// Number of fins:
+ JLabel label = new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Nbroffins"));
+ //// The number of fins in the fin set.
+ label.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Nbroffins"));
panel.add(label);
IntegerModel im = new IntegerModel(component,"FinCount",1,8);
spin = new JSpinner(im.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
- spin.setToolTipText("The number of fins in the fin set.");
+ //// The number of fins in the fin set.
+ spin.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Nbroffins"));
panel.add(spin,"growx, wrap");
//// Base rotation
- label = new JLabel("Fin rotation:");
- label.setToolTipText("The angle of the first fin in the fin set.");
+ //// Fin rotation:
+ label = new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Finrotation"));
+ //// The angle of the first fin in the fin set.
+ label.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Finrotation"));
panel.add(label);
m = new DoubleModel(component, "BaseRotation", UnitGroup.UNITS_ANGLE,-Math.PI,Math.PI);
panel.add(new BasicSlider(m.getSliderModel(-Math.PI,Math.PI)),"w 100lp, wrap");
- //// Fin cant
- label = new JLabel("Fin cant:");
- label.setToolTipText("The angle that the fins are canted with respect to the rocket " +
- "body.");
+ //// Fin cant:
+ label = new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Fincant"));
+ //// The angle that the fins are canted with respect to the rocket
+ label.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Fincant"));
panel.add(label);
m = new DoubleModel(component, "CantAngle", UnitGroup.UNITS_ANGLE,
"w 100lp, wrap");
- //// Root chord
- panel.add(new JLabel("Root chord:"));
+ //// Root chord:
+ panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Rootchord")));
m = new DoubleModel(component,"RootChord",UnitGroup.UNITS_LENGTH,0);
- //// Tip chord
- panel.add(new JLabel("Tip chord:"));
+ //// Tip chord:
+ panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Tipchord")));
m = new DoubleModel(component,"TipChord",UnitGroup.UNITS_LENGTH,0);
panel.add(new BasicSlider(m.getSliderModel(0,0.05,0.2)),"w 100lp, wrap");
- //// Height
- panel.add(new JLabel("Height:"));
+ //// Height:
+ panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Height")));
m = new DoubleModel(component,"Height",UnitGroup.UNITS_LENGTH,0);
- //// Sweep
- panel.add(new JLabel("Sweep length:"));
+ //// Sweep length:
+ panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Sweeplength")));
m = new DoubleModel(component,"Sweep",UnitGroup.UNITS_LENGTH);
panel.add(new BasicSlider(m.getSliderModel(tc,rc)),"w 100lp, wrap");
- //// Sweep angle
- panel.add(new JLabel("Sweep angle:"));
+ //// Sweep angle:
+ panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Sweepangle")));
m = new DoubleModel(component, "SweepAngle",UnitGroup.UNITS_ANGLE,
-TrapezoidFinSet.MAX_SWEEP_ANGLE,TrapezoidFinSet.MAX_SWEEP_ANGLE);
- //// Cross section
- panel.add(new JLabel("Fin cross section:"));
+ //// Fin cross section:
+ panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.FincrossSection")));
combo = new JComboBox(
new EnumModel<FinSet.CrossSection>(component,"CrossSection"));
panel.add(combo,"span, growx, wrap");
- //// Thickness
- panel.add(new JLabel("Thickness:"));
+ //// Thickness:
+ panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Thickness")));
m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
//// Position
-
- panel.add(new JLabel("Position relative to:"));
+ //// Position relative to:
+ panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Posrelativeto")));
combo = new JComboBox(
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
RocketComponent.Position.ABSOLUTE
}));
panel.add(combo,"spanx, growx, wrap");
-
- panel.add(new JLabel("plus"),"right");
+ //// plus
+ panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.plus")),"right");
m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
spin = new JSpinner(m.getSpinnerModel());
mainPanel.add(panel,"aligny 20%");
-
- tabbedPane.insertTab("General", null, mainPanel, "General properties", 0);
+ //// General and General properties
+ tabbedPane.insertTab(trans.get("TrapezoidFinSetCfg.tab.General"), null, mainPanel,
+ trans.get("TrapezoidFinSetCfg.tab.Generalproperties"), 0);
tabbedPane.setSelectedIndex(0);
addFinSetButtons();
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.URLLabel;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.Chars;
import net.sf.openrocket.util.GUIUtil;
import net.sf.openrocket.util.Icons;
public class AboutDialog extends JDialog {
public static final String OPENROCKET_URL = "http://openrocket.sourceforge.net/";
+ private static final Translator trans = Application.getTranslator();
+
-
public AboutDialog(JFrame parent) {
super(parent, true);
JPanel panel = new JPanel(new MigLayout("fill"));
- panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket")),
- "spany 5, top");
+ panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket")),
+ "spany, top");
panel.add(new StyledLabel("OpenRocket", 20), "ax 50%, growy, wrap para");
panel.add(new StyledLabel("Version " + version, 3), "ax 50%, growy, wrap rel");
-// String source = Prefs.getBuildSource();
-// if (!Prefs.DEFAULT_BUILD_SOURCE.equalsIgnoreCase(source)) {
-// panel.add(new StyledLabel("Distributed by " + source, -1),
-// "ax 50%, growy, wrap para");
-// } else {
-// panel.add(new StyledLabel(" ", -1), "ax 50%, growy, wrap para");
-// }
+ // String source = Prefs.getBuildSource();
+ // if (!Prefs.DEFAULT_BUILD_SOURCE.equalsIgnoreCase(source)) {
+ // panel.add(new StyledLabel("Distributed by " + source, -1),
+ // "ax 50%, growy, wrap para");
+ // } else {
+ // panel.add(new StyledLabel(" ", -1), "ax 50%, growy, wrap para");
+ // }
- panel.add(new StyledLabel("Copyright " + Chars.COPY +" 2007-2010 Sampo Niskanen"),
+ panel.add(new StyledLabel("Copyright " + Chars.COPY + " 2007-2010 Sampo Niskanen"),
"ax 50%, growy, wrap para");
panel.add(new URLLabel(OPENROCKET_URL), "ax 50%, growy, wrap para");
-
- JButton close = new JButton("Close");
+ //// translations author if language is not English
+ String translator = trans.get("about.dlg.lbl.translation").trim();
+ String translatorUrl = trans.get("about.dlg.lbl.transwebsite").trim();
+ if (translator.length() > 0) {
+ panel.add(new StyledLabel(translator), "ax 50%, growy, wrap para");
+ if (translatorUrl.length() > 0) {
+ panel.add(new URLLabel(translatorUrl), "ax 50%, growy, wrap para");
+ }
+ }
+
+ //Close button
+ JButton close = new JButton(trans.get("dlg.but.close"));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
GUIUtil.setDisposableDialogOptions(this, close);
}
-
+
}
import net.sf.openrocket.communication.BugReporter;
import net.sf.openrocket.gui.components.SelectableLabel;
import net.sf.openrocket.gui.components.StyledLabel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogLevelBufferLogger;
import net.sf.openrocket.logging.LogLine;
import net.sf.openrocket.startup.Application;
public class BugReportDialog extends JDialog {
private static final String REPORT_EMAIL = "openrocket-bugs@lists.sourceforge.net";
-
+ private static final Translator trans = Application.getTranslator();
+
public BugReportDialog(Window parent, String labelText, String message) {
- super(parent, "Bug report", Dialog.ModalityType.APPLICATION_MODAL);
+ //// Bug report
+ super(parent, trans.get("bugreport.dlg.title"), Dialog.ModalityType.APPLICATION_MODAL);
JPanel panel = new JPanel(new MigLayout("fill"));
label.setMaximumSize(d);
panel.add(label, "gapleft para, wrap para");
+ //// <html>If connected to the Internet, you can simply click
+ //// <em>Send bug report</em>.
label = new JLabel("<html>If connected to the Internet, you can simply click " +
"<em>Send bug report</em>.");
d = label.getPreferredSize();
label.setMaximumSize(d);
panel.add(label, "gapleft para, wrap");
+ //// Otherwise, send the text below to the address:
panel.add(new JLabel("Otherwise, send the text below to the address: "),
"gapleft para, split 2, gapright rel");
panel.add(new SelectableLabel(REPORT_EMAIL), "growx, wrap para");
- //// Close button
- JButton close = new JButton("Close");
+ ////Close button
+ JButton close = new JButton(trans.get("dlg.but.close"));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// }
- //// Send button
- JButton send = new JButton("Send bug report");
- send.setToolTipText("Automatically send the bug report to the OpenRocket developers.");
+ //// Send bug report button
+ JButton send = new JButton(trans.get("bugreport.dlg.but.Sendbugreport"));
+ //// Automatically send the bug report to the OpenRocket developers.
+ send.setToolTipText(trans.get("bugreport.dlg.but.Sendbugreport.Ttip"));
send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BugReporter.sendBugReport(text);
// Success if we came here
- JOptionPane.showMessageDialog(BugReportDialog.this,
+ //bugreport.dlg.successmsg
+ /*JOptionPane.showMessageDialog(BugReportDialog.this,
new Object[] { "Bug report successfully sent.",
"Thank you for helping make OpenRocket better!" },
- "Bug report sent", JOptionPane.INFORMATION_MESSAGE);
+ "Bug report sent", JOptionPane.INFORMATION_MESSAGE);*/
+ JOptionPane.showMessageDialog(BugReportDialog.this,
+ new Object[] { trans.get("bugreport.dlg.successmsg1"),
+ trans.get("bugreport.dlg.successmsg2") },
+ trans.get("bugreport.dlg.successmsg3"), JOptionPane.INFORMATION_MESSAGE);
} catch (Exception ex) {
// Sending the message failed.
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.UnitSelector;
import net.sf.openrocket.gui.scalefigure.RocketPanel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.masscalc.BasicMassCalculator;
import net.sf.openrocket.masscalc.MassCalculator;
import net.sf.openrocket.masscalc.MassCalculator.MassCalcType;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.Coordinate;
public class ComponentAnalysisDialog extends JDialog implements ChangeListener {
private static ComponentAnalysisDialog singletonDialog = null;
-
+ private static final Translator trans = Application.getTranslator();
+
private final FlightConditions conditions;
private final Configuration configuration;
public ComponentAnalysisDialog(final RocketPanel rocketPanel) {
- super(SwingUtilities.getWindowAncestor(rocketPanel), "Component analysis");
+ ////Component analysis
+ super(SwingUtilities.getWindowAncestor(rocketPanel),
+ trans.get("componentanalysisdlg.componentanalysis"));
JTable table;
rocketPanel.setCPRoll(0);
roll = new DoubleModel(rocketPanel, "CPRoll", UnitGroup.UNITS_ROLL);
-
- panel.add(new JLabel("Wind direction:"), "width 100lp!");
+ //// Wind direction:
+ panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.winddir")), "width 100lp!");
panel.add(new UnitSelector(theta, true), "width 50lp!");
BasicSlider slider = new BasicSlider(theta.getSliderModel(0, 2 * Math.PI));
panel.add(slider, "growx, split 2");
- worstToggle = new JToggleButton("Worst");
+ //// Worst button
+ worstToggle = new JToggleButton(trans.get("componentanalysisdlg.ToggleBut.worst"));
worstToggle.setSelected(true);
worstToggle.addActionListener(new ActionListener() {
@Override
warningList = new JList();
JScrollPane scrollPane = new JScrollPane(warningList);
- scrollPane.setBorder(BorderFactory.createTitledBorder("Warnings:"));
+ ////Warnings:
+ scrollPane.setBorder(BorderFactory.createTitledBorder(trans.get("componentanalysisdlg.TitledBorder.warnings")));
panel.add(scrollPane, "gap paragraph, spany 4, width 300lp!, growy 1, height :100lp:, wrap");
-
- panel.add(new JLabel("Angle of attack:"), "width 100lp!");
+ ////Angle of attack:
+ panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.angleofattack")), "width 100lp!");
panel.add(new UnitSelector(aoa, true), "width 50lp!");
panel.add(new BasicSlider(aoa.getSliderModel(0, Math.PI)), "growx, wrap");
- panel.add(new JLabel("Mach number:"), "width 100lp!");
+ //// Mach number:
+ panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.machnumber")), "width 100lp!");
panel.add(new UnitSelector(mach, true), "width 50lp!");
panel.add(new BasicSlider(mach.getSliderModel(0, 3)), "growx, wrap");
- panel.add(new JLabel("Roll rate:"), "width 100lp!");
+ //// Roll rate:
+ panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.rollrate")), "width 100lp!");
panel.add(new UnitSelector(roll, true), "width 50lp!");
panel.add(new BasicSlider(roll.getSliderModel(-20 * 2 * Math.PI, 20 * 2 * Math.PI)),
"growx, wrap paragraph");
// Stage and motor selection:
-
- panel.add(new JLabel("Active stages:"), "spanx, split, gapafter rel");
+ //// Active stages:
+ panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.activestages")), "spanx, split, gapafter rel");
panel.add(new StageSelector(configuration), "gapafter paragraph");
- JLabel label = new JLabel("Motor configuration:");
+ //// Motor configuration:
+ JLabel label = new JLabel(trans.get("componentanalysisdlg.lbl.motorconf"));
label.setHorizontalAlignment(JLabel.RIGHT);
panel.add(label, "growx, right");
panel.add(new JComboBox(new MotorConfigurationModel(configuration)), "wrap");
// Create the CP data table
cpTableModel = new ColumnTableModel(
- new Column("Component") {
+ //// Component
+ new Column(trans.get("componentanalysisdlg.TabStability.Col.Component")) {
@Override
public Object getValueAt(int row) {
RocketComponent c = cpData.get(row).getComponent();
JScrollPane scrollpane = new JScrollPane(table);
scrollpane.setPreferredSize(new Dimension(600, 200));
- tabbedPane.addTab("Stability", null, scrollpane, "Stability information");
+ //// Stability and Stability information
+ tabbedPane.addTab(trans.get("componentanalysisdlg.TabStability"),
+ null, scrollpane, trans.get("componentanalysisdlg.TabStability.ttip"));
// Create the drag data table
dragTableModel = new ColumnTableModel(
- new Column("Component") {
+ //// Component
+ new Column(trans.get("componentanalysisdlg.dragTableModel.Col.Component")) {
@Override
public Object getValueAt(int row) {
RocketComponent c = dragData.get(row).getComponent();
return 200;
}
},
- new Column("<html>Pressure C<sub>D</sub>") {
+ //// <html>Pressure C<sub>D</sub>
+ new Column(trans.get("componentanalysisdlg.dragTableModel.Col.Pressure")) {
@Override
public Object getValueAt(int row) {
return dragData.get(row).getPressureCD();
}
},
- new Column("<html>Base C<sub>D</sub>") {
+ //// <html>Base C<sub>D</sub>
+ new Column(trans.get("componentanalysisdlg.dragTableModel.Col.Base")) {
@Override
public Object getValueAt(int row) {
return dragData.get(row).getBaseCD();
}
},
- new Column("<html>Friction C<sub>D</sub>") {
+ //// <html>Friction C<sub>D</sub>
+ new Column(trans.get("componentanalysisdlg.dragTableModel.Col.friction")) {
@Override
public Object getValueAt(int row) {
return dragData.get(row).getFrictionCD();
}
},
- new Column("<html>Total C<sub>D</sub>") {
+ //// <html>Total C<sub>D</sub>
+ new Column(trans.get("componentanalysisdlg.dragTableModel.Col.total")) {
@Override
public Object getValueAt(int row) {
return dragData.get(row).getCD();
scrollpane = new JScrollPane(table);
scrollpane.setPreferredSize(new Dimension(600, 200));
- tabbedPane.addTab("Drag characteristics", null, scrollpane, "Drag characteristics");
+ //// Drag characteristics and Drag characteristics tooltip
+ tabbedPane.addTab(trans.get("componentanalysisdlg.dragTabchar"), null, scrollpane,
+ trans.get("componentanalysisdlg.dragTabchar.ttip"));
// Create the roll data table
rollTableModel = new ColumnTableModel(
- new Column("Component") {
+ //// Component
+ new Column(trans.get("componentanalysisdlg.rollTableModel.Col.component")) {
@Override
public Object getValueAt(int row) {
RocketComponent c = rollData.get(row).getComponent();
return c.toString();
}
},
- new Column("Roll forcing coefficient") {
+ //// Roll forcing coefficient
+ new Column(trans.get("componentanalysisdlg.rollTableModel.Col.rollforc")) {
@Override
public Object getValueAt(int row) {
return rollData.get(row).getCrollForce();
}
},
- new Column("Roll damping coefficient") {
+ //// Roll damping coefficient
+ new Column(trans.get("componentanalysisdlg.rollTableModel.Col.rolldamp")) {
@Override
public Object getValueAt(int row) {
return rollData.get(row).getCrollDamp();
}
},
- new Column("<html>Total C<sub>l</sub>") {
+ //// <html>Total C<sub>l</sub>
+ new Column(trans.get("componentanalysisdlg.rollTableModel.Col.total")) {
@Override
public Object getValueAt(int row) {
return rollData.get(row).getCroll();
scrollpane = new JScrollPane(table);
scrollpane.setPreferredSize(new Dimension(600, 200));
- tabbedPane.addTab("Roll dynamics", null, scrollpane, "Roll dynamics");
+ //// Roll dynamics and Roll dynamics tooltip
+ tabbedPane.addTab(trans.get("componentanalysisdlg.rollTableModel"), null, scrollpane,
+ trans.get("componentanalysisdlg.rollTableModel.ttip"));
}
});
-
- panel.add(new StyledLabel("Reference length: ", -1),
+ //// Reference length:
+ panel.add(new StyledLabel(trans.get("componentanalysisdlg.lbl.reflenght"), -1),
"span, split, gapleft para, gapright rel");
DoubleModel dm = new DoubleModel(conditions, "RefLength", UnitGroup.UNITS_LENGTH);
UnitSelector sel = new UnitSelector(dm, true);
sel.resizeFont(-1);
panel.add(sel, "gapright para");
- panel.add(new StyledLabel("Reference area: ", -1), "gapright rel");
+ //// Reference area:
+ panel.add(new StyledLabel(trans.get("componentanalysisdlg.lbl.refarea"), -1), "gapright rel");
dm = new DoubleModel(conditions, "RefArea", UnitGroup.UNITS_AREA);
sel = new UnitSelector(dm, true);
sel.resizeFont(-1);
// });
// panel.add(button,"tag ok");
- button = new JButton("Close");
+ //button = new JButton("Close");
+ //Close button
+ button = new JButton(trans.get("dlg.but.close"));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ComponentAnalysisDialog.this.dispose();
import net.sf.openrocket.gui.adaptors.DoubleModel;
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.GUIUtil;
public class CustomMaterialDialog extends JDialog {
private JSpinner densitySpinner;
private UnitSelector densityUnit;
private JCheckBox addBox;
-
+ private static final Translator trans = Application.getTranslator();
+
public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
String title) {
this(parent, material, saveOption, title, null);
public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
String title, String note) {
- super(parent, "Custom material", Dialog.ModalityType.APPLICATION_MODAL);
+ //// Custom material
+ super(parent, trans.get("custmatdlg.title.Custommaterial"), Dialog.ModalityType.APPLICATION_MODAL);
this.originalMaterial = material;
}
- // Material name
- panel.add(new JLabel("Material name:"));
+ //// Material name
+ panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialname")));
nameField = new JTextField(15);
if (material != null) {
nameField.setText(material.getName());
// Material type (if not known)
- panel.add(new JLabel("Material type:"));
+ panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialtype")));
if (material == null) {
typeBox = new JComboBox(Material.Type.values());
typeBox.setSelectedItem(Material.Type.BULK);
}
- // Material density
- panel.add(new JLabel("Material density:"));
+ // Material density:
+ panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialdensity")));
densitySpinner = new JSpinner();
panel.add(densitySpinner, "w 70lp");
densityUnit = new UnitSelector((DoubleModel)null);
// Save option
if (saveOption) {
- addBox = new JCheckBox("Add material to database");
+ //// Add material to database
+ addBox = new JCheckBox(trans.get("custmatdlg.checkbox.Addmaterial"));
panel.add(addBox,"span, wrap");
}
- JButton okButton = new JButton("OK");
+ //// OK button
+ JButton okButton = new JButton(trans.get("dlg.but.ok"));
+
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
panel.add(okButton,"span, split, tag ok");
- JButton closeButton = new JButton("Cancel");
+ //// Cancel
+ JButton closeButton = new JButton(trans.get("dlg.but.cancel"));
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.sf.openrocket.gui.adaptors.Column;
import net.sf.openrocket.gui.adaptors.ColumnTableModel;
import net.sf.openrocket.gui.components.SelectableLabel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.DelegatorLogger;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.logging.LogLevel;
private static final int POLL_TIME = 250;
private static final String STACK_TRACE_MARK = "\uFF01";
-
+ private static final Translator trans = Application.getTranslator();
+
private static final EnumMap<LogLevel, Color> backgroundColors = new EnumMap<LogLevel, Color>(LogLevel.class);
static {
for (LogLevel l : LogLevel.values()) {
private final JTextArea stackTraceLabel;
public DebugLogDialog(Window parent) {
- super(parent, "OpenRocket debug log");
+ //// OpenRocket debug log
+ super(parent, trans.get("debuglogdlg.OpenRocketdebuglog"));
// Start listening to log lines
LogHelper applicationLog = Application.getLogger();
JPanel panel = new JPanel(new MigLayout("fill"));
split.add(panel);
- panel.add(new JLabel("Display log lines:"), "gapright para, split");
+ //// Display log lines:
+ panel.add(new JLabel(trans.get("debuglogdlg.Displayloglines")), "gapright para, split");
for (LogLevel l : LogLevel.values()) {
JCheckBox box = new JCheckBox(l.toString());
// By default display DEBUG and above
filterButtons.put(l, box);
}
- followBox = new JCheckBox("Follow");
+ //// Follow
+ followBox = new JCheckBox(trans.get("debuglogdlg.Follow"));
followBox.setSelected(true);
panel.add(followBox, "skip, gapright para, right");
- JButton clear = new JButton("Clear");
+ //// Clear button
+ JButton clear = new JButton(trans.get("debuglogdlg.but.clear"));
clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
return 60;
}
},
- new Column("Time") {
+ //// Time
+ new Column(trans.get("debuglogdlg.col.Time")) {
@Override
public Object getValueAt(int row) {
return String.format("%.3f", buffer.get(row).getTimestamp() / 1000.0);
return 60;
}
},
- new Column("Level") {
+ //// Level
+ new Column(trans.get("debuglogdlg.col.Level")) {
@Override
public Object getValueAt(int row) {
return buffer.get(row).getLevel();
return 16;
}
},
- new Column("Location") {
+ //// Location
+ new Column(trans.get("debuglogdlg.col.Location")) {
@Override
public Object getValueAt(int row) {
TraceException e = buffer.get(row).getTrace();
return 200;
}
},
- new Column("Message") {
+ //// Message
+ new Column(trans.get("debuglogdlg.col.Message")) {
@Override
public Object getValueAt(int row) {
return buffer.get(row).getMessage();
panel = new JPanel(new MigLayout("fill"));
split.add(panel);
- panel.add(new JLabel("Log line number:"), "split, gapright rel");
+ //// Log line number:
+ panel.add(new JLabel(trans.get("debuglogdlg.lbl.Loglinenbr")), "split, gapright rel");
numberLabel = new SelectableLabel();
panel.add(numberLabel, "width 70lp, gapright para");
- panel.add(new JLabel("Time:"), "split, gapright rel");
+ //// Time:
+ panel.add(new JLabel(trans.get("debuglogdlg.lbl.Time")), "split, gapright rel");
timeLabel = new SelectableLabel();
panel.add(timeLabel, "width 70lp, gapright para");
- panel.add(new JLabel("Level:"), "split, gapright rel");
+ //// Level:
+ panel.add(new JLabel(trans.get("debuglogdlg.lbl.Level")), "split, gapright rel");
levelLabel = new SelectableLabel();
panel.add(levelLabel, "width 70lp, gapright para");
+ //// Location:
panel.add(new JLabel("Location:"), "split, gapright rel");
locationLabel = new SelectableLabel();
panel.add(locationLabel, "growx, wrap unrel");
+ //// Log message:
panel.add(new JLabel("Log message:"), "split, gapright rel");
messageLabel = new SelectableLabel();
panel.add(messageLabel, "growx, wrap para");
+ //// Stack trace:
panel.add(new JLabel("Stack trace:"), "wrap rel");
stackTraceLabel = new JTextArea(8, 80);
stackTraceLabel.setEditable(false);
panel.add(new JScrollPane(stackTraceLabel), "grow");
- JButton close = new JButton("Close");
+ //Close button
+ JButton close = new JButton(trans.get("dlg.but.close"));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.GUIUtil;
public class DetailDialog {
+ private static final Translator trans = Application.getTranslator();
public static void showDetailedMessageDialog(Component parentComponent, Object message,
String details, String title, int messageType) {
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.gui.dialogs.motor.MotorChooserDialog;
import net.sf.openrocket.gui.main.BasicFrame;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.Chars;
import net.sf.openrocket.util.GUIUtil;
// Positive when user is modifying configuration name
private int configurationNameModification = 0;
-
+ private static final Translator trans = Application.getTranslator();
+
public EditMotorConfigurationDialog(final Rocket rocket, Window parent) {
- super(parent, "Edit motor configurations");
+ //// Edit motor configurations
+ super(parent, trans.get("edtmotorconfdlg.title.Editmotorconf"));
if (parent != null)
this.setModalityType(ModalityType.DOCUMENT_MODAL);
//// Motor mount selection
-
- JLabel label = new JLabel("<html><b>Motor mounts:</b>");
+ //// <html><b>Motor mounts:</b>
+ JLabel label = new JLabel(trans.get("edtmotorconfdlg.lbl.Motormounts"));
panel.add(label, "gapbottom para");
- label = new JLabel("<html>Select which components function as motor mounts:");
+ //// <html>Select which components function as motor mounts:
+ label = new JLabel(trans.get("edtmotorconfdlg.selectcomp"));
panel.add(label, "ay 100%, w 1px, growx");
//// Motor selection
-
- label = new JLabel("<html><b>Motor configurations:</b>");
+ //// <html><b>Motor configurations:</b>
+ label = new JLabel(trans.get("edtmotorconfdlg.lbl.Motorconfig"));
panel.add(label, "spanx, gapbottom para");
-
- label = new JLabel("Configuration name:");
- String tip = "Leave name empty for default.";
+ //// Configuration name:
+ label = new JLabel(trans.get("edtmotorconfdlg.lbl.Configname"));
+ //// Leave name empty for default.
+ String tip = trans.get("edtmotorconfdlg.lbl.Leavenamedefault");
label.setToolTipText(tip);
panel.add(label, "");
});
panel.add(configurationNameField, "cell 2 1, gapright para");
- newConfButton = new JButton("New configuration");
+ //// New configuration
+ newConfButton = new JButton(trans.get("edtmotorconfdlg.but.Newconfiguration"));
newConfButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
panel.add(newConfButton, "cell 3 1");
- removeConfButton = new JButton("Remove configuration");
+ //// Remove configuration
+ removeConfButton = new JButton(trans.get("edtmotorconfdlg.but.Removeconfiguration"));
removeConfButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
scroll = new JScrollPane(configurationTable);
panel.add(scroll, "cell 1 2, spanx, w 500lp, h 150lp, grow");
-
- selectMotorButton = new JButton("Select motor");
+ //// Select motor
+ selectMotorButton = new JButton(trans.get("edtmotorconfdlg.but.Selectmotor"));
selectMotorButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
panel.add(selectMotorButton, "spanx, flowx, split 2, ax 50%");
-
- removeMotorButton = new JButton("Remove motor");
+ //// Remove motor button
+ removeMotorButton = new JButton(trans.get("edtmotorconfdlg.but.removemotor"));
removeMotorButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//// Close button
-
- JButton close = new JButton("Close");
+ JButton close = new JButton(trans.get("dlg.but.close"));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Undo description
final OpenRocketDocument document = BasicFrame.findDocument(rocket);
if (document != null) {
- document.startUndo("Edit motor configurations");
+ //// Edit motor configurations
+ document.startUndo(trans.get("edtmotorconfdlg.title.Editmotorconf"));
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
import javax.swing.ListSelectionModel;
import net.miginfocom.swing.MigLayout;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.GUIUtil;
import net.sf.openrocket.util.JarUtil;
private static final String DIRECTORY = "datafiles/examples/";
private static final String PATTERN = ".*\\.[oO][rR][kK]$";
+ private static final Translator trans = Application.getTranslator();
+
private static final FilenameFilter FILTER = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
private final JList designSelection;
private ExampleDesignDialog(ExampleDesign[] designs, Window parent) {
+ //// Open example design
super(parent, "Open example design", Dialog.ModalityType.APPLICATION_MODAL);
JPanel panel = new JPanel(new MigLayout("fill"));
+ //// Select example designs to open:
panel.add(new JLabel("Select example designs to open:"), "wrap");
designSelection = new JList(designs);
});
panel.add(new JScrollPane(designSelection), "grow, wmin 300lp, wrap para");
- JButton openButton = new JButton("Open");
+ //// Open button
+ JButton openButton = new JButton(trans.get("debuglogdlg.but.clear"));
openButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
panel.add(openButton, "split 2, sizegroup buttons, growx");
- JButton cancelButton = new JButton("Cancel");
+ //// Cancel button
+ JButton cancelButton = new JButton(trans.get("dlg.but.cancel"));
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
designs = getDirFileNames();
}
if (designs == null || designs.length == 0) {
+ //// Example designs could not be found.
JOptionPane.showMessageDialog(parent, "Example designs could not be found.",
+ //// Examples not found
"Examples not found", JOptionPane.ERROR_MESSAGE);
return null;
}
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.gui.components.StyledLabel;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.GUIUtil;
public class LicenseDialog extends JDialog {
private static final String LICENSE_FILENAME = "LICENSE.TXT";
-
+ private static final Translator trans = Application.getTranslator();
+
private static final String DEFAULT_LICENSE_TEXT =
"\n" +
"Error: Unable to load " + LICENSE_FILENAME + "!\n" +
text.setEditable(false);
panel.add(new JScrollPane(text),"grow, wrap para");
- JButton close = new JButton("Close");
+ //Close button
+ JButton close = new JButton(trans.get("dlg.but.close"));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.database.ThrustCurveMotorSetDatabase;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.GUIUtil;
public class MotorDatabaseLoadingDialog extends JDialog {
private static final LogHelper log = Application.getLogger();
-
+ private static final Translator trans = Application.getTranslator();
+
private MotorDatabaseLoadingDialog(Window parent) {
- super(parent, "Loading motors", ModalityType.APPLICATION_MODAL);
+ //// Loading motors
+ super(parent, trans.get("MotorDbLoadDlg.title"), ModalityType.APPLICATION_MODAL);
JPanel panel = new JPanel(new MigLayout("fill"));
- panel.add(new JLabel("Loading motors..."), "wrap para");
+ //// Loading motors...
+ panel.add(new JLabel(trans.get("MotorDbLoadDlg.Loadingmotors")), "wrap para");
JProgressBar progress = new JProgressBar();
progress.setIndeterminate(true);
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.gui.print.PDFPrintStreamDoc;
import net.sf.openrocket.gui.print.PrintUtilities;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.startup.Application;
import sun.print.ServiceDialog;
import javax.print.DocFlavor;
*/
private static final DocFlavor.INPUT_STREAM PDF = DocFlavor.INPUT_STREAM.PDF;
+ private static final Translator trans = Application.getTranslator();
+
/**
* Construct a print dialog using an Open Rocket document - which contains the rocket data to ultimately be
* printed.
import net.sf.openrocket.gui.print.TemplateProperties;
import net.sf.openrocket.gui.print.components.CheckTreeManager;
import net.sf.openrocket.gui.print.components.RocketPrintTree;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.startup.Application;
public class PrintPanel extends JPanel implements TreeSelectionListener {
private static final LogHelper log = Application.getLogger();
+ private static final Translator trans = Application.getTranslator();
private final RocketPrintTree stagedTree;
private final RocketPrintTree noStagedTree;
});
add(sortByStage, "wrap");
- saveAsPDF = new JButton("Save as PDF");
+ //// Save as PDF button
+ saveAsPDF = new JButton(trans.get("printdlg.but.saveaspdf"));
saveAsPDF.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent e) {
});
add(saveAsPDF, "span 2, tag save");
- previewButton = new JButton("Preview");
+ //// Preview button
+ previewButton = new JButton(trans.get("printdlg.but.preview"));
previewButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent e) {
});
add(previewButton, "x 150");
- JButton settingsButton = new JButton("Settings");
+ //// Settings button
+ JButton settingsButton = new JButton(trans.get("printdlg.but.settings"));
settingsButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent e) {
* The line color chooser.
*/
private ColorChooser line;
+ private static final Translator trans = Application.getTranslator();
/**
* Construct a dialog for setting the advanced rocket print settings.
* @param parent the owning dialog
*/
public PrintSettingsDialog (JDialog parent) {
- super(parent, "Advanced Settings", true);
+
+ super(parent, "Advanced Settings", true);
setLayout(new MigLayout("fill"));
JPanel settingsPanel = new JPanel();
add(settingsPanel, "wrap");
- JButton closeButton = new JButton("Close");
+ //Close button
+ JButton closeButton = new JButton(trans.get("dlg.but.close"));
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent e) {
import javax.swing.SwingWorker;
import net.miginfocom.swing.MigLayout;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.MathUtil;
*/
public class SwingWorkerDialog extends JDialog implements PropertyChangeListener {
private static final LogHelper log = Application.getLogger();
-
+ private static final Translator trans = Application.getTranslator();
+
/** Number of milliseconds to wait at a time between checking worker status */
private static final int DELAY = 100;
progressBar = new JProgressBar();
panel.add(progressBar, "growx, wrap para");
- JButton cancel = new JButton("Cancel");
+ //// Cancel button
+ JButton cancel = new JButton(trans.get("dlg.but.cancel"));
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.communication.UpdateInfo;
import net.sf.openrocket.gui.components.URLLabel;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.Chars;
import net.sf.openrocket.util.ComparablePair;
import net.sf.openrocket.util.GUIUtil;
public class UpdateInfoDialog extends JDialog {
private final JCheckBox remind;
+ private static final Translator trans = Application.getTranslator();
public UpdateInfoDialog(UpdateInfo info) {
+ //// OpenRocket update available
super((Window)null, "OpenRocket update available", ModalityType.APPLICATION_MODAL);
JPanel panel = new JPanel(new MigLayout("fill"));
panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket")),
"spany 100, top");
-
+ //// <html><b>OpenRocket version
panel.add(new JLabel("<html><b>OpenRocket version " + info.getLatestVersion() +
" is available!"), "wrap para");
List<ComparablePair<Integer, String>> updates = info.getUpdates();
if (updates.size() > 0) {
+ //// Updates include:
panel.add(new JLabel("Updates include:"), "wrap rel");
Collections.sort(updates);
}
}
+ //// Download the new version from:
panel.add(new JLabel("Download the new version from:"),
"gaptop para, alignx 50%, wrap unrel");
panel.add(new URLLabel(AboutDialog.OPENROCKET_URL), "alignx 50%, wrap para");
+ //// Remind me later
remind = new JCheckBox("Remind me later");
+ //// Show this update also the next time you start OpenRocket
remind.setToolTipText("Show this update also the next time you start OpenRocket");
remind.setSelected(true);
panel.add(remind);
- JButton button = new JButton("Close");
+ //Close button
+ JButton button = new JButton(trans.get("dlg.but.close"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.gui.dialogs.MotorDatabaseLoadingDialog;
import net.sf.openrocket.gui.dialogs.motor.thrustcurve.ThrustCurveMotorSelectionPanel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.ThrustCurveMotor;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.GUIUtil;
public class MotorChooserDialog extends JDialog implements CloseableDialog {
private final ThrustCurveMotorSelectionPanel selectionPanel;
private boolean okClicked = false;
-
+ private static final Translator trans = Application.getTranslator();
+
public MotorChooserDialog(Motor current, double delay, double diameter, Window owner) {
super(owner, "Select a rocket motor", Dialog.ModalityType.APPLICATION_MODAL);
// OK / Cancel buttons
-
- JButton okButton = new JButton("OK");
+ JButton okButton = new JButton(trans.get("dlg.but.ok"));
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
panel.add(okButton, "tag ok, spanx, split");
- JButton cancelButton = new JButton("Cancel");
+ //// Cancel button
+ JButton cancelButton = new JButton(trans.get("dlg.but.cancel"));
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import java.util.Comparator;
import net.sf.openrocket.database.ThrustCurveMotorSet;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.motor.DesignationComparator;
import net.sf.openrocket.motor.ThrustCurveMotor;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.unit.Value;
import net.sf.openrocket.unit.ValueComparator;
+
/**
* Enum defining the table columns.
*/
+
enum ThrustCurveMotorColumns {
MANUFACTURER("Manufacturer", 100) {
@Override
private final String title;
private final int width;
+ private static final Translator trans = Application.getTranslator();
ThrustCurveMotorColumns(String title) {
this(title, 50);
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.motor.ThrustCurveMotor;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.GUIUtil;
import org.jfree.data.xy.XYSeriesCollection;
public class ThrustCurveMotorPlotDialog extends JDialog {
+ private static final Translator trans = Application.getTranslator();
public ThrustCurveMotorPlotDialog(List<ThrustCurveMotor> motors, int selected, Window parent) {
super(parent, "Motor thrust curves", ModalityType.APPLICATION_MODAL);
// Close button
- JButton close = new JButton("Close");
+ JButton close = new JButton(trans.get("dlg.but.close"));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.sf.openrocket.gui.components.StyledLabel.Style;
import net.sf.openrocket.gui.dialogs.motor.CloseableDialog;
import net.sf.openrocket.gui.dialogs.motor.MotorSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.MotorDigest;
public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelector {
private static final LogHelper log = Application.getLogger();
-
+ private static final Translator trans = Application.getTranslator();
+
private static final double MOTOR_SIMILARITY_THRESHOLD = 0.95;
private static final int SHOW_ALL = 0;
// Selection label
+ //// Select rocket motor:
label = new StyledLabel("Select rocket motor:", Style.BOLD);
panel.add(label, "spanx, wrap para");
});
panel.add(filterComboBox, "spanx, growx, wrap rel");
-
+ //// Hide very similar thrust curves
hideSimilarBox = new JCheckBox("Hide very similar thrust curves");
GUIUtil.changeFontSize(hideSimilarBox, -1);
hideSimilarBox.setSelected(Prefs.getBoolean(Prefs.MOTOR_HIDE_SIMILAR, true));
// Motor mount diameter label
+ //// Motor mount diameter:
label = new StyledLabel("Motor mount diameter: " +
UnitGroup.UNITS_MOTOR_DIMENSIONS.getDefaultUnit().toStringUnit(diameter));
panel.add(label, "gapright 30lp, spanx, split");
// Search field
+ //// Search:
label = new StyledLabel("Search:");
panel.add(label, "");
// Thrust curve selection
+ //// Select thrust curve:
curveSelectionLabel = new JLabel("Select thrust curve:");
panel.add(curveSelectionLabel);
- // Ejection charge delay
+ // Ejection charge delay:
panel.add(new JLabel("Ejection charge delay:"));
delayBox = new JComboBox();
}
});
panel.add(delayBox, "growx, wrap rel");
+ //// (Number of seconds or \"None\")
panel.add(new StyledLabel("(Number of seconds or \"None\")", -3), "skip, wrap para");
setDelays(false);
// Thrust curve info
+ //// Total impulse:
panel.add(new JLabel("Total impulse:"));
totalImpulseLabel = new JLabel();
panel.add(totalImpulseLabel, "wrap");
+ //// Avg. thrust:
panel.add(new JLabel("Avg. thrust:"));
avgThrustLabel = new JLabel();
panel.add(avgThrustLabel, "wrap");
+ //// Max. thrust:
panel.add(new JLabel("Max. thrust:"));
maxThrustLabel = new JLabel();
panel.add(maxThrustLabel, "wrap");
+ //// Burn time:
panel.add(new JLabel("Burn time:"));
burnTimeLabel = new JLabel();
panel.add(burnTimeLabel, "wrap");
+ //// Launch mass:
panel.add(new JLabel("Launch mass:"));
launchMassLabel = new JLabel();
panel.add(launchMassLabel, "wrap");
+ //// Empty mass:
panel.add(new JLabel("Empty mass:"));
emptyMassLabel = new JLabel();
panel.add(emptyMassLabel, "wrap");
+ //// Data points:
panel.add(new JLabel("Data points:"));
dataPointsLabel = new JLabel();
panel.add(dataPointsLabel, "wrap para");
if (System.getProperty("openrocket.debug.motordigest") != null) {
+ //// Digest:
panel.add(new JLabel("Digest:"));
digestLabel = new JLabel();
panel.add(digestLabel, "w :300:, wrap para");
changeLabelFont(plot.getRangeAxis(), -2);
changeLabelFont(plot.getDomainAxis(), -2);
+ //// Thrust curve:
chart.setTitle(new TextTitle("Thrust curve:", this.getFont()));
chart.setBackgroundPaint(this.getBackground());
plot.setBackgroundPaint(Color.WHITE);
for (int i = 0; i < motors.size(); i++) {
ThrustCurveMotor m = motors.get(i);
+ //// Thrust
XYSeries series = new XYSeries("Thrust");
double[] time = m.getTimePoints();
double[] thrust = m.getThrustPoints();
import javax.swing.JDialog;
import net.sf.openrocket.document.OpenRocketDocument;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter;
import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameterService;
import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier;
import net.sf.openrocket.optimization.rocketoptimization.SimulationModifierService;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException;
public class GeneralOptimizationDialog extends JDialog {
private final List<OptimizableParameter> optimizationParameters = new ArrayList<OptimizableParameter>();
private final Map<Object, List<SimulationModifier>> simulationModifiers =
new HashMap<Object, List<SimulationModifier>>();
-
+ private static final Translator trans = Application.getTranslator();
+
private final OpenRocketDocument document;
import net.sf.openrocket.gui.adaptors.Column;
import net.sf.openrocket.gui.adaptors.ColumnTableModel;
import net.sf.openrocket.gui.dialogs.CustomMaterialDialog;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.unit.Value;
private final JButton editButton;
private final JButton deleteButton;
private final JButton revertButton;
-
+ private static final Translator trans = Application.getTranslator();
+
public MaterialEditPanel() {
super(new MigLayout("fill"));
// TODO: LOW: Create sorter that keeps material types always in order
final ColumnTableModel model = new ColumnTableModel(
- new Column("Material") {
+ //// Material
+ new Column(trans.get("matedtpan.col.Material")) {
@Override
public Object getValueAt(int row) {
return getMaterial(row).getName();
}
},
-
- new Column("Type") {
+ //// Type
+ new Column(trans.get("matedtpan.col.Type")) {
@Override
public Object getValueAt(int row) {
return getMaterial(row).getType().toString();
return 15;
}
},
-
- new Column("Density") {
+ //// Density
+ new Column(trans.get("matedtpan.col.Density")) {
@Override
public Object getValueAt(int row) {
Material m = getMaterial(row);
this.add(new JScrollPane(table), "w 200px, h 100px, grow 100");
-
- addButton = new JButton("New");
- addButton.setToolTipText("Add a new material");
+ //// New button
+ addButton = new JButton(trans.get("matedtpan.but.new"));
+ //// Add a new material
+ addButton.setToolTipText(trans.get("matedtpan.col.but.ttip.New"));
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CustomMaterialDialog dialog = new CustomMaterialDialog(
SwingUtilities.getWindowAncestor(MaterialEditPanel.this),
- null, false, "Add a custom material");
+ //// Add a custom material
+ null, false, trans.get("matedtpan.title.Addcustmaterial"));
dialog.setVisible(true);
if (dialog.getOkClicked()) {
Material mat = dialog.getMaterial();
});
this.add(addButton, "gap rel rel para para, w 70lp, split 5, flowy, growx 1, top");
-
- editButton = new JButton("Edit");
- editButton.setToolTipText("Edit an existing material");
+ //// Edit button
+ editButton = new JButton(trans.get("matedtpan.but.edit"));
+ //// Edit an existing material
+ editButton.setToolTipText(trans.get("matedtpan.but.ttip.edit"));
editButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (m.isUserDefined()) {
dialog = new CustomMaterialDialog(
SwingUtilities.getWindowAncestor(MaterialEditPanel.this),
- m, false, "Edit material");
+ //// Edit material
+ m, false, trans.get("matedtpan.title.Editmaterial"));
} else {
dialog = new CustomMaterialDialog(
SwingUtilities.getWindowAncestor(MaterialEditPanel.this),
- m, false, "Add a custom material",
- "The built-in materials cannot be modified.");
+ //// Add a custom material
+ m, false, trans.get("matedtpan.title.Addcustmaterial"),
+ //// The built-in materials cannot be modified.
+ trans.get("matedtpan.title2.Editmaterial"));
}
dialog.setVisible(true);
});
this.add(editButton, "gap rel rel para para, growx 1, top");
-
- deleteButton = new JButton("Delete");
- deleteButton.setToolTipText("Delete a user-defined material");
+ //// Delete button
+ deleteButton = new JButton(trans.get("matedtpan.but.delete"));
+ //// Delete a user-defined material
+ deleteButton.setToolTipText(trans.get("matedtpan.but.ttip.delete"));
deleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
this.add(new JPanel(), "grow 1");
- revertButton = new JButton("Revert all");
- revertButton.setToolTipText("Delete all user-defined materials");
+ //// Revert all button
+ revertButton = new JButton(trans.get("matedtpan.but.revertall"));
+ //// Delete all user-defined materials
+ revertButton.setToolTipText(trans.get("matedtpan.but.ttip.revertall"));
revertButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int sel = JOptionPane.showConfirmDialog(MaterialEditPanel.this,
- "Delete all user-defined materials?", "Revert all?",
+ //// Delete all user-defined materials?
+ trans.get("matedtpan.title.Deletealluser-defined"),
+ //// Revert all?
+ trans.get("matedtpan.title.Revertall"),
JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if (sel == JOptionPane.YES_OPTION) {
Iterator<Material> iterator;
}
});
-
- this.add(new JLabel("<html><i>Editing materials will not affect existing " +
- "rocket designs.</i>"), "span");
+ //// <html><i>Editing materials will not affect existing
+ //// rocket designs.</i>
+ this.add(new JLabel(trans.get("matedtpan.lbl.edtmaterials")), "span");
}
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.dialogs.UpdateInfoDialog;
import net.sf.openrocket.gui.main.SimpleFileFilter;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.Unit;
private final List<DefaultUnitSelector> unitSelectors = new ArrayList<DefaultUnitSelector>();
private File defaultDirectory = null;
-
+ private static final Translator trans = Application.getTranslator();
+
private PreferencesDialog() {
- super((Window) null, "Preferences", Dialog.ModalityType.APPLICATION_MODAL);
+ //// Preferences
+ super((Window) null, trans.get("pref.dlg.title.Preferences"), Dialog.ModalityType.APPLICATION_MODAL);
JPanel panel = new JPanel(new MigLayout("fill, gap unrel", "[grow]", "[grow][]"));
JTabbedPane tabbedPane = new JTabbedPane();
panel.add(tabbedPane, "grow, wrap");
-
- tabbedPane.addTab("Units", null, unitsPane(), "Default units");
- tabbedPane.addTab("Materials", null, new MaterialEditPanel(), "Custom materials");
- tabbedPane.addTab("Options", null, optionsPane(), "Miscellaneous options");
-
-
- JButton close = new JButton("Close");
+ //// Units and Default units
+ tabbedPane.addTab(trans.get("pref.dlg.tab.Units"), null, unitsPane(),
+ trans.get("pref.dlg.tab.Defaultunits"));
+ //// Materials and Custom materials
+ tabbedPane.addTab(trans.get("pref.dlg.tab.Materials"), null, new MaterialEditPanel(),
+ trans.get("pref.dlg.tab.Custommaterials"));
+ //// Options and Miscellaneous options
+ tabbedPane.addTab(trans.get("pref.dlg.tab.Options"), null, optionsPane(),
+ trans.get("pref.dlg.tab.Miscellaneousoptions"));
+
+ //// Close button
+ JButton close = new JButton(trans.get("dlg.but.close"));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
private JPanel optionsPane() {
JPanel panel = new JPanel(new MigLayout("fillx, ins 30lp n n n"));
-
- panel.add(new JLabel("Position to insert new body components:"), "gapright para");
+ //// Position to insert new body components:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Positiontoinsert")), "gapright para");
panel.add(new JComboBox(new PrefChoiseSelector(Prefs.BODY_COMPONENT_INSERT_POSITION_KEY,
"Always ask", "Insert in middle", "Add to end")), "wrap para, growx, sg combos");
- panel.add(new JLabel("Confirm deletion of simulations:"));
+ //// Confirm deletion of simulations:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Confirmdeletion")));
panel.add(new JComboBox(new PrefBooleanSelector(Prefs.CONFIRM_DELETE_SIMULATION,
"Delete", "Confirm", true)), "wrap 40lp, growx, sg combos");
-
- panel.add(new JLabel("User-defined thrust curves:"), "spanx, wrap");
+ //// User-defined thrust curves:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.User-definedthrust")), "spanx, wrap");
final JTextField field = new JTextField();
List<File> files = Prefs.getUserThrustCurveFiles();
String str = "";
});
panel.add(field, "w 100px, gapright unrel, spanx, growx, split");
- JButton button = new JButton("Add");
+ //// Add button
+ JButton button = new JButton(trans.get("pref.dlg.but.add"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
- SimpleFileFilter filter = new SimpleFileFilter("All thrust curve files (*.eng; *.rse; *.zip; directories)",
+ SimpleFileFilter filter =
+ new SimpleFileFilter(
+ //// All thrust curve files (*.eng; *.rse; *.zip; directories)
+ trans.get("pref.dlg.Allthrustcurvefiles"),
true, "eng", "rse", "zip");
chooser.addChoosableFileFilter(filter);
- chooser.addChoosableFileFilter(new SimpleFileFilter("RASP motor files (*.eng)",
+ //// RASP motor files (*.eng)
+ chooser.addChoosableFileFilter(new SimpleFileFilter(trans.get("pref.dlg.RASPfiles"),
true, "eng"));
- chooser.addChoosableFileFilter(new SimpleFileFilter("RockSim engine files (*.rse)",
+ //// RockSim engine files (*.rse)
+ chooser.addChoosableFileFilter(new SimpleFileFilter(trans.get("pref.dlg.RockSimfiles"),
true, "rse"));
- chooser.addChoosableFileFilter(new SimpleFileFilter("ZIP archives (*.zip)",
+ //// ZIP archives (*.zip)
+ chooser.addChoosableFileFilter(new SimpleFileFilter(trans.get("pref.dlg.ZIParchives"),
true, "zip"));
chooser.setFileFilter(filter);
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
});
panel.add(button, "gapright unrel");
- button = new JButton("Reset");
+ //// Reset button
+ button = new JButton(trans.get("pref.dlg.but.reset"));
button.addActionListener(new ActionListener() {
@Override
-
- final JCheckBox softwareUpdateBox = new JCheckBox("Check for software updates at startup");
+ //// Check for software updates at startup
+ final JCheckBox softwareUpdateBox =
+ new JCheckBox(trans.get("pref.dlg.checkbox.Checkupdates"));
softwareUpdateBox.setSelected(Prefs.getCheckUpdates());
softwareUpdateBox.addActionListener(new ActionListener() {
@Override
});
panel.add(softwareUpdateBox);
- button = new JButton("Check now");
- button.setToolTipText("Check for software updates now");
+ //// Check now button
+ button = new JButton(trans.get("pref.dlg.but.checknow"));
+ //// Check for software updates now
+ button.setToolTipText(trans.get("pref.dlg.ttip.Checkupdatesnow"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPanel panel = new JPanel(new MigLayout("", "[][]40lp[][]"));
JComboBox combo;
- panel.add(new JLabel("Select your preferred units:"), "span, wrap paragraph");
+ //// Select your preferred units:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Selectprefunits")), "span, wrap paragraph");
- panel.add(new JLabel("Rocket dimensions:"));
+ //// Rocket dimensions:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Rocketdimensions")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_LENGTH));
panel.add(combo, "sizegroup boxes");
- panel.add(new JLabel("Line density:"));
+ //// Line density:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Linedensity")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DENSITY_LINE));
panel.add(combo, "sizegroup boxes, wrap");
-
- panel.add(new JLabel("Motor dimensions:"));
+ //// Motor dimensions:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Motordimensions")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_MOTOR_DIMENSIONS));
panel.add(combo, "sizegroup boxes");
- panel.add(new JLabel("Surface density:"));
+ //// Surface density:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Surfacedensity")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DENSITY_SURFACE));
panel.add(combo, "sizegroup boxes, wrap");
-
- panel.add(new JLabel("Distance:"));
+ //// Distance:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Distance")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DISTANCE));
panel.add(combo, "sizegroup boxes");
- panel.add(new JLabel("Bulk density::"));
+ //// Bulk density::
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Bulkdensity")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DENSITY_BULK));
panel.add(combo, "sizegroup boxes, wrap");
-
- panel.add(new JLabel("Velocity:"));
+ //// Velocity:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Velocity")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_VELOCITY));
panel.add(combo, "sizegroup boxes");
- panel.add(new JLabel("Surface roughness:"));
+ //// Surface roughness:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Surfaceroughness")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ROUGHNESS));
panel.add(combo, "sizegroup boxes, wrap");
-
- panel.add(new JLabel("Acceleration:"));
+ //// Acceleration:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Acceleration")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ACCELERATION));
panel.add(combo, "sizegroup boxes");
- panel.add(new JLabel("Area:"));
+ //// Area:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Area")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_AREA));
panel.add(combo, "sizegroup boxes, wrap");
-
- panel.add(new JLabel("Mass:"));
+ //// Mass:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Mass")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_MASS));
panel.add(combo, "sizegroup boxes");
- panel.add(new JLabel("Angle:"));
+ //// Angle:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Angle")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ANGLE));
panel.add(combo, "sizegroup boxes, wrap");
-
- panel.add(new JLabel("Force:"));
+ //// Force:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Force")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_FORCE));
panel.add(combo, "sizegroup boxes");
- panel.add(new JLabel("Roll rate:"));
+ //// Roll rate:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Rollrate")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ROLL));
panel.add(combo, "sizegroup boxes, wrap");
-
- panel.add(new JLabel("Total impulse:"));
+ //// Total impulse:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Totalimpulse")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_IMPULSE));
panel.add(combo, "sizegroup boxes");
- panel.add(new JLabel("Temperature:"));
+ //// Temperature:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Temperature")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_TEMPERATURE));
panel.add(combo, "sizegroup boxes, wrap");
-
- panel.add(new JLabel("Moment of inertia:"));
+ //// Moment of inertia:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Momentofinertia")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_INERTIA));
panel.add(combo, "sizegroup boxes");
- panel.add(new JLabel("Pressure:"));
+ //// Pressure:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Pressure")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_PRESSURE));
panel.add(combo, "sizegroup boxes, wrap");
-
- panel.add(new JLabel("Stability:"));
+ //// Stability:
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Stability")));
combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_STABILITY));
panel.add(combo, "sizegroup boxes, wrap para");
-
- JButton button = new JButton("Default metric");
+ //// Default metric button
+ JButton button = new JButton(trans.get("pref.dlg.but.defaultmetric"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
panel.add(button, "spanx, split 2, grow");
- button = new JButton("Default imperial");
+ //// Default imperial button
+ button = new JButton(trans.get("pref.dlg.but.defaultimperial"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
panel.add(button, "grow, wrap para");
-
- panel.add(new StyledLabel("The effects will take place the next time you open a window.", -2),
+ //// The effects will take place the next time you open a window.
+ panel.add(new StyledLabel(
+ trans.get("pref.dlg.lbl.effect1"), -2),
"spanx, wrap");
final JDialog dialog = new JDialog(this, ModalityType.APPLICATION_MODAL);
JPanel panel = new JPanel(new MigLayout());
- panel.add(new JLabel("Checking for updates..."), "wrap");
+ //// Checking for updates...
+ panel.add(new JLabel(trans.get("pref.dlg.lbl.Checkingupdates")), "wrap");
JProgressBar bar = new JProgressBar();
bar.setIndeterminate(true);
panel.add(bar, "growx, wrap para");
- JButton cancel = new JButton("Cancel");
+ //// Cancel button
+ JButton cancel = new JButton(trans.get("dlg.but.cancel"));
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
UpdateInfo info = retriever.getUpdateInfo();
if (info == null) {
JOptionPane.showMessageDialog(this,
- "An error occurred while communicating with the server.",
- "Unable to retrieve update information", JOptionPane.WARNING_MESSAGE, null);
+ //// An error occurred while communicating with the server.
+ trans.get("pref.dlg.lbl.msg1"),
+ //// Unable to retrieve update information
+ trans.get("pref.dlg.lbl.msg2"), JOptionPane.WARNING_MESSAGE, null);
} else if (info.getLatestVersion() == null ||
info.getLatestVersion().equals("") ||
Prefs.getVersion().equalsIgnoreCase(info.getLatestVersion())) {
JOptionPane.showMessageDialog(this,
- "You are running the latest version of OpenRocket.",
- "No updates available", JOptionPane.INFORMATION_MESSAGE, null);
+ //// You are running the latest version of OpenRocket.
+ trans.get("pref.dlg.lbl.msg3"),
+ //// No updates available
+ trans.get("pref.dlg.lbl.msg4"), JOptionPane.INFORMATION_MESSAGE, null);
} else {
UpdateInfoDialog infoDialog = new UpdateInfoDialog(info);
infoDialog.setVisible(true);
import net.sf.openrocket.aerodynamics.Warning;
import net.sf.openrocket.aerodynamics.WarningSet;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.simulation.FlightData;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.MathUtil;
*/
public class RocketInfo implements FigureElement {
+ private static final Translator trans = Application.getTranslator();
// Margin around the figure edges, pixels
private static final int MARGIN = 8;
import net.sf.openrocket.gui.dialogs.preferences.PreferencesDialog;
import net.sf.openrocket.gui.main.componenttree.ComponentTree;
import net.sf.openrocket.gui.scalefigure.RocketPanel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
private static final RocketSaver ROCKET_SAVER = new OpenRocketSaver();
-
+ private static final Translator trans = Application.getTranslator();
+
// FileFilters for different types of rocket design files
private static final FileFilter ALL_DESIGNS_FILTER =
- new SimpleFileFilter("All rocket designs (*.ork; *.rkt)",
+ //// All rocket designs (*.ork; *.rkt)
+ new SimpleFileFilter(trans.get("BasicFrame.SimpleFileFilter1"),
".ork", ".ork.gz", ".rkt", ".rkt.gz");
private static final FileFilter OPENROCKET_DESIGN_FILTER =
- new SimpleFileFilter("OpenRocket designs (*.ork)", ".ork", ".ork.gz");
+ //// OpenRocket designs (*.ork)
+ new SimpleFileFilter(trans.get("BasicFrame.SimpleFileFilter2"), ".ork", ".ork.gz");
private static final FileFilter ROCKSIM_DESIGN_FILTER =
- new SimpleFileFilter("RockSim designs (*.rkt)", ".rkt", ".rkt.gz");
+ //// RockSim designs (*.rkt)
+ new SimpleFileFilter(trans.get("BasicFrame.SimpleFileFilter3"), ".rkt", ".rkt.gz");
-
+
public static final int COMPONENT_TAB = 0;
public static final int SIMULATION_TAB = 1;
// The top tabbed pane
tabbedPane = new JTabbedPane();
- tabbedPane.addTab("Rocket design", null, designTab());
- tabbedPane.addTab("Flight simulations", null, simulationPanel);
+ //// Rocket design
+ tabbedPane.addTab(trans.get("BasicFrame.tab.Rocketdesign"), null, designTab());
+ //// Flight simulations
+ tabbedPane.addTab(trans.get("BasicFrame.tab.Flightsim"), null, simulationPanel);
vertical.setTopComponent(tabbedPane);
scroll.setBorder(null);
scroll.setViewportBorder(null);
- TitledBorder border = new TitledBorder("Add new component");
+ TitledBorder border = new TitledBorder(trans.get("BasicFrame.title.Addnewcomp"));
border.setTitleFont(border.getTitleFont().deriveFont(Font.BOLD));
scroll.setBorder(border);
JMenuItem item;
//// File
- menu = new JMenu("File");
+ menu = new JMenu(trans.get("main.menu.file"));
menu.setMnemonic(KeyEvent.VK_F);
+ //// File-handling related tasks
menu.getAccessibleContext().setAccessibleDescription("File-handling related tasks");
menubar.add(menu);
- item = new JMenuItem("New", KeyEvent.VK_N);
+ //// New
+ item = new JMenuItem(trans.get("main.menu.file.new"), KeyEvent.VK_N);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
item.setMnemonic(KeyEvent.VK_N);
+ //// Create a new rocket design
item.getAccessibleContext().setAccessibleDescription("Create a new rocket design");
item.setIcon(Icons.FILE_NEW);
item.addActionListener(new ActionListener() {
});
menu.add(item);
- item = new JMenuItem("Open...", KeyEvent.VK_O);
+ //// Open...
+ item = new JMenuItem(trans.get("main.menu.file.open"), KeyEvent.VK_O);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
- item.getAccessibleContext().setAccessibleDescription("Open a rocket design");
+ //// Open a rocket design
+ item.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.item.Openrocketdesign"));
item.setIcon(Icons.FILE_OPEN);
item.addActionListener(new ActionListener() {
@Override
});
menu.add(item);
- item = new JMenuItem("Open example...");
- item.getAccessibleContext().setAccessibleDescription("Open an example rocket design");
+ //// Open example...
+ item = new JMenuItem(trans.get("main.menu.file.openExample"));
+ //// Open an example rocket design
+ item.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.item.Openexamplerocketdesign"));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK));
item.setIcon(Icons.FILE_OPEN_EXAMPLE);
menu.addSeparator();
- item = new JMenuItem("Save", KeyEvent.VK_S);
+ //// Save
+ item = new JMenuItem(trans.get("main.menu.file.save"), KeyEvent.VK_S);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
- item.getAccessibleContext().setAccessibleDescription("Save the current rocket design");
+ //// Save the current rocket design
+ item.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.item.SavecurRocketdesign"));
item.setIcon(Icons.FILE_SAVE);
item.addActionListener(new ActionListener() {
@Override
});
menu.add(item);
- item = new JMenuItem("Save as...", KeyEvent.VK_A);
+ //// Save as...
+ item = new JMenuItem(trans.get("main.menu.file.saveAs"), KeyEvent.VK_A);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK));
- item.getAccessibleContext().setAccessibleDescription("Save the current rocket design " +
- "to a new file");
+ //// Save the current rocket design to a new file
+ item.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.item.SavecurRocketdesnewfile"));
item.setIcon(Icons.FILE_SAVE_AS);
item.addActionListener(new ActionListener() {
@Override
});
menu.add(item);
-
- item = new JMenuItem("Print...", KeyEvent.VK_P);
+ //// Print...
+ item = new JMenuItem(trans.get("main.menu.file.print"), KeyEvent.VK_P);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK));
- item.getAccessibleContext().setAccessibleDescription("Print parts list and fin template");
+ //// Print parts list and fin template
+ item.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.item.Printpart"));
item.setIcon(Icons.FILE_PRINT);
item.addActionListener(new ActionListener() {
@Override
menu.addSeparator();
- item = new JMenuItem("Close", KeyEvent.VK_C);
+ //// Close
+ item = new JMenuItem(trans.get("main.menu.file.close"), KeyEvent.VK_C);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, ActionEvent.CTRL_MASK));
- item.getAccessibleContext().setAccessibleDescription("Close the current rocket design");
+ //// Close the current rocket design
+ item.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.item.Closedesign"));
item.setIcon(Icons.FILE_CLOSE);
item.addActionListener(new ActionListener() {
@Override
menu.addSeparator();
- item = new JMenuItem("Quit", KeyEvent.VK_Q);
+ //// Quit
+ item = new JMenuItem(trans.get("main.menu.file.quit"), KeyEvent.VK_Q);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.CTRL_MASK));
- item.getAccessibleContext().setAccessibleDescription("Quit the program");
+ //// Quit the program
+ item.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.item.Quitprogram"));
item.setIcon(Icons.FILE_QUIT);
item.addActionListener(new ActionListener() {
@Override
//// Edit
- menu = new JMenu("Edit");
+ menu = new JMenu(trans.get("main.menu.edit"));
menu.setMnemonic(KeyEvent.VK_E);
- menu.getAccessibleContext().setAccessibleDescription("Rocket editing");
+ //// Rocket editing
+ menu.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.menu.Rocketedt"));
menubar.add(menu);
item = new JMenuItem(action);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ActionEvent.CTRL_MASK));
item.setMnemonic(KeyEvent.VK_U);
+ //// Undo the previous operation
item.getAccessibleContext().setAccessibleDescription("Undo the previous operation");
menu.add(item);
item = new JMenuItem(action);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, ActionEvent.CTRL_MASK));
item.setMnemonic(KeyEvent.VK_R);
+ //// Redo the previously undone operation
item.getAccessibleContext().setAccessibleDescription("Redo the previously undone " +
"operation");
menu.add(item);
menu.addSeparator();
- item = new JMenuItem("Preferences");
+ //// Preferences
+ item = new JMenuItem(trans.get("main.menu.edit.preferences"));
item.setIcon(Icons.PREFERENCES);
+ //// Setup the application preferences
item.getAccessibleContext().setAccessibleDescription("Setup the application " +
"preferences");
item.addActionListener(new ActionListener() {
//// Analyze
- menu = new JMenu("Analyze");
+ menu = new JMenu(trans.get("main.menu.analyze"));
menu.setMnemonic(KeyEvent.VK_A);
+ //// Analyzing the rocket
menu.getAccessibleContext().setAccessibleDescription("Analyzing the rocket");
menubar.add(menu);
- item = new JMenuItem("Component analysis", KeyEvent.VK_C);
+ //// Component analysis
+ item = new JMenuItem(trans.get("main.menu.analyze.componentAnalysis"), KeyEvent.VK_C);
+ //// Analyze the rocket components separately
item.getAccessibleContext().setAccessibleDescription("Analyze the rocket components " +
"separately");
item.addActionListener(new ActionListener() {
//// Help
- menu = new JMenu("Help");
+ menu = new JMenu(trans.get("main.menu.help"));
menu.setMnemonic(KeyEvent.VK_H);
+ //// Information about OpenRocket
menu.getAccessibleContext().setAccessibleDescription("Information about OpenRocket");
menubar.add(menu);
-
- item = new JMenuItem("License", KeyEvent.VK_L);
+ //// License
+ item = new JMenuItem(trans.get("main.menu.help.license"), KeyEvent.VK_L);
+ //// OpenRocket license information
item.getAccessibleContext().setAccessibleDescription("OpenRocket license information");
item.addActionListener(new ActionListener() {
@Override
menu.addSeparator();
- item = new JMenuItem("Bug report", KeyEvent.VK_B);
+ //// Bug report
+ item = new JMenuItem(trans.get("main.menu.help.bugReport"), KeyEvent.VK_B);
+ //// Information about reporting bugs in OpenRocket
item.getAccessibleContext().setAccessibleDescription("Information about reporting " +
"bugs in OpenRocket");
item.addActionListener(new ActionListener() {
});
menu.add(item);
- item = new JMenuItem("Debug log");
+ //// Debug log
+ item = new JMenuItem(trans.get("main.menu.help.debugLog"));
+ //// View the OpenRocket debug log
item.getAccessibleContext().setAccessibleDescription("View the OpenRocket debug log");
item.addActionListener(new ActionListener() {
@Override
menu.addSeparator();
- item = new JMenuItem("About", KeyEvent.VK_A);
+ //// About
+ item = new JMenuItem(trans.get("main.menu.help.about"), KeyEvent.VK_A);
+ //// About OpenRocket
item.getAccessibleContext().setAccessibleDescription("About OpenRocket");
item.addActionListener(new ActionListener() {
@Override
//// Debug menu
menu = new JMenu("Debug");
+ //// OpenRocket debugging tasks
menu.getAccessibleContext().setAccessibleDescription("OpenRocket debugging tasks");
+ //// What is this menu?
item = new JMenuItem("What is this menu?");
item.addActionListener(new ActionListener() {
@Override
menu.addSeparator();
+ //// Create test rocket
item = new JMenuItem("Create test rocket");
item.addActionListener(new ActionListener() {
@Override
});
menu.add(item);
-
+ //// Exhaust memory
item = new JMenuItem("Exhaust memory");
item.addActionListener(new ActionListener() {
@Override
menu.addSeparator();
+ //// Exception here
item = new JMenuItem("Exception here");
item.addActionListener(new ActionListener() {
@Override
log.info("Confirming whether to save the design");
ComponentConfigDialog.hideDialog();
int result = JOptionPane.showConfirmDialog(this,
- "Design '" + rocket.getName() + "' has not been saved. " +
- "Do you want to save it?",
- "Design not saved", JOptionPane.YES_NO_CANCEL_OPTION,
+ trans.get("BasicFrame.dlg.lbl1") + rocket.getName() +
+ trans.get("BasicFrame.dlg.lbl2")+ " " +
+ trans.get("BasicFrame.dlg.lbl3"),
+ trans.get("BasicFrame.dlg.title"), JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (result == JOptionPane.YES_OPTION) {
// Save
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.configdialog.ComponentConfigDialog;
import net.sf.openrocket.gui.main.componenttree.ComponentTreeModel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.rocketcomponent.BodyComponent;
import net.sf.openrocket.rocketcomponent.BodyTube;
public class ComponentAddButtons extends JPanel implements Scrollable {
private static final LogHelper log = Application.getLogger();
+ private static final Translator trans = Application.getTranslator();
private static final int ROWS = 3;
private static final int MAXCOLS = 6;
////////////////////////////////////////////
-
- addButtonRow("Body components and fin sets", row,
- new BodyComponentButton(NoseCone.class, "Nose cone"),
- new BodyComponentButton(BodyTube.class, "Body tube"),
- new BodyComponentButton(Transition.class, "Transition"),
- new FinButton(TrapezoidFinSet.class, "Trapezoidal"), // TODO: MEDIUM: freer fin placing
- new FinButton(EllipticalFinSet.class, "Elliptical"),
- new FinButton(FreeformFinSet.class, "Freeform"),
- new FinButton(LaunchLug.class, "Launch lug"));
+ //// Body components and fin sets
+ addButtonRow(trans.get("compaddbuttons.Bodycompandfinsets"), row,
+ //// Nose cone
+ new BodyComponentButton(NoseCone.class, trans.get("compaddbuttons.Nosecone")),
+ //// Body tube
+ new BodyComponentButton(BodyTube.class, trans.get("compaddbuttons.Bodytube")),
+ //// Transition
+ new BodyComponentButton(Transition.class, trans.get("compaddbuttons.Transition")),
+ //// Trapezoidal
+ new FinButton(TrapezoidFinSet.class, trans.get("compaddbuttons.Trapezoidal")), // TODO: MEDIUM: freer fin placing
+ //// Elliptical
+ new FinButton(EllipticalFinSet.class, trans.get("compaddbuttons.Elliptical")),
+ //// Freeform
+ new FinButton(FreeformFinSet.class, trans.get("compaddbuttons.Freeform")),
+ //// Launch lug
+ new FinButton(LaunchLug.class, trans.get("compaddbuttons.Launchlug")));
row++;
/////////////////////////////////////////////
- addButtonRow("Inner component", row,
- new ComponentButton(InnerTube.class, "Inner tube"),
- new ComponentButton(TubeCoupler.class, "Coupler"),
- new ComponentButton(CenteringRing.class, "Centering\nring"),
- new ComponentButton(Bulkhead.class, "Bulkhead"),
- new ComponentButton(EngineBlock.class, "Engine\nblock"));
+ //// Inner component
+ addButtonRow(trans.get("compaddbuttons.Innercomponent"), row,
+ //// Inner tube
+ new ComponentButton(InnerTube.class, trans.get("compaddbuttons.Innertube")),
+ //// Coupler
+ new ComponentButton(TubeCoupler.class, trans.get("compaddbuttons.Coupler")),
+ //// Centering\nring
+ new ComponentButton(CenteringRing.class, trans.get("compaddbuttons.Centeringring")),
+ //// Bulkhead
+ new ComponentButton(Bulkhead.class, trans.get("compaddbuttons.Bulkhead")),
+ //// Engine\nblock
+ new ComponentButton(EngineBlock.class, trans.get("compaddbuttons.Engineblock")));
row++;
////////////////////////////////////////////
- addButtonRow("Mass objects", row,
- new ComponentButton(Parachute.class, "Parachute"),
- new ComponentButton(Streamer.class, "Streamer"),
- new ComponentButton(ShockCord.class, "Shock cord"),
+ //// Mass objects
+ addButtonRow(trans.get("compaddbuttons.Massobjects"), row,
+ //// Parachute
+ new ComponentButton(Parachute.class, trans.get("compaddbuttons.Parachute")),
+ //// Streamer
+ new ComponentButton(Streamer.class, trans.get("compaddbuttons.Streamer")),
+ //// Shock cord
+ new ComponentButton(ShockCord.class, trans.get("compaddbuttons.Shockcord")),
// new ComponentButton("Motor clip"),
// new ComponentButton("Payload"),
- new ComponentButton(MassComponent.class, "Mass\ncomponent"));
+ //// Mass\ncomponent
+ new ComponentButton(MassComponent.class, trans.get("compaddbuttons.Masscomponent")));
// Get maximum button size
}
private int askPosition() {
- Object[] options = { "Insert here", "Add to the end", "Cancel" };
+ //// Insert here
+ //// Add to the end
+ //// Cancel
+ Object[] options = { trans.get("compaddbuttons.askPosition.Inserthere"),
+ trans.get("compaddbuttons.askPosition.Addtotheend"),
+ trans.get("compaddbuttons.askPosition.Cancel") };
JPanel panel = new JPanel(new MigLayout());
- JCheckBox check = new JCheckBox("Do not ask me again");
+ //// Do not ask me again
+ JCheckBox check = new JCheckBox(trans.get("compaddbuttons.Donotaskmeagain"));
panel.add(check, "wrap");
- panel.add(new StyledLabel("You can change the default operation in the " +
- "preferences.", -2));
+ //// You can change the default operation in the preferences.
+ panel.add(new StyledLabel(trans.get("compaddbuttons.lbl.Youcanchange"), -2));
int sel = JOptionPane.showOptionDialog(null, // parent component
+ //// Insert the component after the current component or as the last component?
new Object[] {
- "Insert the component after the current component or as the last " +
- "component?",
+ trans.get("compaddbuttons.lbl.insertcomp"),
panel },
- "Select component position", // title
+ //// Select component position
+ trans.get("compaddbuttons.Selectcomppos"), // title
JOptionPane.DEFAULT_OPTION, // default selections
JOptionPane.QUESTION_MESSAGE, // dialog type
null, // icon
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.configdialog.ComponentConfigDialog;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.Stage;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.Icons;
import net.sf.openrocket.util.Pair;
import net.sf.openrocket.util.Prefs;
private final RocketAction newStageAction;
private final RocketAction moveUpAction;
private final RocketAction moveDownAction;
-
+ private static final Translator trans = Application.getTranslator();
+
public RocketActions(OpenRocketDocument document, DocumentSelectionModel selectionModel,
BasicFrame parentFrame) {
boolean verify = Prefs.NODE.getBoolean(Prefs.CONFIRM_DELETE_SIMULATION, true);
if (verify) {
JPanel panel = new JPanel(new MigLayout());
- JCheckBox dontAsk = new JCheckBox("Do not ask me again");
+ //// Do not ask me again
+ JCheckBox dontAsk = new JCheckBox(trans.get("RocketActions.checkbox.Donotaskmeagain"));
panel.add(dontAsk,"wrap");
- panel.add(new StyledLabel("You can change the default operation in the " +
- "preferences.",-2));
+ //// You can change the default operation in the preferences.
+ panel.add(new StyledLabel(trans.get("RocketActions.lbl.Youcanchangedefop"),-2));
int ret = JOptionPane.showConfirmDialog(
parentFrame,
new Object[] {
- "Delete the selected simulations?",
- "<html><i>This operation cannot be undone.</i>",
+ //// Delete the selected simulations?
+ trans.get("RocketActions.showConfirmDialog.lbl1"),
+ //// <html><i>This operation cannot be undone.</i>
+ trans.get("RocketActions.showConfirmDialog.lbl2"),
"",
panel },
- "Delete simulations",
+ //// Delete simulations
+ trans.get("RocketActions.showConfirmDialog.title"),
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if (ret != JOptionPane.OK_OPTION)
*/
private class DeleteComponentAction extends RocketAction {
public DeleteComponentAction() {
- this.putValue(NAME, "Delete");
- this.putValue(SHORT_DESCRIPTION, "Delete the selected component.");
+ //// Delete
+ this.putValue(NAME, trans.get("RocketActions.DelCompAct.Delete"));
+ //// Delete the selected component.
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.DelCompAct.ttip.Delete"));
this.putValue(MNEMONIC_KEY, KeyEvent.VK_D);
// this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
this.putValue(SMALL_ICON, Icons.EDIT_DELETE);
*/
private class DeleteSimulationAction extends RocketAction {
public DeleteSimulationAction() {
- this.putValue(NAME, "Delete");
- this.putValue(SHORT_DESCRIPTION, "Delete the selected simulation.");
+ //// Delete
+ this.putValue(NAME, trans.get("RocketActions.DelSimuAct.Delete"));
+ //// Delete the selected simulation.
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.DelSimuAct.ttip.Delete"));
this.putValue(MNEMONIC_KEY, KeyEvent.VK_D);
// this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
this.putValue(SMALL_ICON, Icons.EDIT_DELETE);
*/
private class DeleteAction extends RocketAction {
public DeleteAction() {
- this.putValue(NAME, "Delete");
- this.putValue(SHORT_DESCRIPTION, "Delete the selected component or simulation.");
+ //// Delete
+ this.putValue(NAME, trans.get("RocketActions.DelAct.Delete"));
+ //// Delete the selected component or simulation.
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.DelAct.ttip.Delete"));
this.putValue(MNEMONIC_KEY, KeyEvent.VK_D);
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
this.putValue(SMALL_ICON, Icons.EDIT_DELETE);
*/
private class CutAction extends RocketAction {
public CutAction() {
- this.putValue(NAME, "Cut");
+ //// Cut
+ this.putValue(NAME, trans.get("RocketActions.CutAction.Cut"));
this.putValue(MNEMONIC_KEY, KeyEvent.VK_T);
this.putValue(ACCELERATOR_KEY, CUT_KEY_STROKE);
- this.putValue(SHORT_DESCRIPTION, "Cut this component or simulation to "
- + "the clipboard and remove from this design");
+ //// Cut this component or simulation to the clipboard and remove from this design
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.CutAction.ttip.Cut"));
this.putValue(SMALL_ICON, Icons.EDIT_CUT);
clipboardChanged();
}
*/
private class CopyAction extends RocketAction {
public CopyAction() {
- this.putValue(NAME, "Copy");
+ //// Copy
+ this.putValue(NAME, trans.get("RocketActions.CopyAct.Copy"));
this.putValue(MNEMONIC_KEY, KeyEvent.VK_C);
this.putValue(ACCELERATOR_KEY, COPY_KEY_STROKE);
- this.putValue(SHORT_DESCRIPTION, "Copy this component (and subcomponents) to "
- + "the clipboard.");
+ //// Copy this component (and subcomponents) to the clipboard.
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.CopyAct.Copy"));
this.putValue(SMALL_ICON, Icons.EDIT_COPY);
clipboardChanged();
}
*/
private class PasteAction extends RocketAction {
public PasteAction() {
- this.putValue(NAME, "Paste");
+ //// Paste
+ this.putValue(NAME, trans.get("RocketActions.PasteAct.Paste"));
this.putValue(MNEMONIC_KEY, KeyEvent.VK_P);
this.putValue(ACCELERATOR_KEY, PASTE_KEY_STROKE);
- this.putValue(SHORT_DESCRIPTION, "Paste the component or simulation on "
- + "the clipboard to the design.");
+ //// Paste the component or simulation on the clipboard to the design.
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.PasteAct.ttip.Paste"));
this.putValue(SMALL_ICON, Icons.EDIT_PASTE);
clipboardChanged();
}
*/
private class EditAction extends RocketAction {
public EditAction() {
- this.putValue(NAME, "Edit");
- this.putValue(SHORT_DESCRIPTION, "Edit the selected component.");
+ //// Edit
+ this.putValue(NAME, trans.get("RocketActions.EditAct.Edit"));
+ //// Edit the selected component.
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.EditAct.ttip.Edit"));
clipboardChanged();
}
*/
private class NewStageAction extends RocketAction {
public NewStageAction() {
- this.putValue(NAME, "New stage");
- this.putValue(SHORT_DESCRIPTION, "Add a new stage to the rocket design.");
+ //// New stage
+ this.putValue(NAME, trans.get("RocketActions.NewStageAct.Newstage"));
+ //// Add a new stage to the rocket design.
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.NewStageAct.Newstage"));
clipboardChanged();
}
ComponentConfigDialog.hideDialog();
RocketComponent stage = new Stage();
- stage.setName("Booster stage");
+ //// Booster stage
+ stage.setName(trans.get("RocketActions.ActBoosterstage"));
+ //// Add stage
document.addUndoPosition("Add stage");
rocket.addChild(stage);
rocket.getDefaultConfiguration().setAllStages();
*/
private class MoveUpAction extends RocketAction {
public MoveUpAction() {
- this.putValue(NAME, "Move up");
- this.putValue(SHORT_DESCRIPTION, "Move this component upwards.");
+ //// Move up
+ this.putValue(NAME, trans.get("RocketActions.MoveUpAct.Moveup"));
+ //// Move this component upwards.
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.MoveUpAct.ttip.Moveup"));
clipboardChanged();
}
*/
private class MoveDownAction extends RocketAction {
public MoveDownAction() {
- this.putValue(NAME, "Move down");
- this.putValue(SHORT_DESCRIPTION, "Move this component downwards.");
+ //// Move down
+ this.putValue(NAME, trans.get("RocketActions.MoveDownAct.Movedown"));
+ //// Move this component downwards.
+ this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.MoveDownAct.ttip.Movedown"));
clipboardChanged();
}
import net.sf.openrocket.gui.plot.Axis;
import net.sf.openrocket.gui.plot.PlotConfiguration;
import net.sf.openrocket.gui.plot.SimulationPlotPanel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.models.atmosphere.ExtendedISAModel;
import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.simulation.FlightData;
import net.sf.openrocket.simulation.FlightDataType;
import net.sf.openrocket.simulation.listeners.SimulationListener;
import net.sf.openrocket.simulation.listeners.example.CSVSaveListener;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.Chars;
private final Simulation simulation;
private final GUISimulationConditions conditions;
private final Configuration configuration;
-
+ private static final Translator trans = Application.getTranslator();
+
public SimulationEditDialog(Window parent, Simulation s) {
this(parent, s, 0);
}
public SimulationEditDialog(Window parent, Simulation s, int tab) {
- super(parent, "Edit simulation", JDialog.ModalityType.DOCUMENT_MODAL);
+ //// Edit simulation
+ super(parent, trans.get("simedtdlg.title.Editsim"), JDialog.ModalityType.DOCUMENT_MODAL);
this.parentWindow = parent;
this.simulation = s;
JPanel mainPanel = new JPanel(new MigLayout("fill","[grow, fill]"));
- mainPanel.add(new JLabel("Simulation name: "), "span, split 2, shrink");
+ //// Simulation name:
+ mainPanel.add(new JLabel(trans.get("simedtdlg.lbl.Simname") + " "), "span, split 2, shrink");
final JTextField field = new JTextField(simulation.getName());
field.getDocument().addDocumentListener(new DocumentListener() {
@Override
JTabbedPane tabbedPane = new JTabbedPane();
-
- tabbedPane.addTab("Launch conditions", flightConditionsTab());
- tabbedPane.addTab("Simulation options", simulationOptionsTab());
- tabbedPane.addTab("Plot data", plotTab());
- tabbedPane.addTab("Export data", exportTab());
+ //// Launch conditions
+ tabbedPane.addTab(trans.get("simedtdlg.tab.Launchcond"), flightConditionsTab());
+ //// Simulation options
+ tabbedPane.addTab(trans.get("simedtdlg.tab.Simopt"), simulationOptionsTab());
+ //// Plot data
+ tabbedPane.addTab(trans.get("simedtdlg.tab.Plotdata"), plotTab());
+ //// Export data
+ tabbedPane.addTab(trans.get("simedtdlg.tab.Exportdata"), exportTab());
// Select the initial tab
if (tab == EDIT) {
mainPanel.add(new JPanel(), "spanx, split, growx");
JButton button;
- button = new JButton("Run simulation");
+ //// Run simulation button
+ button = new JButton(trans.get("simedtdlg.but.runsimulation"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
mainPanel.add(button, "gapright para");
-
- JButton close = new JButton("Close");
+ //// Close button
+ JButton close = new JButton(trans.get("dlg.but.close"));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JSpinner spin;
//// Motor selector
- JLabel label = new JLabel("Motor configuration:");
- label.setToolTipText("Select the motor configuration to use.");
+ //// Motor configuration:
+ JLabel label = new JLabel(trans.get("simedtdlg.lbl.Motorcfg"));
+ //// Select the motor configuration to use.
+ label.setToolTipText(trans.get("simedtdlg.lbl.ttip.Motorcfg"));
panel.add(label, "shrinkx, spanx, split 2");
JComboBox combo = new JComboBox(new MotorConfigurationModel(configuration));
- combo.setToolTipText("Select the motor configuration to use.");
+ //// Select the motor configuration to use.
+ combo.setToolTipText(trans.get("simedtdlg.combo.ttip.motorconf"));
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//// Wind settings: Average wind speed, turbulence intensity, std. deviation
sub = new JPanel(new MigLayout("fill, gap rel unrel",
"[grow][65lp!][30lp!][75lp!]",""));
- sub.setBorder(BorderFactory.createTitledBorder("Wind"));
+ //// Wind
+ sub.setBorder(BorderFactory.createTitledBorder(trans.get("simedtdlg.lbl.Wind")));
panel.add(sub, "growx, split 2, aligny 0, flowy, gapright para");
// Wind average
- label = new JLabel("Average windspeed:");
- tip = "The average windspeed relative to the ground.";
+ //// Average windspeed:
+ label = new JLabel(trans.get("simedtdlg.lbl.Averwindspeed"));
+ //// The average windspeed relative to the ground.
+ tip = trans.get("simedtdlg.lbl.ttip.Averwindspeed");
label.setToolTipText(tip);
sub.add(label);
// Wind std. deviation
- label = new JLabel("Standard deviation:");
- tip = "<html>The standard deviation of the windspeed.<br>" +
- "The windspeed is within twice the standard deviation from the average for " +
- "95% of the time.";
+ //// Standard deviation:
+ label = new JLabel(trans.get("simedtdlg.lbl.Stddeviation"));
+ //// <html>The standard deviation of the windspeed.<br>
+ //// The windspeed is within twice the standard deviation from the average for 95% of the time.
+ tip = trans.get("simedtdlg.lbl.ttip.Stddeviation");
label.setToolTipText(tip);
sub.add(label);
// Wind turbulence intensity
- label = new JLabel("Turbulence intensity:");
- tip = "<html>The turbulence intensity is the standard deviation " +
- "divided by the average windspeed.<br>" +
- "Typical values range from "+
+ //// Turbulence intensity:
+ label = new JLabel(trans.get("simedtdlg.lbl.Turbulenceintensity"));
+ //// <html>The turbulence intensity is the standard deviation divided by the average windspeed.<br>
+ //// Typical values range from
+ //// to
+ tip = trans.get("simedtdlg.lbl.ttip.Turbulenceintensity1") +
+ trans.get("simedtdlg.lbl.ttip.Turbulenceintensity2") + " "+
UnitGroup.UNITS_RELATIVE.getDefaultUnit().toStringUnit(0.05) +
- " to " +
+ " " + trans.get("simedtdlg.lbl.ttip.Turbulenceintensity3") +" " +
UnitGroup.UNITS_RELATIVE.getDefaultUnit().toStringUnit(0.20) + ".";
label.setToolTipText(tip);
sub.add(label);
//// Temperature and pressure
sub = new JPanel(new MigLayout("fill, gap rel unrel",
"[grow][65lp!][30lp!][75lp!]",""));
- sub.setBorder(BorderFactory.createTitledBorder("Atmospheric conditions"));
+ //// Atmospheric conditions
+ sub.setBorder(BorderFactory.createTitledBorder(trans.get("simedtdlg.border.Atmoscond")));
panel.add(sub, "growx, aligny 0, gapright para");
BooleanModel isa = new BooleanModel(conditions, "ISAAtmosphere");
JCheckBox check = new JCheckBox(isa);
- check.setText("Use International Standard Atmosphere");
- check.setToolTipText("<html>Select to use the International Standard Atmosphere model."+
- "<br>This model has a temperature of " +
+ //// Use International Standard Atmosphere
+ check.setText(trans.get("simedtdlg.checkbox.InterStdAtmosphere"));
+ //// <html>Select to use the International Standard Atmosphere model.
+ //// <br>This model has a temperature of
+ //// and a pressure of
+ //// at sea level.
+ check.setToolTipText(trans.get("simedtdlg.checkbox.ttip.InterStdAtmosphere1") +" " +
UnitGroup.UNITS_TEMPERATURE.toStringUnit(ExtendedISAModel.STANDARD_TEMPERATURE)+
- " and a pressure of " +
+ " " + trans.get("simedtdlg.checkbox.ttip.InterStdAtmosphere2") + " " +
UnitGroup.UNITS_PRESSURE.toStringUnit(ExtendedISAModel.STANDARD_PRESSURE) +
- " at sea level.");
+ " " + trans.get("simedtdlg.checkbox.ttip.InterStdAtmosphere3"));
sub.add(check, "spanx, wrap unrel");
- // Temperature
- label = new JLabel("Temperature:");
- tip = "The temperature at the launch site.";
+ // Temperature:
+ label = new JLabel(trans.get("simedtdlg.lbl.Temperature"));
+ //// The temperature at the launch site.
+ tip = trans.get("simedtdlg.lbl.ttip.Temperature");
label.setToolTipText(tip);
isa.addEnableComponent(label, false);
sub.add(label);
- // Pressure
- label = new JLabel("Pressure:");
- tip = "The atmospheric pressure at the launch site.";
+ // Pressure:
+ label = new JLabel(trans.get("simedtdlg.lbl.Pressure"));
+ //// The atmospheric pressure at the launch site.
+ tip = trans.get("simedtdlg.lbl.ttip.Pressure");
label.setToolTipText(tip);
isa.addEnableComponent(label, false);
sub.add(label);
//// Launch site conditions
sub = new JPanel(new MigLayout("fill, gap rel unrel",
"[grow][65lp!][30lp!][75lp!]",""));
- sub.setBorder(BorderFactory.createTitledBorder("Launch site"));
+ //// Launch site
+ sub.setBorder(BorderFactory.createTitledBorder(trans.get("simedtdlg.lbl.Launchsite")));
panel.add(sub, "growx, split 2, aligny 0, flowy");
- // Latitude
- label = new JLabel("Latitude:");
- tip = "<html>The launch site latitude affects the gravitational pull of Earth.<br>" +
- "Positive values are on the Northern hemisphere, negative values on the " +
- "Southern hemisphere.";
+ // Latitude:
+ label = new JLabel(trans.get("simedtdlg.lbl.Latitude"));
+ //// <html>The launch site latitude affects the gravitational pull of Earth.<br>
+ //// Positive values are on the Northern hemisphere, negative values on the Southern hemisphere.
+ tip = trans.get("simedtdlg.lbl.ttip.Latitude");
label.setToolTipText(tip);
sub.add(label);
- // Altitude
- label = new JLabel("Altitude:");
- tip = "<html>The launch altitude above mean sea level.<br>" +
- "This affects the position of the rocket in the atmospheric model.";
+ // Altitude:
+ label = new JLabel(trans.get("simedtdlg.lbl.Altitude"));
+ //// <html>The launch altitude above mean sea level.<br>
+ //// This affects the position of the rocket in the atmospheric model.
+ tip = trans.get("simedtdlg.lbl.ttip.Altitude");
label.setToolTipText(tip);
sub.add(label);
//// Launch rod
sub = new JPanel(new MigLayout("fill, gap rel unrel",
"[grow][65lp!][30lp!][75lp!]",""));
- sub.setBorder(BorderFactory.createTitledBorder("Launch rod"));
+ //// Launch rod
+ sub.setBorder(BorderFactory.createTitledBorder(trans.get("simedtdlg.border.Launchrod")));
panel.add(sub, "growx, aligny 0, wrap");
- // Length
- label = new JLabel("Length:");
- tip = "The length of the launch rod.";
+ // Length:
+ label = new JLabel(trans.get("simedtdlg.lbl.Length"));
+ //// The length of the launch rod.
+ tip = trans.get("simedtdlg.lbl.ttip.Length");
label.setToolTipText(tip);
sub.add(label);
- // Angle
- label = new JLabel("Angle:");
- tip = "The angle of the launch rod from vertical.";
+ // Angle:
+ label = new JLabel(trans.get("simedtdlg.lbl.Angle"));
+ //// The angle of the launch rod from vertical.
+ tip = trans.get("simedtdlg.lbl.ttip.Angle");
label.setToolTipText(tip);
sub.add(label);
- // Direction
- label = new JLabel("Direction:");
- tip = "<html>Direction of the launch rod relative to the wind.<br>" +
+ // Direction:
+ label = new JLabel(trans.get("simedtdlg.lbl.Direction"));
+ //// <html>Direction of the launch rod relative to the wind.<br>
+ //// = towards the wind,
+ //// = downwind.
+ tip = trans.get("simedtdlg.lbl.ttip.Direction1") +
UnitGroup.UNITS_ANGLE.toStringUnit(0) +
- " = towards the wind, "+
+ " " + trans.get("simedtdlg.lbl.ttip.Direction2") + " "+
UnitGroup.UNITS_ANGLE.toStringUnit(Math.PI) +
- " = downwind.";
+ " " + trans.get("simedtdlg.lbl.ttip.Direction3");
label.setToolTipText(tip);
sub.add(label);
//// Simulation options
sub = new JPanel(new MigLayout("fill, gap rel unrel",
"[grow][65lp!][30lp!][75lp!]",""));
- sub.setBorder(BorderFactory.createTitledBorder("Simulator options"));
+ //// Simulator options
+ sub.setBorder(BorderFactory.createTitledBorder(trans.get("simedtdlg.border.Simopt")));
panel.add(sub, "w 330lp!, growy, aligny 0");
// Calculation method
- tip = "<html>" +
- "The Extended Barrowman method calculates aerodynamic forces according <br>" +
- "to the Barrowman equations extended to accommodate more components.";
+ //// <html>The Extended Barrowman method calculates aerodynamic forces according <br>
+ //// to the Barrowman equations extended to accommodate more components.
+ tip = trans.get("simedtdlg.lbl.ttip.Calcmethod");
- label = new JLabel("Calculation method:");
+ //// Calculation method:
+ label = new JLabel(trans.get("simedtdlg.lbl.Calcmethod"));
label.setToolTipText(tip);
sub.add(label, "gaptop unrel, gapright para, spanx, split 2, w 150lp!");
- label = new JLabel("Extended Barrowman");
+ //// Extended Barrowman
+ label = new JLabel(trans.get("simedtdlg.lbl.ExtBarrowman"));
label.setToolTipText(tip);
sub.add(label, "growx, wrap para");
// Simulation method
- tip = "<html>" +
- "The six degree-of-freedom simulator allows the rocket total freedom during " +
- "flight.<br>" +
- "Integration is performed using a 4<sup>th</sup> order Runge-Kutta 4 " +
- "numerical integration.";
+ //// <html>The six degree-of-freedom simulator allows the rocket total freedom during flight.<br>
+ //// Integration is performed using a 4<sup>th</sup> order Runge-Kutta 4 numerical integration.
+ tip = trans.get("simedtdlg.lbl.ttip.Simmethod1") +
+ trans.get("simedtdlg.lbl.ttip.Simmethod2");
- label = new JLabel("Simulation method:");
+ //// Simulation method:
+ label = new JLabel(trans.get("simedtdlg.lbl.Simmethod"));
label.setToolTipText(tip);
sub.add(label, "gaptop unrel, gapright para, spanx, split 2, w 150lp!");
// Wind average
- label = new JLabel("Time step:");
- tip = "<html>The time between simulation steps.<br>" +
- "A smaller time step results in a more accurate but slower simulation.<br>" +
- "The 4<sup>th</sup> order simulation method is quite accurate with a time " +
- "step of " +
+ //// Time step:
+ label = new JLabel(trans.get("simedtdlg.lbl.Timestep"));
+ //// <html>The time between simulation steps.<br>
+ //// A smaller time step results in a more accurate but slower simulation.<br>
+ //// The 4<sup>th</sup> order simulation method is quite accurate with a time step of
+ tip = trans.get("simedtdlg.lbl.ttip.Timestep1") +
+ trans.get("simedtdlg.lbl.ttip.Timestep2") + " " +
UnitGroup.UNITS_TIME_STEP.toStringUnit(RK4SimulationStepper.RECOMMENDED_TIME_STEP) +
".";
label.setToolTipText(tip);
sub.add(slider,"w 75lp, wrap para");
*/
- JButton button = new JButton("Reset to default");
- button.setToolTipText("Reset the time step to its default value (" +
+ //// Reset to default button
+ JButton button = new JButton(trans.get("simedtdlg.but.resettodefault"));
+ //// Reset the time step to its default value (
+ button.setToolTipText(trans.get("simedtdlg.but.ttip.resettodefault") +
UnitGroup.UNITS_SHORT_TIME.toStringUnit(RK4SimulationStepper.RECOMMENDED_TIME_STEP) +
").");
button.addActionListener(new ActionListener() {
//// Simulation listeners
sub = new JPanel(new MigLayout("fill, gap 0 0"));
- sub.setBorder(BorderFactory.createTitledBorder("Simulator listeners"));
+ //// Simulator listeners
+ sub.setBorder(BorderFactory.createTitledBorder(trans.get("simedtdlg.border.Simlist")));
panel.add(sub, "growx, growy");
DescriptionArea desc = new DescriptionArea(5);
- desc.setText("<html>" +
- "<i>Simulation listeners</i> is an advanced feature that allows "+
- "user-written code to listen to and interact with the simulation. " +
- "For details on writing simulation listeners, see the OpenRocket " +
- "technical documentation.");
+ //// <html><i>Simulation listeners</i> is an advanced feature that allows user-written code to listen to and interact with the simulation.
+ //// For details on writing simulation listeners, see the OpenRocket technical documentation.
+ desc.setText(trans.get("simedtdlg.txt.longA1") +
+ trans.get("simedtdlg.txt.longA2"));
sub.add(desc, "aligny 0, growx, wrap para");
-
- label = new JLabel("Current listeners:");
+ //// Current listeners:
+ label = new JLabel(trans.get("simedtdlg.lbl.Curlist"));
sub.add(label, "spanx, wrap rel");
final ListenerListModel listenerModel = new ListenerListModel();
// scroll.setPreferredSize(new Dimension(1,1));
sub.add(scroll, "height 1px, grow, wrap rel");
-
- button = new JButton("Add");
+ //// Add button
+ button = new JButton(trans.get("simedtdlg.but.add"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String previous = Prefs.NODE.get("previousListenerName", "");
String input = (String)JOptionPane.showInputDialog(SimulationEditDialog.this,
new Object[] {
+ //// Type the full Java class name of the simulation listener, for example:
"Type the full Java class name of the simulation listener, for example:",
"<html><tt>" + CSVSaveListener.class.getName() + "</tt>" },
- "Add simulation listener",
+ //// Add simulation listener
+ trans.get("simedtdlg.lbl.Addsimlist"),
JOptionPane.QUESTION_MESSAGE,
null, null,
previous
});
sub.add(button, "split 2, sizegroup buttons, alignx 50%, gapright para");
- button = new JButton("Remove");
+ //// Remove button
+ button = new JButton(trans.get("simedtdlg.but.remove"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPanel panel = new JPanel(new MigLayout("fill"));
// No data available
- panel.add(new JLabel("No flight data available."),
+ //// No flight data available.
+ panel.add(new JLabel(trans.get("simedtdlg.lbl.Noflightdata")),
"alignx 50%, aligny 100%, wrap para");
- panel.add(new JLabel("Please run the simulation first."),
+ //// Please run the simulation first.
+ panel.add(new JLabel(trans.get("simedtdlg.lbl.runsimfirst")),
"alignx 50%, aligny 0%, wrap");
return panel;
}
// Create the chart using the factory to get all default settings
JFreeChart chart = ChartFactory.createXYLineChart(
- "Simulated flight",
+ //// Simulated flight
+ trans.get("simedtdlg.chart.Simflight"),
null,
null,
null,
// Create the dialog
- final JDialog dialog = new JDialog(this, "Simulation results");
+ //// Simulation results
+ final JDialog dialog = new JDialog(this, trans.get("simedtdlg.dlg.Simres"));
dialog.setModalityType(ModalityType.DOCUMENT_MODAL);
JPanel panel = new JPanel(new MigLayout("fill"));
panel.add(chartPanel, "grow, wrap 20lp");
- JButton button = new JButton("Close");
+ //// Close button
+ JButton button = new JButton(trans.get("dlg.but.close"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (ex == null) {
setIcon(Icons.SIMULATION_LISTENER_OK);
+ //// Listener instantiated successfully.
setToolTipText("Listener instantiated successfully.");
} else {
setIcon(Icons.SIMULATION_LISTENER_ERROR);
+ //// <html>Unable to instantiate listener due to exception:<br>
setToolTipText("<html>Unable to instantiate listener due to exception:<br>" +
ex.toString());
}
import net.sf.openrocket.gui.adaptors.Column;
import net.sf.openrocket.gui.adaptors.ColumnTableModel;
import net.sf.openrocket.gui.components.StyledLabel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
public class SimulationPanel extends JPanel {
private static final LogHelper log = Application.getLogger();
+ private static final Translator trans = Application.getTranslator();
+
private static final Color WARNING_COLOR = Color.RED;
private static final String WARNING_TEXT = "\uFF01"; // Fullwidth exclamation mark
//////// The simulation action buttons
- button = new JButton("New simulation");
- button.setToolTipText("Add a new simulation");
+ //// New simulation button
+ button = new JButton(trans.get("simpanel.but.newsimulation"));
+ //// Add a new simulation
+ button.setToolTipText(trans.get("simpanel.but.ttip.newsimulation"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
this.add(button, "skip 1, gapright para");
- button = new JButton("Edit simulation");
- button.setToolTipText("Edit the selected simulation");
+ //// Edit simulation button
+ button = new JButton(trans.get("simpanel.but.editsimulation"));
+ //// Edit the selected simulation
+ button.setToolTipText(trans.get("simpanel.but.ttip.editsim"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
this.add(button, "gapright para");
- button = new JButton("Run simulations");
- button.setToolTipText("Re-run the selected simulations");
+ //// Run simulations
+ button = new JButton(trans.get("simpanel.but.runsimulations"));
+ //// Re-run the selected simulations
+ button.setToolTipText(trans.get("simpanel.but.ttip.runsimu"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
this.add(button, "gapright para");
- button = new JButton("Delete simulations");
- button.setToolTipText("Delete the selected simulations");
+ //// Delete simulations button
+ button = new JButton(trans.get("simpanel.but.deletesimulations"));
+ //// Delete the selected simulations
+ button.setToolTipText(trans.get("simpanel.but.ttip.deletesim"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (verify) {
JPanel panel = new JPanel(new MigLayout());
- JCheckBox dontAsk = new JCheckBox("Do not ask me again");
+ //// Do not ask me again
+ JCheckBox dontAsk = new JCheckBox(trans.get("simpanel.checkbox.donotask"));
panel.add(dontAsk, "wrap");
- panel.add(new StyledLabel("You can change the default operation in the " +
- "preferences.", -2));
+ //// You can change the default operation in the preferences.
+ panel.add(new StyledLabel(trans.get("simpanel.lbl.defpref"), -2));
int ret = JOptionPane.showConfirmDialog(SimulationPanel.this,
new Object[] {
- "Delete the selected simulations?",
- "<html><i>This operation cannot be undone.</i>",
+ //// Delete the selected simulations?
+ trans.get("simpanel.dlg.lbl.DeleteSim1"),
+ //// <html><i>This operation cannot be undone.</i>
+ trans.get("simpanel.dlg.lbl.DeleteSim2"),
"",
panel },
- "Delete simulations",
+ //// Delete simulations
+ trans.get("simpanel.dlg.lbl.DeleteSim3"),
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if (ret != JOptionPane.OK_OPTION)
});
this.add(button, "gapright para");
-
- button = new JButton("Plot / export");
+ //// Plot / export button
+ button = new JButton(trans.get("simpanel.but.plotexport"));
// button = new JButton("Plot flight");
button.addActionListener(new ActionListener() {
@Override
},
//// Simulation name
- new Column("Name") {
+ //// Name
+ new Column(trans.get("simpanel.col.Name")) {
@Override
public Object getValueAt(int row) {
if (row < 0 || row >= document.getSimulationCount())
},
//// Simulation motors
- new Column("Motors") {
+ //// Motors
+ new Column(trans.get("simpanel.col.Motors")) {
@Override
public Object getValueAt(int row) {
if (row < 0 || row >= document.getSimulationCount())
},
//// Apogee
- new Column("Apogee") {
+ new Column(trans.get("simpanel.col.Apogee")) {
@Override
public Object getValueAt(int row) {
if (row < 0 || row >= document.getSimulationCount())
},
//// Maximum velocity
- new Column("Max. velocity") {
+ new Column(trans.get("simpanel.col.Maxvelocity")) {
@Override
public Object getValueAt(int row) {
if (row < 0 || row >= document.getSimulationCount())
},
//// Maximum acceleration
- new Column("Max. acceleration") {
+ new Column(trans.get("simpanel.col.Maxacceleration")) {
@Override
public Object getValueAt(int row) {
if (row < 0 || row >= document.getSimulationCount())
},
//// Time to apogee
- new Column("Time to apogee") {
+ new Column(trans.get("simpanel.col.Timetoapogee")) {
@Override
public Object getValueAt(int row) {
if (row < 0 || row >= document.getSimulationCount())
},
//// Flight time
- new Column("Flight time") {
+ new Column(trans.get("simpanel.col.Flighttime")) {
@Override
public Object getValueAt(int row) {
if (row < 0 || row >= document.getSimulationCount())
},
//// Ground hit velocity
- new Column("Ground hit velocity") {
+ new Column(trans.get("simpanel.col.Groundhitvelocity")) {
@Override
public Object getValueAt(int row) {
if (row < 0 || row >= document.getSimulationCount())
tip = "<html><b>" + sim.getName() + "</b><br>";
switch (sim.getStatus()) {
case UPTODATE:
+ //// <i>Up to date</i><br>
tip += "<i>Up to date</i><br>";
break;
case LOADED:
+ //// <i>Data loaded from a file</i><br>
tip += "<i>Data loaded from a file</i><br>";
break;
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.gui.dialogs.DetailDialog;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.rocketcomponent.MotorMount;
public class SimulationRunDialog extends JDialog {
private static final LogHelper log = Application.getLogger();
+ private static final Translator trans = Application.getTranslator();
+
/** Update the dialog status every this many ms */
private static final long UPDATE_MS = 200;
private final boolean[] simulationDone;
public SimulationRunDialog(Window window, Simulation... simulations) {
- super(window, "Running simulations...", Dialog.ModalityType.DOCUMENT_MODAL);
+ //// Running simulations...
+ super(window, trans.get("SimuRunDlg.title.RunSim"), Dialog.ModalityType.DOCUMENT_MODAL);
if (simulations.length == 0) {
throw new IllegalArgumentException("Called with no simulations to run");
// Build the dialog
JPanel panel = new JPanel(new MigLayout("fill", "[][grow]"));
- simLabel = new JLabel("Running ...");
+ //// Running ...
+ simLabel = new JLabel(trans.get("SimuRunDlg.lbl.Running"));
panel.add(simLabel, "spanx, wrap para");
-
- panel.add(new JLabel("Simulation time: "), "gapright para");
+ //// Simulation time:
+ panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Simutime") + " "), "gapright para");
timeLabel = new JLabel("");
panel.add(timeLabel, "growx, wrap rel");
- panel.add(new JLabel("Altitude: "));
+ //// Altitude:
+ panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Altitude") + " "));
altLabel = new JLabel("");
panel.add(altLabel, "growx, wrap rel");
- panel.add(new JLabel("Velocity: "));
+ //// Velocity:
+ panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Velocity") +" "));
velLabel = new JLabel("");
panel.add(velLabel, "growx, wrap para");
// Add cancel button
- JButton cancel = new JButton("Cancel");
+ JButton cancel = new JButton(trans.get("dlg.but.cancel"));
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
new Object[] {
- "Unable to simulate:",
+ //// Unable to simulate:
+ trans.get("SimuRunDlg.msg.Unabletosim"),
t.getMessage()
},
null, simulation.getName(), JOptionPane.ERROR_MESSAGE);
DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
new Object[] {
- "A error occurred during the simulation:",
+ //// A error occurred during the simulation:
+ trans.get("SimuRunDlg.msg.errorOccurred"),
t.getMessage()
},
stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE);
t.printStackTrace();
DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
new Object[] {
- "An exception occurred during the simulation:",
+ //// An exception occurred during the simulation:
+ trans.get("SimuRunDlg.msg.AnException1"),
t.getMessage(),
simulation.getSimulationListeners().isEmpty() ?
- "Please report this as a bug along with the details below." : ""
+ trans.get("SimuRunDlg.msg.AnException2") : ""
},
stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE);
t.printStackTrace();
DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
new Object[] {
- "A computation error occurred during the simulation.",
- "Please report this as a bug along with the details below."
+ //// A computation error occurred during the simulation.
+ trans.get("SimuRunDlg.msg.AssertionError1"),
+ //// Please report this as a bug along with the details below.
+ trans.get("SimuRunDlg.msg.AssertionError2")
},
stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE);
// Probably an Error
DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this,
new Object[] {
- "An unknown error was encountered during the simulation.",
- "The program may be unstable, you should save all your designs " +
- "and restart OpenRocket now!"
+ //// An unknown error was encountered during the simulation.
+ trans.get("SimuRunDlg.msg.unknownerror1"),
+ //// The program may be unstable, you should save all your designs and restart OpenRocket now!
+ trans.get("SimuRunDlg.msg.unknownerror2")
},
stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE);
import java.util.List;
import java.util.Set;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.simulation.FlightDataBranch;
import net.sf.openrocket.simulation.FlightDataType;
import net.sf.openrocket.simulation.FlightEvent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.util.ArrayList;
import net.sf.openrocket.util.BugException;
public class PlotConfiguration implements Cloneable {
+ private static final Translator trans = Application.getTranslator();
+
public static final PlotConfiguration[] DEFAULT_CONFIGURATIONS;
static {
ArrayList<PlotConfiguration> configs = new ArrayList<PlotConfiguration>();
PlotConfiguration config;
+ //// Vertical motion vs. time
config = new PlotConfiguration("Vertical motion vs. time");
config.addPlotDataType(FlightDataType.TYPE_ALTITUDE, 0);
config.addPlotDataType(FlightDataType.TYPE_VELOCITY_Z);
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
configs.add(config);
+ //// Total motion vs. time
config = new PlotConfiguration("Total motion vs. time");
config.addPlotDataType(FlightDataType.TYPE_ALTITUDE, 0);
config.addPlotDataType(FlightDataType.TYPE_VELOCITY_TOTAL);
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
configs.add(config);
+ //// Flight side profile
config = new PlotConfiguration("Flight side profile", FlightDataType.TYPE_POSITION_X);
config.addPlotDataType(FlightDataType.TYPE_ALTITUDE);
config.setEvent(FlightEvent.Type.IGNITION, true);
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
configs.add(config);
+ //// Stability vs. time
config = new PlotConfiguration("Stability vs. time");
config.addPlotDataType(FlightDataType.TYPE_STABILITY, 0);
config.addPlotDataType(FlightDataType.TYPE_CP_LOCATION, 1);
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
configs.add(config);
+ //// Drag coefficients vs. Mach number
config = new PlotConfiguration("Drag coefficients vs. Mach number",
FlightDataType.TYPE_MACH_NUMBER);
config.addPlotDataType(FlightDataType.TYPE_DRAG_COEFF, 0);
config.addPlotDataType(FlightDataType.TYPE_PRESSURE_DRAG_COEFF, 0);
configs.add(config);
+ //// Roll characteristics
config = new PlotConfiguration("Roll characteristics");
config.addPlotDataType(FlightDataType.TYPE_ROLL_RATE, 0);
config.addPlotDataType(FlightDataType.TYPE_ROLL_MOMENT_COEFF, 1);
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
configs.add(config);
+ //// Angle of attack and orientation vs. time
config = new PlotConfiguration("Angle of attack and orientation vs. time");
config.addPlotDataType(FlightDataType.TYPE_AOA, 0);
config.addPlotDataType(FlightDataType.TYPE_ORIENTATION_PHI);
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
configs.add(config);
+ //// Simulation time step and computation time
config = new PlotConfiguration("Simulation time step and computation time");
config.addPlotDataType(FlightDataType.TYPE_TIME_STEP);
config.addPlotDataType(FlightDataType.TYPE_COMPUTATION_TIME);
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.gui.components.StyledLabel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.simulation.FlightDataBranch;
import net.sf.openrocket.simulation.FlightDataType;
import net.sf.openrocket.simulation.FlightEvent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.BugException;
public class PlotDialog extends JDialog {
private static final float PLOT_STROKE_WIDTH = 1.5f;
-
+ private static final Translator trans = Application.getTranslator();
+
private static final Color DEFAULT_EVENT_COLOR = new Color(0, 0, 0);
private static final Map<FlightEvent.Type, Color> EVENT_COLORS =
new HashMap<FlightEvent.Type, Color>();
new ArrayList<ModifiedXYItemRenderer>();
private PlotDialog(Window parent, Simulation simulation, PlotConfiguration config) {
- super(parent, "Flight data plot");
+ //// Flight data plot
+ super(parent, trans.get("PlotDialog.title.Flightdataplot"));
this.setModalityType(ModalityType.DOCUMENT_MODAL);
final boolean initialShowPoints = Prefs.getBoolean(Prefs.PLOT_SHOW_POINTS, false);
// Create the chart using the factory to get all default settings
JFreeChart chart = ChartFactory.createXYLineChart(
- "Simulated flight",
+ //// Simulated flight
+ trans.get("PlotDialog.Chart.Simulatedflight"),
null,
null,
null,
panel.add(chartPanel, "grow, wrap 20lp");
- final JCheckBox check = new JCheckBox("Show data points");
+ //// Show data points
+ final JCheckBox check = new JCheckBox(trans.get("PlotDialog.CheckBox.Showdatapoints"));
check.setSelected(initialShowPoints);
check.addActionListener(new ActionListener() {
@Override
panel.add(check, "split, left");
- JLabel label = new StyledLabel("Click+drag down+right to zoom in, up+left to zoom out", -2);
+ JLabel label = new StyledLabel(trans.get("PlotDialog.lbl.Chart"), -2);
panel.add(label, "gapleft para");
panel.add(new JPanel(), "growx");
- JButton button = new JButton("Close");
+ //// Close button
+ JButton button = new JButton(trans.get("dlg.but.close"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.gui.components.DescriptionArea;
import net.sf.openrocket.gui.components.UnitSelector;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.simulation.FlightDataBranch;
import net.sf.openrocket.simulation.FlightDataType;
import net.sf.openrocket.simulation.FlightEvent;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.util.GUIUtil;
import net.sf.openrocket.util.Icons;
public class SimulationPlotPanel extends JPanel {
-
+ private static final Translator trans = Application.getTranslator();
+
// TODO: LOW: Should these be somewhere else?
public static final int AUTO = -1;
public static final int LEFT = 0;
modifying--;
}
});
- this.add(new JLabel("Preset plot configurations: "), "spanx, split");
+ //// Preset plot configurations:
+ this.add(new JLabel(trans.get("simplotpanel.lbl.Presetplotconf")), "spanx, split");
this.add(configurationSelector, "growx, wrap 20lp");
//// X axis
-
- this.add(new JLabel("X axis type:"), "spanx, split");
+ //// X axis type:
+ this.add(new JLabel(trans.get("simplotpanel.lbl.Xaxistype")), "spanx, split");
domainTypeSelector = new JComboBox(types);
domainTypeSelector.setSelectedItem(configuration.getDomainAxisType());
domainTypeSelector.addItemListener(new ItemListener() {
});
this.add(domainTypeSelector, "gapright para");
-
- this.add(new JLabel("Unit:"));
+ //// Unit:
+ this.add(new JLabel(trans.get("simplotpanel.lbl.Unit")));
domainUnitSelector = new UnitSelector(configuration.getDomainAxisType().getUnitGroup());
domainUnitSelector.setSelectedUnit(configuration.getDomainAxisUnit());
domainUnitSelector.addItemListener(new ItemListener() {
});
this.add(domainUnitSelector, "width 40lp, gapright para");
-
- DescriptionArea desc = new DescriptionArea("The data will be plotted in time order " +
- "even if the X axis type is not time.", 2, -2f);
+ //// The data will be plotted in time order even if the X axis type is not time.
+ DescriptionArea desc = new DescriptionArea(trans.get("simplotpanel.Desc"), 2, -2f);
desc.setViewportBorder(BorderFactory.createEmptyBorder());
this.add(desc, "width 1px, growx 1, wrap unrel");
//// Y axis selector panel
-
- this.add(new JLabel("Y axis types:"));
-
- this.add(new JLabel("Flight events:"), "wrap rel");
+ //// Y axis types:
+ this.add(new JLabel(trans.get("simplotpanel.lbl.Yaxistypes")));
+ //// Flight events:
+ this.add(new JLabel(trans.get("simplotpanel.lbl.Flightevents")), "wrap rel");
typeSelectorPanel = new JPanel(new MigLayout("gapy rel"));
JScrollPane scroll = new JScrollPane(typeSelectorPanel);
//// All + None buttons
- JButton button = new JButton("All");
+ JButton button = new JButton(trans.get("simplotpanel.but.All"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
this.add(button, "split 2, gapleft para, gapright para, growx, sizegroup buttons");
- button = new JButton("None");
+ //// None
+ button = new JButton(trans.get("simplotpanel.but.None"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
-
- button = new JButton("New Y axis plot type");
+ //// New Y axis plot type
+ button = new JButton(trans.get("simplotpanel.but.NewYaxisplottype"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (configuration.getTypeCount() >= 15) {
JOptionPane.showMessageDialog(SimulationPlotPanel.this,
- "A maximum of 15 plots is allowed.", "Cannot add plot",
+ //// A maximum of 15 plots is allowed.
+ //// Cannot add plot
+ trans.get("simplotpanel.OptionPane.lbl1"),
+ trans.get("simplotpanel.OptionPane.lbl2"),
JOptionPane.ERROR_MESSAGE);
return;
}
this.add(new JPanel(), "growx");
- button = new JButton("Plot flight");
+ //// Plot flight
+ button = new JButton(trans.get("simplotpanel.but.Plotflight"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
});
this.add(typeSelector, "gapright para");
- this.add(new JLabel("Unit:"));
+ //// Unit:
+ this.add(new JLabel(trans.get("simplotpanel.lbl.Unit")));
unitSelector = new UnitSelector(type.getUnitGroup());
if (unit != null)
unitSelector.setSelectedUnit(unit);
});
this.add(unitSelector, "width 40lp, gapright para");
- this.add(new JLabel("Axis:"));
+ //// Axis:
+ this.add(new JLabel(trans.get("simplotpanel.lbl.Axis")));
axisSelector = new JComboBox(POSITIONS);
if (position == LEFT)
axisSelector.setSelectedIndex(1);
JButton button = new JButton(Icons.DELETE);
- button.setToolTipText("Remove this plot");
+ //// Remove this plot
+ button.setToolTipText(trans.get("simplotpanel.but.ttip.Removethisplot"));
button.setBorderPainted(false);
button.addActionListener(new ActionListener() {
@Override
import net.sf.openrocket.gui.figureelements.RocketInfo;
import net.sf.openrocket.gui.main.SimulationWorker;
import net.sf.openrocket.gui.main.componenttree.ComponentTreeModel;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.masscalc.BasicMassCalculator;
import net.sf.openrocket.masscalc.MassCalculator;
import net.sf.openrocket.masscalc.MassCalculator.MassCalcType;
import net.sf.openrocket.simulation.listeners.SimulationListener;
import net.sf.openrocket.simulation.listeners.system.ApogeeEndListener;
import net.sf.openrocket.simulation.listeners.system.InterruptListener;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.ChangeSource;
import net.sf.openrocket.util.Chars;
*/
public class RocketPanel extends JPanel implements TreeSelectionListener, ChangeSource {
+ private static final Translator trans = Application.getTranslator();
private final RocketFigure figure;
private final ScaleScrollPane scrollPane;
// Side/back buttons
FigureTypeAction action = new FigureTypeAction(RocketFigure.TYPE_SIDE);
- action.putValue(Action.NAME, "Side view");
- action.putValue(Action.SHORT_DESCRIPTION, "Side view");
+ //// Side view
+ action.putValue(Action.NAME, trans.get("RocketPanel.FigTypeAct.Sideview"));
+ //// Side view
+ action.putValue(Action.SHORT_DESCRIPTION, trans.get("RocketPanel.FigTypeAct.ttip.Sideview"));
JToggleButton toggle = new JToggleButton(action);
add(toggle, "spanx, split");
action = new FigureTypeAction(RocketFigure.TYPE_BACK);
- action.putValue(Action.NAME, "Back view");
- action.putValue(Action.SHORT_DESCRIPTION, "Rear view");
+ //// Back view
+ action.putValue(Action.NAME, trans.get("RocketPanel.FigTypeAct.Backview"));
+ //// Back view
+ action.putValue(Action.SHORT_DESCRIPTION, trans.get("RocketPanel.FigTypeAct.ttip.Backview"));
toggle = new JToggleButton(action);
add(toggle, "gap rel");
// Motor configuration selector
-
- JLabel label = new JLabel("Motor configuration:");
+ //// Motor configuration:
+ JLabel label = new JLabel(trans.get("RocketPanel.lbl.Motorcfg"));
label.setHorizontalAlignment(JLabel.RIGHT);
add(label, "growx, right");
add(new JComboBox(new MotorConfigurationModel(configuration)), "wrap");
add(new BasicSlider(theta.getSliderModel(0, 2 * Math.PI), JSlider.VERTICAL, true),
"ax 50%, wrap, width " + (d.width + 6) + "px:null:null, growy");
-
- infoMessage = new JLabel("<html>" +
- "Click to select " +
- "Shift+click to select other " +
- "Double-click to edit " +
- "Click+drag to move");
+
+ //// <html>Click to select Shift+click to select other Double-click to edit Click+drag to move
+ infoMessage = new JLabel(trans.get("RocketPanel.lbl.infoMessage"));
infoMessage.setFont(new Font("Sans Serif", Font.PLAIN, 9));
add(infoMessage, "skip, span, gapleft 25, wrap");
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.file.motor.GeneralMotorLoader;
+import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.ThrustCurveMotor;
+import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.GUIUtil;
import org.jfree.chart.ChartFactory;
public class MotorPlot extends JDialog {
private int selected = -1;
+ private static final Translator trans = Application.getTranslator();
public MotorPlot(List<String> filenames, List<ThrustCurveMotor> motors) {
- super((JFrame) null, "Motor plot", true);
+ //// Motor plot
+ super((JFrame) null, trans.get("MotorPlot.title.Motorplot"), true);
JTabbedPane tabs = new JTabbedPane();
for (int i = 0; i < filenames.size(); i++) {
JPanel pane = createPlotPanel((ThrustCurveMotor) motors.get(i));
- JButton button = new JButton("Select");
+ //// Select button
+ JButton button = new JButton(trans.get("MotorPlot.but.Select"));
final int number = i;
button.addActionListener(new ActionListener() {
@Override
// Create the chart using the factory to get all default settings
JFreeChart chart = ChartFactory.createXYLineChart(
- "Motor thrust curve",
- "Time / s",
- "Thrust / N",
+ //// Motor thrust curve
+ trans.get("MotorPlot.Chart.Motorthrustcurve"),
+ //// Time / s
+ trans.get("MotorPlot.Chart.Time"),
+ //// Thrust / N
+ trans.get("MotorPlot.Chart.Thrust"),
new XYSeriesCollection(series),
PlotOrientation.VERTICAL,
true,
JTextArea area = new JTextArea(5, 40);
StringBuilder sb = new StringBuilder();
- sb.append("Designation: ").append(motor.getDesignation()).append(" ");
- sb.append("Manufacturer: ").append(motor.getManufacturer()).append(" ");
- sb.append("Type: ").append(motor.getMotorType()).append('\n');
- sb.append("Delays: ").append(Arrays.toString(motor.getStandardDelays())).append('\n');
- sb.append("Comment:\n").append(motor.getDescription());
+ //// Designation:
+ sb.append("MotorPlot.txt.Designation" + " ").append(motor.getDesignation()).append(" ");
+ //// Manufacturer:
+ sb.append("MotorPlot.txt.Manufacturer" + " ").append(motor.getManufacturer()).append(" ");
+ //// Type:
+ sb.append("MotorPlot.txt.Type" + " ").append(motor.getMotorType()).append('\n');
+ //// Delays:
+ sb.append("MotorPlot.txt.Delays" +" ").append(Arrays.toString(motor.getStandardDelays())).append('\n');
+ //// Comment:\n
+ sb.append("MotorPlot.txt.Comment" + " ").append(motor.getDescription());
area.setText(sb.toString());
panel.add(area, "grow, wrap");