#
# 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
+ BasicFrame.StageName.Sustainer = Sustainer
+ BasicFrame.WarningDialog.txt1 = The following problems were encountered while opening
+ BasicFrame.WarningDialog.txt2 = Some design features may not have been loaded correctly.
+ BasicFrame.WarningDialog.title = Warnings while opening file
! Labels used in buttons of dialog windows
button.ok = OK
button.cancel = Cancel
button.close = Close
-about.dlg.but.close = Close
-about.dlg.lbl.translation =
-about.dlg.lbl.transwebsite =
+ ! Common labels used in buttons of dialog windows
+ dlg.but.ok = OK
+ dlg.but.cancel = Cancel
+ dlg.but.close = Close
+
++
++! General file type names
++filetypes.pdf = PDF files
++
++
+ ! About Dialog
-! Print panel dialog
-printdlg.but.saveaspdf = Save as PDF
-printdlg.but.preview = Preview
-printdlg.but.settings = Settings
++AboutDialog.lbl.version = Version
++! The texts below provide additional credits for the translation maintainer
++! - In AboutDialog.lbl.translation replace "English" with the current language.
++! - AboutDialog.lbl.translator is the translator / group name (may be empty)
++! - AboutDialog.lbl.translatorWebsite is a URL to the translator / group (may be empty)
++! - AboutDialog.lbl.translatorIcon is the file name of an icon under pix/translators/ (may be empty)
++AboutDialog.lbl.translation = English translation by:
++AboutDialog.lbl.translator =
++AboutDialog.lbl.translatorWebsite =
++AboutDialog.lbl.translatorIcon =
++
++
++! Print dialog
++PrintDialog.title = Print or export
++PrintDialog.but.previewAndPrint = Preview & Print
++PrintDialog.checkbox.showByStage = Show by stage
++PrintDialog.lbl.selectElements = Select elements to include:
++printdlg.but.saveaspdf = Save as PDF
++printdlg.but.preview = Preview
++printdlg.but.settings = Settings
++PrintDialog.error.preview.title = Unable to open preview
++PrintDialog.error.preview.desc1 = Unable to open PDF preview.
++PrintDialog.error.preview.desc2 = Please use the "Save as PDF" option instead.
++
+
+ ! 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
+ bugreport.dlg.connectedInternet = <html>If connected to the Internet, you can simply click <em>Send bug report</em>.
+ bugreport.dlg.otherwise = Otherwise, send the text below to the address:
+ bugreport.lbl.Theinformation = The information above may be included in a public bug report. Make sure it does not contain any sensitive information you do not want to be made public.
+ bugreport.dlg.failedmsg1 = OpenRocket was unable to send the bug report:
+ bugreport.dlg.failedmsg2 = Please send the report manually to
+ bugreport.dlg.failedmsg3 = Error sending report
+ bugreport.reportDialog.txt = <html><b>You can report a bug in OpenRocket by filling in and submitting the form below.</b><br>You can also report bugs and include attachments on the project web site.
+ bugreport.reportDialog.txt2 = <html><b>Please include a short description about what you were doing when the exception occurred.</b>
+
+
+ ! 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
+ exdesigndlg.lbl.Selectexample = Select example designs to open:
+ exdesigndlg.lbl.Openexampledesign = Open example design
+ exdesigndlg.lbl.Exampledesignsnotfound = Example designs could not be found.
+ exdesigndlg.lbl.Examplesnotfound = Examples not found
+
+
+ ! 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
+ pref.dlg.PrefChoiseSelector1 = Always ask
+ pref.dlg.PrefChoiseSelector2 = Insert in middle
+ pref.dlg.PrefChoiseSelector3 = Add to end
+ pref.dlg.PrefBooleanSelector1 = Delete
+ pref.dlg.PrefBooleanSelector2 = Confirm
+ pref.dlg.Add = Add
+ pref.dlg.DescriptionArea.Adddirectories = Add directories, RASP motor files (*.eng), RockSim engine files (*.rse) or ZIP archives separated by a semicolon (;) to load external thrust curves. Changes will take effect the next time you start OpenRocket.
+
+
+ ! 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
+ simedtdlg.IntensityDesc.None = None
+ simedtdlg.IntensityDesc.Verylow = Very low
+ simedtdlg.IntensityDesc.Low = Low
+ simedtdlg.IntensityDesc.Medium = Medium
+ simedtdlg.IntensityDesc.High = High
+ simedtdlg.IntensityDesc.Veryhigh = Very high
+ simedtdlg.IntensityDesc.Extreme = Extreme
+
+
+
+ ! 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...
+ SimExpPan.Fileexists.desc1 = File \"
+ SimExpPan.Fileexists.desc2 = \" exists. Overwrite?
+ SimExpPan.Fileexists.title = File exists
+ SimExpPan.ExportingVar.desc1 = Exporting 1 variable out of
+ SimExpPan.ExportingVar.desc2 = Exporting
+ SimExpPan.ExportingVar.desc3 = variables out of
+ SimExpPan.Col.Variable = Variable
+ SimExpPan.Col.Unit = Unit
+
+ ! 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
+ simplotpanel.AUTO_NAME = Auto
+ simplotpanel.LEFT_NAME = Left
+ simplotpanel.RIGHT_NAME = Right
+ simplotpanel.CUSTOM = Custom
+
+ ! 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
+ ringcompcfg.EngineBlock.desc = <html>An <b>engine block</b> stops the motor from moving forwards in the motor mount tube.<br><br>In order to add a motor, create a <b>body tube</b> or <b>inner tube</b> and mark it as a motor mount in the <em>Motor</em> tab.
+ ringcompcfg.note.desc = Note: An inner tube will not affect the aerodynamics of the rocket even if it is located outside of the body tube.
+
+
+ ! 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
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc1 = Show all motors
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc2 = Show motors with diameter less than that of the motor mount
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc3 = Show motors with diameter equal to that of the motor mount
+ TCMotorSelPan.lbl.Motormountdia = Motor mount diameter:
+ TCMotorSelPan.lbl.Search = Search:
+ TCMotorSelPan.lbl.Selectthrustcurve = Select thrust curve:
+ TCMotorSelPan.lbl.Ejectionchargedelay = Ejection charge delay:
+ TCMotorSelPan.equalsIgnoreCase.None = None
+ TCMotorSelPan.lbl.NumberofsecondsorNone = (Number of seconds or \"None\")
+ TCMotorSelPan.lbl.Totalimpulse = Total impulse:
+ TCMotorSelPan.lbl.Avgthrust = Avg. thrust:
+ TCMotorSelPan.lbl.Maxthrust = Max. thrust:
+ TCMotorSelPan.lbl.Burntime = Burn time:
+ TCMotorSelPan.lbl.Launchmass = Launch mass:
+ TCMotorSelPan.lbl.Emptymass = Empty mass:
+ TCMotorSelPan.lbl.Datapoints = Data points:
+ TCMotorSelPan.lbl.Digest = Digest:
+ TCMotorSelPan.title.Thrustcurve = Thrust curve:
+ TCMotorSelPan.title.Thrust = Thrust
+ TCMotorSelPan.delayBox.None = None
+
+
+ ! 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.print = Print / Export PDF...
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
+
+ ! database
+ ! Translate here all material database
+ !
+
+ ! Material database
+ ! BULK_MATERIAL
+ Databases.materials.Acrylic = Acrylic
+ Databases.materials.Balsa = Balsa
+ Databases.materials.Birch = Birch
+ Databases.materials.Cardboard = Cardboard
+ Databases.materials.Carbonfiber = Carbon fiber
+ Databases.materials.Cork = Cork
+ Databases.materials.DepronXPS = Depron (XPS)
+ Databases.materials.Fiberglass = Fiberglass
+ Databases.materials.Kraftphenolic = Kraft phenolic
+ Databases.materials.Maple = Maple
+ Databases.materials.Paperoffice = Paper (office)
+ Databases.materials.Pine = Pine
+ Databases.materials.Plywoodbirch = Plywood (birch)
+ Databases.materials.PolycarbonateLexan = Polycarbonate (Lexan)
+ Databases.materials.Polystyrene = Polystyrene
+ Databases.materials.PVC = PVC
+ Databases.materials.Spruce = Spruce
+ Databases.materials.StyrofoamgenericEPS = Styrofoam (generic EPS)
+ Databases.materials.StyrofoamBluefoamXPS = Styrofoam \"Blue foam\" (XPS)
+ Databases.materials.Quantumtubing = Quantum tubing
+ !SURFACE_MATERIAL
+ Databases.materials.Ripstopnylon = Ripstop nylon
+ Databases.materials.Mylar = Mylar
+ Databases.materials.Polyethylenethin = Polyethylene (thin)
+ Databases.materials.Polyethyleneheavy = Polyethylene (heavy)
+ Databases.materials.Silk = Silk
+ Databases.materials.Paperoffice = Paper (office)
+ Databases.materials.Cellophane = Cellophane
-Databases.materials.Creape paper = Cr\u00eape paper
++Databases.materials.Crepepaper = Cr\u00eape paper
+ ! LINE_MATERIAL
+ Databases.materials.Threadheavy-duty = Thread (heavy-duty)
+ Databases.materials.Elasticcordround2mm = Elastic cord (round 2mm, 1/16 in)
+ Databases.materials.Elasticcordflat6mm = Elastic cord (flat 6mm, 1/4 in)
+ Databases.materials.Elasticcordflat12mm = Elastic cord (flat 12mm, 1/2 in)
+ Databases.materials.Elasticcordflat19mm = Elastic cord (flat 19mm, 3/4 in)
+ Databases.materials.Elasticcordflat25mm = Elastic cord (flat 25mm, 1 in)
+ Databases.materials.Braidednylon2mm = Braided nylon (2 mm, 1/16 in)
+ Databases.materials.Braidednylon3mm = Braided nylon (3 mm, 1/8 in)
+ Databases.materials.Tubularnylon11mm = Tubular nylon (11 mm, 7/16 in)
+ Databases.materials.Tubularnylon14mm = Tubular nylon (14 mm, 9/16 in)
+ Databases.materials.Tubularnylon25mm = Tubular nylon (25 mm, 1 in)
+
+ ! ExternalComponent
+ ExternalComponent.Rough = Rough
+ ExternalComponent.Unfinished = Unfinished
+ ExternalComponent.Regularpaint = Regular paint
+ ExternalComponent.Smoothpaint = Smooth paint
+ ExternalComponent.Polished = Polished
+
+ ! LineStyle
+ LineStyle.Solid = Solid
+ LineStyle.Dashed = Dashed
+ LineStyle.Dotted = Dotted
+ LineStyle.Dash-dotted = Dash-dotted
+ LineStyle.Defaultstyle = Default style
+
+ ! Shape
+ Shape.Conical = Conical
+ Shape.Conical.desc1 = A conical nose cone has a profile of a triangle.
+ Shape.Conical.desc2 = A conical transition has straight sides.
+ Shape.Ogive = Ogive
+ Shape.Ogive.desc1 = An ogive nose cone has a profile that is a segment of a circle. The shape parameter value 1 produces a <b>tangent ogive</b>, which has a smooth transition to the body tube, values less than 1 produce <b>secant ogives</b>.
+ Shape.Ogive.desc2 = An ogive transition has a profile that is a segment of a circle. The shape parameter value 1 produces a <b>tangent ogive</b>, which has a smooth transition to the body tube at the aft end, values less than 1 produce <b>secant ogives</b>.
+ Shape.Ellipsoid = Ellipsoid
+ Shape.Ellipsoid.desc1 = An ellipsoidal nose cone has a profile of a half-ellipse with major axes of lengths 2×<i>Length</i> and <i>Diameter</i>.
+ Shape.Ellipsoid.desc2 = An ellipsoidal transition has a profile of a half-ellipse with major axes of lengths 2×<i>Length</i> and <i>Diameter</i>. If the transition is not clipped, then the profile is extended at the center by the corresponding radius.
+ Shape.Powerseries = Power series
-Shape.Powerseries.descA1 = A power series nose cone has a profile of <i>Radius</i> × (<i>x</i> / <i>Length</i>)<sup><i>k</i></sup> where <i>k</i> is the shape parameter. For <i>k</i>=0.5 this is a <b>
-Shape.Powerseries.descA2 = -power</b> or <b>parabolic</b> nose cone, for <i>k</i>=0.75 a <b>
-Shape.Powerseries.descA3 = -power</b>, and for <i>k</i>=1 a <b>conical</b> nose cone.
-Shape.Powerseries.descB1 = A power series transition has a profile of <i>Radius</i> × (<i>x</i> / <i>Length</i>)<sup><i>k</i></sup> where <i>k</i> is the shape parameter. For <i>k</i>=0.5 the transition is <b>
-Shape.Powerseries.descB2 = -power</b> or <b>parabolic</b>, for <i>k</i>=0.75 a <b>
-Shape.Powerseries.descB3 = -power</b>, and for <i>k</i>=1 <b>conical</b>.
++Shape.Powerseries.desc1 = A power series nose cone has a profile of <i>Radius</i> × (<i>x</i> / <i>Length</i>)<sup><i>k</i></sup> where <i>k</i> is the shape parameter. For <i>k</i>=0.5 this is a <b>\u00BD-power</b> or <b>parabolic</b> nose cone, for <i>k</i>=0.75 a <b>\u00BE-power</b>, and for <i>k</i>=1 a <b>conical</b> nose cone.
++Shape.Powerseries.desc2 = A power series transition has a profile of <i>Radius</i> × (<i>x</i> / <i>Length</i>)<sup><i>k</i></sup> where <i>k</i> is the shape parameter. For <i>k</i>=0.5 the transition is <b>\u00BD-power</b> or <b>parabolic</b>, for <i>k</i>=0.75 a <b>\u00BE-power</b>, and for <i>k</i>=1 <b>conical</b>.
+ Shape.Parabolicseries = Parabolic series
+ Shape.Parabolicseries.desc1 = A parabolic series nose cone has a profile of a parabola. The shape parameter defines the segment of the parabola to utilize. The shape parameter 1.0 produces a <b>full parabola</b> which is tangent to the body tube, 0.75 produces a <b>3/4 parabola</b>, 0.5 procudes a <b>1/2 parabola</b> and 0 produces a <b>conical</b> nose cone.
+ Shape.Parabolicseries.desc2 = A parabolic series transition has a profile of a parabola. The shape parameter defines the segment of the parabola to utilize. The shape parameter 1.0 produces a <b>full parabola</b> which is tangent to the body tube at the aft end, 0.75 produces a <b>3/4 parabola</b>, 0.5 procudes a <b>1/2 parabola</b> and 0 produces a <b>conical</b> transition.
+ Shape.Haackseries = Haack series
+ Shape.Haackseries.desc1 = The Haack series nose cones are designed to minimize drag. The shape parameter 0 produces an <b>LD-Haack</b> or <b>Von Karman</b> nose cone, which minimizes drag for fixed length and diameter, while a value of 0.333 produces an <b>LV-Haack</b> nose cone, which minimizes drag for fixed length and volume.
+ Shape.Haackseries.desc2 = The Haack series <i>nose cones</i> are designed to minimize drag. These transition shapes are their equivalents, but do not necessarily produce optimal drag for transitions. The shape parameter 0 produces an <b>LD-Haack</b> or <b>Von Karman</b> shape, while a value of 0.333 produces an <b>LV-Haack</b> shape.
+
+
+ ! RocketComponent
+ RocketComponent.Position.TOP = Top of the parent component
+ RocketComponent.Position.MIDDLE = Middle of the parent component
+ RocketComponent.Position.BOTTOM = Bottom of the parent component
+ RocketComponent.Position.AFTER = After the parent component
+ RocketComponent.Position.ABSOLUTE = Tip of the nose cone
+
+ ! LaunchLug
+ LaunchLug.Launchlug = Launch lug
+ ! NoseCone
+ NoseCone.NoseCone = Nose cone
+ ! Transition
+ Transition.Transition = Transition
+ !Stage
+ Stage.Stage = Stage
+ ! BodyTube
+ BodyTube.BodyTube = Body tube
+ ! TubeCoupler
+ TubeCoupler.TubeCoupler = Tube coupler
+ !InnerTube
+ InnerTube.InnerTube = Inner Tube
+ ! TrapezoidFinSet
+ TrapezoidFinSet.TrapezoidFinSet = Trapezoidal fin set
+ ! FreeformFinSet
+ FreeformFinSet.FreeformFinSet = Freeform fin set
+ !MassComponent
+ MassComponent.MassComponent = Mass component
+ ! Parachute
+ Parachute.Parachute = Parachute
+ ! ShockCord
+ ShockCord.ShockCord = Shock cord
+ ! Bulkhead
+ Bulkhead.Bulkhead = Bulkhead
+
+ !Rocket
+ Rocket.motorCount.Nomotor = [No motors]
+ Rocket.compname.Rocket = Rocket
+
+ !MotorMount
+ MotorMount.IgnitionEvent.AUTOMATIC = Automatic (launch or ejection charge)
+ MotorMount.IgnitionEvent.LAUNCH = Launch
+ MotorMount.IgnitionEvent.EJECTION_CHARGE = First ejection charge of previous stage
+ MotorMount.IgnitionEvent.BURNOUT = First burnout of previous stage
+ MotorMount.IgnitionEvent.NEVER = Never
+
+ !ComponentIcons
+ ComponentIcons.Nosecone = Nose cone
+ ComponentIcons.Bodytube = Body tube
+ ComponentIcons.Transition = Transition
+ ComponentIcons.Trapezoidalfinset = Trapezoidal fin set
+ ComponentIcons.Ellipticalfinset = Elliptical fin set
+ ComponentIcons.Freeformfinset = Freeform fin set
+ ComponentIcons.Launchlug = Launch lug
+ ComponentIcons.Innertube = Inner tube
+ ComponentIcons.Tubecoupler = Tube coupler
+ ComponentIcons.Centeringring = Centering ring
+ ComponentIcons.Bulkhead = Bulk head
+ ComponentIcons.Engineblock = Engine block
+ ComponentIcons.Parachute = Parachute
+ ComponentIcons.Streamer = Streamer
+ ComponentIcons.Shockcord = Shock cord
+ ComponentIcons.Masscomponent = Mass component
+ ComponentIcons.disabled = (disabled)
+
+ ! StageAction
+ StageAction.Stage = Stage
+
+ ! RecoveryDevice
+ RecoveryDevice.DeployEvent.LAUNCH = Launch (plus NN seconds)
+ RecoveryDevice.DeployEvent.EJECTION = First ejection charge of this stage
+ RecoveryDevice.DeployEvent.APOGEE = Apogee
+ RecoveryDevice.DeployEvent.ALTITUDE = Specific altitude during descent
+ RecoveryDevice.DeployEvent.NEVER = Never
+
+ ! FlightEvent
+ FlightEvent.Type.LAUNCH = Launch
+ FlightEvent.Type.IGNITION = Motor ignition
+ FlightEvent.Type.LIFTOFF = Lift-off
+ FlightEvent.Type.LAUNCHROD = Launch rod clearance
+ FlightEvent.Type.BURNOUT = Motor burnout
+ FlightEvent.Type.EJECTION_CHARGE = Ejection charge
+ FlightEvent.Type.STAGE_SEPARATION = Stage separation
+ FlightEvent.Type.APOGEE = Apogee
+ FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT = Recovery device deployment
+ FlightEvent.Type.GROUND_HIT = Ground hit
+ FlightEvent.Type.SIMULATION_END = Simulation end
+ FlightEvent.Type.ALTITUDE = Altitude change
+
+ ! ThrustCurveMotorColumns
+ TCurveMotorCol.MANUFACTURER = Manufacturer
+ TCurveMotorCol.DESIGNATION = Designation
+ TCurveMotorCol.TYPE = Type
+ TCurveMotorCol.DIAMETER = Diameter
+ TCurveMotorCol.LENGTH = Length
+
+ ! RocketInfo
+ RocketInfo.lengthLine.Length = Length
+ RocketInfo.lengthLine.maxdiameter = , max. diameter
+ RocketInfo.massText1 = Mass with motors
+ RocketInfo.massText2 = Mass with no motors
+ RocketInfo.at = at M=
+ RocketInfo.cgText = CG:
+ RocketInfo.cpText = CP:
+ RocketInfo.stabText = Stability:
+ RocketInfo.Warning = Warning:
+ RocketInfo.Calculating = Calculating...
+ RocketInfo.Apogee = Apogee:
+ RocketInfo.Maxvelocity = Max. velocity:
+ RocketInfo.Maxacceleration = Max. acceleration:
+ RocketInfo.apogeeValue = N/A
+ RocketInfo.Mach = (Mach
+ RocketInfo.velocityValue = N/A
+ RocketInfo.accelerationValue = N/A
+
+ ! FinSet
+ FinSet.CrossSection.SQUARE = Square
+ FinSet.CrossSection.ROUNDED = Rounded
+ FinSet.CrossSection.AIRFOIL = Airfoil
+ FinSet.TabRelativePosition.FRONT = Root chord leading edge
+ FinSet.TabRelativePosition.CENTER = Root chord midpoint
+ FinSet.TabRelativePosition.END = Root chord trailing edge
+ ! FlightDataType
+ FlightDataType.TYPE_TIME = Time
+ FlightDataType.TYPE_ALTITUDE = Altitude
+ FlightDataType.TYPE_VELOCITY_Z = Vertical velocity
+ FlightDataType.TYPE_ACCELERATION_Z = Vertical acceleration
+ FlightDataType.TYPE_VELOCITY_TOTAL = Total velocity
+ FlightDataType.TYPE_ACCELERATION_TOTAL = Total acceleration
+ FlightDataType.TYPE_POSITION_X = Position upwind
+ FlightDataType.TYPE_POSITION_Y = Position parallel to wind
+ FlightDataType.TYPE_POSITION_XY = Lateral distance
+ FlightDataType.TYPE_POSITION_DIRECTION = Lateral direction
+ FlightDataType.TYPE_VELOCITY_XY = Lateral velocity
+ FlightDataType.TYPE_ACCELERATION_XY = Lateral acceleration
+ FlightDataType.TYPE_AOA = Angle of attack
+ FlightDataType.TYPE_ROLL_RATE = Roll rate
+ FlightDataType.TYPE_PITCH_RATE = Pitch rate
+ FlightDataType.TYPE_YAW_RATE = Yaw rate
+ FlightDataType.TYPE_MASS = Mass
+ FlightDataType.TYPE_LONGITUDINAL_INERTIA = Longitudinal moment of inertia
+ FlightDataType.TYPE_ROTATIONAL_INERTIA = Rotational moment of inertia
+ FlightDataType.TYPE_CP_LOCATION = CP location
+ FlightDataType.TYPE_CG_LOCATION = CG location
+ FlightDataType.TYPE_STABILITY = Stability margin calibers
+ FlightDataType.TYPE_MACH_NUMBER = Mach number
+ FlightDataType.TYPE_REYNOLDS_NUMBER = Reynolds number
+ FlightDataType.TYPE_THRUST_FORCE = Thrust
+ FlightDataType.TYPE_DRAG_FORCE = Drag force
+ FlightDataType.TYPE_DRAG_COEFF = Drag coefficient
+ FlightDataType.TYPE_AXIAL_DRAG_COEFF = Axial drag coefficient
+ FlightDataType.TYPE_FRICTION_DRAG_COEFF = Friction drag coefficient
+ FlightDataType.TYPE_PRESSURE_DRAG_COEFF = Pressure drag coefficient
+ FlightDataType.TYPE_BASE_DRAG_COEFF = Base drag coefficient
+ FlightDataType.TYPE_NORMAL_FORCE_COEFF = Normal force coefficient
+ FlightDataType.TYPE_PITCH_MOMENT_COEFF = Pitch moment coefficient
+ FlightDataType.TYPE_YAW_MOMENT_COEFF = Yaw moment coefficient
+ FlightDataType.TYPE_SIDE_FORCE_COEFF = Side force coefficient
+ FlightDataType.TYPE_ROLL_MOMENT_COEFF = Roll moment coefficient
+ FlightDataType.TYPE_ROLL_FORCING_COEFF = Roll forcing coefficient
+ FlightDataType.TYPE_ROLL_DAMPING_COEFF = Roll damping coefficient
+ FlightDataType.TYPE_PITCH_DAMPING_MOMENT_COEFF = Pitch damping coefficient
+ FlightDataType.TYPE_YAW_DAMPING_MOMENT_COEFF = Yaw damping coefficient
+ FlightDataType.TYPE_REFERENCE_LENGTH = Reference lenght
+ FlightDataType.TYPE_REFERENCE_AREA = Reference area
+ FlightDataType.TYPE_ORIENTATION_THETA = Vertical orientation (zenith)
+ FlightDataType.TYPE_ORIENTATION_PHI = Lateral orientation (azimuth)
+ FlightDataType.TYPE_WIND_VELOCITY = Wind velocity
+ FlightDataType.TYPE_AIR_TEMPERATURE = Air temperature
+ FlightDataType.TYPE_AIR_PRESSURE = Air pressure
+ FlightDataType.TYPE_SPEED_OF_SOUND = Speed of sound
+ FlightDataType.TYPE_TIME_STEP = Simulation time step
+ FlightDataType.TYPE_COMPUTATION_TIME = Computation time
+ ! PlotConfiguration
+ PlotConfiguration.Verticalmotion = Vertical motion vs. time
+ PlotConfiguration.Totalmotion = Total motion vs. time
+ PlotConfiguration.Flightside = Flight side profile
+ PlotConfiguration.Stability = Stability vs. time
+ PlotConfiguration.Dragcoef = Drag coefficients vs. Mach number
+ PlotConfiguration.Rollcharacteristics = Roll characteristics
+ PlotConfiguration.Angleofattack = Angle of attack and orientation vs. time
+ PlotConfiguration.Simulationtime = Simulation time step and computation time
+ ! Warning
+ Warning.LargeAOA.str1 = Large angle of attack encountered.
+ Warning.LargeAOA.str2 = Large angle of attack encountered (
+ Warning.DISCONTINUITY = Discontinuity in rocket body diameter.
+ Warning.THICK_FIN = Thick fins may not be modeled accurately.
+ Warning.JAGGED_EDGED_FIN = Jagged-edged fin predictions may be inaccurate.
+ Warning.LISTENERS_AFFECTED = Listeners modified the flight simulation
+ Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING = Recovery device opened while motor still burning.
+ Warning.FILE_INVALID_PARAMETER = Invalid parameter encountered, ignoring.
--- /dev/null
-Databases.materials.Creape paper = Krepppapier\r
+ ! Set to the name of the current translation file (used for debugging purposes)\r
+ debug.currentFile = messages_de.properties\r
+ \r
+ ! RocketActions\r
+ RocketActions.checkbox.Donotaskmeagain = Nicht wieder fragen\r
+ RocketActions.lbl.Youcanchangedefop = Die Standardaktion kann in den Einstellungen geändert werden.\r
+ RocketActions.showConfirmDialog.lbl1 = Simulationen löschen?\r
+ RocketActions.showConfirmDialog.lbl2 = <html><i>Diese Aktion kann nicht rückgängig gemacht werden.</i>\r
+ RocketActions.showConfirmDialog.title = Simulationen löschen\r
+ RocketActions.DelCompAct.Delete = Löschen\r
+ RocketActions.DelCompAct.ttip.Delete = Die ausgewählte Komponente löschen.\r
+ RocketActions.DelSimuAct.Delete = Löschen\r
+ RocketActions.DelSimuAct.ttip.Delete = Die ausgewählte Simulation löschen.\r
+ RocketActions.DelAct.Delete = Löschen\r
+ RocketActions.DelAct.ttip.Delete = Die ausgewählte Komponente oder Simulation löschen.\r
+ RocketActions.CutAction.Cut = Ausschneiden\r
+ RocketActions.CutAction.ttip.Cut = Diese Komponente oder Simulation ausschneiden und aus dem Design entfernen\r
+ RocketActions.CopyAct.Copy = Kopieren\r
+ RocketActions.CopyAct.ttip.Copy = Komponente (und Subkomponenten) in die Zwischenablage kopieren.\r
+ RocketActions.PasteAct.Paste = Einfügen\r
+ RocketActions.PasteAct.ttip.Paste = Fügt die Komponente oder Simulation aus der Zwischenablage in das Design ein.\r
+ RocketActions.EditAct.Edit = Bearbeiten\r
+ RocketActions.EditAct.ttip.Edit = Die ausgewählte Komponente bearbeiten.\r
+ RocketActions.NewStageAct.Newstage = Neue Stufe\r
+ RocketActions.NewStageAct.ttip.Newstage = Fügt eine neue Stufe in das Raketendesign ein.\r
+ RocketActions.ActBoosterstage = Booster-Stufe\r
+ RocketActions.MoveUpAct.Moveup = Nach oben verschieben\r
+ RocketActions.MoveUpAct.ttip.Moveup = Verschiebt diese Komponente nach oben.\r
+ RocketActions.MoveDownAct.Movedown = Nach unten verschieben\r
+ RocketActions.MoveDownAct.ttip.Movedown = Verschiebt diese Komponente nach unten.\r
+ \r
+ ! RocketPanel\r
+ RocketPanel.FigTypeAct.Sideview = Seitenansicht\r
+ RocketPanel.FigTypeAct.ttip.Sideview = Seitenansicht\r
+ RocketPanel.FigTypeAct.Backview = Rückansicht\r
+ RocketPanel.FigTypeAct.ttip.Backview = Vorderansicht\r
+ RocketPanel.lbl.Motorcfg = Motorkonfiguration\r
+ RocketPanel.lbl.infoMessage = <html>Zum Auswählen klicken Shift+Klick andere auswählen Doppelklick zum Bearbeiten Klicken+Ziehen zum Verschieben\r
+ \r
+ \r
+ ! BasicFrame\r
+ BasicFrame.SimpleFileFilter1 = Alle Raketendesigns (*.ork; *.rkt)\r
+ BasicFrame.SimpleFileFilter2 = OpenRocket Designs (*.ork)\r
+ BasicFrame.SimpleFileFilter3 = RockSim Designs (*.rkt)\r
+ BasicFrame.tab.Rocketdesign = Raketendesign\r
+ BasicFrame.tab.Flightsim = Flugsimulation\r
+ BasicFrame.title.Addnewcomp = Neue Komponente hinzufügen\r
+ BasicFrame.item.Openrocketdesign = Raketendesign öffnen\r
+ BasicFrame.item.Openexamplerocketdesign = Beispieldesign öffnen\r
+ BasicFrame.item.SavecurRocketdesign = Aktuelles Raketendesign speichern\r
+ BasicFrame.item.SavecurRocketdesnewfile = Aktuelles Raketendesign in eine neue Datei speichern\r
+ BasicFrame.item.Printpart = Komponentenliste und Leitwerkschablone drucken\r
+ BasicFrame.item.Closedesign = Aktuelles Raketendesign schließen\r
+ BasicFrame.item.Quitprogram = Programm beenden\r
+ BasicFrame.menu.Rocketedt = Rakete bearbeiten\r
+ BasicFrame.dlg.lbl1 = Design '\r
+ BasicFrame.dlg.lbl2 = ist nicht gespeichert.\r
+ BasicFrame.dlg.lbl3 = Möchten Sie es speichern?\r
+ BasicFrame.dlg.title = Design nicht gespeichert\r
+ BasicFrame.StageName.Sustainer = Sustainer\r
+ BasicFrame.WarningDialog.txt1 = Die folgenden Probleme würden beim Öffnen festgestellt\r
+ BasicFrame.WarningDialog.txt2 = Einige Designeigenschaften wurde eventuell nicht korrekt geladen.\r
+ BasicFrame.WarningDialog.title = Warnungen während des Öffnens der Datei\r
+ \r
+ ! Labels used in buttons of dialog windows\r
+ button.ok = OK\r
+ button.cancel = Abbrechen\r
+ button.close = Schließen\r
+ \r
+ ! Common labels used in buttons of dialog windows\r
+ dlg.but.ok = OK\r
+ dlg.but.cancel = Abbrechen\r
+ dlg.but.close = Schließen\r
+ \r
+ ! About Dialog\r
+ about.dlg.but.close = Schließen\r
+ about.dlg.lbl.translation = Ins Deutsche übersetzt von Stefan Lobas (ERIG e.V.)\r
+ about.dlg.lbl.transwebsite = http://www.er-ig.de/\r
+ \r
+ ! Bug Report dialog\r
+ bugreport.dlg.title = Fehlerbericht\r
+ bugreport.dlg.but.Sendbugreport = Fehlerbericht senden\r
+ bugreport.dlg.but.Sendbugreport.Ttip = Automatische einen Fehlerbericht an die OpenRocket-Entwickler senden.\r
+ bugreport.dlg.successmsg1 = Fehlerbericht erfolgreich gesendet.\r
+ bugreport.dlg.successmsg2 = Danke für die Hilfe, OpenRocket noch besser zu machen!\r
+ bugreport.dlg.successmsg3 = Fehlerbericht gesendet\r
+ bugreport.dlg.connectedInternet = <html>Wenn Sie mit dem Internet verbunden sind, können Sie einfach auf <em>Fehlerbericht senden</em> klicken.\r
+ bugreport.dlg.otherwise = Sonst senden Sie den den folgenden Text an diese Adresse:\r
+ bugreport.lbl.Theinformation = Die oben stehenden Informationen können in einem öffentlichen Fehlerbericht erscheinen. Bitte stellen Sie sicher, dass der Bericht keine sensiblen Informationen enthält, die nicht veröffentlicht werden sollen!\r
+ bugreport.dlg.failedmsg1 = OpenRocket konnte den Fehlerbericht nicht versenden:\r
+ bugreport.dlg.failedmsg2 = Bitte senden Sie den Bericht manuell an\r
+ bugreport.dlg.failedmsg3 = Fehler beim Versenden des Berichts\r
+ bugreport.reportDialog.txt = <html><b>Sie können eine Fehler in OpenRocket mitteilen, indem Sie das unten stehende Formular ausfüllen und abschicken.</b><br>Sie können Fehler mit angehängten Dateien auch auf der Projekt-Website mitteilen.\r
+ bugreport.reportDialog.txt2 = Bitte beschreiben Sie kurz, was Sie getan haben, als der Fehler auftrat.</b>\r
+ \r
+ \r
+ ! Debug log dialog\r
+ debuglogdlg.but.clear = Löschen\r
+ debuglogdlg.OpenRocketdebuglog = OpenRocket Fehler-Log\r
+ debuglogdlg.Displayloglines = Zeige Log-Zeilen:\r
+ debuglogdlg.Follow = Folgen\r
+ debuglogdlg.col.Time = Zeit\r
+ debuglogdlg.col.Level = Level\r
+ debuglogdlg.col.Location = Ort\r
+ debuglogdlg.col.Message = Nachricht\r
+ debuglogdlg.lbl.Loglinenbr = Log-Zeilennummer\r
+ debuglogdlg.lbl.Time = Zeit:\r
+ debuglogdlg.lbl.Level = Level:\r
+ \r
+ \r
+ ! Edit Motor configuration dialog\r
+ edtmotorconfdlg.but.removemotor = Motor entfernen\r
+ edtmotorconfdlg.but.Selectmotor = Motor auswählen\r
+ edtmotorconfdlg.but.Removeconfiguration = Konfiguration entfernen\r
+ edtmotorconfdlg.but.Newconfiguration = Neue Konfiguration\r
+ edtmotorconfdlg.lbl.Motormounts = <html><b>Motorhalterungen:</b>\r
+ edtmotorconfdlg.title.Editmotorconf = Motorkonfiguration bearbeiten\r
+ edtmotorconfdlg.selectcomp = <html>Auswählen, welche Komponenten Motorhalterungen sind:\r
+ edtmotorconfdlg.lbl.Motorconfig = <html><b>Motorkonfigurationen:</b>\r
+ edtmotorconfdlg.lbl.Configname = Name der Konfiguration:\r
+ edtmotorconfdlg.lbl.Leavenamedefault = Leer lassen für Standardwert.\r
+ \r
+ ! Example design dialog\r
+ exdesigndlg.but.open = Öffnen\r
+ exdesigndlg.lbl.Selectexample = Beispieldesigns zum Öffnen auswählen:\r
+ exdesigndlg.lbl.Openexampledesign = Beispieldesign öffnen\r
+ exdesigndlg.lbl.Exampledesignsnotfound = Beispieldesigns konnten nicht gefunden werden.\r
+ exdesigndlg.lbl.Examplesnotfound = Beispieldesign konnten nicht gefunden werden\r
+ \r
+ ! Print panel dialog\r
+ printdlg.but.saveaspdf = Als PDF speichern\r
+ printdlg.but.preview = Vorschau\r
+ printdlg.but.settings = Einstellungen\r
+ \r
+ ! Material edit panel\r
+ matedtpan.but.new = Neu\r
+ matedtpan.but.edit = Bearbeiten\r
+ matedtpan.but.delete = Löschen\r
+ matedtpan.but.revertall = Alle löschen\r
+ matedtpan.col.Material = Material\r
+ matedtpan.col.Type = Typ\r
+ matedtpan.col.Density = Dichte\r
+ matedtpan.col.but.ttip.New = Neues Material hinzufügen\r
+ matedtpan.title.Addcustmaterial = Benutzerdefiniertes Material hinzufügen\r
+ matedtpan.but.ttip.edit = Bestehendes Material bearbeiten\r
+ matedtpan.title.Editmaterial = Material bearbeiten\r
+ matedtpan.title2.Editmaterial = Die mitgelieferten Materialien können nicht verändert werden.\r
+ matedtpan.but.ttip.delete = Benutzerdefiniertes Material löschen\r
+ matedtpan.but.ttip.revertall = Alle benutzerdefinierten Materialien löschen\r
+ matedtpan.title.Deletealluser-defined = Alle benutzerdefinierten Materialien löschen?\r
+ matedtpan.title.Revertall = Alle löschen?\r
+ matedtpan.lbl.edtmaterials = <html><i>Das Bearbeiten der Materialien beeinflusst keine bereits existierenden Raketendesigns.</i>\r
+ \r
+ !MaterialModel\r
+ MaterialModel.title.Material = Material\r
+ MaterialModel.title.Defcustmat = Benutzerdefiniertes Material definieren\r
+ \r
+ \r
+ ! Preference dialog\r
+ pref.dlg.but.add = Hinzufügen\r
+ pref.dlg.but.reset = Zurücksetzen\r
+ pref.dlg.but.checknow = Jetzt überprüfen\r
+ pref.dlg.but.defaultmetric = Metrisches System\r
+ pref.dlg.but.defaultimperial = Imperialistisches System\r
+ pref.dlg.title.Preferences = Einstellungen\r
+ pref.dlg.tab.Units = Einheiten\r
+ pref.dlg.tab.Defaultunits = Standardeinheiten\r
+ pref.dlg.tab.Materials = Materialien\r
+ pref.dlg.tab.Custommaterials = Benutzerdefinierte Materialien\r
+ pref.dlg.tab.Options = Optionen\r
+ pref.dlg.tab.Miscellaneousoptions = Weiter Optionen\r
+ pref.dlg.lbl.Positiontoinsert = Position, um neue Komponenten einzufügen:\r
+ pref.dlg.lbl.Confirmdeletion = Löschen von Simulationen bestätigen\r
+ pref.dlg.lbl.User-definedthrust = Benutzerdefinierte Schubkurven:\r
+ pref.dlg.Allthrustcurvefiles = Alle Schubkurvendateien (*.eng; *.rrse; *.zzip; Verzeichnisse)\r
+ pref.dlg.RASPfiles = RASP Schubkurven (*.eng)\r
+ pref.dlg.RockSimfiles = RockSim Schubkurven(*.rse)\r
+ pref.dlg.ZIParchives = ZIP-Archiv (*.zip)\r
+ pref.dlg.checkbox.Checkupdates = Beim Starten auf neue Version prüfen\r
+ pref.dlg.ttip.Checkupdatesnow = Jetzt auf neue Version prüfen\r
+ pref.dlg.lbl.Selectprefunits = Wählen Sie Ihre bevorzugten Einheiten aus:\r
+ pref.dlg.lbl.Rocketdimensions = Raketendimensionen:\r
+ pref.dlg.lbl.Linedensity = Liniendichte:\r
+ pref.dlg.lbl.Motordimensions = Motordimensionen:\r
+ pref.dlg.lbl.Surfacedensity = Oberflächendichte:\r
+ pref.dlg.lbl.Distance = Entfernung:\r
+ pref.dlg.lbl.Bulkdensity = Bulk density::\r
+ pref.dlg.lbl.Velocity = Geschwindigkeit\r
+ pref.dlg.lbl.Surfaceroughness = Oberflächenrauhheit:\r
+ pref.dlg.lbl.Acceleration = Beschleunigung:\r
+ pref.dlg.lbl.Area = Fläche\r
+ pref.dlg.lbl.Mass = Masse:\r
+ pref.dlg.lbl.Angle = Winkel:\r
+ pref.dlg.lbl.Force = Kraft:\r
+ pref.dlg.lbl.Rollrate = Roll-Rate:\r
+ pref.dlg.lbl.Totalimpulse = Gesamtimpuls:\r
+ pref.dlg.lbl.Temperature = Temperatur:\r
+ pref.dlg.lbl.Momentofinertia = Trägheitsmoment:\r
+ pref.dlg.lbl.Pressure = Druck:\r
+ pref.dlg.lbl.Stability = Stabilität\r
+ pref.dlg.lbl.effect1 = Die Änderungen werden wirksam, wenn Sie das nächste Mal ein Fenster öffnen.\r
+ pref.dlg.lbl.Checkingupdates = Prüfe, ob Aktualisierungen verfügbar sind...\r
+ pref.dlg.lbl.msg1 = Ein Fehler trat bei der Kommunikation mit dem Server auf.\r
+ pref.dlg.lbl.msg2 = Es konnten keine Informationen über Programmaktualisierungen empfangen werden.\r
+ pref.dlg.lbl.msg3 = Sie benutzen die neueste Version von OpenRocket.\r
+ pref.dlg.lbl.msg4 = Keine Aktualisierungen verfügbar.\r
+ pref.dlg.PrefChoiseSelector1 = Immer fragen\r
+ pref.dlg.PrefChoiseSelector2 = in der Mitte einfügen\r
+ a = an das Ende anhängen\r
+ pref.dlg.PrefBooleanSelector1 = Löschen\r
+ pref.dlg.PrefBooleanSelector2 = Bestätigen\r
+ pref.dlg.Add = Hinzufügen\r
+ pref.dlg.DescriptionArea.Adddirectories = Um eigene Schubkurven zu laden, Verzeichnisse, RASP-Motordateien (*.eng), RockSim-Motordateien (*.rse) oder ZIP-Archive mit Semikolon getrennt eingeben. Änderungen werden beim nächsten Neustart von OpenRocket übernommen.\r
+ \r
+ \r
+ ! Simulation edit dialog\r
+ simedtdlg.but.runsimulation = Simulation starten\r
+ simedtdlg.but.resettodefault = Auf Standardeinstellungen zurücksetzen\r
+ simedtdlg.but.add = Hinzufügen\r
+ simedtdlg.but.remove = Entfernen\r
+ simedtdlg.title.Editsim = Simulation bearbeiten\r
+ simedtdlg.lbl.Simname = Name der Simulation:\r
+ simedtdlg.tab.Launchcond = Startbedingungen\r
+ simedtdlg.tab.Simopt = Simulationsoptionen\r
+ simedtdlg.tab.Plotdata = Daten plotten\r
+ simedtdlg.tab.Exportdata = Daten exportieren\r
+ simedtdlg.lbl.Motorcfg = Motorkonfiguration:\r
+ simedtdlg.lbl.ttip.Motorcfg = Motorkonfiguration auswählen\r
+ simedtdlg.combo.ttip.motorconf = Die Motorkonfiguration auswählen.\r
+ simedtdlg.lbl.Wind = Wind\r
+ simedtdlg.lbl.Averwindspeed = Durchschnittliche Windgeschwindigkeit:\r
+ simedtdlg.lbl.ttip.Averwindspeed = Die durchschnittliche Windgeschwindigkeit relativ zum Boden.\r
+ simedtdlg.lbl.Stddeviation = Standardabweichung\r
+ simedtdlg.lbl.ttip.Stddeviation = <html>Die Standardabweichung der Windgeschwindigkeit. <br>Die Windgeschwindigkeit liegt im Durchschnitt zu 95% der Zeit in der doppelten Standardabweichung.\r
+ simedtdlg.lbl.Turbulenceintensity = Intensität der Turbulenz:\r
+ simedtdlg.lbl.ttip.Turbulenceintensity1 = <html>Die Intensität der Turbulenz ist die Standardabweichung geteilt durch durch die durchschnittliche Windgeschwindigkeit.<br>\r
+ simedtdlg.lbl.ttip.Turbulenceintensity2 = Typischer Wertebereich von\r
+ simedtdlg.lbl.ttip.Turbulenceintensity3 = bis\r
+ simedtdlg.border.Atmoscond = Atmosphärische Bedingungen\r
+ simedtdlg.checkbox.InterStdAtmosphere = Internationale Standardatmosphäre benutzen\r
+ simedtdlg.checkbox.ttip.InterStdAtmosphere1 = <html>Auswählen, um das Modell der Internationalen Standardatmosphäre zu verwenden.<br>In diesem Modell gilt eine Temperatur von\r
+ simedtdlg.checkbox.ttip.InterStdAtmosphere2 = und ein Luftdruck von\r
+ simedtdlg.checkbox.ttip.InterStdAtmosphere3 = auf Meeresniveau.\r
+ simedtdlg.lbl.Temperature = Temperatur:\r
+ simedtdlg.lbl.ttip.Temperature = Die Temperatur am Startplatz.\r
+ simedtdlg.lbl.Pressure = Luftdruck:\r
+ simedtdlg.lbl.ttip.Pressure = Der Luftdruck am Startplatz.\r
+ simedtdlg.lbl.Launchsite = Startplatz\r
+ simedtdlg.lbl.Latitude = Breitengrad:\r
+ simedtdlg.lbl.ttip.Latitude = <html>Der Breitengrad des Startplatzes beeinflusst die wirksame Gravitationskraft.<br>Positive Werte liegen auf der Nordhalbkugel, negative Werte auf der Südhalbkugel.\r
+ simedtdlg.lbl.Altitude = Höhe:\r
+ simedtdlg.lbl.ttip.Altitude = <html>Die Höhe des Startplatzes über Meeresniveau.<br>Die Höhe des Startplatzes beeinflusst die Position der Rakete im atmosphärischen Modell.\r
+ simedtdlg.border.Launchrod = Startrampe\r
+ simedtdlg.lbl.Length = Länge:\r
+ simedtdlg.lbl.ttip.Length = Die Länge der Startrampe\r
+ simedtdlg.lbl.Angle = Winkel:\r
+ simedtdlg.lbl.ttip.Angle = Der Winkel der Startrampe aus der Vertikalen.\r
+ simedtdlg.lbl.Direction = Richtung:\r
+ simedtdlg.lbl.ttip.Direction1 = <html>Richtung der Startrampe relativ zur Windrichtung<br>\r
+ simedtdlg.lbl.ttip.Direction2 = = gegen den Wind.\r
+ simedtdlg.lbl.ttip.Direction3 = = mit dem Wind\r
+ simedtdlg.border.Simopt = Simulationsoptionen\r
+ simedtdlg.lbl.Calcmethod = Berechnungsmethode\r
+ simedtdlg.lbl.ttip.Calcmethod = <html>Die erweiterte Methode nach Barrowman berechnet die aerodynamischen Kräfte<br>nach den Gleichungen von Barrowman, die um weitere Faktoren erweitert wurden.\r
+ simedtdlg.lbl.ExtBarrowman = Barrowman (erweitert)\r
+ simedtdlg.lbl.Simmethod = Simulationsmethode:\r
+ simedtdlg.lbl.ttip.Simmethod1 = <html>Der Sechs-Freiheitsgradsimulator erlaubt der Rakete völlige Bewegungsfreiheit während des Fluges.<br>\r
+ simedtdlg.lbl.ttip.Simmethod2 = Das Integrieren wird nach dem numerischen Runge-Kutta-Verfahren 4. Ordnung durchgeführt.\r
+ simedtdlg.lbl.Timestep = Zeitschritt:\r
+ simedtdlg.lbl.ttip.Timestep1 = <html>Die Zeit zwischen den Simulationsschritten.<br>Kleinere Schritte ergeben genauere Ergebnisse, die Simulationen dauern aber länger.<br>\r
+ simedtdlg.lbl.ttip.Timestep2 = Die Berechnung der Simulation mit dem Verfahren 4. Ordnung liefert gute Ergebnisse mit Zeitschritten von\r
+ simedtdlg.but.ttip.resettodefault = Zeitschritte zurücksetzen auf den Standardwert (\r
+ simedtdlg.border.Simlist = Simulationsempfänger\r
+ simedtdlg.txt.longA1 = <html><i>Simulationsempfänger</i> sind ein fortgeschrittenes Feature, dass es benutzerdefinierten Programmen erlaubt, die Simulationsdaten zu empfangen und mit der Simulation zu interagieren. \r
+ simedtdlg.txt.longA2 = Mehr Information zum Schreiben von Simualtionsempfängern sind in der OpenRocket technical documentation zu finden.\r
+ simedtdlg.lbl.Curlist = Aktuelle Simulationsempfänger:\r
+ simedtdlg.lbl.Addsimlist = Simulationsempfänger hinzufügen\r
+ simedtdlg.lbl.Noflightdata = Keine Flugdaten verfügbar.\r
+ simedtdlg.lbl.runsimfirst = Bitte erst die Simulation ausführen.\r
+ simedtdlg.chart.Simflight = Simulierter Flug\r
+ simedtdlg.dlg.Simres = Ergebnisse der Simulation\r
+ simedtdlg.IntensityDesc.None = Keine\r
+ simedtdlg.IntensityDesc.Verylow = Sehr niedrig\r
+ simedtdlg.IntensityDesc.Low = Niedrig\r
+ simedtdlg.IntensityDesc.Medium = Mittel\r
+ simedtdlg.IntensityDesc.High = Hoch\r
+ simedtdlg.IntensityDesc.Veryhigh = Sehr hoch\r
+ simedtdlg.IntensityDesc.Extreme = Extrem\r
+ \r
+ \r
+ \r
+ ! Simulation Panel\r
+ simpanel.but.newsimulation = Neue Simulation\r
+ simpanel.but.editsimulation = Simulation bearbeiten\r
+ simpanel.but.runsimulations = Simulation ausführen\r
+ simpanel.but.deletesimulations = Simulation löschen\r
+ simpanel.but.plotexport = Plotten / exportieren\r
+ simpanel.but.ttip.newsimulation = Neue Simulation hinzufügen\r
+ simpanel.but.ttip.editsim = Ausgewählte Simulation bearbeiten\r
+ simpanel.but.ttip.runsimu = Neuberechnen der ausgewählten Simulationen\r
+ simpanel.but.ttip.deletesim = Ausgewählte Simulationen löschen\r
+ simpanel.checkbox.donotask = Nicht wieder fragen\r
+ simpanel.lbl.defpref = Die Standardaktion kann in den Einstellungen geändert werden.\r
+ simpanel.dlg.lbl.DeleteSim1 = Die ausgewählten Simulationen löschen?\r
+ simpanel.dlg.lbl.DeleteSim2 = <html><i>Diese Aktion kann nicht rückgängig gemacht werden.</i>\r
+ simpanel.dlg.lbl.DeleteSim3 = Simulationen löschen\r
+ simpanel.col.Name = Name der Simulation:\r
+ simpanel.col.Motors = Motoren\r
+ simpanel.col.Apogee = Apogäum\r
+ simpanel.col.Maxvelocity = max. Geschwindigkeit\r
+ simpanel.col.Maxacceleration = max. Beschleunigung\r
+ simpanel.col.Timetoapogee = Zeit bis zum Apogäum\r
+ simpanel.col.Flighttime = Flugzeit\r
+ simpanel.col.Groundhitvelocity = Landegeschwindigkeit\r
+ \r
+ ! SimulationRunDialog\r
+ SimuRunDlg.title.RunSim = Simuliere...\r
+ SimuRunDlg.lbl.Running = Arbeite...\r
+ SimuRunDlg.lbl.Simutime = Simulationsdauer:\r
+ SimuRunDlg.lbl.Altitude = Höhe:\r
+ SimuRunDlg.lbl.Velocity = Geschwindigkeit:\r
+ SimuRunDlg.msg.Unabletosim = Simulieren nicht möglich:\r
+ SimuRunDlg.msg.errorOccurred = Während der Simulation trat ein Fehler auf:\r
+ SimuRunDlg.msg.AnException1 = Während der Simulation trat eine Ausnahme auf:\r
+ SimuRunDlg.msg.AnException2 = Bitte berichten Sie diesen Fehler mit den unten stehenden Details.\r
+ SimuRunDlg.msg.AssertionError1 = Während der Simulation trat ein Berechnungsfehler auf:\r
+ SimuRunDlg.msg.AssertionError2 = Bitte berichten Sie diesen Fehler mit den unten stehenden Details.\r
+ SimuRunDlg.msg.unknownerror1 = Während der Simulation trat ein unbekannter Fehler auf:\r
+ SimuRunDlg.msg.unknownerror2 = Das Programm könnte instabil sein, speichern Sie Ihr Design und starten Sie OpenRocket neu!\r
+ \r
+ \r
+ \r
+ ! SimulationExportPanel\r
+ SimExpPan.desc = Komma getrennte Werte (*.csv)\r
+ SimExpPan.border.Vartoexport = zu exportierende Variablen\r
+ SimExpPan.but.Selectall = Alle auswählen\r
+ SimExpPan.but.Selectnone = Keine auswählen\r
+ SimExpPan.border.Fieldsep = Feldtrennung\r
+ SimExpPan.lbl.Fieldsepstr = Trennzeichen\r
+ SimExpPan.lbl.longA1 = <html>Das Trennzeichen wird benutzt, um die Felder in der exportierten Datei voneinander zu trennen.<br>\r
+ SimExpPan.lbl.longA2 = Für eine CSV-Datei (Comma Separated Values) ein ',' benutzen.\r
+ SimExpPan.checkbox.Includesimudesc = Simulationsbeschreibung einfügen\r
+ SimExpPan.checkbox.ttip.Includesimudesc = Fügt einen Kommentar mit einer Simulationsbeschreibung am Anfang der Datei ein.\r
+ SimExpPan.border.Comments = Kommentare\r
+ SimExpPan.checkbox.Includefielddesc = Feldbeschreibungen einfügen\r
+ SimExpPan.checkbox.ttip.Includefielddesc = Fügt eine Kommentarzeile mit der Beschreibung der exportierten Variablen ein.\r
+ SimExpPan.checkbox.Incflightevents = Flugereignisse einfügen\r
+ SimExpPan.checkbox.ttip.Incflightevents = Fügt eine Kommentarzeile für jedes Flugereignis ein.\r
+ SimExpPan.lbl.Commentchar = Kommentarzeichen:\r
+ SimExpPan.lbl.ttip.Commentchar = Zeichen, das einen Kommentar in der exportierten Datei kennzeichnet.\r
+ SimExpPan.but.Exporttofile = In Datei exportieren...\r
+ SimExpPan.Fileexists.desc1 = File \"",Datei \«"\r
+ SimExpPan.Fileexists.desc2 = \" existiert bereits. Überschreiben?"\r
+ SimExpPan.Fileexists.title = Datei existiert bereits\r
+ SimExpPan.ExportingVar.desc1 = Exportiere Variable 1 aus\r
+ SimExpPan.ExportingVar.desc2 = Exportiere\r
+ SimExpPan.ExportingVar.desc3 = Variablen aus\r
+ SimExpPan.Col.Variable = Variable\r
+ SimExpPan.Col.Unit = Einheit\r
+ \r
+ ! MotorPlot\r
+ MotorPlot.title.Motorplot = Motorkurve\r
+ MotorPlot.but.Select = Auswahl\r
+ MotorPlot.Chart.Motorthrustcurve = Motorschubkurve\r
+ MotorPlot.Chart.Time = Zeit / s\r
+ MotorPlot.Chart.Thrust = Schub / N\r
+ MotorPlot.txt.Designation = Bezeichnung:\r
+ MotorPlot.txt.Manufacturer = Hersteller\r
+ MotorPlot.txt.Type = Typ:\r
+ MotorPlot.txt.Delays = Verzögerungen:\r
+ MotorPlot.txt.Comment = Kommentare:\n\r
+ \r
+ \r
+ \r
+ ! Simulation plot panel\r
+ simplotpanel.lbl.Presetplotconf = Plotparameter setzen\r
+ simplotpanel.lbl.Xaxistype = X-Achse:\r
+ simplotpanel.lbl.Unit = Einheit:\r
+ simplotpanel.lbl.Yaxistypes = Y-Achse:\r
+ simplotpanel.lbl.Flightevents = Flugereignisse:\r
+ simplotpanel.but.All = Alle auswählen\r
+ simplotpanel.but.None = Keine\r
+ simplotpanel.but.NewYaxisplottype = Neuer Y-Achsenplot-Typ\r
+ simplotpanel.but.Plotflight = Flug plotten\r
+ simplotpanel.lbl.Axis = Achsen:\r
+ simplotpanel.but.ttip.Removethisplot = Diesen Plot löschen\r
+ simplotpanel.Desc = Die Daten werden in zeitlicher Reihenfolge geplottet, auch wenn der X-Achsen-Typ nicht Zeit ist.\r
+ simplotpanel.OptionPane.lbl1 = Es sind maximal 15 Plots erlaubt.\r
+ simplotpanel.OptionPane.lbl2 = Plot konnte nicht hinzugefügt werden\r
+ simplotpanel.AUTO_NAME = Auto\r
+ simplotpanel.LEFT_NAME = Links\r
+ simplotpanel.RIGHT_NAME = Rechts\r
+ simplotpanel.CUSTOM = Benutzerdefiniert\r
+ \r
+ ! Component add buttons\r
+ compaddbuttons.Bodycompandfinsets = Körperteile und Leitwerke\r
+ compaddbuttons.Nosecone = Spitze\r
+ compaddbuttons.Bodytube = Körperrohr\r
+ compaddbuttons.Transition = Übergang\r
+ compaddbuttons.Trapezoidal = Trapeziod\r
+ compaddbuttons.Elliptical = Elliptisch\r
+ compaddbuttons.Freeform = Freiform\r
+ compaddbuttons.Launchlug = Leit-\nröhrchen\r
+ compaddbuttons.Innercomponent = Innenteile\r
+ compaddbuttons.Innertube = Innenrohr\r
+ compaddbuttons.Coupler = Koppler\r
+ compaddbuttons.Centeringring = Zentrier-\nring\r
+ compaddbuttons.Bulkhead = Schott\r
+ compaddbuttons.Engineblock = Motor-\nblock\r
+ compaddbuttons.Massobjects = Massenobjekte\r
+ compaddbuttons.Parachute = Fallschirm\r
+ compaddbuttons.Streamer = Strömer\r
+ compaddbuttons.Shockcord = Gummiseil\r
+ compaddbuttons.Masscomponent = Massen-\nobjekt\r
+ compaddbuttons.Donotaskmeagain = Nicht wieder fragen\r
+ compaddbuttons.Selectcomppos = Komponentenposition auswählen\r
+ compaddbuttons.lbl.Youcanchange = Die Standardaktion kann in den Einstellungen geändert werden.\r
+ compaddbuttons.lbl.insertcomp = Die Komponente nach der aktuellen Komponente oder als letzte Komponente einfügen?\r
+ compaddbuttons.askPosition.Inserthere = Hier einfügen\r
+ compaddbuttons.askPosition.Addtotheend = Zum Ende hinzufügen\r
+ compaddbuttons.askPosition.Cancel = Abbrechen\r
+ \r
+ ! Component Analysis Dialog\r
+ componentanalysisdlg.componentanalysis = Component analysis\r
+ componentanalysisdlg.lbl.winddir = Windrichtung\r
+ componentanalysisdlg.TitledBorder.warnings = Warnungen:\r
+ componentanalysisdlg.ToggleBut.worst = Worst\r
+ componentanalysisdlg.lbl.angleofattack = Angriffswinkel:\r
+ componentanalysisdlg.lbl.machnumber = Machzahl:\r
+ componentanalysisdlg.lbl.rollrate = Rollrate:\r
+ componentanalysisdlg.lbl.activestages = Aktive Stufen:\r
+ componentanalysisdlg.lbl.motorconf = Motorkonfiguration:\r
+ componentanalysisdlg.TabStability.Col = Komponente\r
+ componentanalysisdlg.TabStability = Stabilität\r
+ componentanalysisdlg.TabStability.ttip = Stabilitätsinformationen\r
+ componentanalysisdlg.dragTableModel.Col.Component = Komponente\r
+ componentanalysisdlg.dragTableModel.Col.Pressure = <html>Druck C<sub>D</sub>\r
+ componentanalysisdlg.dragTableModel.Col.Base = <html>Base C<sub>D</sub>\r
+ componentanalysisdlg.dragTableModel.Col.friction = <html>Reibung C<sub>D</sub>\r
+ componentanalysisdlg.dragTableModel.Col.total = <html>Gesamt C<sub>D</sub>\r
+ componentanalysisdlg.dragTabchar = Drag characteristics\r
+ componentanalysisdlg.dragTabchar.ttip = Drag characteristics\r
+ componentanalysisdlg.rollTableModel.Col.component = Komponente\r
+ componentanalysisdlg.rollTableModel.Col.rollforc = Roll forcing coefficient\r
+ componentanalysisdlg.rollTableModel.Col.rolldamp = Roll damping coefficient\r
+ componentanalysisdlg.rollTableModel.Col.total = <html>Gesamt C<sub>l</sub>\r
+ componentanalysisdlg.rollTableModel = Rolldynamik\r
+ componentanalysisdlg.rollTableModel.ttip = Rolldynamik\r
+ componentanalysisdlg.println.closingmethod = Closing method called:\r
+ componentanalysisdlg.println.settingnam = SETTING NAN VALUES\r
+ componentanalysisdlg.lbl.reflenght = Referenzlänge:\r
+ componentanalysisdlg.lbl.refarea = Referenzfläche:\r
+ !componentanalysisdlg.But.close =Close\r
+ \r
+ ! Custom Material dialog\r
+ custmatdlg.title.Custommaterial = Benutzerdefiniertes Material\r
+ custmatdlg.lbl.Materialname = Name des Materials:\r
+ custmatdlg.lbl.Materialtype = Materialtyp\r
+ custmatdlg.lbl.Materialdensity = Materialdichte:\r
+ custmatdlg.checkbox.Addmaterial = Material zur Datenbank hinzufügen\r
+ \r
+ \r
+ ! Ring Component Config\r
+ ringcompcfg.OuterRadius = Äußerer Radius\r
+ ringcompcfg.Automatic = Automatisch\r
+ ringcompcfg.InnerRadius = Innerer Radius\r
+ ringcompcfg.Thickness = Wandstärke\r
+ ringcompcfg.Length = Länge\r
+ ringcompcfg.Positionrelativeto = Relative Position zu:\r
+ ringcompcfg.plus = plus\r
+ ringcompcfg.PositionValue = Positionswert\r
+ ringcompcfg.Radialdistance = Radialer Abstand:\r
+ ringcompcfg.Distancefrom = Abstand von der Raketenmittellinie\r
+ ringcompcfg.Radialdirection = Radiale Richtung\r
+ ringcompcfg.radialdirectionfrom = Die radiale Richtung von der Raketenmittellinie\r
+ ringcompcfg.but.Reset = Zurücksetzen\r
+ ringcompcfg.but.Resetcomponant = Komponente auf die Raketenmittellinie zurücksetzen\r
+ ringcompcfg.EngineBlock.desc = <html>Eine <b>Motorhalterung</b> verhindert, dass der Motor sich im Rohr nach vorne bewegt.<br><br>Um einen Motor hinzuzufügen, ein <b>Körperrohr</b> oder ein <b>Innenrohr</b> hinzufügen und im Reiter <em>Motor</em> als Motorhalterung markieren.\r
+ ringcompcfg.note.desc = Hinweis: Innenrohre beeinflussen die Aerodynamik der Rakete nicht, auch wenn sie außerhalb des Körperohres liegen.\r
+ \r
+ \r
+ ! Body Tube Config\r
+ BodyTubecfg.lbl.Bodytubelength = Länge des Körperrohres:\r
+ BodyTubecfg.lbl.Outerdiameter = Außendurchmesser:\r
+ BodyTubecfg.lbl.Innerdiameter = Innendurchmesser:\r
+ BodyTubecfg.lbl.Wallthickness = Wandstärke:\r
+ BodyTubecfg.tab.General = Allgemein\r
+ BodyTubecfg.tab.Generalproperties = Allgemeine Eigenschaften\r
+ BodyTubecfg.tab.Motor = Motor\r
+ BodyTubecfg.tab.Motormountconf = Motorkonfiguration\r
+ BodyTubecfg.checkbox.Automatic = Automatisch\r
+ BodyTubecfg.checkbox.Filled = Gefüllt\r
+ \r
+ ! FinSetConfig\r
+ FinSetConfig.tab.Fintabs = Leitwerke\r
+ FinSetConfig.tab.Through-the-wall = Durchsteckbare Leitwerke\r
+ FinSetConfig.but.Converttofreeform = In Freiform konvertieren\r
+ FinSetConfig.but.Converttofreeform.ttip = Konvertiert diese Leitwerke in eine Freiform\r
+ FinSetConfig.Convertfinset = Leitwerke konvertieren\r
+ FinSetConfig.but.Splitfins = Geteilte Leitwerke\r
+ FinSetConfig.but.Splitfins.ttip = Teilt den Leitwerkssatz in getrennte Leitwerke\r
+ FinSetConfig.lbl.Through-the-wall = Durchsteckbare Leitwerke:\r
+ FinSetConfig.lbl.Tablength = Länge:\r
+ FinSetConfig.ttip.Tablength = Länge des Leitwerks.\r
+ FinSetConfig.lbl.Tabheight = Höhe:\r
+ FinSetConfig.ttip.Tabheight = Spannweite des Leitwerks.\r
+ FinSetConfig.lbl.Tabposition = Position:\r
+ FinSetConfig.ttip.Tabposition = Position des Leitwerks.\r
+ FinSetConfig.lbl.relativeto = relativ zu\r
+ \r
+ ! MotorDatabaseLoadingDialog\r
+ MotorDbLoadDlg.title = Lade Motoren\r
+ MotorDbLoadDlg.Loadingmotors = Lade Motoren...\r
+ \r
+ ! RocketConfig\r
+ RocketCfg.lbl.Designname = Name der Rakete:\r
+ RocketCfg.lbl.Designer = Ersteller:\r
+ RocketCfg.lbl.Comments = Kommentare:\r
+ RocketCfg.lbl.Revisionhistory = Versionsgeschichte:\r
+ RocketCfg.lbl.Material = Material:\r
+ \r
+ ! ShockCordConfig\r
+ ShockCordCfg.lbl.Shockcordlength = Gummiseillänge\r
+ \r
+ ! RocketComponentConfig\r
+ RocketCompCfg.lbl.Componentname = Komponentenname:\r
+ RocketCompCfg.ttip.Thecomponentname = Name der Komponente.\r
+ RocketCompCfg.tab.Override = Werte überschreiben\r
+ RocketCompCfg.tab.MassandCGoverride = Massen- und Schwerpunktsoptionen\r
+ RocketCompCfg.tab.Figure = Form\r
+ RocketCompCfg.tab.Figstyleopt = Formoptionen\r
+ RocketCompCfg.tab.Comment = Kommentar\r
+ RocketCompCfg.tab.Specifyacomment = Kommentar zu dieser Komponente\r
+ RocketCompCfg.lbl.Mass = Masse:\r
+ RocketCompCfg.lbl.Componentmass = Masse der Komponente:\r
+ RocketCompCfg.lbl.overriddento = (überschrieben auf\r
+ RocketCompCfg.lbl.overriddenby = (überschrieben durch\r
+ RocketCompCfg.lbl.Componentmaterial = Material:\r
+ RocketCompCfg.lbl.Componentfinish = Oberfläche:\r
+ RocketCompCfg.lbl.ttip.componentmaterialaffects = Das Material beeinflusst die Masse der Komponente.\r
+ RocketCompCfg.combo.ttip.componentmaterialaffects = Das Material beeinflusst die Masse der Komponente.\r
+ RocketCompCfg.lbl.longA1 = <html>Die Oberfläche beeinflusst den aerodynamischen Widerstand der Komponente.<br>\r
+ RocketCompCfg.lbl.longA2 = Der angegebene Wert ist die durchschnittliche Rautiefe der Oberfläche.\r
+ RocketCompCfg.but.Setforall = Für alle setzen\r
+ RocketCompCfg.but.ttip.Setforall = Diese Oberflächen für alle Komponenten der Rakete setzen.\r
+ RocketCompCfg.lbl.Overridemassorcenter = Überschreiben von Masse oder Schwerpunkts von \r
+ RocketCompCfg.checkbox.Overridemass = Masse überschreiben:\r
+ RocketCompCfg.checkbox.Overridecenterofgrav = Schwerpunkt überschreiben:\r
+ RocketCompCfg.checkbox.OverridemassandCG = Masse und Schwerpunkt für alle Unterkomponenten überschreiben\r
+ RocketCompCfg.lbl.longB1 = <html>Die überschriebene Masse enthält keine Motoren.<br>\r
+ RocketCompCfg.lbl.longB2 = Die Messung des Schwerpunktes beginnt am Ende von\r
+ RocketCompCfg.lbl.Commentsonthe = Kommentare zu\r
+ RocketCompCfg.lbl.Figurestyle = Form:\r
+ RocketCompCfg.lbl.Componentcolor = Farbe:\r
+ RocketCompCfg.lbl.Choosecolor = Farbe auswählen\r
+ RocketCompCfg.checkbox.Usedefaultcolor = Standardfarbe verwenden\r
+ RocketCompCfg.lbl.Complinestyle = Linienstil:\r
+ RocketCompCfg.but.Saveasdefstyle = Als Standardstil speichern\r
+ RocketCompCfg.lbl.Diameter = Durchmesser:\r
+ RocketCompCfg.lbl.Length = Länge:\r
+ RocketCompCfg.lbl.Thickness = Wandstärke:\r
+ RocketCompCfg.checkbox.Endcapped = Verschlossenes Ende\r
+ RocketCompCfg.ttip.Endcapped = Gibt an, ob das Ende der Schulter geschlossen ist.\r
+ RocketCompCfg.title.Noseconeshoulder = Spitzenschulter\r
+ RocketCompCfg.title.Aftshoulder = Schulter hinten\r
+ RocketCompCfg.border.Foreshoulder = Schulter vorn\r
+ !RocketCompCfg.lbl.Length = Length:\r
+ \r
+ ! BulkheadConfig\r
+ BulkheadCfg.tab.Radius = Radius:\r
+ BulkheadCfg.tab.Thickness = Wandstärke:\r
+ BulkheadCfg.tab.General = Allgemein\r
+ BulkheadCfg.tab.Generalproperties = Allgemeine Eigenschaften\r
+ \r
+ !CenteringRingConfig\r
+ CenteringRingCfg.tab.Outerdiam = Außendurchmesser:\r
+ CenteringRingCfg.tab.Innerdiam = Innendurchmesser:\r
+ CenteringRingCfg.tab.Thickness = Wandstärke:\r
+ CenteringRingCfg.tab.General = Allgemein\r
+ CenteringRingCfg.tab.Generalproperties = Allgemeine Eigenschaften\r
+ \r
+ !ComponentConfigDialog\r
+ ComponentCfgDlg.configuration = Konfiguration\r
+ ComponentCfgDlg.Modify = Verändern\r
+ \r
+ !EllipticalFinSetConfig\r
+ EllipticalFinSetCfg.Nbroffins = Anzahl der Leitwerke\r
+ EllipticalFinSetCfg.Rotation = Rotation:\r
+ EllipticalFinSetCfg.Fincant = Neigung:\r
+ EllipticalFinSetCfg.Rootchord = Blatttiefe:\r
+ EllipticalFinSetCfg.Height = Höhe:\r
+ EllipticalFinSetCfg.Positionrelativeto = Position relativ zu:\r
+ EllipticalFinSetCfg.plus = plus\r
+ EllipticalFinSetCfg.FincrossSection = Querschnitt:\r
+ EllipticalFinSetCfg.Thickness = Wandstärke:\r
+ EllipticalFinSetCfg.General = Allgemein\r
+ EllipticalFinSetCfg.Generalproperties = Allgemeine Eigenschaften\r
+ EllipticalFinSetCfg.ttip.Fincant = Der Winkel, in dem die Leitwerke zum Körperrohr geneigt sind.\r
+ \r
+ !FreeformFinSetConfig\r
+ FreeformFinSetCfg.tab.General = Allgemein\r
+ FreeformFinSetCfg.tab.ttip.General = Allgemeine Eigenschaften\r
+ FreeformFinSetCfg.tab.Shape = Form\r
+ FreeformFinSetCfg.tab.ttip.Finshape = Leitwerksform\r
+ FreeformFinSetCfg.lbl.Numberoffins = Anzahl der Leitwerke\r
+ FreeformFinSetCfg.lbl.Finrotation = Rotation:\r
+ FreeformFinSetCfg.lbl.Fincant = Neigung:\r
+ FreeformFinSetCfg.lbl.ttip.Fincant = Der Winkel, in dem die Leitwerke zum Körperrohr geneigt sind.\r
+ FreeformFinSetCfg.lbl.Posrelativeto = Position relativ zu:\r
+ FreeformFinSetCfg.lbl.plus = plus\r
+ FreeformFinSetCfg.lbl.FincrossSection = Querschnitt:\r
+ FreeformFinSetCfg.lbl.Thickness = Wandstärke:\r
+ \r
+ !InnerTubeConfig\r
+ InnerTubeCfg.tab.Motor = Motor\r
+ InnerTubeCfg.tab.ttip.Motor = Motorkonfiguration\r
+ InnerTubeCfg.tab.Cluster = Cluster\r
+ InnerTubeCfg.tab.ttip.Cluster = Cluster-Konfiguration\r
+ InnerTubeCfg.tab.Radialpos = Radiale Position\r
+ InnerTubeCfg.tab.ttip.Radialpos = Radiale Position\r
+ InnerTubeCfg.lbl.Selectclustercfg = Cluster-Konfiguration auswählen:\r
+ InnerTubeCfg.lbl.TubeSep = Rohrtrennung\r
+ InnerTubeCfg.lbl.ttip.TubeSep = Die Trennung der Rohre, 1.0 = die Rohre berühren sich\r
+ InnerTubeCfg.lbl.Rotation = Rotation:\r
+ InnerTubeCfg.lbl.ttip.Rotation = Rotationswinkel der Cluster-Konfiguration\r
+ InnerTubeCfg.lbl.Rotangle = Rotationswinkel der Cluster-Konfiguration\r
+ InnerTubeCfg.but.Splitcluster = Cluster aufteilen\r
+ InnerTubeCfg.lbl.longA1 = <html>Den Cluster in einzelne Komponenten aufteilen.<br>\r
+ InnerTubeCfg.lbl.longA2 = Die dupliziert alle Komponenten innerhalb dieses Innenrohrs.\r
+ InnerTubeCfg.but.Resetsettings = Einstellungen zurücksetzen\r
+ InnerTubeCfg.but.ttip.Resetsettings = Setzt die Aufteilung und Rotation auf die Standardwerte zurück\r
+ \r
+ ! LaunchLugConfig\r
+ LaunchLugCfg.lbl.Length = Länge:\r
+ LaunchLugCfg.lbl.Outerdiam = Außendurchmesser:\r
+ LaunchLugCfg.lbl.Innerdiam = Innendurchmesser:\r
+ LaunchLugCfg.lbl.Thickness = Wandstärke:\r
+ LaunchLugCfg.lbl.Radialpos = Radiale Position:\r
+ LaunchLugCfg.lbl.Posrelativeto = Position relativ zu:\r
+ LaunchLugCfg.lbl.plus = plus\r
+ LaunchLugCfg.tab.General = Allgemein\r
+ LaunchLugCfg.tab.Generalprop = Allgemeine Eigenschaften\r
+ \r
+ ! MassComponentConfig\r
+ MassComponentCfg.lbl.Mass = Masse\r
+ MassComponentCfg.lbl.Length = Länge\r
+ MassComponentCfg.lbl.Diameter = Durchmesser\r
+ MassComponentCfg.lbl.PosRelativeto = Position relativ zu:\r
+ MassComponentCfg.lbl.plus = plus\r
+ MassComponentCfg.tab.General = Allgemein\r
+ MassComponentCfg.tab.ttip.General = Allgemeine Eigenschaften\r
+ MassComponentCfg.tab.Radialpos = Radiale Position\r
+ MassComponentCfg.tab.ttip.Radialpos = Konfiguration der radialen Position\r
+ MassComponentCfg.lbl.Radialdistance = Radialer Abstand:\r
+ MassComponentCfg.lbl.Radialdirection = radiale Richtung:\r
+ MassComponentCfg.but.Reset = Zurücksetzen\r
+ \r
+ ! MotorConfig\r
+ MotorCfg.checkbox.compmotormount = Diese Komponente ist eine Motorhalterung\r
+ MotorCfg.lbl.Motorcfg = Motorkonfiguration\r
+ MotorCfg.but.New = Neu\r
+ MotorCfg.lbl.Currentmotor = Aktueller Motor:\r
+ MotorCfg.lbl.Motoroverhang = Motorüberstand:\r
+ MotorCfg.lbl.Ignitionat = Zündung bei:\r
+ MotorCfg.lbl.plus = plus\r
+ MotorCfg.lbl.seconds = Sekunden\r
+ MotorCfg.lbl.longA1 = Das aktuelle Design hat im Moment nur eine Stufe.\r
+ MotorCfg.lbl.longA2 = Stufen können durch Klicken auf \«Neue Stufe\« hinzugefügt werden.\r
+ MotorCfg.lbl.longB1 = Das aktuelle Design hat im Moment nur eine Stufe.\r
+ MotorCfg.lbl.longB2 = Stufen.\r
+ MotorCfg.but.Selectmotor = Motor auswählen\r
+ MotorCfg.but.Removemotor = Motor entfernen\r
+ MotorCfg.lbl.motorLabel = Keiner\r
+ \r
+ ! NoseConeConfig\r
+ NoseConeCfg.lbl.Noseconeshape = Spitzenform:\r
+ NoseConeCfg.lbl.Shapeparam = Formparameter:\r
+ NoseConeCfg.lbl.Noseconelength = Spitzenlänge:\r
+ NoseConeCfg.lbl.Basediam = Basisdurchmesser:\r
+ NoseConeCfg.checkbox.Automatic = Automatisch\r
+ NoseConeCfg.lbl.Wallthickness = Wandstärke:\r
+ NoseConeCfg.checkbox.Filled = gefüllt\r
+ NoseConeCfg.tab.General = Allgemein\r
+ NoseConeCfg.tab.ttip.General = Allgemeine Eigenschaften\r
+ NoseConeCfg.tab.Shoulder = Schulter\r
+ NoseConeCfg.tab.ttip.Shoulder = Schultereigenschaften\r
+ \r
+ ! ParachuteConfig\r
+ ParachuteCfg.lbl.Canopy = Fallschirmkappe:\r
+ ParachuteCfg.lbl.Diameter = Durchmesser:\r
+ ParachuteCfg.lbl.Material = Material:\r
+ ParachuteCfg.combo.MaterialModel = Das Material beeinflusst die Masse der Komponente.\r
+ ParachuteCfg.lbl.longA1 = <html>Luftwiderstandskoeffizient C<sub>D</sub>:\r
+ ParachuteCfg.lbl.longB1 = <html>Der Luftwiderstandsbeiwert relativ zur Gesamtfläche des Fallschirms.<br>\r
+ ParachuteCfg.lbl.longB2 = Ein größerer Luftwiderstand führt zu einer kleineren Sinkrate.\r
+ ParachuteCfg.lbl.longB3 = Ein typischer Wert für Fallschirme ist 0,8.\r
+ ParachuteCfg.but.Reset = Zurücksetzen\r
+ ParachuteCfg.lbl.Shroudlines = Fangleinen:\r
+ ParachuteCfg.lbl.Numberoflines = Anzahl der Leinen:\r
+ ParachuteCfg.lbl.Linelength = Länge der Leinen:\r
+ ParachuteCfg.lbl.Material = Material:\r
+ ParachuteCfg.lbl.Posrelativeto = Position relativ zu:\r
+ ParachuteCfg.lbl.plus = plus\r
+ ParachuteCfg.lbl.Packedlength = gepackte Länge:\r
+ ParachuteCfg.lbl.Packeddiam = gepackter Durchmesser:\r
+ ParachuteCfg.lbl.Deploysat = Auswurf bei\r
+ ParachuteCfg.lbl.seconds = Sekunden\r
+ ParachuteCfg.lbl.Altitude = Höhe:\r
+ ParachuteCfg.tab.General = Allgemein\r
+ ParachuteCfg.tab.ttip.General = Allgemeine Eigenschaften\r
+ ParachuteCfg.tab.Radialpos = Radiale Position\r
+ ParachuteCfg.tab.ttip.Radialpos = Konfiguration der radialen Position\r
+ ParachuteCfg.lbl.Radialdistance = Radialer Abstand:\r
+ ParachuteCfg.lbl.Radialdirection = radiale Richtung:\r
+ ParachuteCfg.but.Reset = Zurücksetzen\r
+ \r
+ ! ShockCordConfig \r
+ ShockCordCfg.lbl.Shockcordlength = Länge des Gummiseils\r
+ ShockCordCfg.lbl.Shockcordmaterial = Material des Gummiseils:\r
+ ShockCordCfg.lbl.Posrelativeto = Position relativ zu:\r
+ ShockCordCfg.lbl.plus = plus\r
+ ShockCordCfg.lbl.Packedlength = gepackte Länge:\r
+ ShockCordCfg.lbl.Packeddiam = gepackter Durchmesser:\r
+ ShockCordCfg.tab.General = Allgemein\r
+ ShockCordCfg.tab.ttip.General = Allgemeine Eigenschaften\r
+ \r
+ !SleeveConfig\r
+ SleeveCfg.tab.Outerdiam = Außendurchmesser:\r
+ SleeveCfg.tab.Innerdiam = Innendurchmesser:\r
+ SleeveCfg.tab.Wallthickness = Wandstärke:\r
+ SleeveCfg.tab.Length = Länge:\r
+ SleeveCfg.tab.General = Allgemein\r
+ SleeveCfg.tab.Generalproperties = Allgemeine Eigenschaften\r
+ \r
+ ! StreamerConfig\r
+ StreamerCfg.lbl.Striplength = Länge des Strömers:\r
+ StreamerCfg.lbl.Stripwidth = Breite des Strömers:\r
+ StreamerCfg.lbl.Striparea = Fläche des Strömers:\r
+ StreamerCfg.lbl.Aspectratio = Seitenverhältnis:\r
+ StreamerCfg.lbl.Material = Material:\r
+ StreamerCfg.combo.ttip.MaterialModel = Das Material beeinflusst die Masse der Komponente.\r
+ StreamerCfg.lbl.longA1 = <html>Widerstandskoeffizient C<sub>D</sub>:\r
+ StreamerCfg.lbl.longB1 = <html>Der Widerstandskoeffizient des Strömers hängt von der Gesamtfläche ab.<br>\r
+ StreamerCfg.lbl.longB2 = Ein größerer Luftwiderstandskoeffizient führt zu einer kleineren Sinkrate.\r
+ StreamerCfg.lbl.Automatic = Automatisch\r
+ StreamerCfg.lbl.longC1 = Der Luftwiderstandskoeffizient hängt von der Fläche des Strömers ab.\r
+ StreamerCfg.lbl.Posrelativeto = Position relativ zu:\r
+ StreamerCfg.lbl.plus = plus\r
+ StreamerCfg.lbl.Packedlength = gepackte Länge:\r
+ StreamerCfg.lbl.Packeddiam = gepackter Durchmesser:\r
+ StreamerCfg.lbl.Deploysat = Auswurf bei\r
+ StreamerCfg.lbl.seconds = Sekunden\r
+ StreamerCfg.lbl.Altitude = Höhe:\r
+ StreamerCfg.tab.General = Allgemein\r
+ StreamerCfg.tab.ttip.General = Allgemeine Eigenschaften\r
+ StreamerCfg.tab.Radialpos = Radiale Position\r
+ StreamerCfg.tab.ttip.Radialpos = Konfiguration der radialen Position\r
+ StreamerCfg.lbl.Radialdistance = Radialer Abstand:\r
+ StreamerCfg.lbl.Radialdirection = radiale Richtung:\r
+ StreamerCfg.but.Reset = Zurücksetzen\r
+ \r
+ ! ThicknessRingComponentConfig\r
+ ThicknessRingCompCfg.tab.Outerdiam = Außendurchmesser:\r
+ ThicknessRingCompCfg.tab.Innerdiam = Innendurchmesser:\r
+ ThicknessRingCompCfg.tab.Wallthickness = Wandstärke:\r
+ ThicknessRingCompCfg.tab.Length = Länge:\r
+ ThicknessRingCompCfg.tab.General = Allgemein\r
+ ThicknessRingCompCfg.tab.Generalprop = Allgemeine Eigenschaften\r
+ \r
+ ! TransitionConfig\r
+ TransitionCfg.lbl.Transitionshape = Form des Übergangs\r
+ TransitionCfg.checkbox.Clipped = geklemmt\r
+ TransitionCfg.lbl.Shapeparam = Formparameter:\r
+ TransitionCfg.lbl.Transitionlength = Länge des Übergangs:\r
+ TransitionCfg.lbl.Forediam = Vorderer Durchmesser\r
+ TransitionCfg.checkbox.Automatic = Automatisch\r
+ TransitionCfg.lbl.Aftdiam = Hinterer Durchmesser\r
+ TransitionCfg.lbl.Wallthickness = Wandstärke:\r
+ TransitionCfg.checkbox.Filled = gefüllt\r
+ TransitionCfg.tab.General = Allgemein\r
+ TransitionCfg.tab.Generalproperties = Allgemeine Eigenschaften\r
+ TransitionCfg.tab.Shoulder = Schulter\r
+ TransitionCfg.tab.Shoulderproperties = Schultereigenschaften\r
+ \r
+ ! TrapezoidFinSetConfig\r
+ TrapezoidFinSetCfg.lbl.Nbroffins = Anzahl der Leitwerke\r
+ TrapezoidFinSetCfg.lbl.ttip.Nbroffins = Anzahl der Leitwerke in diesem Satz\r
+ TrapezoidFinSetCfg.lbl.Finrotation = Rotation der Leitwerke\r
+ TrapezoidFinSetCfg.lbl.ttip.Finrotation = Winkel des ersten Leitwerks in diesem Satz\r
+ TrapezoidFinSetCfg.lbl.Fincant = Neigung:\r
+ TrapezoidFinSetCfg.lbl.ttip.Fincant = Der Winkel, in dem die Leitwerke zum Körperrohr geneigt sind.\r
+ TrapezoidFinSetCfg.lbl.Rootchord = Blatttiefe:\r
+ TrapezoidFinSetCfg.lbl.Tipchord = Blatttiefe (Spitze)\r
+ TrapezoidFinSetCfg.lbl.Height = Höhe:\r
+ TrapezoidFinSetCfg.lbl.Sweeplength = Blattbreite:\r
+ TrapezoidFinSetCfg.lbl.Sweepangle = Pfeilungswinkel\r
+ TrapezoidFinSetCfg.lbl.FincrossSection = Leitwerksquerschnitt\r
+ TrapezoidFinSetCfg.lbl.Thickness = Wandstärke:\r
+ TrapezoidFinSetCfg.lbl.Posrelativeto = Position relativ zu:\r
+ TrapezoidFinSetCfg.lbl.plus = plus\r
+ TrapezoidFinSetCfg.tab.General = Allgemein\r
+ TrapezoidFinSetCfg.tab.Generalproperties = Allgemeine Eigenschaften\r
+ \r
+ !MotorConfigurationModel\r
+ MotorCfgModel.Editcfg = Konfigurationen bearbeiten\r
+ \r
+ ! StorageOptionChooser\r
+ StorageOptChooser.lbl.Simdatatostore = Zu speichernde Simulationsdaten:\r
+ StorageOptChooser.rdbut.Allsimdata = Alle Simulationsdaten\r
+ StorageOptChooser.lbl.longA1 = <html>Speichert alle Simulationsdaten.<br>\r
+ StorageOptChooser.lbl.longA2 = Dies kann sehr große Dateien erzeugen!\r
+ StorageOptChooser.rdbut.Every = Alle Simulationsdaten\r
+ StorageOptChooser.lbl.longB1 = <html>Speicher plotbare Daten in etwa diesem Abstand.<br>\r
+ StorageOptChooser.lbl.longB2 = Größere Werte erzeugen kleinere Dateien.\r
+ StorageOptChooser.lbl.seconds = Sekunden\r
+ StorageOptChooser.rdbut.Onlyprimfig = Nur die wichtigsten Werte\r
+ StorageOptChooser.lbl.longC1 = <html>Speichert nur die Werte, die in der Zusammenfassung stehen.<br>\r
+ StorageOptChooser.lbl.longC2 = Dies ergibt die kleinsten Dateien\r
+ StorageOptChooser.checkbox.Compfile = Datei komprimieren\r
+ StorageOptChooser.lbl.UsingComp = Kompression der Datei verringert die Größe signifikant.\r
+ StorageOptChooser.lbl.longD1 = Eine Schätzung der Dateigröße mit den gegebenen Optionen.\r
+ StorageOptChooser.ttip.Saveopt = Speicheroptionen\r
+ StorageOptChooser.lbl.Estfilesize = Voraussichtliche Dateigröße:\r
+ StorageOptChooser.lbl.Saveopt = Speicheroptionen\r
+ \r
+ ! ThrustCurveMotorSelectionPanel\r
+ TCMotorSelPan.lbl.Selrocketmotor = Raketenmotor auswählen:\r
+ TCMotorSelPan.checkbox.hideSimilar = Ähnliche Schubkurven verbergen\r
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc1 = Alle Motoren anzeigen\r
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc2 = Motoren anzeigen, deren Durchmesser kleiner als der der Motorhalterung ist\r
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc3 = Motoren anzeigen, deren Durchmesser gleich der der Motorhalterung ist\r
+ TCMotorSelPan.lbl.Motormountdia = Durchmesser der Motorhalterung\r
+ TCMotorSelPan.lbl.Search = Suchen:\r
+ TCMotorSelPan.lbl.Selectthrustcurve = Schubkurve auswählen:\r
+ TCMotorSelPan.lbl.Ejectionchargedelay = Verzögerung der Ausstoßladung:\r
+ TCMotorSelPan.equalsIgnoreCase.None = keine\r
+ TCMotorSelPan.lbl.NumberofsecondsorNone = (Anzahl der Sekunden oder \«keine\«)\r
+ TCMotorSelPan.lbl.Totalimpulse = Gesamtimpuls:\r
+ TCMotorSelPan.lbl.Avgthrust = Durchschn. Schub:\r
+ TCMotorSelPan.lbl.Maxthrust = max. Schub\r
+ TCMotorSelPan.lbl.Burntime = Brenndauer:\r
+ TCMotorSelPan.lbl.Launchmass = Startmasse:\r
+ TCMotorSelPan.lbl.Emptymass = Leermasse:\r
+ TCMotorSelPan.lbl.Datapoints = Datenpunkte:\r
+ TCMotorSelPan.lbl.Digest = Übersicht:\r
+ TCMotorSelPan.title.Thrustcurve = Schubkurve:\r
+ TCMotorSelPan.title.Thrust = Schub:\r
+ TCMotorSelPan.delayBox.None = keine\r
+ \r
+ \r
+ ! PlotDialog\r
+ PlotDialog.title.Flightdataplot = Flugdatenplot\r
+ PlotDialog.Chart.Simulatedflight = Simulierter Flug\r
+ PlotDialog.CheckBox.Showdatapoints = Datenpunkte anzeigen\r
+ PlotDialog.lbl.Chart = Klicken+ziehen: runter+rechts um hinein zu zoomen, hoch+links um heraus zu zoomen \r
+ \r
+ \r
+ ! "main" prefix is used for the main application dialog\r
+ \r
+ main.menu.file = Datei\r
+ main.menu.file.new = Neu\r
+ main.menu.file.open = Öffnen..\r
+ main.menu.file.openExample = Beispiel öffnen..\r
+ main.menu.file.save = Speichern\r
+ main.menu.file.saveAs = Speichern unter...\r
+ main.menu.file.print = Drucken...\r
+ main.menu.file.close = Schließen\r
+ main.menu.file.quit = Beenden\r
+ \r
+ main.menu.edit = Bearbeiten\r
+ main.menu.edit.undo = Rückgängig\r
+ main.menu.edit.redo = Wiederholen\r
+ main.menu.edit.cut = Ausschneiden\r
+ main.menu.edit.copy = Kopieren\r
+ main.menu.edit.paste = Einfügen\r
+ main.menu.edit.delete = Löschen\r
+ main.menu.edit.preferences = Einstellungen\r
+ \r
+ main.menu.analyze = Analysieren\r
+ main.menu.analyze.componentAnalysis = Komponente analysieren\r
+ \r
+ main.menu.help = Hilfe\r
+ main.menu.help.license = Lizenz\r
+ main.menu.help.bugReport = Fehlerbericht\r
+ main.menu.help.debugLog = Debug-Log\r
+ main.menu.help.about = Über\r
+ \r
+ main.menu.debug = Debug\r
+ main.menu.debug.whatisthismenu = Was macht diese Menü?\r
+ main.menu.debug.createtestrocket = Eine Testrakete erstellen\r
+ \r
+ ! database\r
+ ! Translate here all material database\r
+ !\r
+ \r
+ ! Material database\r
+ ! BULK_MATERIAL\r
+ Databases.materials.Acrylic = Acryl\r
+ Databases.materials.Balsa = Balsa\r
+ Databases.materials.Birch = Birke\r
+ Databases.materials.Cardboard = Karton\r
+ Databases.materials.Carbonfiber = Kohlefaser\r
+ Databases.materials.Cork = Kork\r
+ Databases.materials.DepronXPS = Depron (XPS)\r
+ Databases.materials.Fiberglass = Glasfaser\r
+ Databases.materials.Kraftphenolic = Pertinax\r
+ Databases.materials.Maple = Ahorn\r
+ Databases.materials.Paperoffice = Papier (Büro)\r
+ Databases.materials.Pine = Kiefer\r
+ Databases.materials.Plywoodbirch = Sperrholz (Birke)\r
+ Databases.materials.PolycarbonateLexan = Polycarbonat (Lexan)\r
+ Databases.materials.Polystyrene = Polystyrène\r
+ Databases.materials.PVC = PVC\r
+ Databases.materials.Spruce = Fichte\r
+ Databases.materials.StyrofoamgenericEPS = Styropor (EPS)\r
+ Databases.materials.StyrofoamBluefoamXPS = Styrodur (XPS)\r
+ Databases.materials.Quantumtubing = Quantum tubing\r
+ !SURFACE_MATERIAL\r
+ Databases.materials.Ripstopnylon = Ripstop Nylon\r
+ Databases.materials.Mylar = Mylar\r
+ Databases.materials.Polyethylenethin = Polyethylen (dünn)\r
+ Databases.materials.Polyethyleneheavy = Polyethylen (schwer)\r
+ Databases.materials.Silk = Seide\r
+ Databases.materials.Paperoffice = Papier (Büro)\r
+ Databases.materials.Cellophane = Zellophan\r
++Databases.materials.Crepepaper = Krepppapier\r
+ ! LINE_MATERIAL\r
+ Databases.materials.Threadheavy-duty = Faden (stark)\r
+ Databases.materials.Elasticcordround2mm = Elastikband (rund, 2mm, 1/16 in)\r
+ Databases.materials.Elasticcordflat6mm = Elastikband (flach, 6mm, 1/4 in)\r
+ Databases.materials.Elasticcordflat12mm = Elastikband (flach, 12mm, 1/2 in)\r
+ Databases.materials.Elasticcordflat19mm = Elastikband (flach, 19mm, 3/4 in)\r
+ Databases.materials.Elasticcordflat25mm = Elastikband (flach, 25mm, 1 in)\r
+ Databases.materials.Braidednylon2mm = Nylonflachband (2 mm, 1/16 in)\r
+ Databases.materials.Braidednylon3mm = Nylonflachband (3 mm, 1/8 in)\r
+ Databases.materials.Tubularnylon11mm = Tubular Nylon (11 mm, 7/16 in)\r
+ Databases.materials.Tubularnylon14mm = Tubular Nylon (14 mm, 9/16 in)\r
+ Databases.materials.Tubularnylon25mm = Tubular Nylon (25 mm, 1 in)\r
+ \r
+ ! ExternalComponent\r
+ ExternalComponent.Rough = Rau\r
+ ExternalComponent.Unfinished = unbehandelt\r
+ ExternalComponent.Regularpaint = normale Farbe\r
+ ExternalComponent.Smoothpaint = glatte Farbe\r
+ ExternalComponent.Polished = poliert\r
+ \r
+ ! LineStyle\r
+ LineStyle.Solid = durchgehend\r
+ LineStyle.Dashed = gestrichelt\r
+ LineStyle.Dotted = gepunktet\r
+ LineStyle.Dash-dotted = Strich-Punkt\r
+ LineStyle.Defaultstyle = Standardstil\r
+ \r
+ ! Shape\r
+ Shape.Conical = Konisch\r
+ Shape.Conical.desc1 = Eine konische Spitze hat ein dreieckiges Profil\r
+ Shape.Conical.desc2 = Ein konischer Übergang hat gerade Kanten\r
+ Shape.Ogive = Ogive\r
+ Shape.Ogive.desc1 = Eine ogive Spitze hat das Profil eines Kreissegments. Der Formparamter 1 erzeugt eine <b>tangentiale Ogive</b>, die einen weichen Übergang zum Körperrohr hat, Werte kleiner 1 erzeugen eine <b>sekante Ogive<b>.\r
+ Shape.Ogive.desc2 = Eine ogive Spitze hat das Profil eines Kreissegments. Der Formparamter 1 erzeugt eine <b>tangentiale Ogive</b>, die einen weichen Übergang zum Körperrohr am hinteren Ende hat, Werte kleiner 1 erzeugen eine <b>sekante Ogive<b>.\r
+ Shape.Ellipsoid = Ellipsoid\r
+ Shape.Ellipsoid.desc1 = Eine ellipsoide Spitze hat ein Profil einer Halbellipse mit der einer Hauptachsenlänge von 2×<i>Länge</i> und <i>Durchmesser</i> \r
+ Shape.Ellipsoid.desc2 = An ellipsoidal transition has a profile of a half-ellipse with major axes of lengths 2×<i>Length</i> and <i>Diameter</i>. If the transition is not clipped, then the profile is extended at the center by the corresponding radius. \r
+ Shape.Powerseries = Power series\r
+ Shape.Powerseries.descA1 = A power series nose cone has a profile of <i>Radius</i> × (<i>x</i> / <i>Length</i>)<sup><i>k</i></sup> where <i>k</i> is the shape parameter. For <i>k</i>=0.5 this is a <b>\r
+ Shape.Powerseries.descA2 = -power</b> or <b>parabolic</b> nose cone, for <i>k</i>=0.75 a <b>\r
+ Shape.Powerseries.descA3 = -power</b>, and for <i>k</i>=1 a <b>conical</b> nose cone.\r
+ Shape.Powerseries.descB1 = A power series transition has a profile of <i>Radius</i> × (<i>x</i> / <i>Length</i>)<sup><i>k</i></sup> where <i>k</i> is the shape parameter. For <i>k</i>=0.5 the transition is <b>\r
+ Shape.Powerseries.descB2 = -power</b> or <b>parabolic</b>, for <i>k</i>=0.75 a <b>\r
+ Shape.Powerseries.descB3 = -power</b>, and for <i>k</i>=1 <b>conical</b>.\r
+ Shape.Parabolicseries = Parabolic series\r
+ Shape.Parabolicseries.desc1 = A parabolic series nose cone has a profile of a parabola. The shape parameter defines the segment of the parabola to utilize. The shape parameter 1.0 produces a <b>full parabola</b> which is tangent to the body tube, 0.75 produces a <b>3/4 parabola</b>, 0.5 procudes a <b>1/2 parabola</b> and 0 produces a <b>conical</b> nose cone.\r
+ Shape.Parabolicseries.desc2 = A parabolic series transition has a profile of a parabola. The shape parameter defines the segment of the parabola to utilize. The shape parameter 1.0 produces a <b>full parabola</b> which is tangent to the body tube at the aft end, 0.75 produces a <b>3/4 parabola</b>, 0.5 procudes a <b>1/2 parabola</b> and 0 produces a <b>conical</b> transition.\r
+ Shape.Haackseries = Haack series\r
+ Shape.Haackseries.desc1 = The Haack series nose cones are designed to minimize drag. The shape parameter 0 produces an <b>LD-Haack</b> or <b>Von Karman</b> nose cone, which minimizes drag for fixed length and diameter, while a value of 0.333 produces an <b>LV-Haack</b> nose cone, which minimizes drag for fixed length and volume.\r
+ Shape.Haackseries.desc2 = The Haack series <i>nose cones</i> are designed to minimize drag. These transition shapes are their equivalents, but do not necessarily produce optimal drag for transitions. The shape parameter 0 produces an <b>LD-Haack</b> or <b>Von Karman</b> shape, while a value of 0.333 produces an <b>LV-Haack</b> shape. \r
+ \r
+ \r
+ ! RocketComponent\r
+ RocketComponent.Position.TOP = oberes Ende der übergeordneten Komponente\r
+ RocketComponent.Position.MIDDLE = Mitte der übergeordneten Komponente\r
+ RocketComponent.Position.BOTTOM = unteres Ende der übergeordneten Komponente\r
+ RocketComponent.Position.AFTER = nach der übergeordneten Komponente\r
+ RocketComponent.Position.ABSOLUTE = zur Spitze\r
+ \r
+ ! LaunchLug\r
+ LaunchLug.Launchlug = Leitröhrchen\r
+ ! NoseCone\r
+ NoseCone.NoseCone = Spitze\r
+ ! Transition\r
+ Transition.Transition = Übergang\r
+ !Stage\r
+ Stage.Stage = Stufe\r
+ ! BodyTube\r
+ BodyTube.BodyTube = Körperrohr\r
+ ! TubeCoupler\r
+ TubeCoupler.TubeCoupler = Koppler\r
+ !InnerTube\r
+ InnerTube.InnerTube = Innenrohr\r
+ ! TrapezoidFinSet\r
+ TrapezoidFinSet.TrapezoidFinSet = Trapezoide Leitwerke\r
+ ! FreeformFinSet\r
+ FreeformFinSet.FreeformFinSet = Frei geformte Leitwerke\r
+ !MassComponent\r
+ MassComponent.MassComponent = Masse\r
+ ! Parachute\r
+ Parachute.Parachute = Fallschirm\r
+ ! ShockCord\r
+ ShockCord.ShockCord = Gummiseil\r
+ ! Bulkhead\r
+ Bulkhead.Bulkhead = Schott\r
+ \r
+ !Rocket\r
+ Rocket.motorCount.Nomotor = [Keine Motoren]\r
+ Rocket.compname.Rocket = Rakete\r
+ \r
+ !MotorMount\r
+ MotorMount.IgnitionEvent.AUTOMATIC = Automatisch (Start oder Ausstoßladung)\r
+ MotorMount.IgnitionEvent.LAUNCH = Start\r
+ MotorMount.IgnitionEvent.EJECTION_CHARGE = Erste Ausstoßladung der vorherigen Stufe\r
+ MotorMount.IgnitionEvent.BURNOUT = Erster Brennschluss der vorherigen Stufe\r
+ MotorMount.IgnitionEvent.NEVER = Nie\r
+ \r
+ !ComponentIcons \r
+ ComponentIcons.Nosecone = Spitze\r
+ ComponentIcons.Bodytube = Körperrohr\r
+ ComponentIcons.Transition = Übergang\r
+ ComponentIcons.Trapezoidalfinset = Trapezoide Leitwerke\r
+ ComponentIcons.Ellipticalfinset = Elliptische Leitwerke\r
+ ComponentIcons.Freeformfinset = Frei geformte Leitwerke\r
+ ComponentIcons.Launchlug = Leitröhrchen\r
+ ComponentIcons.Innertube = Innenrohr\r
+ ComponentIcons.Tubecoupler = Koppler\r
+ ComponentIcons.Centeringring = Zentrierring\r
+ ComponentIcons.Bulkhead = Schott\r
+ ComponentIcons.Engineblock = Motorhalterung\r
+ ComponentIcons.Parachute = Fallschirm\r
+ ComponentIcons.Streamer = Strömer\r
+ ComponentIcons.Shockcord = Gummiseil\r
+ ComponentIcons.Masscomponent = Masse\r
+ ComponentIcons.disabled = (deaktiviert)\r
+ \r
+ ! StageAction\r
+ StageAction.Stage = Stufe\r
+ \r
+ ! RecoveryDevice\r
+ RecoveryDevice.DeployEvent.LAUNCH = Start (plus NN Sekunden)\r
+ RecoveryDevice.DeployEvent.EJECTION = Erste Ausstoßladung dieser Stufe\r
+ RecoveryDevice.DeployEvent.APOGEE = Apogäum\r
+ RecoveryDevice.DeployEvent.ALTITUDE = Spezifische Höhe während der Landephase\r
+ RecoveryDevice.DeployEvent.NEVER = Nie\r
+ \r
+ ! FlightEvent\r
+ FlightEvent.Type.LAUNCH = Start\r
+ FlightEvent.Type.IGNITION = Motorzündung\r
+ FlightEvent.Type.LIFTOFF = Abheben\r
+ FlightEvent.Type.LAUNCHROD = Verlassen der Startrampe\r
+ FlightEvent.Type.BURNOUT = Motorbrennschluss\r
+ FlightEvent.Type.EJECTION_CHARGE = Ausstoßladung\r
+ FlightEvent.Type.STAGE_SEPARATION = Stufentrennung\r
+ FlightEvent.Type.APOGEE = Apogäum\r
+ FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT = Auslösung des Bergungssystems\r
+ FlightEvent.Type.GROUND_HIT = Landung\r
+ FlightEvent.Type.SIMULATION_END = Ende der Simulation\r
+ FlightEvent.Type.ALTITUDE = Höhenänderung\r
+ \r
+ ! ThrustCurveMotorColumns\r
+ TCurveMotorCol.MANUFACTURER = Hersteller\r
+ TCurveMotorCol.DESIGNATION = Bezeichnung\r
+ TCurveMotorCol.TYPE = Typ\r
+ TCurveMotorCol.DIAMETER = Durchmesser\r
+ TCurveMotorCol.LENGTH = Länge\r
+ \r
+ ! RocketInfo\r
+ RocketInfo.lengthLine.Length = Länge\r
+ RocketInfo.lengthLine.maxdiameter = , max. Durchmesser\r
+ RocketInfo.massText1 = Masse mit Motoren\r
+ RocketInfo.massText2 = Masse ohne Motoren\r
+ RocketInfo.at = bei M=\r
+ RocketInfo.cgText = CG:\r
+ RocketInfo.cpText = CP:\r
+ RocketInfo.stabText = Stabilität:\r
+ RocketInfo.Warning = Warnung:\r
+ RocketInfo.Calculating = Berechne...\r
+ RocketInfo.Apogee = Apogäum:\r
+ RocketInfo.Maxvelocity = max. Geschwindigkeit:\r
+ RocketInfo.Maxacceleration = max. Beschleunigung:\r
+ RocketInfo.apogeeValue = N/A\r
+ RocketInfo.Mach = (Mach\r
+ RocketInfo.velocityValue = N/A\r
+ RocketInfo.accelerationValue = N/A\r
+ \r
+ ! FinSet\r
+ FinSet.CrossSection.SQUARE = Quadrat\r
+ FinSet.CrossSection.ROUNDED = Abgerundet\r
+ FinSet.CrossSection.AIRFOIL = Tragfläche\r
+ FinSet.TabRelativePosition.FRONT = Root chord leading edge\r
+ FinSet.TabRelativePosition.CENTER = Root chord midpoint\r
+ FinSet.TabRelativePosition.END = Root chord trailing edge\r
+ \r
+ ! FlightDataType\r
+ FlightDataType.TYPE_TIME = Zeit\r
+ FlightDataType.TYPE_ALTITUDE = Höhe\r
+ FlightDataType.TYPE_VELOCITY_Z = Vertikalgeschwindigkeit\r
+ FlightDataType.TYPE_ACCELERATION_Z = Vertikalbeschleunigung\r
+ FlightDataType.TYPE_VELOCITY_TOTAL = Gesamtgeschwindigkeit\r
+ FlightDataType.TYPE_ACCELERATION_TOTAL = Gesamtbeschleunigung\r
+ FlightDataType.TYPE_POSITION_X = Position upwind\r
+ FlightDataType.TYPE_POSITION_Y = Position parallel to wind\r
+ FlightDataType.TYPE_POSITION_XY = Lateral distance\r
+ FlightDataType.TYPE_POSITION_DIRECTION = Lateral direction\r
+ FlightDataType.TYPE_VELOCITY_XY = Lateral velocity\r
+ FlightDataType.TYPE_ACCELERATION_XY = Lateral acceleration\r
+ FlightDataType.TYPE_AOA = Angriffswinkel\r
+ FlightDataType.TYPE_ROLL_RATE = Rollrate\r
+ FlightDataType.TYPE_PITCH_RATE = Nickrate\r
+ FlightDataType.TYPE_YAW_RATE = Gierrate\r
+ FlightDataType.TYPE_MASS = Masse\r
+ FlightDataType.TYPE_LONGITUDINAL_INERTIA = Longitudinal moment of inertia\r
+ FlightDataType.TYPE_ROTATIONAL_INERTIA = Rotational moment of inertia\r
+ FlightDataType.TYPE_CP_LOCATION = Position vom CP\r
+ FlightDataType.TYPE_CG_LOCATION = Position vom CG\r
+ FlightDataType.TYPE_STABILITY = Stabilität in Kalibern\r
+ FlightDataType.TYPE_MACH_NUMBER = Machzahl\r
+ FlightDataType.TYPE_REYNOLDS_NUMBER = Reynoldszahl\r
+ FlightDataType.TYPE_THRUST_FORCE = Schub\r
+ FlightDataType.TYPE_DRAG_FORCE = Luftwiderstandskraft\r
+ FlightDataType.TYPE_DRAG_COEFF = Luftwiderstandskoeffizient\r
+ FlightDataType.TYPE_AXIAL_DRAG_COEFF = Axial drag coefficient\r
+ FlightDataType.TYPE_FRICTION_DRAG_COEFF = Reibungskoeffizient\r
+ FlightDataType.TYPE_PRESSURE_DRAG_COEFF = Pressure drag coefficient\r
+ FlightDataType.TYPE_BASE_DRAG_COEFF = Base drag coefficient\r
+ FlightDataType.TYPE_NORMAL_FORCE_COEFF = Normal force coefficient\r
+ FlightDataType.TYPE_PITCH_MOMENT_COEFF = Pitch moment coefficient\r
+ FlightDataType.TYPE_YAW_MOMENT_COEFF = Yaw moment coefficient\r
+ FlightDataType.TYPE_SIDE_FORCE_COEFF = Side force coefficient\r
+ FlightDataType.TYPE_ROLL_MOMENT_COEFF = Roll moment coefficient\r
+ FlightDataType.TYPE_ROLL_FORCING_COEFF = Roll forcing coefficient\r
+ FlightDataType.TYPE_ROLL_DAMPING_COEFF = Roll damping coefficient\r
+ FlightDataType.TYPE_PITCH_DAMPING_MOMENT_COEFF = Pitch damping coefficient\r
+ FlightDataType.TYPE_YAW_DAMPING_MOMENT_COEFF = Yaw damping coefficient\r
+ FlightDataType.TYPE_REFERENCE_LENGTH = Referenzlänge\r
+ FlightDataType.TYPE_REFERENCE_AREA = Referenzfläche\r
+ FlightDataType.TYPE_ORIENTATION_THETA = Vertical orientation (zenith)\r
+ FlightDataType.TYPE_ORIENTATION_PHI = Lateral orientation (azimuth)\r
+ FlightDataType.TYPE_WIND_VELOCITY = Windgeschwindigkeit\r
+ FlightDataType.TYPE_AIR_TEMPERATURE = Lufttemperatur\r
+ FlightDataType.TYPE_AIR_PRESSURE = Luftdruck\r
+ FlightDataType.TYPE_SPEED_OF_SOUND = Schallgeschwindigkeit\r
+ FlightDataType.TYPE_TIME_STEP = Simulationszeitschritt\r
+ FlightDataType.TYPE_COMPUTATION_TIME = Berechnnungszeit\r
+ \r
+ ! PlotConfiguration\r
+ PlotConfiguration.Verticalmotion = Vertikale Bewegung über Zeit\r
+ PlotConfiguration.Totalmotion = Gesamte Bewegung über Zeit\r
+ PlotConfiguration.Flightside = Flight side profile\r
+ PlotConfiguration.Stability = Stabilität über Zeit\r
+ PlotConfiguration.Dragcoef = Drag coefficients vs. Mach number\r
+ PlotConfiguration.Rollcharacteristics = Roll characteristics\r
+ PlotConfiguration.Angleofattack = Angle of attack and orientation vs. time\r
+ PlotConfiguration.Simulationtime = Simulationszeitschritt und Berechnungszeit\r
+ \r
+ ! Warning\r
+ Warning.LargeAOA.str1 = Large angle of attack encountered.\r
+ Warning.LargeAOA.str2 = Large angle of attack encountered (\r
+ Warning.DISCONTINUITY = Unstetigkeit im Raketendurchmesser\r
+ Warning.THICK_FIN = Dicke Leitwerke können nicht präzise modelliert werden.\r
+ Warning.JAGGED_EDGED_FIN = Gezackte Ecken in Leitwerken können unpräzise Ergebnisse liefern.\r
+ Warning.LISTENERS_AFFECTED = Simulationsempfänger haben die Simulation beeinflusst.\r
+ Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING = Bergungssystem wurde ausgelöst während der Motor noch gebrannt hat.\r
+ Warning.FILE_INVALID_PARAMETER = Ignoriere ungültigen Parameter.\r
--- /dev/null
-compaddbuttons.Bodytube = Tubo del fuselaje
+ #
+ # Spanish base translation file
+ # translations provided by Tripoli Spain
+ #
+ # 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_es.properties
+
+ ! RocketActions
+ RocketActions.checkbox.Donotaskmeagain = No preguntarme nuevamente
+ RocketActions.lbl.Youcanchangedefop = Puede modificar la operación por defecto con sus preferencias
+ RocketActions.showConfirmDialog.lbl1 = ¿Borrar las simulaciones seleccionadas?
+ RocketActions.showConfirmDialog.lbl2 = <html><i>Esta operación no puede deshacerse.</i>
+ RocketActions.showConfirmDialog.title = Borrar simulaciones
+ RocketActions.DelCompAct.Delete = Borrar
+ RocketActions.DelCompAct.ttip.Delete = Borrar el componente seleccionado
+ RocketActions.DelSimuAct.Delete = Borrar
+ RocketActions.DelSimuAct.ttip.Delete = Borrar la simulación seleccionada
+ RocketActions.DelAct.Delete = Borrar
+ RocketActions.DelAct.ttip.Delete = Borrar el componente o simulación, seleccionado
+ RocketActions.CutAction.Cut = Cortar
+ RocketActions.CutAction.ttip.Cut = Cortar este componente o simulación y copiarlo a la libreta de notas y quitarlo de este diseño
+ RocketActions.CopyAct.Copy = Copiar
+ RocketActions.CopyAct.ttip.Copy = Copiar este componente (y subcomponentes) a la libreta de notas
+ RocketActions.PasteAct.Paste = Pegar
+ RocketActions.PasteAct.ttip.Paste = Pegar el componente o simulación de la libreta de notas al diseño.
+ RocketActions.EditAct.Edit = Mostrar
+ RocketActions.EditAct.ttip.Edit = Mostrar el componente seleccionado
+ RocketActions.NewStageAct.Newstage = Nueva etapa
+ RocketActions.NewStageAct.ttip.Newstage = Añadir una nueva etapa al diseño del cohete
+ RocketActions.ActBoosterstage = Etapa booster
+ RocketActions.MoveUpAct.Moveup = Mover hacia arriba
+ RocketActions.MoveUpAct.ttip.Moveup = Mover este componente hacia arriba
+ RocketActions.MoveDownAct.Movedown = Mover hacia abajo
+ RocketActions.MoveDownAct.ttip.Movedown = Mover este componente hacia abajo
+
+ ! RocketPanel
+ RocketPanel.FigTypeAct.Sideview = Vista lateral
+ RocketPanel.FigTypeAct.ttip.Sideview = Vista lateral
+ RocketPanel.FigTypeAct.Backview = Vista desde atrás
+ RocketPanel.FigTypeAct.ttip.Backview = Vista trasera
+ RocketPanel.lbl.Motorcfg = Configuración del motor
+ RocketPanel.lbl.infoMessage = <html>Click para seleccionar Mayúsculas+click para seleccionar otro Doble-click to mostrar Click+arrastrar para mover
+
+
+ ! BasicFrame
+ BasicFrame.SimpleFileFilter1 = Todos los diseños de cohete(*.ork; *.rkt)
+ BasicFrame.SimpleFileFilter2 = Diseños OpenRocket (*.ork)
+ BasicFrame.SimpleFileFilter3 = Diseños RockSim (*.rkt)
+ BasicFrame.tab.Rocketdesign = Diseños de cohete
+ BasicFrame.tab.Flightsim = Simulaciones de vuelo
+ BasicFrame.title.Addnewcomp = Añadir un nuevo componente
+ BasicFrame.item.Openrocketdesign = Abrir un diseño de cohete
+ BasicFrame.item.Openexamplerocketdesign = Abrir un ejemplo de diseño de cohete
+ BasicFrame.item.SavecurRocketdesign = Guardar el diseño actual
+ BasicFrame.item.SavecurRocketdesnewfile = Guardar el diseño actual como un nuevo documento
+ BasicFrame.item.Printpart = Imprimir un listado de componentes y un esquema de aleta
+ BasicFrame.item.Closedesign = Cerrar el diseño actual
+ BasicFrame.item.Quitprogram = Abandonar el programa
+ BasicFrame.menu.Rocketedt = Mostrando el cohete
+ BasicFrame.dlg.lbl1 = Diseño
+ BasicFrame.dlg.lbl2 = No se ha guardado
+ BasicFrame.dlg.lbl3 = ¿Quiere guardarlo?
+ BasicFrame.dlg.title = Diseño no guardado
+ BasicFrame.StageName.Sustainer = Cuerpo principal
+ BasicFrame.WarningDialog.txt1 = Mientras se abría, se encontraron los siguiente problemas
+ BasicFrame.WarningDialog.txt2 = Algunas configuraciones de diseño no pudieron cargarse correctamente.
+ BasicFrame.WarningDialog.title = Precauciones mientras se abre el archivo
+
+ ! Labels used in buttons of dialog windows
+ button.ok = OK
+ button.cancel = Borrar
+ button.close = Cerrar
+
+ ! Common labels used in buttons of dialog windows
+ dlg.but.ok = OK
+ dlg.but.cancel = Borrar
+ dlg.but.close = Cerrar
+
+ ! About Dialog
+ about.dlg.but.close = Cerrar
+ about.dlg.lbl.translation = Traducido al español por Tripoli Spain
+ about.dlg.lbl.transwebsite = http://www.tripoli-spain.org/
+
+ ! Bug Report dialog
+ bugreport.dlg.title = Report de error
+ bugreport.dlg.but.Sendbugreport = Enviar un report de error
+ bugreport.dlg.but.Sendbugreport.Ttip = Enviar automáticamente un report de error a los creadores de Open Rocket
+ bugreport.dlg.successmsg1 = Report de error enviado con éxito
+ bugreport.dlg.successmsg2 = Gracias por ayudar a mejorar Open Rocket !
+ bugreport.dlg.successmsg3 = Report de error enviado
+ bugreport.dlg.connectedInternet = <html>Si está conectado a Internet, haga simplemente Clik <em>Enviar report de errores</em>.
+ bugreport.dlg.otherwise = De otro modo, envíe el texto debajo a la dirección:
+ bugreport.lbl.Theinformation = La información de arriba puede incluirse en un report de error público. Asegúrese de que no contiene ninguna información que usted no quiere hacer pública.
+ bugreport.dlg.failedmsg1 = OpenRocket fue incapaz de enviar el report de error:
+ bugreport.dlg.failedmsg2 = Por favor envíe manualmente el report a
+ bugreport.dlg.failedmsg3 = Error enviando el report
+ bugreport.reportDialog.txt = <html><b>Puede enviar un report de error en OpenRocket rellenando el formulario de abajo y enviándolo.</b><br>También puede reportar errores e incluir adjuntos sobre el proyecto de Web.
+ bugreport.reportDialog.txt2 = <html><b>Por favor incluya una breve descripción de lo que estaba haciendo cuando ocurrió la excepción.</b>
+
+
+ ! Debug log dialog
+ debuglogdlg.but.clear = Limpiar
+ debuglogdlg.OpenRocketdebuglog = Fichero de error de Open Rocket
+ debuglogdlg.Displayloglines = Mostrar líneas de registro:
+ debuglogdlg.Follow = Seguir
+ debuglogdlg.col.Time = Hora
+ debuglogdlg.col.Level = Nivel
+ debuglogdlg.col.Location = Situación
+ debuglogdlg.col.Message = Mensaje
+ debuglogdlg.lbl.Loglinenbr = Número de línea de registro:
+ debuglogdlg.lbl.Time = Hora:
+ debuglogdlg.lbl.Level = Nivel:
+
+
+ ! Edit Motor configuration dialog
+ edtmotorconfdlg.but.removemotor = Quitar motor
+ edtmotorconfdlg.but.Selectmotor = Seleccionar motor
+ edtmotorconfdlg.but.Removeconfiguration = Quitar configuración
+ edtmotorconfdlg.but.Newconfiguration = Nueva configuración
+ edtmotorconfdlg.lbl.Motormounts = <html><b>Porta motor:</b>
+ edtmotorconfdlg.title.Editmotorconf = Mostrar las configuraciones de motor
+ edtmotorconfdlg.selectcomp = <html>Seleccionar que componentes tienen la función de porta motor:
+ edtmotorconfdlg.lbl.Motorconfig = <html><b>Configuraciones del motor:</b>
+ edtmotorconfdlg.lbl.Configname = Nombre de la configuración:
+ edtmotorconfdlg.lbl.Leavenamedefault = Dejar vacío el nombre por defecto.
+
+ ! Example design dialog
+ exdesigndlg.but.open = Abrir
+ exdesigndlg.lbl.Selectexample = Al abrir seleccione ejemplos de diseños:
+ exdesigndlg.lbl.Openexampledesign = Abra un diseño como ejemplo
+ exdesigndlg.lbl.Exampledesignsnotfound = Los ejemplos de diseño podrían no hallarse.
+ exdesigndlg.lbl.Examplesnotfound = Ejemplos no hallados
+
+ ! Print panel dialog
+ printdlg.but.saveaspdf = Guardar como PDF
+ printdlg.but.preview = Previsualizar
+ printdlg.but.settings = Configuraciones
+
+ ! Material edit panel
+ matedtpan.but.new = Nuevo
+ matedtpan.but.edit = Editar
+ matedtpan.but.delete = Borrar
+ matedtpan.but.revertall = Invertir todo
+ matedtpan.col.Material = Material
+ matedtpan.col.Type = Tipo
+ matedtpan.col.Density = Densidad
+ matedtpan.col.but.ttip.New = Añadir un nuevo material
+ matedtpan.title.Addcustmaterial = Añadir un material hecho en casa
+ matedtpan.but.ttip.edit = Editar un material existente
+ matedtpan.title.Editmaterial = Editar material
+ matedtpan.title2.Editmaterial = Los materiales construidos no se pueden modificar
+ matedtpan.but.ttip.delete = Borrar un material pre definido
+ matedtpan.but.ttip.revertall = Borrar todos los materiales predefinidos
+ matedtpan.title.Deletealluser-defined = ¿Borrar todos los materiales predefinidos?
+ matedtpan.title.Revertall = ¿Revertir todo?
+ matedtpan.lbl.edtmaterials = <html><i>Editar materiales que no afectaran los diseños existentes.</i>
+
+ !MaterialModel
+ MaterialModel.title.Material = Material
+ MaterialModel.title.Defcustmat = Definir material hecho en casa
+
+
+ ! Preference dialog
+ pref.dlg.but.add = Agregar
+ pref.dlg.but.reset = Reiniciar
+ pref.dlg.but.checknow = Comprobar ahora
+ pref.dlg.but.defaultmetric = Sistema Métrico por defecto
+ pref.dlg.but.defaultimperial = Sistema Imperial por defecto
+ pref.dlg.title.Preferences = Preferencias
+ pref.dlg.tab.Units = Unidades
+ pref.dlg.tab.Defaultunits = Unidades por defecto
+ pref.dlg.tab.Materials = Materiales
+ pref.dlg.tab.Custommaterials = Materiales hechos en casa
+ pref.dlg.tab.Options = Opciones
+ pref.dlg.tab.Miscellaneousoptions = Otras opciones
+ pref.dlg.lbl.Positiontoinsert = Posición para introducir nuevos componentes del fuselaje:
+ pref.dlg.lbl.Confirmdeletion = Confirmar borrar simulaciones:
+ pref.dlg.lbl.User-definedthrust = Curvas de potencia definidas por el usuario:
+ pref.dlg.Allthrustcurvefiles = Todos los ficheros de curvas de potencia (*.eng; *.rse; *.zip; directorios)
+ pref.dlg.RASPfiles = Ficheros de motor RASP (*.eng)
+ pref.dlg.RockSimfiles = Ficheros de motor Rocksim (*.rse)
+ pref.dlg.ZIParchives = Archivos ZIP (*.zip)
+ pref.dlg.checkbox.Checkupdates = Comprobar actualizaciones de software al arrancar
+ pref.dlg.ttip.Checkupdatesnow = Comprobar actualizaciones de software ahora
+ pref.dlg.lbl.Selectprefunits = Seleccione sus unidades preferidas:
+ pref.dlg.lbl.Rocketdimensions = Dimensiones del cohete:
+ pref.dlg.lbl.Linedensity = Densidad:
+ pref.dlg.lbl.Motordimensions = Dimensiones del motor:
+ pref.dlg.lbl.Surfacedensity = Densidad superficial:
+ pref.dlg.lbl.Distance = Distancia:
+ pref.dlg.lbl.Bulkdensity = Densidad media:
+ pref.dlg.lbl.Velocity = Velocidad:
+ pref.dlg.lbl.Surfaceroughness = Rugosidad de la superficie:
+ pref.dlg.lbl.Acceleration = Aceleración:
+ pref.dlg.lbl.Area = Área:
+ pref.dlg.lbl.Mass = Masa:
+ pref.dlg.lbl.Angle = Ángulo:
+ pref.dlg.lbl.Force = Fuerza:
+ pref.dlg.lbl.Rollrate = Valor de giro:
+ pref.dlg.lbl.Totalimpulse = Impulso total:
+ pref.dlg.lbl.Temperature = Temperatura:
+ pref.dlg.lbl.Momentofinertia = Momento de inercia:
+ pref.dlg.lbl.Pressure = Presión:
+ pref.dlg.lbl.Stability = Estabilidad:
+ pref.dlg.lbl.effect1 = Los cambios tendrán efecto cuando se abra nuevamente una ventana.
+ pref.dlg.lbl.Checkingupdates = Comprobando actualizaciones...
+ pref.dlg.lbl.msg1 = Ocurrió un error mientras se comunicaba con el servidor.
+ pref.dlg.lbl.msg2 = Incapaz de recuperar la información de las actualizaciones
+ pref.dlg.lbl.msg3 = Usted está utilizando la última versión de Open Rocket.
+ pref.dlg.lbl.msg4 = No hay actualizaciones disponibles
+ pref.dlg.PrefChoiseSelector1 = Pregunte siempre
+ pref.dlg.PrefChoiseSelector2 = Insertar en medio
+ pref.dlg.PrefChoiseSelector3 = Añadir al final
+ pref.dlg.PrefBooleanSelector1 = Borrar
+ pref.dlg.PrefBooleanSelector2 = Confirmar
+ pref.dlg.Add = Añadir
+ pref.dlg.DescriptionArea.Adddirectories = Añadir directorios, RASP archivos de motor (*.eng), RockSim archivos de motor (*.rse) o ZIP archivos separados por punto y coma (;) para cargar curvas de empuje externas. Los cambios tendrán efecto la próxima vez que abra OpenRocket.
+
+
+ ! Simulation edit dialog
+ simedtdlg.but.runsimulation = Lanzar la simulación
+ simedtdlg.but.resettodefault = Restaurar por defecto
+ simedtdlg.but.add = Agregar
+ simedtdlg.but.remove = Quitar
+ simedtdlg.title.Editsim = Mostrar la simulación
+ simedtdlg.lbl.Simname = Nombre de la simulación
+ simedtdlg.tab.Launchcond = Condiciones del lanzamiento
+ simedtdlg.tab.Simopt = Opciones de simulación
+ simedtdlg.tab.Plotdata = Datos del plotter
+ simedtdlg.tab.Exportdata = Exportar datos
+ simedtdlg.lbl.Motorcfg = Configuración del motor:
+ simedtdlg.lbl.ttip.Motorcfg = Seleccionar la configuración del motor a usar
+ simedtdlg.combo.ttip.motorconf = Seleccionar la configuración del motor a usar
+ simedtdlg.lbl.Wind = Viento
+ simedtdlg.lbl.Averwindspeed = Velocidad media del viento
+ simedtdlg.lbl.ttip.Averwindspeed = Velocidad media del viento en relación al suelo
+ simedtdlg.lbl.Stddeviation = Desviación standard
+ simedtdlg.lbl.ttip.Stddeviation = <html>Desviación standard de la velocidad del viento.<br>La velocidad del viento se encuentra dentro del doble de la desviación media en un 95% del tiempo.
+ simedtdlg.lbl.Turbulenceintensity = Intensidad de la turbulencia
+ simedtdlg.lbl.ttip.Turbulenceintensity1 = <html>La intensidad de la turbulencia es la desviación standard dividida por la velocidad media del viento.<br>
+ simedtdlg.lbl.ttip.Turbulenceintensity2 = Valores típicos en el campo
+ simedtdlg.lbl.ttip.Turbulenceintensity3 = a
+ simedtdlg.border.Atmoscond = Condiciones atmosféricas
+ simedtdlg.checkbox.InterStdAtmosphere = Usa los patrones de Atmosfera Internacional
+ simedtdlg.checkbox.ttip.InterStdAtmosphere1 = <html>Seleccionar para usar el modelo de la International Standard Atmosphere model.<br>Este modelo tiene una temperatura de
+ simedtdlg.checkbox.ttip.InterStdAtmosphere2 = Y una presión de
+ simedtdlg.checkbox.ttip.InterStdAtmosphere3 = A nivel del mar.
+ simedtdlg.lbl.Temperature = Temperatura:
+ simedtdlg.lbl.ttip.Temperature = Temperatura en el lugar del lanzamiento.
+ simedtdlg.lbl.Pressure = Presión:
+ simedtdlg.lbl.ttip.Pressure = Presión atmosférica en el lugar del lanzamiento
+ simedtdlg.lbl.Launchsite = Lugar del lanzamiento
+ simedtdlg.lbl.Latitude = Latitud:
+ simedtdlg.lbl.ttip.Latitude = <html>La latitud del lugar de lanzamiento afecta la atracción terrestre.<br>Los valores positivos se dan en el hemisferio Norte, los negativos en el hemisferio Sur.
+ simedtdlg.lbl.Altitude = Altitud:
+ simedtdlg.lbl.ttip.Altitude = <html>Los valores por encima del nivel del mar.<br>Esto afecta la posición del modelo atmosférico.
+ simedtdlg.border.Launchrod = Varilla para lanzar
+ simedtdlg.lbl.Length = Longitud:
+ simedtdlg.lbl.ttip.Length = Longitud de la varilla de lanzamiento
+ simedtdlg.lbl.Angle = Ángulo:
+ simedtdlg.lbl.ttip.Angle = El ángulo de la varilla de lanzamiento con la vertical.
+ simedtdlg.lbl.Direction = Dirección:
+ simedtdlg.lbl.ttip.Direction1 = <html>Dirección de la varilla de lanzamiento relativa al viento.<br>
+ simedtdlg.lbl.ttip.Direction2 = Hacia el viento
+ simedtdlg.lbl.ttip.Direction3 = A favor del viento
+ simedtdlg.border.Simopt = Opciones del simulador
+ simedtdlg.lbl.Calcmethod = Método de cálculo
+ simedtdlg.lbl.ttip.Calcmethod = <html>El método Barrowman extendido calcula las fuerzas aerodinámicas <br>Para las ecuaciones Barrowman extendidas para recibir mas componentes.
+ simedtdlg.lbl.ExtBarrowman = Barrowman Extendido
+ simedtdlg.lbl.Simmethod = Método de simulación:
+ simedtdlg.lbl.ttip.Simmethod1 = <html>El simulador de seis-grados-de-libertad permite al cohete una total libertad durante el vuelo.<br>
+ simedtdlg.lbl.ttip.Simmethod2 = La integración mejora usando un 4<sup>th</sup> ordenar Runge-Kutta 4 integración numérica.
+ simedtdlg.lbl.Timestep = Duración de la etapa
+ simedtdlg.lbl.ttip.Timestep1 = <html>Tiempo entre etapas de simulación.<br>Un tiempo mas corto de etapa origina una simulación mas exacta pero mas lenta.<br>
+ simedtdlg.lbl.ttip.Timestep2 = The 4<sup>th</sup> ordenar el método de simulación es bastante preciso con un tiempo de etapa de
+ simedtdlg.but.ttip.resettodefault = Restituir el tiempo de etapa a su valor por defecto (
+ simedtdlg.border.Simlist = Oyentes del simulador
+ simedtdlg.txt.longA1 = <html><i>Oyentes del simulador</i> es una prestación avanzada que permite al código escrito del usuario oír e interaccionar con la simulación.
+ simedtdlg.txt.longA2 = Para detalles de esta prestación de los oyentes, vea la documentación técnica del Open Rocket.
+ simedtdlg.lbl.Curlist = Oyentes actuales
+ simedtdlg.lbl.Addsimlist = Añadir la audición del simulador
+ simedtdlg.lbl.Noflightdata = No hay datos disponibles del vuelo.
+ simedtdlg.lbl.runsimfirst = Por favor accione la simulación primero.
+ simedtdlg.chart.Simflight = Vuelo simulado
+ simedtdlg.dlg.Simres = Resultados de la simulación
+ simedtdlg.IntensityDesc.None = Ninguno
+ simedtdlg.IntensityDesc.Verylow = Muy pesado
+ simedtdlg.IntensityDesc.Low = Pesado
+ simedtdlg.IntensityDesc.Medium = Medio
+ simedtdlg.IntensityDesc.High = Alto
+ simedtdlg.IntensityDesc.Veryhigh = Muy alto
+ simedtdlg.IntensityDesc.Extreme = Extremo
+
+
+
+ ! Simulation Panel
+ simpanel.but.newsimulation = Nueva simulación
+ simpanel.but.editsimulation = Editar la simulación
+ simpanel.but.runsimulations = Lanzar las simulaciones
+ simpanel.but.deletesimulations = Borrar las simulaciones
+ simpanel.but.plotexport = Exportar / Plot
+ simpanel.but.ttip.newsimulation = Añadir una nueva simulación
+ simpanel.but.ttip.editsim = Mostrar la simulación seleccionada
+ simpanel.but.ttip.runsimu = Accionar de nuevo las simulaciones seleccionadas
+ simpanel.but.ttip.deletesim = Borrar las simulaciones seleccionadas
+ simpanel.checkbox.donotask = No preguntarme de nuevo
+ simpanel.lbl.defpref = Puede cambiar la operación por defecto por las preferencias
+ simpanel.dlg.lbl.DeleteSim1 = ¿Borrar las simulaciones seleccionadas?
+ simpanel.dlg.lbl.DeleteSim2 = <html><i>Esta operación no puede deshacerse.</i>
+ simpanel.dlg.lbl.DeleteSim3 = Borrar las simulaciones
+ simpanel.col.Name = Nombre
+ simpanel.col.Motors = Motores
+ simpanel.col.Apogee = Apogeo
+ simpanel.col.Maxvelocity = Velocidad máxima
+ simpanel.col.Maxacceleration = Aceleración máxima
+ simpanel.col.Timetoapogee = Tiempo hasta el apogeo
+ simpanel.col.Flighttime = Duración del vuelo
+ simpanel.col.Groundhitvelocity = Velocidad de llegada a tierra
+
+ ! SimulationRunDialog
+ SimuRunDlg.title.RunSim = Accionando simulaciones
+ SimuRunDlg.lbl.Running = Accionando
+ SimuRunDlg.lbl.Simutime = Duración de la simulación:
+ SimuRunDlg.lbl.Altitude = Altitud:
+ SimuRunDlg.lbl.Velocity = Velocidad:
+ SimuRunDlg.msg.Unabletosim = Incapaz de simular:
+ SimuRunDlg.msg.errorOccurred = Ha ocurrido un error durante la simulación:
+ SimuRunDlg.msg.AnException1 = Ha ocurrido una excepción durante la simulación:
+ SimuRunDlg.msg.AnException2 = Por favor anote esto debajo como un error con todos los detalles.
+ SimuRunDlg.msg.AssertionError1 = Se ha producido un error informático durante la simulación.
+ SimuRunDlg.msg.AssertionError2 = Por favor anote esto debajo como un error con todos los detalles.
+ SimuRunDlg.msg.unknownerror1 = Se ha detectado un error desconocido durante la simulación.
+ SimuRunDlg.msg.unknownerror2 = El programa puede ser inestable, Guarde todos sus diseños y reinicie OpenRocket ahora!
+
+
+
+ ! SimulationExportPanel
+ SimExpPan.desc = Documentos separados por comas (*.csv)
+ SimExpPan.border.Vartoexport = Variables para exportar
+ SimExpPan.but.Selectall = Seleccione todo
+ SimExpPan.but.Selectnone = No seleccione nada
+ SimExpPan.border.Fieldsep = Separador de campo
+ SimExpPan.lbl.Fieldsepstr = Barra separador de campo
+ SimExpPan.lbl.longA1 = <html>Las barras para separar campos en el documento exportado.<br>
+ SimExpPan.lbl.longA2 = Use ',' Para valores separados por comas (CSV) file.
+ SimExpPan.checkbox.Includesimudesc = Incluye descripción de la simulación
+ SimExpPan.checkbox.ttip.Includesimudesc = Incluye un comentario en el inicio del documento describiendo la simulación.
+ SimExpPan.border.Comments = Comentarios
+ SimExpPan.checkbox.Includefielddesc = Incluye descripciones de campo
+ SimExpPan.checkbox.ttip.Includefielddesc = Incluye una línea de comentario con las descripciones de las variables exportadas.
+ SimExpPan.checkbox.Incflightevents = Incluye los eventos del vuelo
+ SimExpPan.checkbox.ttip.Incflightevents = Incluye una línea de comentario para cada evento del vuelo
+ SimExpPan.lbl.Commentchar = Carácter de comentario
+ SimExpPan.lbl.ttip.Commentchar = La característica(as) que marcan una línea de comentario.
+ SimExpPan.but.Exporttofile = Exportar al documento ...
+ SimExpPan.Fileexists.desc1 = Archivo \"
+ SimExpPan.Fileexists.desc2 = \" existe. Sobrescribir?
+ SimExpPan.Fileexists.title = El archivo existe
+ SimExpPan.ExportingVar.desc1 = Exportando una variable fuera de
+ SimExpPan.ExportingVar.desc2 = Exportando
+ SimExpPan.ExportingVar.desc3 = variables fuera de
+ SimExpPan.Col.Variable = Variable
+ SimExpPan.Col.Unit = Unidad
+
+ ! MotorPlot
+ MotorPlot.title.Motorplot = Curva del motor
+ MotorPlot.but.Select = Seleccionar la configuración del motor a usar
+ MotorPlot.Chart.Motorthrustcurve = Curva de empuje del motor
+ MotorPlot.Chart.Time = Tiempo / s
+ MotorPlot.Chart.Thrust = Empuje / N
+ MotorPlot.txt.Designation = Designación:
+ MotorPlot.txt.Manufacturer = Fabricante:
+ MotorPlot.txt.Type = Tipo:
+ MotorPlot.txt.Delays = Retardos:
+ MotorPlot.txt.Comment = Comentario:\n
+
+
+
+ ! Simulation plot panel
+ simplotpanel.lbl.Presetplotconf = Pre configuración del Plot:
+ simplotpanel.lbl.Xaxistype = Tipo de eje X:
+ simplotpanel.lbl.Unit = Unidad:
+ simplotpanel.lbl.Yaxistypes = Tipo de eje Y:
+ simplotpanel.lbl.Flightevents = Eventos del vuelo:
+ simplotpanel.but.All = Todo
+ simplotpanel.but.None = Ninguno
+ simplotpanel.but.NewYaxisplottype = Nuevo tipo de Eje Y del Plot
+ simplotpanel.but.Plotflight = Curva del vuelo
+ simplotpanel.lbl.Axis = Ejes:
+ simplotpanel.but.ttip.Removethisplot = Borrar esta curva
+ simplotpanel.Desc = Los datos según orden de tiempo serán impresos en el eje X si no hay tiempo
+ simplotpanel.OptionPane.lbl1 = Se permiten un máximo de 15 impresiones
+ simplotpanel.OptionPane.lbl2 = No puede añadirse la curva
+ simplotpanel.AUTO_NAME = Auto
+ simplotpanel.LEFT_NAME = Izquierda
+ simplotpanel.RIGHT_NAME = Derecha
+ simplotpanel.CUSTOM = Casero
+
+ ! Component add buttons
+ compaddbuttons.Bodycompandfinsets = Componentes del fuselaje y aletas
+ compaddbuttons.Nosecone = Ojiva
-compaddbuttons.Launchlug = Guía en el fuselaje
++compaddbuttons.Bodytube = Tubo del\nfuselaje
+ compaddbuttons.Transition = Transición
+ compaddbuttons.Trapezoidal = Trapezoidal
+ compaddbuttons.Elliptical = Elíptico
+ compaddbuttons.Freeform = Forma libre
-compaddbuttons.Innertube = Tubo interior
++compaddbuttons.Launchlug = Guía en el\nfuselaje
+ compaddbuttons.Innercomponent = Componente interior
-compaddbuttons.Shockcord = Tirante de suspensión
++compaddbuttons.Innertube = Tubo\ninterior
+ compaddbuttons.Coupler = Acoplador
+ compaddbuttons.Centeringring = Arandela\nde centraje
+ compaddbuttons.Bulkhead = Cámara
+ compaddbuttons.Engineblock = Retén\nde motor
+ compaddbuttons.Massobjects = Objeto masa
+ compaddbuttons.Parachute = Paracaídas
+ compaddbuttons.Streamer = Banderola
-Databases.materials.Creape paper = Cr\u00eape Papel
++compaddbuttons.Shockcord = Tirante de\nsuspensión
+ compaddbuttons.Masscomponent = Componente\nmasa
+ compaddbuttons.Donotaskmeagain = No me pregunte de nuevo
+ compaddbuttons.Selectcomppos = Seleccionar la posición del componente
+ compaddbuttons.lbl.Youcanchange = Puede cambiar la operación con las preferencias por defecto
+ compaddbuttons.lbl.insertcomp = ¿Inserta el componente despues del actual o como último?
+ compaddbuttons.askPosition.Inserthere = Inserte aquí
+ compaddbuttons.askPosition.Addtotheend = Añadir al final
+ compaddbuttons.askPosition.Cancel = Borrar
+
+ ! Component Analysis Dialog
+ componentanalysisdlg.componentanalysis = Análisis del componente
+ componentanalysisdlg.lbl.winddir = Dirección del viento:
+ componentanalysisdlg.TitledBorder.warnings = Advertencias:
+ componentanalysisdlg.ToggleBut.worst = Peor
+ componentanalysisdlg.lbl.angleofattack = Ángulo de ataque:
+ componentanalysisdlg.lbl.machnumber = Número Mach:
+ componentanalysisdlg.lbl.rollrate = Valor de giro:
+ componentanalysisdlg.lbl.activestages = Etapas activas:
+ componentanalysisdlg.lbl.motorconf = Configuración del Motor:
+ componentanalysisdlg.TabStability.Col = Componente
+ componentanalysisdlg.TabStability = Estabilidad
+ componentanalysisdlg.TabStability.ttip = Información de Estabilidad
+ componentanalysisdlg.dragTableModel.Col.Component = Componente
+ componentanalysisdlg.dragTableModel.Col.Pressure = <html>Presión C<sub>D</sub>
+ componentanalysisdlg.dragTableModel.Col.Base = <html>Base C<sub>D</sub>
+ componentanalysisdlg.dragTableModel.Col.friction = <html>Rozamiento C<sub>D</sub>
+ componentanalysisdlg.dragTableModel.Col.total = <html>Total C<sub>D</sub>
+ componentanalysisdlg.dragTabchar = Características de rozamiento
+ componentanalysisdlg.dragTabchar.ttip = Características de rozamiento
+ componentanalysisdlg.rollTableModel.Col.component = Componente
+ componentanalysisdlg.rollTableModel.Col.rollforc = Coeficiente de giro
+ componentanalysisdlg.rollTableModel.Col.rolldamp = Coeficiente de corrección de giro
+ componentanalysisdlg.rollTableModel.Col.total = <html>Total C<sub>l</sub>
+ componentanalysisdlg.rollTableModel = Dinámica de giro
+ componentanalysisdlg.rollTableModel.ttip = Dinámica de giro
+ componentanalysisdlg.println.closingmethod = Llamado método de cierre:
+ componentanalysisdlg.println.settingnam = CONFIGURANDO VALORES NAN
+ componentanalysisdlg.lbl.reflenght = Longitud de referencia:
+ componentanalysisdlg.lbl.refarea = Área de referencia:
+ !componentanalysisdlg.But.close =Close
+
+ ! Custom Material dialog
+ custmatdlg.title.Custommaterial = Material hecho en casa
+ custmatdlg.lbl.Materialname = Nombre del material:
+ custmatdlg.lbl.Materialtype = Tipo de material:
+ custmatdlg.lbl.Materialdensity = Densidad del material:
+ custmatdlg.checkbox.Addmaterial = Agregar este material a la base de datos
+
+
+ ! Ring Component Config
+ ringcompcfg.OuterRadius = Radio exterior
+ ringcompcfg.Automatic = Automático
+ ringcompcfg.InnerRadius = Radio interior
+ ringcompcfg.Thickness = Espesor
+ ringcompcfg.Length = Longitud
+ ringcompcfg.Positionrelativeto = Posición relativa a:
+ ringcompcfg.plus = plus
+ ringcompcfg.PositionValue = Valor de posición
+ ringcompcfg.Radialdistance = Distancia radial:
+ ringcompcfg.Distancefrom = Distancia desde la línea central del cohete
+ ringcompcfg.Radialdirection = Dirección radial:
+ ringcompcfg.radialdirectionfrom = En dirección radial desde la línea central del cohete
+ ringcompcfg.but.Reset = Reiniciar
+ ringcompcfg.but.Resetcomponant = Resituar el componente a la línea central del cohete
+ ringcompcfg.EngineBlock.desc = <html>Un <b>retén motor</b> Impide que el motor se desplace hacia delante dentro del tubo porta motor.<br><br>Para añadir un motor, cree un <b>tubo de fuselaje</b> o <b>dentro del tubo</b> y desígnelo como portamotor en el <em>Motor</em> tab.
+ ringcompcfg.note.desc = Nota: Un tubo interior no afectará la aerodinámica del cohete salvo que esté situado fuera del fuselaje.
+
+
+ ! Body Tube Config
+ BodyTubecfg.lbl.Bodytubelength = Longitud del tubo del fuselaje:
+ BodyTubecfg.lbl.Outerdiameter = Diámetro exterior:
+ BodyTubecfg.lbl.Innerdiameter = Diámetro interior:
+ BodyTubecfg.lbl.Wallthickness = Espesor de la pared:
+ BodyTubecfg.tab.General = General
+ BodyTubecfg.tab.Generalproperties = Propiedades generales
+ BodyTubecfg.tab.Motor = Motor
+ BodyTubecfg.tab.Motormountconf = Configuración del porta motor
+ BodyTubecfg.checkbox.Automatic = Automático
+ BodyTubecfg.checkbox.Filled = Archivado
+
+ ! FinSetConfig
+ FinSetConfig.tab.Fintabs = Raíz de aleta
+ FinSetConfig.tab.Through-the-wall = Raíces de aleta a través de la pared
+ FinSetConfig.but.Converttofreeform = Convertir a forma libre
+ FinSetConfig.but.Converttofreeform.ttip = Convertir esta forma de aleta a una forma libre
+ FinSetConfig.Convertfinset = Convertir la configuración de aleta
+ FinSetConfig.but.Splitfins = Separar las aletas
+ FinSetConfig.but.Splitfins.ttip = Dividir la configuración de aleta en varias separadas
+ FinSetConfig.lbl.Through-the-wall = Raíces de aleta a través de la pared:
+ FinSetConfig.lbl.Tablength = Longitud de la raíz:
+ FinSetConfig.ttip.Tablength = La longitud de la raíz de aleta.
+ FinSetConfig.lbl.Tabheight = Altura de la raíz:
+ FinSetConfig.ttip.Tabheight = Envergadura en altura de la raíz de aleta.
+ FinSetConfig.lbl.Tabposition = Posición de la raíz:
+ FinSetConfig.ttip.Tabposition = Posición de la raíz de aleta.
+ FinSetConfig.lbl.relativeto = Relativo a
+
+ ! MotorDatabaseLoadingDialog
+ MotorDbLoadDlg.title = Cargando motores
+ MotorDbLoadDlg.Loadingmotors = Cargando motores...
+
+ ! RocketConfig
+ RocketCfg.lbl.Designname = Nombre del proyecto:
+ RocketCfg.lbl.Designer = Proyectista:
+ RocketCfg.lbl.Comments = Comentarios:
+ RocketCfg.lbl.Revisionhistory = Histórico de la revisión:
+ RocketCfg.lbl.Material = Material:
+
+ ! ShockCordConfig
+ ShockCordCfg.lbl.Shockcordlength = Longitud del tirante de suspensión
+
+ ! RocketComponentConfig
+ RocketCompCfg.lbl.Componentname = Nombre del componente:
+ RocketCompCfg.ttip.Thecomponentname = El nombre del componente.
+ RocketCompCfg.tab.Override = Elegir
+ RocketCompCfg.tab.MassandCGoverride = Elección de estimación de Masa y CG
+ RocketCompCfg.tab.Figure = Figura
+ RocketCompCfg.tab.Figstyleopt = Opciones de estilo de la figura
+ RocketCompCfg.tab.Comment = Comentarios
+ RocketCompCfg.tab.Specifyacomment = Especifique un comentario para el componente
+ RocketCompCfg.lbl.Mass = Masa:
+ RocketCompCfg.lbl.Componentmass = Masa del componente:
+ RocketCompCfg.lbl.overriddento = (Elegido para
+ RocketCompCfg.lbl.overriddenby = (Elegido por
+ RocketCompCfg.lbl.Componentmaterial = Material del componente:
+ RocketCompCfg.lbl.Componentfinish = Acabado:
+ RocketCompCfg.lbl.ttip.componentmaterialaffects = El material del componente afecta su peso.
+ RocketCompCfg.combo.ttip.componentmaterialaffects = El material del componente afecta su peso.
+ RocketCompCfg.lbl.longA1 = <html>El acabado del componente afecta su coeficiente de rozamiento.<br>
+ RocketCompCfg.lbl.longA2 = El valor indicado es el promedio de la rugosidad en altura de la superficie.
+ RocketCompCfg.but.Setforall = Aplicar a todos
+ RocketCompCfg.but.ttip.Setforall = Aplicar este acabado a todos los componentes del cohete.
+ RocketCompCfg.lbl.Overridemassorcenter = Elegir la masa o el CG del
+ RocketCompCfg.checkbox.Overridemass = Elegir la masa:
+ RocketCompCfg.checkbox.Overridecenterofgrav = Elegir el CG:
+ RocketCompCfg.checkbox.OverridemassandCG = Elegir la masa y el CG de todos los subcomponentes
+ RocketCompCfg.lbl.longB1 = <html>La masa elegida no incluye los motores.<br>
+ RocketCompCfg.lbl.longB2 = El CG se mide desde el extremo frontal del
+ RocketCompCfg.lbl.Commentsonthe = Comentarios sobre
+ RocketCompCfg.lbl.Figurestyle = Estilo de figura:
+ RocketCompCfg.lbl.Componentcolor = Color del componente:
+ RocketCompCfg.lbl.Choosecolor = Elija color
+ RocketCompCfg.checkbox.Usedefaultcolor = Use color por defecto
+ RocketCompCfg.lbl.Complinestyle = Estilo de línea del componente:
+ RocketCompCfg.but.Saveasdefstyle = Guarde como estilo por defecto
+ RocketCompCfg.lbl.Diameter = Diámetro:
+ RocketCompCfg.lbl.Length = Longitud:
+ RocketCompCfg.lbl.Thickness = Espesor:
+ RocketCompCfg.checkbox.Endcapped = Extremo troncado
+ RocketCompCfg.ttip.Endcapped = Si el extremo del hombro está troncado.
+ RocketCompCfg.title.Noseconeshoulder = Hombro de la ojiva
+ RocketCompCfg.title.Aftshoulder = Trasera del hombro
+ RocketCompCfg.border.Foreshoulder = Hombro visible
+ !RocketCompCfg.lbl.Length = Length:
+
+ ! BulkheadConfig
+ BulkheadCfg.tab.Radius = Radio:
+ BulkheadCfg.tab.Thickness = Espesor:
+ BulkheadCfg.tab.General = General
+ BulkheadCfg.tab.Generalproperties = Propiedades generales
+
+ !CenteringRingConfig
+ CenteringRingCfg.tab.Outerdiam = Diámetro exterior:
+ CenteringRingCfg.tab.Innerdiam = Diámetro interior:
+ CenteringRingCfg.tab.Thickness = Espesor:
+ CenteringRingCfg.tab.General = General
+ CenteringRingCfg.tab.Generalproperties = Propiedades generales
+
+ !ComponentConfigDialog
+ ComponentCfgDlg.configuration = configuración
+ ComponentCfgDlg.Modify = Modificar
+
+ !EllipticalFinSetConfig
+ EllipticalFinSetCfg.Nbroffins = Número de aletas:
+ EllipticalFinSetCfg.Rotation = Rotación:
+ EllipticalFinSetCfg.Fincant = Canto de aleta:
+ EllipticalFinSetCfg.Rootchord = Anclaje de la raíz:
+ EllipticalFinSetCfg.Height = Altura:
+ EllipticalFinSetCfg.Positionrelativeto = Posición relativa a:
+ EllipticalFinSetCfg.plus = plus
+ EllipticalFinSetCfg.FincrossSection = Sección de corte de la aleta:
+ EllipticalFinSetCfg.Thickness = Espesor:
+ EllipticalFinSetCfg.General = General
+ EllipticalFinSetCfg.Generalproperties = Propiedades generales
+ EllipticalFinSetCfg.ttip.Fincant = Ángulo que forma el canto de la aleta con respecto al fuselaje.
+
+ !FreeformFinSetConfig
+ FreeformFinSetCfg.tab.General = General
+ FreeformFinSetCfg.tab.ttip.General = Propiedades generales
+ FreeformFinSetCfg.tab.Shape = Forma
+ FreeformFinSetCfg.tab.ttip.Finshape = Forma de la aleta
+ FreeformFinSetCfg.lbl.Numberoffins = Número de aletas:
+ FreeformFinSetCfg.lbl.Finrotation = Rotación de la aleta:
+ FreeformFinSetCfg.lbl.Fincant = Canto de la aleta:
+ FreeformFinSetCfg.lbl.ttip.Fincant = Angulo que el canto de las aletas forman con respecto al fuselaje.
+ FreeformFinSetCfg.lbl.Posrelativeto = Posición relativa a:
+ FreeformFinSetCfg.lbl.plus = plus
+ FreeformFinSetCfg.lbl.FincrossSection = Sección de la aleta:
+ FreeformFinSetCfg.lbl.Thickness = Espesor:
+
+ !InnerTubeConfig
+ InnerTubeCfg.tab.Motor = Motor
+ InnerTubeCfg.tab.ttip.Motor = Configuración del porta motor
+ InnerTubeCfg.tab.Cluster = Cluster
+ InnerTubeCfg.tab.ttip.Cluster = Configuración del cluster
+ InnerTubeCfg.tab.Radialpos = Posición radial
+ InnerTubeCfg.tab.ttip.Radialpos = Posición radial
+ InnerTubeCfg.lbl.Selectclustercfg = Elija la configuración del cluster:
+ InnerTubeCfg.lbl.TubeSep = Separación del tubo:
+ InnerTubeCfg.lbl.ttip.TubeSep = La separación de los tubos, 1.0 = tocándose uno a otro
+ InnerTubeCfg.lbl.Rotation = Rotación:
+ InnerTubeCfg.lbl.ttip.Rotation = Configuración del ángulo de rotación del cluster
+ InnerTubeCfg.lbl.Rotangle = Angulo de rotación de la configuración del cluster
+ InnerTubeCfg.but.Splitcluster = Split cluster
+ InnerTubeCfg.lbl.longA1 = <html>Split del cluster dentro de componentes separados.<br>
+ InnerTubeCfg.lbl.longA2 = Esto también duplica todos los componentes unidos a este tubo interior.
+ InnerTubeCfg.but.Resetsettings = Reiniciar configuración
+ InnerTubeCfg.but.ttip.Resetsettings = Reiniciar la separación y la rotación a valores predeterminados
+
+ ! LaunchLugConfig
+ LaunchLugCfg.lbl.Length = Longitud:
+ LaunchLugCfg.lbl.Outerdiam = Diámetro exterior:
+ LaunchLugCfg.lbl.Innerdiam = Diámetro interior:
+ LaunchLugCfg.lbl.Thickness = Espesor:
+ LaunchLugCfg.lbl.Radialpos = Posición radial:
+ LaunchLugCfg.lbl.Posrelativeto = Posición relativa a:
+ LaunchLugCfg.lbl.plus = plus
+ LaunchLugCfg.tab.General = General
+ LaunchLugCfg.tab.Generalprop = Propiedades generales
+
+ ! MassComponentConfig
+ MassComponentCfg.lbl.Mass = Masa
+ MassComponentCfg.lbl.Length = Longitud
+ MassComponentCfg.lbl.Diameter = Diámetro
+ MassComponentCfg.lbl.PosRelativeto = Posición relativa a:
+ MassComponentCfg.lbl.plus = plus
+ MassComponentCfg.tab.General = General
+ MassComponentCfg.tab.ttip.General = Propiedades generales
+ MassComponentCfg.tab.Radialpos = Posición radial
+ MassComponentCfg.tab.ttip.Radialpos = Configuración de la posición radial
+ MassComponentCfg.lbl.Radialdistance = Distancia radial:
+ MassComponentCfg.lbl.Radialdirection = Dirección radial:
+ MassComponentCfg.but.Reset = Reiniciar
+
+ ! MotorConfig
+ MotorCfg.checkbox.compmotormount = Este componente es un porta motor
+ MotorCfg.lbl.Motorcfg = Configuración del motor:
+ MotorCfg.but.New = Nuevo
+ MotorCfg.lbl.Currentmotor = Motor actual:
+ MotorCfg.lbl.Motoroverhang = Sobresalida del motor:
+ MotorCfg.lbl.Ignitionat = Encendido en:
+ MotorCfg.lbl.plus = plus
+ MotorCfg.lbl.seconds = segundos
+ MotorCfg.lbl.longA1 = El diseño actual tiene solo una etapa.
+ MotorCfg.lbl.longA2 = Pueden agregarse etapas haciendo clic \"Nueva etapa\".
+ MotorCfg.lbl.longB1 = El diseño actual tiene
+ MotorCfg.lbl.longB2 = etapas.
+ MotorCfg.but.Selectmotor = Seleccionar motor
+ MotorCfg.but.Removemotor = Quitar motor
+ MotorCfg.lbl.motorLabel = Ninguno
+
+ ! NoseConeConfig
+ NoseConeCfg.lbl.Noseconeshape = Forma de la ojiva:
+ NoseConeCfg.lbl.Shapeparam = Parámetros de la forma:
+ NoseConeCfg.lbl.Noseconelength = Longitud de la ojiva:
+ NoseConeCfg.lbl.Basediam = Diámetro de la base:
+ NoseConeCfg.checkbox.Automatic = Automático
+ NoseConeCfg.lbl.Wallthickness = Espesor de la pared:
+ NoseConeCfg.checkbox.Filled = Archivado
+ NoseConeCfg.tab.General = General
+ NoseConeCfg.tab.ttip.General = Propiedades generales
+ NoseConeCfg.tab.Shoulder = Hombro
+ NoseConeCfg.tab.ttip.Shoulder = Propiedades del hombro
+
+ ! ParachuteConfig
+ ParachuteCfg.lbl.Canopy = Campana:
+ ParachuteCfg.lbl.Diameter = Diámetro:
+ ParachuteCfg.lbl.Material = Material:
+ ParachuteCfg.combo.MaterialModel = El material del componente afecta su peso.
+ ParachuteCfg.lbl.longA1 = <html>Drag coeficiente C<sub>D</sub>:
+ ParachuteCfg.lbl.longB1 = <html>Coeficiente de rozamiento relativo al área total del paracaídas.<br>
+ ParachuteCfg.lbl.longB2 = Un mas alto coeficiente de rozamiento genera un valor de descenso mas lento.
+ ParachuteCfg.lbl.longB3 = Un valor típico para los paracaídas es 0,8.
+ ParachuteCfg.but.Reset = Reiniciar
+ ParachuteCfg.lbl.Shroudlines = Cuerdas:
+ ParachuteCfg.lbl.Numberoflines = Número de cuerdas:
+ ParachuteCfg.lbl.Linelength = Longitud de cuerda:
+ ParachuteCfg.lbl.Material = Material:
+ ParachuteCfg.lbl.Posrelativeto = Posición relativa a:
+ ParachuteCfg.lbl.plus = plus
+ ParachuteCfg.lbl.Packedlength = Longitud empaquetado:
+ ParachuteCfg.lbl.Packeddiam = Diámetro del empaquetado:
+ ParachuteCfg.lbl.Deploysat = Despliegue en:
+ ParachuteCfg.lbl.seconds = segundos
+ ParachuteCfg.lbl.Altitude = Altitud:
+ ParachuteCfg.tab.General = General
+ ParachuteCfg.tab.ttip.General = Propiedades generales
+ ParachuteCfg.tab.Radialpos = Posición radial
+ ParachuteCfg.tab.ttip.Radialpos = Configuración de la posición radial
+ ParachuteCfg.lbl.Radialdistance = Distancia radial:
+ ParachuteCfg.lbl.Radialdirection = Dirección radial:
+ ParachuteCfg.but.Reset = Reiniciar
+
+ ! ShockCordConfig
+ ShockCordCfg.lbl.Shockcordlength = Longitud del tirante de suspensión
+ ShockCordCfg.lbl.Shockcordmaterial = Material del tirante de suspensión:
+ ShockCordCfg.lbl.Posrelativeto = Posición relativa a:
+ ShockCordCfg.lbl.plus = plus
+ ShockCordCfg.lbl.Packedlength = Longitud del empaquetado:
+ ShockCordCfg.lbl.Packeddiam = Diámetro del empaquetado:
+ ShockCordCfg.tab.General = General
+ ShockCordCfg.tab.ttip.General = Propiedades generales
+
+ !SleeveConfig
+ SleeveCfg.tab.Outerdiam = Diámetro exterior:
+ SleeveCfg.tab.Innerdiam = Diámetro interior:
+ SleeveCfg.tab.Wallthickness = Espesor de la pared:
+ SleeveCfg.tab.Length = Longitud:
+ SleeveCfg.tab.General = General
+ SleeveCfg.tab.Generalproperties = Propiedades generales
+
+ ! StreamerConfig
+ StreamerCfg.lbl.Striplength = Longitud de la cinta:
+ StreamerCfg.lbl.Stripwidth = Ancho de la cinta:
+ StreamerCfg.lbl.Striparea = Área de la cinta:
+ StreamerCfg.lbl.Aspectratio = Relación de aspecto:
+ StreamerCfg.lbl.Material = Material:
+ StreamerCfg.combo.ttip.MaterialModel = El material del componente afecta su peso.
+ StreamerCfg.lbl.longA1 = <html>Coeficiente de fricción C<sub>D</sub>:
+ StreamerCfg.lbl.longB1 = <html>Coeficiente de fricción relativo al área total de la banderola.<br>
+ StreamerCfg.lbl.longB2 = Un mayor coeficiente de fricción genera un valor de descenso mas lento.
+ StreamerCfg.lbl.Automatic = Automático
+ StreamerCfg.lbl.longC1 = El coeficiente de Fricción es relativo al área de la banderola.
+ StreamerCfg.lbl.Posrelativeto = Posición relativa a:
+ StreamerCfg.lbl.plus = plus
+ StreamerCfg.lbl.Packedlength = Longitud de empaquetado:
+ StreamerCfg.lbl.Packeddiam = Diámetro de empaquetado:
+ StreamerCfg.lbl.Deploysat = Despliegue a:
+ StreamerCfg.lbl.seconds = segundos
+ StreamerCfg.lbl.Altitude = Altitud:
+ StreamerCfg.tab.General = General
+ StreamerCfg.tab.ttip.General = Propiedades generales
+ StreamerCfg.tab.Radialpos = Posición radial
+ StreamerCfg.tab.ttip.Radialpos = Configuración de posición radial
+ StreamerCfg.lbl.Radialdistance = Distancia radial:
+ StreamerCfg.lbl.Radialdirection = Dirección radial:
+ StreamerCfg.but.Reset = Reiniciar
+
+ ! ThicknessRingComponentConfig
+ ThicknessRingCompCfg.tab.Outerdiam = Diámetro exterior:
+ ThicknessRingCompCfg.tab.Innerdiam = Diámetro Interior:
+ ThicknessRingCompCfg.tab.Wallthickness = Espesor de la pared:
+ ThicknessRingCompCfg.tab.Length = Longitud:
+ ThicknessRingCompCfg.tab.General = General
+ ThicknessRingCompCfg.tab.Generalprop = Propiedades generales
+
+ ! TransitionConfig
+ TransitionCfg.lbl.Transitionshape = Forma de la transición:
+ TransitionCfg.checkbox.Clipped = Acortado
+ TransitionCfg.lbl.Shapeparam = Parámetro de forma:
+ TransitionCfg.lbl.Transitionlength = Longitud de la transición:
+ TransitionCfg.lbl.Forediam = Diámetro delantero:
+ TransitionCfg.checkbox.Automatic = Automático
+ TransitionCfg.lbl.Aftdiam = Diámetro trasero:
+ TransitionCfg.lbl.Wallthickness = Espesor de la pared:
+ TransitionCfg.checkbox.Filled = Archivado
+ TransitionCfg.tab.General = General
+ TransitionCfg.tab.Generalproperties = Propiedades generales
+ TransitionCfg.tab.Shoulder = Hombro
+ TransitionCfg.tab.Shoulderproperties = Propiedades del hombro
+
+ ! TrapezoidFinSetConfig
+ TrapezoidFinSetCfg.lbl.Nbroffins = Número de aletas:
+ TrapezoidFinSetCfg.lbl.ttip.Nbroffins = Número de aletas en la base de aletas.
+ TrapezoidFinSetCfg.lbl.Finrotation = Rotación de las aletas:
+ TrapezoidFinSetCfg.lbl.ttip.Finrotation = Ángulo de la primera aleta en la base de aletas.
+ TrapezoidFinSetCfg.lbl.Fincant = Canto de aleta:
+ TrapezoidFinSetCfg.lbl.ttip.Fincant = El ángulo del canto de las aletas respecto al fuselaje.
+ TrapezoidFinSetCfg.lbl.Rootchord = Anclaje de la raíz:
+ TrapezoidFinSetCfg.lbl.Tipchord = Forma de la extremidad:
+ TrapezoidFinSetCfg.lbl.Height = Altura:
+ TrapezoidFinSetCfg.lbl.Sweeplength = Longitud del barrido:
+ TrapezoidFinSetCfg.lbl.Sweepangle = Ángulo de barrido:
+ TrapezoidFinSetCfg.lbl.FincrossSection = Sección de la aleta:
+ TrapezoidFinSetCfg.lbl.Thickness = Espesor:
+ TrapezoidFinSetCfg.lbl.Posrelativeto = Posición relativa a:
+ TrapezoidFinSetCfg.lbl.plus = plus
+ TrapezoidFinSetCfg.tab.General = General
+ TrapezoidFinSetCfg.tab.Generalproperties = Propiedades generales
+
+ !MotorConfigurationModel
+ MotorCfgModel.Editcfg = Editar configuraciones
+
+ ! StorageOptionChooser
+ StorageOptChooser.lbl.Simdatatostore = Almacenar datos simulados
+ StorageOptChooser.rdbut.Allsimdata = Todos los datos simulados
+ StorageOptChooser.lbl.longA1 = <html>Almacenar todos los datos simulados.<br>
+ StorageOptChooser.lbl.longA2 = Puede significar archivos muy grandes
+ StorageOptChooser.rdbut.Every = Cada
+ StorageOptChooser.lbl.longB1 = <html>Almacenar valores de impresión aproximadamente este lejano apartado.<br>
+ StorageOptChooser.lbl.longB2 = Resultados de valores grandes en archivos mas pequeños.
+ StorageOptChooser.lbl.seconds = Segundos
+ StorageOptChooser.rdbut.Onlyprimfig = Solamente figuras primarios
+ StorageOptChooser.lbl.longC1 = <html>Almacenas sólo los valores en la tabla sumario.<br>
+ StorageOptChooser.lbl.longC2 = Estos resultados en los archivos mas pequeños.
+ StorageOptChooser.checkbox.Compfile = Archivo comprimido
+ StorageOptChooser.lbl.UsingComp = Usando la compresión reducimos el tamaño de los archivos.
+ StorageOptChooser.lbl.longD1 = Una estimación de cuan grande será un archivo podría tenerse con las presentes opciones.
+ StorageOptChooser.ttip.Saveopt = Guardar opciones
+ StorageOptChooser.lbl.Estfilesize = Estimación del tamaño del archivo:
+ StorageOptChooser.lbl.Saveopt = Guardar opciones
+
+ ! ThrustCurveMotorSelectionPanel
+ TCMotorSelPan.lbl.Selrocketmotor = Selecciones el motor del cohete:
+ TCMotorSelPan.checkbox.hideSimilar = Borrar las curvas muy similares
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc1 = Mostrar todos los motores
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc2 = Mostrar motores con diámetro inferior al del tubo portamotor
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc3 = Mostrar motores con diámetro igual al del tubo portamotor
+ TCMotorSelPan.lbl.Motormountdia = Diámetro del portamotor:
+ TCMotorSelPan.lbl.Search = Buscar:
+ TCMotorSelPan.lbl.Selectthrustcurve = Seleccione curva de empuje:
+ TCMotorSelPan.lbl.Ejectionchargedelay = Retardo de la carga de eyección:
+ TCMotorSelPan.equalsIgnoreCase.None = Ninguno
+ TCMotorSelPan.lbl.NumberofsecondsorNone = (Número de segundos o \"Ninguno\")
+ TCMotorSelPan.lbl.Totalimpulse = Impulso total:
+ TCMotorSelPan.lbl.Avgthrust = Empuje medio:
+ TCMotorSelPan.lbl.Maxthrust = Empuje máximo:
+ TCMotorSelPan.lbl.Burntime = Tiempo de quemado:
+ TCMotorSelPan.lbl.Launchmass = Masa a lanzar:
+ TCMotorSelPan.lbl.Emptymass = Masa vacía:
+ TCMotorSelPan.lbl.Datapoints = Puntos dato:
+ TCMotorSelPan.lbl.Digest = Resumen:
+ TCMotorSelPan.title.Thrustcurve = Curva de empuje:
+ TCMotorSelPan.title.Thrust = Empuje
+ TCMotorSelPan.delayBox.None = Ninguno
+
+
+ ! PlotDialog
+ PlotDialog.title.Flightdataplot = Representar los datos de vuelo
+ PlotDialog.Chart.Simulatedflight = Vuelo simulado
+ PlotDialog.CheckBox.Showdatapoints = Mostrar los puntos datos
+ PlotDialog.lbl.Chart = Click+bajar el rozamiento+derecha ampliar, arriba+izquierda disminuir
+
+
+ ! "main" prefix is used for the main application dialog
+
+ main.menu.file = Archivo
+ main.menu.file.new = Nuevo
+ main.menu.file.open = Abrir ...
+ main.menu.file.openExample = Abrir ejemplo ...
+ main.menu.file.save = Guardar
+ main.menu.file.saveAs = Guardar como ...
+ main.menu.file.print = Imprimir ...
+ main.menu.file.close = Cerrar
+ main.menu.file.quit = Silenciar
+
+ main.menu.edit = Representar
+ main.menu.edit.undo = Invertir
+ main.menu.edit.redo = Rehacer
+ main.menu.edit.cut = Cortar
+ main.menu.edit.copy = Copiar
+ main.menu.edit.paste = Pegar
+ main.menu.edit.delete = Borrar
+ main.menu.edit.preferences = Preferencias
+
+ main.menu.analyze = Analizar
+ main.menu.analyze.componentAnalysis = Análisis de componentes
+
+ main.menu.help = Ayuda
+ main.menu.help.license = Licencia
+ main.menu.help.bugReport = Report de supresiones
+ main.menu.help.debugLog = Registro de recuperaciones
+ main.menu.help.about = Acerca de
+
+ main.menu.debug = Recuperación
+ main.menu.debug.whatisthismenu = ¿Que es este menú?
+ main.menu.debug.createtestrocket = Crear prueba de modelo
+
+ ! database
+ ! Translate here all material database
+ !
+
+ ! Material database
+ ! BULK_MATERIAL
+ Databases.materials.Acrylic = Acrílico
+ Databases.materials.Balsa = Balsa
+ Databases.materials.Birch = Abedul
+ Databases.materials.Cardboard = Cartón
+ Databases.materials.Carbonfiber = Fibra de Carbono
+ Databases.materials.Cork = Corcho
+ Databases.materials.DepronXPS = Depron (XPS)
+ Databases.materials.Fiberglass = Fibra de vidrio
+ Databases.materials.Kraftphenolic = Cartón fenólico
+ Databases.materials.Maple = Arce
+ Databases.materials.Paperoffice = Papel (oficina)
+ Databases.materials.Pine = Pino
+ Databases.materials.Plywoodbirch = Contrachapado (birch)
+ Databases.materials.PolycarbonateLexan = Policarbonato (Lexan)
+ Databases.materials.Polystyrene = Poliestireno
+ Databases.materials.PVC = PVC
+ Databases.materials.Spruce = Pulido
+ Databases.materials.StyrofoamgenericEPS = Porex (generico EPS)
+ Databases.materials.StyrofoamBluefoamXPS = Porex \"Foam azul\" (XPS)
+ Databases.materials.Quantumtubing = Quantum tubing
+ !SURFACE_MATERIAL
+ Databases.materials.Ripstopnylon = Ripstop nylon
+ Databases.materials.Mylar = Mylar
+ Databases.materials.Polyethylenethin = Polietileno (delgado)
+ Databases.materials.Polyethyleneheavy = Polietileno (grueso)
+ Databases.materials.Silk = Seda
+ Databases.materials.Paperoffice = Papel (oficina)
+ Databases.materials.Cellophane = Celofán
++Databases.materials.Crepepaper = Cr\u00eape Papel
+ ! LINE_MATERIAL
+ Databases.materials.Threadheavy-duty = Trenzado (Alta resistencia)
+ Databases.materials.Elasticcordround2mm = Cordón elástico (aprox. 2mm, 1/16 in)
+ Databases.materials.Elasticcordflat6mm = Cordón elástico (Plano 6mm, 1/4 in)
+ Databases.materials.Elasticcordflat12mm = Cordón elástico (Plano 12mm, 1/2 in)
+ Databases.materials.Elasticcordflat19mm = Cordón elástico (Plano 19mm, 3/4 in)
+ Databases.materials.Elasticcordflat25mm = Cordón elástico (Plano 25mm, 1 in)
+ Databases.materials.Braidednylon2mm = Nylon trenzado (2 mm, 1/16 in)
+ Databases.materials.Braidednylon3mm = Nylon trenzado (3 mm, 1/8 in)
+ Databases.materials.Tubularnylon11mm = Nylon tubular (11 mm, 7/16 in)
+ Databases.materials.Tubularnylon14mm = Nylon tubular (14 mm, 9/16 in)
+ Databases.materials.Tubularnylon25mm = Nylon tubular (25 mm, 1 in)
+
+ ! ExternalComponent
+ ExternalComponent.Rough = Rugoso
+ ExternalComponent.Unfinished = Inacabado
+ ExternalComponent.Regularpaint = Pintura normal
+ ExternalComponent.Smoothpaint = Pintura fina
+ ExternalComponent.Polished = Pulido
+
+ ! LineStyle
+ LineStyle.Solid = Sólido
+ LineStyle.Dashed = Pulverizado
+ LineStyle.Dotted = Punteado
+ LineStyle.Dash-dotted = Pulverizado con puntos
+ LineStyle.Defaultstyle = Estilo por defecto
+
+ ! Shape
+ Shape.Conical = Cónico
+ Shape.Conical.desc1 = Una ojiva cónica de perfil triangular
+ Shape.Conical.desc2 = Transición cónica de lados rectos
+ Shape.Ogive = Ojiva
+ Shape.Ogive.desc1 = Una ojiva con perfil de segmento circular. El parámetro de forma de valor 1 produce una <b>Tangente a la ojiva</b>, Que tiene una transición suave al fuselaje, produce un valor menor que 1 <b>Secante a la ojiva</b>.
+ Shape.Ogive.desc2 = Una ojiva con perfil de segmento circular. El parámetro de forma de valor 1 produce una <b>Tangente a la ojiva</b>, Que tiene una transición suave al fuselaje, produce un valor menor que 1 <b>Secante a la ojiva</b>.
+ Shape.Ellipsoid = Elipsoide
+ Shape.Ellipsoid.desc1 = Una ojiva elipsoidal tiene un perfil de media elipse con el eje mayor de longitud 2&veces;<i>Longitud</i> y <i>Diámetro</i>.
+ Shape.Ellipsoid.desc2 = Una ojiva elipsoidal tiene un perfil de media elipse con el eje mayor de longitud 2&veces;<i>Longitud</i> y <i>Diámetro</i>. Si la transición no se interrumpe, entonces el perfil se extiende al centro con el correspondiente radio.
+ Shape.Powerseries = Series potentes
+ Shape.Powerseries.descA1 = Una serie de ojivas potentes tiene un perfil de<i>Radio</i> &veces; (<i>x</i> / <i>Longitud</i>)<sup><i>k</i></sup> donde <i>k</i> es el parámetro de forma. Para <i>k</i>=0.5 este es un <b>
+ Shape.Powerseries.descA2 = -potencia</b> o <b>parabólico</b> ojiva, para <i>k</i>=0.75 un <b>
+ Shape.Powerseries.descA3 = -potencia</b>, y para <i>k</i>=1 a <b>cónica</b> ojiva.
+ Shape.Powerseries.descB1 = Una serie de transiciones potentes tiene un perfil de <i>Radio</i> &veces; (<i>x</i> / <i>Longitud</i>)<sup><i>k</i></sup> donde <i>k</i> es el parámetro de forma. Para <i>k</i>=0.5 la transición es <b>
+ Shape.Powerseries.descB2 = -potencia</b> o <b>parabólica</b>, para <i>k</i>=0.75 a <b>
+ Shape.Powerseries.descB3 = -potencia</b>, y para <i>k</i>=1 <b>cónica</b>.
+ Shape.Parabolicseries = Serie parabólica
+ Shape.Parabolicseries.desc1 = A parabólica series ojiva Cone has a perfil de a parábola. The forma parámetro defines el segmento de el parábola a utilice. The forma parámetro 1.0 produces a <b>full parábola</b> que es tangente a el body tubo, 0.75 produces a <b>3/4 parábola</b>, 0.5 procudes a <b>1/2 parábola</b> y 0 produces a <b>cónico</b> ojiva .
+ Shape.Parabolicseries.desc2 = A parabólica series transición has a perfil de a parábola. The forma parámetro defines el segmento de el parábola a utilice. The forma parámetro 1.0 produces a <b>full parábola</b> que es tangente a el body tubo at el aft extremo, 0.75 produces a <b>3/4 parábola</b>, 0.5 procudes a <b>1/2 parábola</b> y 0 produces a <b>cónico</b> transición.
+ Shape.Haackseries = Haack series
+ Shape.Haackseries.desc1 = The Haack series ojiva are designado a minimizar drag. The forma parámetro 0 produces un <b>LD-Haack</b> o <b>Von Karman</b> ojiva , que minimizas drag para fijado longitud y diámetro, mientras a valor de 0.333 produces un <b>LV-Haack</b> ojiva , que minimizas drag para fijado longitud y volumen.
+ Shape.Haackseries.desc2 = The Haack series <i>ojiva </i> are designado a minimizar drag. estas transición formas are sus equivalentes, pero do no necesariamente produce optima drag para transiciones. The forma parámetro 0 produces un <b>LD-Haack</b> o <b>Von Karman</b> forma, mientras a valor de 0.333 produces un <b>LV-Haack</b> shape.
+
+
+ ! RocketComponent
+ RocketComponent.Position.TOP = Parte alta del componente
+ RocketComponent.Position.MIDDLE = Parte media del componente
+ RocketComponent.Position.BOTTOM = Extremo inferior del componente
+ RocketComponent.Position.AFTER = Despues del componente
+ RocketComponent.Position.ABSOLUTE = Punta de la ojiva
+
+ ! LaunchLug
+ LaunchLug.Launchlug = Guía
+ ! NoseCone
+ NoseCone.NoseCone = Ojiva
+ ! Transition
+ Transition.Transition = Transición cónica de lados rectos
+ !Stage
+ Stage.Stage = Etapa
+ ! BodyTube
+ BodyTube.BodyTube = Tubo del fuselaje
+ ! TubeCoupler
+ TubeCoupler.TubeCoupler = Acoplador
+ !InnerTube
+ InnerTube.InnerTube = Tubo interior
+ ! TrapezoidFinSet
+ TrapezoidFinSet.TrapezoidFinSet = Aleta en configuración trapezoidal
+ ! FreeformFinSet
+ FreeformFinSet.FreeformFinSet = Forma libre de aleta
+ !MassComponent
+ MassComponent.MassComponent = Componente masa
+ ! Parachute
+ Parachute.Parachute = Paracaídas
+ ! ShockCord
+ ShockCord.ShockCord = Tirante de suspensión
+ ! Bulkhead
+ Bulkhead.Bulkhead = Media cámara
+
+ !Rocket
+ Rocket.motorCount.Nomotor = [Sin motores]
+ Rocket.compname.Rocket = Cohete
+
+ !MotorMount
+ MotorMount.IgnitionEvent.AUTOMATIC = Automático (Lanzamiento o carga de eyección)
+ MotorMount.IgnitionEvent.LAUNCH = Lanzamiento
+ MotorMount.IgnitionEvent.EJECTION_CHARGE = Primera carga de eyección de la etapa previa
+ MotorMount.IgnitionEvent.BURNOUT = Primer encendido de la etapa previa
+ MotorMount.IgnitionEvent.NEVER = Nunca
+
+ !ComponentIcons
+ ComponentIcons.Nosecone = Ojiva
+ ComponentIcons.Bodytube = Tubo del fuselaje
+ ComponentIcons.Transition = Transición
+ ComponentIcons.Trapezoidalfinset = Aleta en configuración trapezoidal
+ ComponentIcons.Ellipticalfinset = Aleta en configuración elíptica
+ ComponentIcons.Freeformfinset = Forma libre de aleta
+ ComponentIcons.Launchlug = Guía de lanzamiento
+ ComponentIcons.Innertube = Tubo interior
+ ComponentIcons.Tubecoupler = Tubo de acoplamiento
+ ComponentIcons.Centeringring = Arandela de centraje
+ ComponentIcons.Bulkhead = Media cámara
+ ComponentIcons.Engineblock = Tope motor
+ ComponentIcons.Parachute = Paracaídas
+ ComponentIcons.Streamer = Banderola
+ ComponentIcons.Shockcord = Tirante de suspensión
+ ComponentIcons.Masscomponent = Componente masa
+ ComponentIcons.disabled = (Desconectado)
+
+ ! StageAction
+ StageAction.Stage = Etapa
+
+ ! RecoveryDevice
+ RecoveryDevice.DeployEvent.LAUNCH = Lanzamiento (mas NN segundos)
+ RecoveryDevice.DeployEvent.EJECTION = Primera carga de eyección de esta etapa
+ RecoveryDevice.DeployEvent.APOGEE = Apogeo
+ RecoveryDevice.DeployEvent.ALTITUDE = Altura específica durante el descenso
+ RecoveryDevice.DeployEvent.NEVER = Nunca
+
+ ! FlightEvent
+ FlightEvent.Type.LAUNCH = Lanzamiento
+ FlightEvent.Type.IGNITION = Encendido del motor
+ FlightEvent.Type.LIFTOFF = Despegue
+ FlightEvent.Type.LAUNCHROD = Despeje de la varilla de lanzamiento
+ FlightEvent.Type.BURNOUT = Apagado del motor
+ FlightEvent.Type.EJECTION_CHARGE = Carga de eyección
+ FlightEvent.Type.STAGE_SEPARATION = Separación de etapa
+ FlightEvent.Type.APOGEE = Apogeo
+ FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT = Sistema de despliegue del sistema de recuperación
+ FlightEvent.Type.GROUND_HIT = Contacto con el suelo
+ FlightEvent.Type.SIMULATION_END = Fin de la simulación
+ FlightEvent.Type.ALTITUDE = Cambio de altura
+
+ ! ThrustCurveMotorColumns
+ TCurveMotorCol.MANUFACTURER = Fabricante
+ TCurveMotorCol.DESIGNATION = Designación
+ TCurveMotorCol.TYPE = Tipo
+ TCurveMotorCol.DIAMETER = Diámetro
+ TCurveMotorCol.LENGTH = Longitud
+
+ ! RocketInfo
+ RocketInfo.lengthLine.Length = Longitud
+ RocketInfo.lengthLine.maxdiameter = , max. Diámetro
+ RocketInfo.massText1 = Masa con motores
+ RocketInfo.massText2 = Masa sin motores
+ RocketInfo.at = a M=
+ RocketInfo.cgText = CG:
+ RocketInfo.cpText = CP:
+ RocketInfo.stabText = Estabilidad:
+ RocketInfo.Warning = Peligro:
+ RocketInfo.Calculating = Calculando...
+ RocketInfo.Apogee = Apogeo:
+ RocketInfo.Maxvelocity = Max. velocidad:
+ RocketInfo.Maxacceleration = Max. aceleración:
+ RocketInfo.apogeeValue = N/A
+ RocketInfo.Mach = (Mach
+ RocketInfo.velocityValue = N/A
+ RocketInfo.accelerationValue = N/A
+
+ ! FinSet
+ FinSet.CrossSection.SQUARE = Cuadrado
+ FinSet.CrossSection.ROUNDED = Redondo
+ FinSet.CrossSection.AIRFOIL = Superficie de sustentación
+ FinSet.TabRelativePosition.FRONT = Borde principal del extremo de anclaje
+ FinSet.TabRelativePosition.CENTER = Borde principal del anclaje
+ FinSet.TabRelativePosition.END = Borde principal de tracción
+
+ ! FlightDataType
+ FlightDataType.TYPE_TIME = Tiempo de quemado:
+ FlightDataType.TYPE_ALTITUDE = Altura específica durante el descenso
+ FlightDataType.TYPE_VELOCITY_Z = Velocidad vertical
+ FlightDataType.TYPE_ACCELERATION_Z = Aceleración vertical
+ FlightDataType.TYPE_VELOCITY_TOTAL = Velocidad total
+ FlightDataType.TYPE_ACCELERATION_TOTAL = Aceleración total
+ FlightDataType.TYPE_POSITION_X = Posición contra viento
+ FlightDataType.TYPE_POSITION_Y = Posición paralela al viento
+ FlightDataType.TYPE_POSITION_XY = Distancia lateral
+ FlightDataType.TYPE_POSITION_DIRECTION = Dirección lateral
+ FlightDataType.TYPE_VELOCITY_XY = Velocidad lateral
+ FlightDataType.TYPE_ACCELERATION_XY = Aceleración lateral
+ FlightDataType.TYPE_AOA = Ángulo de ataque:
+ FlightDataType.TYPE_ROLL_RATE = Relación de rotación
+ FlightDataType.TYPE_PITCH_RATE = Relación de pico
+ FlightDataType.TYPE_YAW_RATE = Relación de desvío
+ FlightDataType.TYPE_MASS = Masa
+ FlightDataType.TYPE_LONGITUDINAL_INERTIA = Momento de inercia longitudinal
+ FlightDataType.TYPE_ROTATIONAL_INERTIA = Momento de inercia rotacional
+ FlightDataType.TYPE_CP_LOCATION = CP situación
+ FlightDataType.TYPE_CG_LOCATION = CG situación
+ FlightDataType.TYPE_STABILITY = Calibración del margen de estabilidad
+ FlightDataType.TYPE_MACH_NUMBER = Número Mach
+ FlightDataType.TYPE_REYNOLDS_NUMBER = Número de Reynolds
+ FlightDataType.TYPE_THRUST_FORCE = Empuje
+ FlightDataType.TYPE_DRAG_FORCE = Fuerza de rozamiento
+ FlightDataType.TYPE_DRAG_COEFF = Coeficiente de rozamiento
+ FlightDataType.TYPE_AXIAL_DRAG_COEFF = Coeficiente de rozamiento axial
+ FlightDataType.TYPE_FRICTION_DRAG_COEFF = Coeficiente de rozamiento por fricción
+ FlightDataType.TYPE_PRESSURE_DRAG_COEFF = Presión del coeficiente de rozamiento
+ FlightDataType.TYPE_BASE_DRAG_COEFF = Coeficiente de rozamiento base
+ FlightDataType.TYPE_NORMAL_FORCE_COEFF = Coeficiente de rozamiento normal
+ FlightDataType.TYPE_PITCH_MOMENT_COEFF = Pico del coeficiente de rozamiento
+ FlightDataType.TYPE_YAW_MOMENT_COEFF = Coeficiente de rozamiento de desviación
+ FlightDataType.TYPE_SIDE_FORCE_COEFF = Coeficiente de fuerza lateral
+ FlightDataType.TYPE_ROLL_MOMENT_COEFF = Coeficiente del momento de rotación
+ FlightDataType.TYPE_ROLL_FORCING_COEFF = Fuerza del coeficiente de rotación
+ FlightDataType.TYPE_ROLL_DAMPING_COEFF = Disminución del coeficiente de rotación
+ FlightDataType.TYPE_PITCH_DAMPING_MOMENT_COEFF = Disminución del coeficiente de pico
+ FlightDataType.TYPE_YAW_DAMPING_MOMENT_COEFF = Disminución del coeficiente de desviación
+ FlightDataType.TYPE_REFERENCE_LENGTH = Longitud de referencia:
+ FlightDataType.TYPE_REFERENCE_AREA = Área de referencia
+ FlightDataType.TYPE_ORIENTATION_THETA = Orientación vertical (zenit)
+ FlightDataType.TYPE_ORIENTATION_PHI = Orientación lateral (azimut)
+ FlightDataType.TYPE_WIND_VELOCITY = Velocidad del viento
+ FlightDataType.TYPE_AIR_TEMPERATURE = Temperatura del aire
+ FlightDataType.TYPE_AIR_PRESSURE = Presión del aire
+ FlightDataType.TYPE_SPEED_OF_SOUND = Velocidad del sonido
+ FlightDataType.TYPE_TIME_STEP = Simulación del tiempo de etapa
+ FlightDataType.TYPE_COMPUTATION_TIME = Cálculo del tiempo
+
+ ! PlotConfiguration
+ PlotConfiguration.Verticalmotion = Movimiento vertical vs. Tiempo
+ PlotConfiguration.Totalmotion = Movimiento total vs. Tiempo
+ PlotConfiguration.Flightside = Perfil lateral de vuelo
+ PlotConfiguration.Stability = Estabilidad vs. Tiempo
+ PlotConfiguration.Dragcoef = Coeficiente de rozamiento vs. Número Mach
+ PlotConfiguration.Rollcharacteristics = Características de rotación
+ PlotConfiguration.Angleofattack = Ángulo de orientación y ataque vs. Tiempo
+ PlotConfiguration.Simulationtime = Simulación del tiempo de etapa y cálculo del tiempo
+
+ ! Warning
+ Warning.LargeAOA.str1 = Evaluación de la amplitud del ángulo de ataque.
+ Warning.LargeAOA.str2 = Evaluación de la amplitud del ángulo de ataque (
+ Warning.DISCONTINUITY = Discontinuidad en el diámetro del fuselaje.
+ Warning.THICK_FIN = Las aletas gruesas no están correctamente modeladas.
+ Warning.JAGGED_EDGED_FIN = las predicciones afiladas de la aleta pueden ser inexactas.
+ Warning.LISTENERS_AFFECTED = Los oyentes modificaron la simulación del vuelo
+ Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING = Sistema de recuperación abierto mientras el motor todavía empujaba
+ Warning.FILE_INVALID_PARAMETER = Parámetro no válido encontrado. Ignorarlo.
--- /dev/null
-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
+ #\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 = Supprimer 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 plusieurs 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
+ BasicFrame.StageName.Sustainer = Sustainer\r
+ BasicFrame.WarningDialog.txt1 = Les problemes suivant sont survenus lors de l'ouverture de\r
+ BasicFrame.WarningDialog.txt2 = Certains elements du projet n'ont peut etre pas été chargé correctement.\r
+ BasicFrame.WarningDialog.title = Avertissement lors de l'ouverture du fichier\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
-compaddbuttons.Bodytube = Tube du corps\r
++AboutDialog.lbl.translation = Traduit en français par\r
++AboutDialog.lbl.translator = Tripoli France\r
++AboutDialog.lbl.translatorWebsite = 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
+ bugreport.dlg.connectedInternet = <html>Si vous etes connecté sur Internet, vous pouvez tout simplement cliquer sur <em>Envoyer un rapport d'erreurs</em>.\r
+ bugreport.dlg.otherwise = Sinon envoyez le texte ci-dessous à l'adresse:\r
+ bugreport.lbl.Theinformation = Les informations ci-dessus sont succeptibles d'etre incluse dans un rapport d'erreur publique. Assurez vous qu'il ne contienne pas d'informations sensibles que vous ne voulez pas rendre publique.\r
+ bugreport.dlg.failedmsg1 = OpenRocket n'a pas réussi à envoyer le rapport d'erreur:\r
+ bugreport.dlg.failedmsg2 = S'il vous plait envoyez le rapport manuellement à\r
+ bugreport.dlg.failedmsg3 = Erreur d'envoi du rapport\r
+ bugreport.reportDialog.txt = <html><b>Vous pouvez signaler une erreur avec OpenRocket en remplissant et en envoyant le message ci-dessous.</b><br>Vous pouvez egalement signaler des erreurs et inclure des pieces jointes sur le site web du projet.\r
+ bugreport.reportDialog.txt2 = <html><b>S'il vous plait ajoutez une courte description de ce que vous faisiez lorsque l'erreur s'est produite.</b>\r
+ \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
+ exdesigndlg.lbl.Selectexample = Chosir l'exemple de projet à ouvrir:\r
+ exdesigndlg.lbl.Openexampledesign = Ouvrir un exemple de projet\r
+ exdesigndlg.lbl.Exampledesignsnotfound = Impossible de trouver les exemples de projets.\r
+ exdesigndlg.lbl.Examplesnotfound = Exemples non trouvés\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éfinis ne peuvent pas être modifiés.\r
+ matedtpan.but.ttip.delete = Supprimer un matériau personnalisé\r
+ matedtpan.but.ttip.revertall = Supprimer tous les matériaux personnalisés\r
+ matedtpan.title.Deletealluser-defined = Effacer tous les matériaux personalisés?\r
+ matedtpan.title.Revertall = Revenir aux valeurs précédentes?\r
+ matedtpan.lbl.edtmaterials = <html><i>Modifier les matériaux n'affectera pas les projets fusée existants.</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és\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 = Densité apparente:\r
+ pref.dlg.lbl.Velocity = Vitesse:\r
+ pref.dlg.lbl.Surfaceroughness = Rugosité de la Surface:\r
+ pref.dlg.lbl.Acceleration = Accélération:\r
+ pref.dlg.lbl.Area = Surface:\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
+ pref.dlg.PrefChoiseSelector1 = Toujours demander\r
+ pref.dlg.PrefChoiseSelector2 = Insérer au milieu\r
+ pref.dlg.PrefChoiseSelector3 = Ajouter à la fin\r
+ pref.dlg.PrefBooleanSelector1 = Supprimer\r
+ pref.dlg.PrefBooleanSelector2 = Confirmer\r
+ pref.dlg.Add = Ajouter\r
+ pref.dlg.DescriptionArea.Adddirectories = Ajouter des répertoires, des fichiers moteurs RASP (*.eng), des fichiers moteurs RockSim (*.rse) ou des fichiers achives ZIP separés par un point virgule (;) pour charger des courbes de pousées externes. Les changements prendront effet au prochain démarrage d'OpenRocket.\r
+ \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ériques\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>La méthode Barrowman étendue calcule les forces aérodynamique selon <br>les équations de Barrowman étendues pour arranger plus de pièces.\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 = Auditeurs de simulation\r
+ simedtdlg.txt.longA1 = <html><i>Les auditeurs de simulation</i> sont une fonction avancé qui permet à l'utilisateur d'écrire du code pour suivre et interagir avec la simulation. \r
+ simedtdlg.txt.longA2 = Pour plus de détails sur les auditeurs de simulation, reférez vous à la documentation technique d'OpenRocket.\r
+ simedtdlg.lbl.Curlist = Auditeurs de simulation actuel:\r
+ simedtdlg.lbl.Addsimlist = Ajouter un "auditeur de simulation"\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
+ simedtdlg.IntensityDesc.None = Aucune\r
+ simedtdlg.IntensityDesc.Verylow = Très basse\r
+ simedtdlg.IntensityDesc.Low = Basse\r
+ simedtdlg.IntensityDesc.Medium = Moyenne\r
+ simedtdlg.IntensityDesc.High = Haute\r
+ simedtdlg.IntensityDesc.Veryhigh = Très haute\r
+ simedtdlg.IntensityDesc.Extreme = Extreme\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
+ simpanel.col.Groundhitvelocity = Vitesse à l'atterrissage\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 = Simulation impossible:\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 inconnue 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 événements 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
+ SimExpPan.Fileexists.desc1 = Le fichier \"\r
+ SimExpPan.Fileexists.desc2 = \" existe déjà. Ecraser?\r
+ SimExpPan.Fileexists.title = Le fichier existe\r
+ SimExpPan.ExportingVar.desc1 = Exporter 1 variable sur un total de\r
+ SimExpPan.ExportingVar.desc2 = Exportation\r
+ SimExpPan.ExportingVar.desc3 = variable sur un total de\r
+ SimExpPan.Col.Variable = Variable\r
+ SimExpPan.Col.Unit = Unité\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 = Les données seront tracées en fonction du temps même si le type d'Axe des abscisses n'est pas le temps.\r
+ simplotpanel.OptionPane.lbl1 = Un maximum de 15 tracés est permis. \r
+ simplotpanel.OptionPane.lbl2 = Impossible d'ajouter le tracé\r
+ simplotpanel.AUTO_NAME = Auto\r
+ simplotpanel.LEFT_NAME = Gauche\r
+ simplotpanel.RIGHT_NAME = Droite\r
+ simplotpanel.CUSTOM = Personnalisé\r
+ \r
+ \r
+ \r
+ ! Component add buttons\r
+ compaddbuttons.Bodycompandfinsets = Pièces du corps et ailerons\r
+ compaddbuttons.Nosecone = Cône\r
-compaddbuttons.Launchlug = Tube de guidage\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.Centeringring = Anneau\nde centrage\r
++compaddbuttons.Launchlug = Tube de\nguidage\r
+ compaddbuttons.Innercomponent = Pièces internes\r
+ compaddbuttons.Innertube = Tube interne\r
+ compaddbuttons.Coupler = Coupleur\r
-compaddbuttons.Engineblock = Bague \nde rétention\nmoteur\r
++compaddbuttons.Centeringring = Anneau de\ncentrage\r
+ compaddbuttons.Bulkhead = Cloison\r
-compaddbuttons.Shockcord = Cordon amortisseur\r
++compaddbuttons.Engineblock = Bague de\nrétention\nmoteur\r
+ compaddbuttons.Massobjects = Pièces pleines\r
+ compaddbuttons.Parachute = Parachute\r
+ compaddbuttons.Streamer = Banderole\r
-Databases.materials.Creapepaper = Cr\u00eape paper\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 actifs:\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 = Coefficient de forçage de roulis\r
+ componentanalysisdlg.rollTableModel.Col.rolldamp = Coefficient amortisseur de roulis\r
+ componentanalysisdlg.rollTableModel.Col.total = <html>Total C<sub>l</sub>\r
+ componentanalysisdlg.rollTableModel = Dynamique du roulis\r
+ componentanalysisdlg.rollTableModel.ttip = Dynamique du roulis\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 personnalisé\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
+ ringcompcfg.EngineBlock.desc = <html>Un <b>bloc moteur </b> empêche le moteur de se déplacer vers l'avant dans le tube porte moteur.<br><br>Pour ajouter un moteur, créer un <b>tube</b> ou un <b>tube interne</b> et marquer le comme porte moteur dans l'onglet <em>Moteur</em>.\r
+ ringcompcfg.note.desc = A noter: Un tube interne n'affectera pas l'aerodynamisme de la fusée meme si il est situé en dehors du tube.\r
+ \r
+ \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 = Aspérités bouchées\r
+ \r
+ ! FinSetConfig\r
+ FinSetConfig.tab.Fintabs = Pattes des ailerons\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 jeu d'ailerons en forme libre\r
+ FinSetConfig.Convertfinset = Convertir le jeu d'ailerons\r
+ FinSetConfig.but.Splitfins = Séparer les ailerons\r
+ FinSetConfig.but.Splitfins.ttip = Diviser le jeu d'ailerons en aileron indépendant\r
+ FinSetConfig.lbl.Through-the-wall = Ailerons traversant le fuselage:\r
+ FinSetConfig.lbl.Tablength = Longueur de la patte:\r
+ FinSetConfig.ttip.Tablength = La longueur de la patte de l'aileron.\r
+ FinSetConfig.lbl.Tabheight = Hauteur de la patte:\r
+ FinSetConfig.ttip.Tabheight = La hauteur de l'envergure de la patte de l'aileron.\r
+ FinSetConfig.lbl.Tabposition = Position de la patte:\r
+ FinSetConfig.ttip.Tabposition = La position de la patte de l'ailerons.\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 poids de la pièce.\r
+ RocketCompCfg.combo.ttip.componentmaterialaffects = Les matériaux utilisés pour la pièce affectent le poids 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 = Aspérités bouchées\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 = La nature du matériau affecte le poids de la pièce.\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 plié:\r
+ ParachuteCfg.lbl.Packeddiam = Diamètre plié:\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 affecte 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 = Emboitée\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 = Aspérités bouchées\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 jeu.\r
+ TrapezoidFinSetCfg.lbl.Finrotation = Rotation de l'aileron:\r
+ TrapezoidFinSetCfg.lbl.ttip.Finrotation = Angle du premier aileron dans le jeu.\r
+ TrapezoidFinSetCfg.lbl.Fincant = Inclinaison de l'aileron:\r
+ TrapezoidFinSetCfg.lbl.ttip.Fincant = Angle d'inclinaison des ailerons par rapport au tube du corps de la fusée.\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 = Des valeurs plus grandes produisent des fichiers plus petits.\r
+ StorageOptChooser.lbl.seconds = secondes\r
+ StorageOptChooser.rdbut.Onlyprimfig = Seuls les chiffres primaires\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'aurait le fichier résultant avec les options actuelles.\r
+ StorageOptChooser.ttip.Saveopt = Options de sauvegarde\r
+ StorageOptChooser.lbl.Estfilesize = Taille estimée 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 poussées similaires\r
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc1 = Montrer tous les moteurs\r
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc2 = Montrer les moteurs avec un diametre inferieur au porte moteur\r
+ TCMotorSelPan.SHOW_DESCRIPTIONS.desc3 = Montrer les moteurs avec un diametre egale au porte moteur\r
+ TCMotorSelPan.lbl.Motormountdia = Diametre du tube porte moteur:\r
+ TCMotorSelPan.lbl.Search = Rechercher:\r
+ TCMotorSelPan.lbl.Selectthrustcurve = Choisir la courbe de poussée:\r
+ TCMotorSelPan.lbl.Ejectionchargedelay = Retard de la charge d'ejection:\r
+ TCMotorSelPan.equalsIgnoreCase.None = Aucun\r
+ TCMotorSelPan.lbl.NumberofsecondsorNone = (Nombre de secondes ou \"Aucun\")\r
+ TCMotorSelPan.lbl.Totalimpulse = Impulsion totale:\r
+ TCMotorSelPan.lbl.Avgthrust = Poussée moyenne:\r
+ TCMotorSelPan.lbl.Maxthrust = Poussée Max.:\r
+ TCMotorSelPan.lbl.Burntime = Temps de combustion:\r
+ TCMotorSelPan.lbl.Launchmass = Masse au lancement:\r
+ TCMotorSelPan.lbl.Emptymass = Masse à vide:\r
+ TCMotorSelPan.lbl.Datapoints = Points de données:\r
+ TCMotorSelPan.lbl.Digest = Assimilation:\r
+ TCMotorSelPan.title.Thrustcurve = Courbe de poussée:\r
+ TCMotorSelPan.title.Thrust = Poussée\r
+ TCMotorSelPan.delayBox.None = Aucun\r
+ \r
+ ! PlotDialog\r
+ PlotDialog.title.Flightdataplot = Tracé du vol\r
+ PlotDialog.Chart.Simulatedflight = Simulation du vol\r
+ PlotDialog.CheckBox.Showdatapoints = Afficher un point pour chaque valeur\r
+ PlotDialog.lbl.Chart = Cliquer+déplacer en bas +droite pour agrandir, haut+gauche pour rétrécir\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
+ ! database\r
+ ! Translate here all material database\r
+ !\r
+ \r
+ ! Material database\r
+ ! BULK_MATERIAL\r
+ Databases.materials.Acrylic = Acrylique\r
+ Databases.materials.Balsa = Balsa\r
+ Databases.materials.Birch = Bouleau\r
+ Databases.materials.Cardboard = Carton\r
+ Databases.materials.Carbonfiber = Fibre de carbone\r
+ Databases.materials.Cork = Liège\r
+ Databases.materials.DepronXPS = Depron (XPS)\r
+ Databases.materials.Fiberglass = Fibre de verre\r
+ Databases.materials.Kraftphenolic = Kraft phénolique\r
+ Databases.materials.Maple = Érable\r
+ Databases.materials.Paperoffice = Papier (bureau)\r
+ Databases.materials.Pine = Pin\r
+ Databases.materials.Plywoodbirch = Contre-plaqué (bouleau)\r
+ Databases.materials.PolycarbonateLexan = Polycarbonate (Lexan)\r
+ Databases.materials.Polystyrene = Polystyrène\r
+ Databases.materials.PVC = PVC\r
+ Databases.materials.Spruce = Sapin\r
+ Databases.materials.StyrofoamgenericEPS = Polystyrène (générique EPS)\r
+ Databases.materials.StyrofoamBluefoamXPS = \"Mousse Bleue\" de polystyrène (XPS)\r
+ Databases.materials.Quantumtubing = Quantum tubing\r
+ !SURFACE_MATERIAL\r
+ Databases.materials.Ripstopnylon = Ripstop nylon\r
+ Databases.materials.Mylar = Mylar\r
+ Databases.materials.Polyethylenethin = Polyéthylène (fin)\r
+ Databases.materials.Polyethyleneheavy = Polyéthylène (lourd)\r
+ Databases.materials.Silk = Soie\r
+ Databases.materials.Paperoffice1 = Papier (bureau)\r
+ Databases.materials.Cellophane = Cellophane\r
++Databases.materials.Crepepaper = Cr\u00eape paper\r
+ ! LINE_MATERIAL\r
+ Databases.materials.Threadheavy-duty = Fil(résistant)\r
+ Databases.materials.Elasticcordround2mm = Corde Elastique (ronde 2mm, 1/16 in)\r
+ Databases.materials.Elasticcordflat6mm = Corde Elastique (plate 6mm, 1/4 in)\r
+ Databases.materials.Elasticcordflat12mm = Corde Elastique (plate 12mm, 1/2 in)\r
+ Databases.materials.Elasticcordflat19mm = Corde Elastique (plate 19mm, 3/4 in)\r
+ Databases.materials.Elasticcordflat25mm = Corde Elastique (plate 25mm, 1 in)\r
+ Databases.materials.Braidednylon2mm = Nylon tressé (2 mm, 1/16 in)\r
+ Databases.materials.Braidednylon3mm = Nylon tressé (3 mm, 1/8 in)\r
+ Databases.materials.Tubularnylon11mm = Nylon tubulaire (11 mm, 7/16 in)\r
+ Databases.materials.Tubularnylon14mm = Nylon tubulaire (14 mm, 9/16 in)\r
+ Databases.materials.Tubularnylon25mm = Nylon tubulaire (25 mm, 1 in)\r
+ \r
+ ! ExternalComponent\r
+ ExternalComponent.Rough = Rugeuse\r
+ ExternalComponent.Unfinished = Non peinte\r
+ ExternalComponent.Regularpaint = Peinture classique\r
+ ExternalComponent.Smoothpaint = Fine couche\r
+ ExternalComponent.Polished = Polie\r
+ \r
+ \r
+ ! LineStyle\r
+ LineStyle.Solid = Ligne pleine\r
+ LineStyle.Dashed = Tiret\r
+ LineStyle.Dotted = Ligne pointillée\r
+ LineStyle.Dash-dotted = Ligne Pointillée et Tiret\r
+ LineStyle.Defaultstyle = Style par défaut\r
+ \r
+ ! Shape\r
+ Shape.Conical = Conique\r
+ Shape.Conical.desc1 = Un cône conique a un profil triangulaire.\r
+ Shape.Conical.desc2 = Une transition conique a des côtés droits.\r
+ Shape.Ogive = Ogive\r
+ Shape.Ogive.desc1 = Un cône ogival a un profil qui est un segment de cercle. La valeur du paramètre de forme 1 produit une <b>ogive tangente</b>, qui a une transition en douceur vers le tube de la fusée, des valeurs inférieures à 1 produisent des <b>ogives sécantes</b>.\r
+ Shape.Ogive.desc2 = Une transition en ogive a un profil qui est un segment de cercle. La valeur du paramètre de forme 1 produit une <b>ogive tangente</b>, qui a une transition en douceur vers le tube de la fusée à l'extrémité arrière, des valeurs inférieures à 1 produisent des <b>ogives sécantes</b>.\r
+ Shape.Ellipsoid = Ellipsoïde\r
+ Shape.Ellipsoid.desc1 = Un cône ellipsoïdal a un profil d'une demi ellipse dont les axes principaux sont de longueurs 2×<i>la longueur</i> et <i>diamètre</i>.\r
+ Shape.Ellipsoid.desc2 = Une transition ellipsoïdale a un profil d'une demi ellipse dont les axes principaux sont de longueurs 2×<i>longueur</i> et <i>diamètre</i>. Si la transition n'est pas coupée alors le profil est étendu au centre par le rayon correspondant. \r
+ Shape.Powerseries = Série Haute puissance\r
+ Shape.Powerseries.descA1 = Un cône de puissance a un profil de <i>Rayon</i> × (<i>x</i> / <i>Longueur</i>)<sup><i>k</i></sup> ou <i>k</i> est le paramètre de la forme. Pour <i>k</i>=0,5 c'est une <b>\r
+ Shape.Powerseries.descA2 = -puissance</b> ou une ogive <b>parabolique</b>, pour <i>k</i>=0,75 une <b>\r
+ Shape.Powerseries.descA3 = -puissance</b>, et pour <i>k</i>=1 un cône <b>conique</b>.\r
+ Shape.Powerseries.descB1 = Une transition de la série haute puissance a un profile de <i>Rayon</i> × (<i>x</i> / <i>Longueur</i>)<sup><i>k</i></sup> ou <i>k</i> est le paramètre de la forme. Pour <i>k</i>=0,5 la transition est <b>\r
+ Shape.Powerseries.descB2 = -puissance</b> ou <b>parabolique</b>, pour <i>k</i>=0,75 une <b>\r
+ Shape.Powerseries.descB3 = -puissance</b>, et pour <i>k</i>=1 <b>conique</b>.\r
+ Shape.Parabolicseries = Série parabolique\r
+ Shape.Parabolicseries.desc1 = Un cône parabolique a un profil d'une parabole. Le paramètre de forme définit le segment de la parabole à utiliser. Le paramètre 1 produit une <b>parabole pleine</b> qui est tangent au tube de la fusée, 0,75 produit un <b>3/4 de parabole</b>, 0,5 produit une <b>1/2 parabole</b> et 0 produit un cône <b>conique</b>.\r
+ Shape.Parabolicseries.desc2 = Une transistion de type parabolique a un profile en forme de parabole. Le paramètre de forme définit le segment de la parabole à utiliser. Le paramètre 1,0 produit une <b>parabole pleine</b> qui est tangent au tube de la fusée à l'extrémité arrière, 0,75 produit une <b>3/4 parabole</b>, 0,5 produit une <b>1/2 parabole</b> et 0 produit une transition <b>conique</b>.\r
+ Shape.Haackseries = Série Haack\r
+ Shape.Haackseries.desc1 = Les cônes du type Haack sont conçus pour minimiser la trainée. Le paramètre de forme égale à 0 produit une <b>LD-Haack</b> ou un cône <b>Von Karman</b>, ce qui a pour effet de minimiser la trainée pour une longueur et un diamètre fixe, tandis qu'une valeur de 0,333 produit un cône <b>LV-Haack</b>, ce qui minimise la trainée pour une longueur et un volume fixe.\r
+ Shape.Haackseries.desc2 = Les <i>cônes</i> du type Haack sont conçus pour minimiser la trainée. Ces formes de transition sont leurs équivalents, mais ne produisent pas nécessairement des valeurs optimales. Le paramètre 0 produit une forme <b>LD-Haack</b> ou <b>Von Karman</b>, tandis qu'une valeur de 0,333 produit une forme <b>LV-Haack</b>. \r
+ \r
+ \r
+ ! RocketComponent\r
+ RocketComponent.Position.TOP = Haut de la pièce parent\r
+ RocketComponent.Position.MIDDLE = Milieu de la pièce parent(porteuse)\r
+ RocketComponent.Position.BOTTOM = Bas de la pièce parent\r
+ RocketComponent.Position.AFTER = Après la pièce parent\r
+ RocketComponent.Position.ABSOLUTE = Pointe de l'ogive\r
+ \r
+ \r
+ ! LaunchLug\r
+ LaunchLug.Launchlug = Tube de guidage\r
+ ! NoseCone\r
+ NoseCone.NoseCone = Ogive\r
+ ! Transition\r
+ Transition.Transition = Transition\r
+ !Stage\r
+ Stage.Stage = Etage\r
+ ! BodyTube\r
+ BodyTube.BodyTube = Tube du corps\r
+ ! TubeCoupler\r
+ TubeCoupler.TubeCoupler = Coupleur de tube\r
+ !InnerTube\r
+ InnerTube.InnerTube = Tube interne\r
+ ! TrapezoidFinSet\r
+ TrapezoidFinSet.TrapezoidFinSet = Ailerons Trapezoidaux\r
+ ! FreeformFinSet\r
+ FreeformFinSet.FreeformFinSet = Ailerons personnalisés\r
+ !MassComponent\r
+ MassComponent.MassComponent = Poids\r
+ ! Parachute\r
+ Parachute.Parachute = Parachute\r
+ ! ShockCord\r
+ ShockCord.ShockCord = Cordon amortisseur\r
+ ! Bulkhead\r
+ Bulkhead.Bulkhead = Cloison\r
+ \r
+ !Rocket\r
+ Rocket.motorCount.Nomotor = [aucun moteurs]\r
+ Rocket.compname.Rocket = Fusée\r
+ \r
+ !MotorMount\r
+ MotorMount.IgnitionEvent.AUTOMATIC = Automatique (lancement ou charge d'éjection)\r
+ MotorMount.IgnitionEvent.LAUNCH = Lancement\r
+ MotorMount.IgnitionEvent.EJECTION_CHARGE = Premiere charge d'ejection ou étage precedent\r
+ MotorMount.IgnitionEvent.BURNOUT = First burnout of previous stage\r
+ MotorMount.IgnitionEvent.NEVER = Jamais\r
+ \r
+ !ComponentIcons \r
+ ComponentIcons.Nosecone = Ogive\r
+ ComponentIcons.Bodytube = Tube\r
+ ComponentIcons.Transition = Transition\r
+ ComponentIcons.Trapezoidalfinset = Jeu d'ailerons de forme trapézoïdale\r
+ ComponentIcons.Ellipticalfinset = Jeu d'ailerons de forme elliptique \r
+ ComponentIcons.Freeformfinset = Jeu d'ailerons de forme personnalisé\r
+ ComponentIcons.Launchlug = Tube de guidage\r
+ ComponentIcons.Innertube = Tube interne\r
+ ComponentIcons.Tubecoupler = Coupleur de tube\r
+ ComponentIcons.Centeringring = Anneau de centrage\r
+ ComponentIcons.Bulkhead = Cloison\r
+ ComponentIcons.Engineblock = Bague de retension moteur\r
+ ComponentIcons.Parachute = Parachute\r
+ ComponentIcons.Streamer = Banderolle\r
+ ComponentIcons.Shockcord = Cordon amortisseur\r
+ ComponentIcons.Masscomponent = Mass component\r
+ ComponentIcons.disabled = (désactivé)\r
+ \r
+ ! StageAction\r
+ StageAction.Stage = Etage\r
+ \r
+ ! RecoveryDevice\r
+ RecoveryDevice.DeployEvent.LAUNCH = Lancement(plus NN secondes)\r
+ RecoveryDevice.DeployEvent.EJECTION = Première charge d'éjection de cet étage\r
+ RecoveryDevice.DeployEvent.APOGEE = Apogée\r
+ RecoveryDevice.DeployEvent.ALTITUDE = Altitude spécifiée durant la descente\r
+ RecoveryDevice.DeployEvent.NEVER = Jamais\r
+ \r
+ ! FlightEvent\r
+ FlightEvent.Type.LAUNCH = Lancement\r
+ FlightEvent.Type.IGNITION = Allumage du moteur\r
+ FlightEvent.Type.LIFTOFF = Décollage\r
+ FlightEvent.Type.LAUNCHROD = Dégagement de rampe de lancement\r
+ FlightEvent.Type.BURNOUT = Fin de combustion du moteur\r
+ FlightEvent.Type.EJECTION_CHARGE = Charge d'éjection\r
+ FlightEvent.Type.STAGE_SEPARATION = Séparation d'étage\r
+ FlightEvent.Type.APOGEE = Apogée\r
+ FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT = Déploiement du dispositif de récupération\r
+ FlightEvent.Type.GROUND_HIT = Atterrissage\r
+ FlightEvent.Type.SIMULATION_END = Fin de la simulation\r
+ FlightEvent.Type.ALTITUDE = Changement d'altitude\r
+ \r
+ ! ThrustCurveMotorColumns\r
+ TCurveMotorCol.MANUFACTURER = Fabricant\r
+ TCurveMotorCol.DESIGNATION = Désignation\r
+ TCurveMotorCol.TYPE = Type\r
+ TCurveMotorCol.DIAMETER = Diamètre\r
+ TCurveMotorCol.LENGTH = Longueur\r
+ \r
+ ! RocketInfo\r
+ RocketInfo.lengthLine.Length = Longueur\r
+ RocketInfo.lengthLine.maxdiameter = , diamètre max.\r
+ RocketInfo.massText1 = Masse avec moteurs \r
+ RocketInfo.massText2 = Masse sans moteurs\r
+ RocketInfo.at = à M=\r
+ RocketInfo.cgText = CG:\r
+ RocketInfo.cpText = CP:\r
+ RocketInfo.stabText = Stabilité:\r
+ RocketInfo.Warning = Avertissement:\r
+ RocketInfo.Calculating = Calcul en cours...\r
+ RocketInfo.Apogee = Apogée:\r
+ RocketInfo.Maxvelocity = Vitesse Max.:\r
+ RocketInfo.Maxacceleration = Accélération Max.:\r
+ RocketInfo.apogeeValue = N/A\r
+ RocketInfo.Mach = (Mach\r
+ RocketInfo.velocityValue = N/A\r
+ RocketInfo.accelerationValue = N/A\r
+ \r
+ ! FinSet\r
+ FinSet.CrossSection.SQUARE = Carré\r
+ FinSet.CrossSection.ROUNDED = Arondie\r
+ FinSet.CrossSection.AIRFOIL = Airfoil\r
+ FinSet.TabRelativePosition.FRONT = Root chord leading edge\r
+ FinSet.TabRelativePosition.CENTER = Root chord midpoint\r
+ FinSet.TabRelativePosition.END = Root chord trailing edge\r
+ \r
+ ! FlightDataType\r
+ FlightDataType.TYPE_TIME = Temps\r
+ FlightDataType.TYPE_ALTITUDE = Altitude\r
+ FlightDataType.TYPE_VELOCITY_Z = Vitesse verticale\r
+ FlightDataType.TYPE_ACCELERATION_Z = Accélération verticale\r
+ FlightDataType.TYPE_VELOCITY_TOTAL = Vitesse totale\r
+ FlightDataType.TYPE_ACCELERATION_TOTAL = Accélération totale\r
+ FlightDataType.TYPE_POSITION_X = Position contre le vent\r
+ FlightDataType.TYPE_POSITION_Y = Position parallèle au vent\r
+ FlightDataType.TYPE_POSITION_XY = Distance latérale\r
+ FlightDataType.TYPE_POSITION_DIRECTION = Direction latérale\r
+ FlightDataType.TYPE_VELOCITY_XY = Vitesse latérale\r
+ FlightDataType.TYPE_ACCELERATION_XY = Accélération latérale\r
+ FlightDataType.TYPE_AOA = Angle d'attaque\r
+ FlightDataType.TYPE_ROLL_RATE = Taux de roulis\r
+ FlightDataType.TYPE_PITCH_RATE = Taux de tangage\r
+ FlightDataType.TYPE_YAW_RATE = Taux d'embardée\r
+ FlightDataType.TYPE_MASS = Masse\r
+ FlightDataType.TYPE_LONGITUDINAL_INERTIA = Moment d'inertie longitudinale\r
+ FlightDataType.TYPE_ROTATIONAL_INERTIA = Moment d'inertie rotatif\r
+ FlightDataType.TYPE_CP_LOCATION = Emplacement du CP\r
+ FlightDataType.TYPE_CG_LOCATION = Emplacement du CG\r
+ FlightDataType.TYPE_STABILITY = Calibres marge de stabilité\r
+ FlightDataType.TYPE_MACH_NUMBER = Mach number\r
+ FlightDataType.TYPE_REYNOLDS_NUMBER = Nombre de Reynolds\r
+ FlightDataType.TYPE_THRUST_FORCE = Poussée\r
+ FlightDataType.TYPE_DRAG_FORCE = Force de traînée\r
+ FlightDataType.TYPE_DRAG_COEFF = Coefficient de traînée\r
+ FlightDataType.TYPE_AXIAL_DRAG_COEFF = Coefficient de trainée axiale\r
+ FlightDataType.TYPE_FRICTION_DRAG_COEFF = Coefficient de traînée de friction\r
+ FlightDataType.TYPE_PRESSURE_DRAG_COEFF = Coefficient de traînée de pression\r
+ FlightDataType.TYPE_BASE_DRAG_COEFF = Base drag coefficient\r
+ FlightDataType.TYPE_NORMAL_FORCE_COEFF = Normal force coefficient\r
+ FlightDataType.TYPE_PITCH_MOMENT_COEFF = Pitch moment coefficient\r
+ FlightDataType.TYPE_YAW_MOMENT_COEFF = Yaw moment coefficient\r
+ FlightDataType.TYPE_SIDE_FORCE_COEFF = Side force coefficient\r
+ FlightDataType.TYPE_ROLL_MOMENT_COEFF = Roll moment coefficient\r
+ FlightDataType.TYPE_ROLL_FORCING_COEFF = Roll forcing coefficient\r
+ FlightDataType.TYPE_ROLL_DAMPING_COEFF = Roll damping coefficient\r
+ FlightDataType.TYPE_PITCH_DAMPING_MOMENT_COEFF = Pitch damping coefficient\r
+ FlightDataType.TYPE_YAW_DAMPING_MOMENT_COEFF = Yaw damping coefficient\r
+ FlightDataType.TYPE_REFERENCE_LENGTH = Longueur de référence\r
+ FlightDataType.TYPE_REFERENCE_AREA = Surface de référence\r
+ FlightDataType.TYPE_ORIENTATION_THETA = Orientation verticale (zénith)\r
+ FlightDataType.TYPE_ORIENTATION_PHI = Orientation latérale (azimut)\r
+ FlightDataType.TYPE_WIND_VELOCITY = Vitesse de vent\r
+ FlightDataType.TYPE_AIR_TEMPERATURE = Température de l'air\r
+ FlightDataType.TYPE_AIR_PRESSURE = Pression atmosphérique\r
+ FlightDataType.TYPE_SPEED_OF_SOUND = Vitesse du son\r
+ FlightDataType.TYPE_TIME_STEP = Pas de simulation du temps\r
+ FlightDataType.TYPE_COMPUTATION_TIME = Temps de calcul\r
+ \r
+ ! PlotConfiguration\r
+ PlotConfiguration.Verticalmotion = Mouvement vertical par rapport au temps\r
+ PlotConfiguration.Totalmotion = Mouvement total par rapport au temps\r
+ PlotConfiguration.Flightside = Flight side profile\r
+ PlotConfiguration.Stability = Stabilité par rapport temps\r
+ PlotConfiguration.Dragcoef = Coefficients de traînée par rapport au Mach number\r
+ PlotConfiguration.Rollcharacteristics = Caractéristiques de roulis\r
+ PlotConfiguration.Angleofattack = Angle d'attaque et orientation par rapport au temps\r
+ PlotConfiguration.Simulationtime = Pas du temps et temps de calcul\r
+ \r
+ ! Warning\r
+ Warning.LargeAOA.str1 = Grand angle d'attaque rencontré.\r
+ Warning.LargeAOA.str2 = Grand angle d'attaque rencontré (\r
+ Warning.DISCONTINUITY = Discontinuité dans le diametre du corps de la fusée.\r
+ Warning.THICK_FIN = Les ailerons fin ne seront peut etre pas modélisés correctement.\r
+ Warning.JAGGED_EDGED_FIN = Jagged-edged fin predictions may be inaccurate.\r
+ Warning.LISTENERS_AFFECTED = Listeners modified the flight simulation\r
+ Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING = Le dispositif de récupération s'est ouvert alors que la combustion du moteur n'était pas finie.\r
+ Warning.FILE_INVALID_PARAMETER = Parametre invalide rencontré, ignorer.\r
package net.sf.openrocket.database;
+ import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.material.MaterialStorage;
*/
public class Databases {
private static final LogHelper log = Application.getLogger();
-
+ private static final Translator trans = Application.getTranslator();
+
/* Static implementations of specific databases: */
/**
static {
// Add default materials
- BULK_MATERIAL.add(new Material.Bulk("Acrylic", 1190, false));
- BULK_MATERIAL.add(new Material.Bulk("Balsa", 170, false));
- BULK_MATERIAL.add(new Material.Bulk("Birch", 670, false));
- BULK_MATERIAL.add(new Material.Bulk("Cardboard", 680, false));
- BULK_MATERIAL.add(new Material.Bulk("Carbon fiber", 1780, false));
- BULK_MATERIAL.add(new Material.Bulk("Cork", 240, false));
- BULK_MATERIAL.add(new Material.Bulk("Depron (XPS)", 40, false));
- BULK_MATERIAL.add(new Material.Bulk("Fiberglass", 1850, false));
- BULK_MATERIAL.add(new Material.Bulk("Kraft phenolic", 950, false));
- BULK_MATERIAL.add(new Material.Bulk("Maple", 755, false));
- BULK_MATERIAL.add(new Material.Bulk("Paper (office)", 820, false));
- BULK_MATERIAL.add(new Material.Bulk("Pine", 530, false));
- BULK_MATERIAL.add(new Material.Bulk("Plywood (birch)", 630, false));
- BULK_MATERIAL.add(new Material.Bulk("Polycarbonate (Lexan)", 1200, false));
- BULK_MATERIAL.add(new Material.Bulk("Polystyrene", 1050, false));
- BULK_MATERIAL.add(new Material.Bulk("PVC", 1390, false));
- BULK_MATERIAL.add(new Material.Bulk("Spruce", 450, false));
- BULK_MATERIAL.add(new Material.Bulk("Styrofoam (generic EPS)", 20, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Acrylic"), 1190, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Balsa"), 170, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Birch"), 670, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Cardboard"), 680, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Carbonfiber"), 1780, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Cork"), 240, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.DepronXPS"), 40, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Fiberglass"), 1850, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Kraftphenolic"), 950, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Maple"), 755, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Paperoffice"), 820, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Pine"), 530, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Plywoodbirch"), 630, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.PolycarbonateLexan"), 1200, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Polystyrene"), 1050, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.PVC"), 1390, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Spruce"), 450, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.StyrofoamgenericEPS"), 20, false));
// BULK_MATERIAL.add(new Material.Bulk("Styrofoam (Blue foam, XPS)", 32, false));
- BULK_MATERIAL.add(new Material.Bulk("Styrofoam \"Blue foam\" (XPS)", 32, false));
- BULK_MATERIAL.add(new Material.Bulk("Quantum tubing", 1050, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.StyrofoamBluefoamXPS"), 32, false));
+ BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Quantumtubing"), 1050, false));
- SURFACE_MATERIAL.add(new Material.Surface("Ripstop nylon", 0.067, false));
- SURFACE_MATERIAL.add(new Material.Surface("Mylar", 0.021, false));
- SURFACE_MATERIAL.add(new Material.Surface("Polyethylene (thin)", 0.015, false));
- SURFACE_MATERIAL.add(new Material.Surface("Polyethylene (heavy)", 0.040, false));
- SURFACE_MATERIAL.add(new Material.Surface("Silk", 0.060, false));
- SURFACE_MATERIAL.add(new Material.Surface("Paper (office)", 0.080, false));
- SURFACE_MATERIAL.add(new Material.Surface("Cellophane", 0.018, false));
- SURFACE_MATERIAL.add(new Material.Surface("Cr\u00eape paper", 0.025, false));
+ SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Ripstopnylon"), 0.067, false));
+ SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Mylar"), 0.021, false));
+ SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Polyethylenethin"), 0.015, false));
+ SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Polyethyleneheavy"), 0.040, false));
+ SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Silk"), 0.060, false));
+ SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Paperoffice"), 0.080, false));
+ SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Cellophane"), 0.018, false));
- SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Creapepaper"), 0.025, false));
++ SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Crepepaper"), 0.025, false));
- LINE_MATERIAL.add(new Material.Line("Thread (heavy-duty)", 0.0003, false));
- LINE_MATERIAL.add(new Material.Line("Elastic cord (round 2mm, 1/16 in)", 0.0018, false));
- LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 6mm, 1/4 in)", 0.0043, false));
- LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 12mm, 1/2 in)", 0.008, false));
- LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 19mm, 3/4 in)", 0.0012, false));
- LINE_MATERIAL.add(new Material.Line("Elastic cord (flat 25mm, 1 in)", 0.0016, false));
- LINE_MATERIAL.add(new Material.Line("Braided nylon (2 mm, 1/16 in)", 0.001, false));
- LINE_MATERIAL.add(new Material.Line("Braided nylon (3 mm, 1/8 in)", 0.0035, false));
- LINE_MATERIAL.add(new Material.Line("Tubular nylon (11 mm, 7/16 in)", 0.013, false));
- LINE_MATERIAL.add(new Material.Line("Tubular nylon (14 mm, 9/16 in)", 0.016, false));
- LINE_MATERIAL.add(new Material.Line("Tubular nylon (25 mm, 1 in)", 0.029, false));
+ //// Thread (heavy-duty)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Threadheavy-duty"), 0.0003, false));
+ //// Elastic cord (round 2mm, 1/16 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordround2mm"), 0.0018, false));
+ //// Elastic cord (flat 6mm, 1/4 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat6mm"), 0.0043, false));
+ //// Elastic cord (flat 12mm, 1/2 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat12mm"), 0.008, false));
+ //// Elastic cord (flat 19mm, 3/4 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat19mm"), 0.0012, false));
+ //// Elastic cord (flat 25mm, 1 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat25mm"), 0.0016, false));
+ //// Braided nylon (2 mm, 1/16 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Braidednylon2mm"), 0.001, false));
+ //// Braided nylon (3 mm, 1/8 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Braidednylon3mm"), 0.0035, false));
+ //// Tubular nylon (11 mm, 7/16 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Tubularnylon11mm"), 0.013, false));
+ //// Tubular nylon (14 mm, 9/16 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Tubularnylon14mm"), 0.016, false));
+ //// Tubular nylon (25 mm, 1 in)
+ LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Tubularnylon25mm"), 0.029, false));
// Add user-defined materials
import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.util.List;
import javax.swing.BorderFactory;
-import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import net.sf.openrocket.gui.adaptors.EnumModel;
import net.sf.openrocket.gui.adaptors.MaterialModel;
import net.sf.openrocket.gui.components.BasicSlider;
+import net.sf.openrocket.gui.components.ColorIcon;
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) {
// Component color and "Use default color" checkbox
if (colorButton != null && colorDefault != null) {
- colorButton.setIcon(new ColorIcon(component.getColor()));
+ colorButton.setIcon(new ColorIcon(getColor()));
if ((component.getColor() == null) != colorDefault.isSelected())
colorDefault.setSelected(component.getColor() == null);
// 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 = new JButton(new ColorIcon(getColor()));
colorButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
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);
JComboBox combo = new JComboBox(new EnumModel<LineStyle>(component, "LineStyle",
- list, "Default style"));
+ //// Default style
+ list, trans.get("LineStyle.Defaultstyle")));
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) {
}
-
+ private Color getColor() {
+ Color c = component.getColor();
+ if (c == null) {
+ c = Prefs.getDefaultColor(component.getClass());
+ }
+ return c;
+ }
+
+
protected JPanel shoulderTab() {
JPanel panel = new JPanel(new MigLayout("fill"));
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");
}
- private class ColorIcon implements Icon {
- private final Color color;
-
- public ColorIcon(Color c) {
- this.color = c;
- }
-
- @Override
- public int getIconHeight() {
- return 15;
- }
-
- @Override
- public int getIconWidth() {
- return 25;
- }
-
- @Override
- public void paintIcon(Component c, Graphics g, int x, int y) {
- if (color == null) {
- g.setColor(Prefs.getDefaultColor(component.getClass()));
- } else {
- g.setColor(color);
- }
- g.fill3DRect(x, y, getIconWidth(), getIconHeight(), false);
- }
-
- }
-
protected void register(Invalidatable model) {
this.invalidatables.add(model);
}
}
}
-}
+}
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
+import net.sf.openrocket.gui.components.DescriptionArea;
import net.sf.openrocket.gui.components.StyledLabel;
++import net.sf.openrocket.gui.components.StyledLabel.Style;
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();
- "Doug Pedrick (RockSim file format, printing)<br><br>" +
+ private static final String CREDITS = "<html><center>" +
+ "<font size=\"+1\"><b>OpenRocket has been developed by:</b></font><br><br>" +
+ "Sampo Niskanen (main developer)<br>" +
++ "Doug Pedrick (RockSim file format, printing)<br>" +
++ "Boris du Reau (internationalization, translation lead)<br><br>" +
+ "<b>OpenRocket utilizes the following libraries:</b><br><br>" +
+ "MiG Layout (http://www.miglayout.com/)<br>" +
+ "JFreeChart (http://www.jfree.org/jfreechart/)<br>" +
+ "iText (http://www.itextpdf.com/)";
+
public AboutDialog(JFrame parent) {
super(parent, true);
final String version = Prefs.getVersion();
JPanel panel = new JPanel(new MigLayout("fill"));
++ JPanel sub;
-- panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket")),
- "spany 4, top");
- "spany, top");
++
++ // OpenRocket logo
++ panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket")), "top");
+
- panel.add(new StyledLabel("OpenRocket", 20), "ax 50%, growy, wrap para");
- panel.add(new StyledLabel("Version " + version, 3), "ax 50%, growy, wrap rel");
++
++ // OpenRocket version info + copyright
++ sub = new JPanel(new MigLayout("fill"));
- 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");
- // }
++ sub.add(new StyledLabel("OpenRocket", 20), "ax 50%, growy, wrap para");
++ sub.add(new StyledLabel(trans.get("lbl.version").trim() + " " + version, 3), "ax 50%, growy, wrap rel");
++ sub.add(new StyledLabel("Copyright " + Chars.COPY + " 2007-2011 Sampo Niskanen"), "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"),
- "ax 50%, growy, wrap para");
++ sub.add(new URLLabel(OPENROCKET_URL), "ax 50%, growy, wrap para");
++ panel.add(sub, "grow");
- panel.add(new StyledLabel("Copyright " + Chars.COPY + " 2007-2011 Sampo Niskanen"),
- "ax 50%, growy, wrap para");
- panel.add(new URLLabel(OPENROCKET_URL), "ax 50%, growy, wrap para");
++
++ // Translation information (if present)
++ String translation = trans.get("lbl.translation").trim();
++ String translator = trans.get("lbl.translator").trim();
++ String translatorWebsite = trans.get("lbl.translatorWebsite").trim();
++ String translatorIcon = trans.get("lbl.translatorIcon").trim();
- panel.add(new URLLabel(OPENROCKET_URL), "ax 50%, growy, wrap para");
- //// 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");
++ if (translator.length() > 0 || translatorWebsite.length() > 0 || translatorIcon.length() > 0) {
++ sub = new JPanel(new MigLayout("fill"));
++
++ sub.add(new StyledLabel(translation, Style.BOLD), "ax 50%, growy, wrap para");
++
++ if (translatorIcon.length() > 0) {
++ sub.add(new JLabel(Icons.loadImageIcon("pix/translators/" + translatorIcon, translator)),
++ "ax 50%, growy, wrap para");
++ }
++ if (translator.length() > 0) {
++ sub.add(new JLabel(translator), "ax 50%, growy, wrap rel");
++ }
++ if (translatorWebsite.length() > 0) {
++ sub.add(new URLLabel(translatorWebsite), "ax 50%, growy, wrap para");
+ }
++
++ panel.add(sub);
+ }
- panel.add(info, "width 10px, height 100lp, grow, spanx, wrap para");
+
+ DescriptionArea info = new DescriptionArea(5);
+ info.setText(CREDITS);
- JButton close = new JButton("Close");
++ panel.add(info, "newline, width 10px, height 100lp, grow, spanx, wrap para");
+
+ // JTextArea area = new JTextArea(CREATORS);
+ // area.setEditable(false);
+ // area.setLineWrap(true);
+ // area.setWrapStyleWord(true);
+ // panel.add(new JScrollPane(area), "width 10px, height 100lp, grow, spanx, wrap para");
+
+
- JButton close = new JButton(trans.get("dlg.but.close"));
+ //Close button
++ JButton close = new JButton(trans.get("button.close"));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
GUIUtil.setDisposableDialogOptions(this, close);
}
--
}
/*
- * PrintDialog.java
+ * PrintPanel.java
*/
package net.sf.openrocket.gui.dialogs;
+import java.awt.Desktop;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Iterator;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JDialog;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.filechooser.FileFilter;
+import javax.swing.tree.TreeNode;
+import javax.swing.tree.TreePath;
+
+import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.document.OpenRocketDocument;
-import net.sf.openrocket.gui.print.PDFPrintStreamDoc;
-import net.sf.openrocket.gui.print.PrintUtilities;
+import net.sf.openrocket.gui.main.ExceptionHandler;
+import net.sf.openrocket.gui.print.PrintController;
+import net.sf.openrocket.gui.print.PrintSettings;
+import net.sf.openrocket.gui.print.PrintableContext;
+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;
-import sun.print.ServiceDialog;
-
-import javax.print.DocFlavor;
-import javax.print.DocPrintJob;
-import javax.print.PrintException;
-import javax.print.PrintService;
-import javax.print.PrintServiceLookup;
-import javax.print.attribute.Attribute;
-import javax.print.attribute.AttributeSet;
-import javax.print.attribute.HashPrintRequestAttributeSet;
-import javax.print.attribute.PrintRequestAttributeSet;
-import javax.print.attribute.standard.Destination;
-import javax.print.attribute.standard.Fidelity;
-import javax.swing.JDialog;
-import javax.swing.JMenu;
-import javax.swing.JTabbedPane;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dialog;
-import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsDevice;
-import java.awt.GraphicsEnvironment;
-import java.awt.HeadlessException;
-import java.awt.Rectangle;
-import java.io.ByteArrayOutputStream;
+import net.sf.openrocket.util.GUIUtil;
+import net.sf.openrocket.util.Prefs;
/**
- * This class is not a dialog by inheritance, but is by delegation. It front-ends a java print dialog by
- * augmenting it with application specific (rocket) settings.
+ * This class isolates the Swing components used to create a panel that is added to a standard Java print dialog.
*/
-public class PrintDialog {
-
- /**
- * The service UI dialog.
- */
- private ServiceDialog dialog;
-
- /**
- * A javax doc flavor specific for printing PDF documents.
- */
- 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.
- *
- * @param orDocument the rocket container
- */
- public PrintDialog (OpenRocketDocument orDocument) {
- PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
- PrintService svc = PrintServiceLookup.lookupDefaultPrintService();
- PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
- attrs.add(PrintUtilities.getDefaultMedia().getMediaSizeName());
-
- final PrintPanel panel = new PrintPanel(orDocument, this);
- PrintService ps = printDialog(null, 100, 100, services, svc, PDF, attrs, panel);
- if (ps != null) {
- DocPrintJob dpj = ps.createPrintJob();
- try {
- System.err.println(attrs.size());
- ByteArrayOutputStream baos = panel.generateReport();
- dpj.print(new PDFPrintStreamDoc(baos, null), attrs);
- }
- catch (PrintException e) {
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
- }
- }
- }
-
- /**
- * Get the set of attributes from the service ui print dialog.
- *
- * @return a set of print attributes
- */
- PrintRequestAttributeSet getAttributes () {
- return dialog.getAttributes();
- }
-
- /**
- * Get the service ui dialog. This is the actual dialog that gets displayed - we co-opt it for adding a rocket
- * specific tab.
- *
- * @return the Java service ui print dialog
- */
- JDialog getDialog () {
- return dialog;
- }
-
- /**
- * Mimics the ServiceUI.printDialog method, but with enhancements for our own print settings tab.
- *
- * @param gc used to select screen. null means primary or default screen.
- * @param x location of dialog including border in screen coordinates
- * @param y location of dialog including border in screen coordinates
- * @param services to be browsable, must be non-null.
- * @param defaultService - initial PrintService to display.
- * @param flavor - the flavor to be printed, or null.
- * @param attributes on input is the initial application supplied preferences. This cannot be null but may be
- * empty. On output the attributes reflect changes made by the user.
- * @param addnl a panel to be added, as a tab, to the internal tabbed pane of the resulting print dialog
- *
- * @return print service selected by the user, or null if the user cancelled the dialog.
- *
- * @throws HeadlessException if GraphicsEnvironment.isHeadless() returns true.
- * @throws IllegalArgumentException if services is null or empty, or attributes is null, or the initial PrintService
- * is not in the list of browsable services.
- */
- private PrintService printDialog (GraphicsConfiguration gc,
- int x, int y,
- PrintService[] services,
- PrintService defaultService,
- DocFlavor flavor,
- PrintRequestAttributeSet attributes,
- PrintPanel addnl)
- throws HeadlessException {
- int defaultIndex = -1;
-
- if (GraphicsEnvironment.isHeadless()) {
- throw new HeadlessException();
- }
- else if ((services == null) || (services.length == 0)) {
- throw new IllegalArgumentException("services must be non-null " +
- "and non-empty");
- }
- else if (attributes == null) {
- throw new IllegalArgumentException("attributes must be non-null");
- }
-
- if (defaultService != null) {
- for (int i = 0; i < services.length; i++) {
- if (services[i].equals(defaultService)) {
- defaultIndex = i;
- break;
- }
- }
-
- if (defaultIndex < 0) {
- throw new IllegalArgumentException("services must contain " +
- "defaultService");
- }
- }
- else {
- defaultIndex = 0;
- }
-
- Rectangle gcBounds = (gc == null) ? GraphicsEnvironment.
- getLocalGraphicsEnvironment().getDefaultScreenDevice().
- getDefaultConfiguration().getBounds() : gc.getBounds();
-
- dialog = new ServiceDialog(gc,
- x + gcBounds.x,
- y + gcBounds.y,
- services, defaultIndex,
- flavor, attributes,
- (Dialog) null);
- Rectangle dlgBounds = dialog.getBounds();
-
- // get union of all GC bounds
- GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
- GraphicsDevice[] gs = ge.getScreenDevices();
- for (GraphicsDevice g : gs) {
- gcBounds = gcBounds.union(g.getDefaultConfiguration().getBounds());
- }
-
- // if portion of dialog is not within the gc boundary
- if (!gcBounds.contains(dlgBounds)) {
- // put in the center relative to parent frame/dialog
- dialog.setLocationRelativeTo(null);
- }
- if (addnl != null && addnl.getTitle() != null) {
- JTabbedPane tp = (JTabbedPane) getDescendantOfClass(JTabbedPane.class, dialog);
- tp.add(addnl, addnl.getTitle(), 0);
- tp.setSelectedIndex(0);
- }
+public class PrintDialog extends JDialog implements TreeSelectionListener {
+
+ private static final LogHelper log = Application.getLogger();
++ private static final Translator trans = Application.getTranslator();
+
- private static final String SETTINGS_BUTTON_TEXT = "Settings";
- private static final String PREVIEW_BUTTON_TEXT = "Preview & Print";
- private static final String SAVE_AS_PDF_BUTTON_TEXT = "Save as PDF";
- private static final String SHOW_BY_STAGE = "Show By Stage";
++ private final Desktop desktop;
+
+ private final RocketPrintTree stagedTree;
+ private final RocketPrintTree noStagedTree;
+ private OpenRocketDocument document;
+ private RocketPrintTree currentTree;
- private Desktop desktop = null;
+
+ private JButton previewButton;
+ private JButton saveAsPDF;
+ private JButton cancel;
+
+ /**
+ * Constructor.
+ *
+ * @param orDocument the OR rocket container
+ */
+ public PrintDialog(Window parent, OpenRocketDocument orDocument) {
- super(parent, "Print or export", ModalityType.APPLICATION_MODAL);
++ super(parent, trans.get("title"), ModalityType.APPLICATION_MODAL);
+
- dialog.setVisible(true);
+ JPanel panel = new JPanel(new MigLayout("fill, gap rel unrel"));
+ this.add(panel);
+
- if (dialog.getStatus() == ServiceDialog.APPROVE) {
- PrintRequestAttributeSet newas = dialog.getAttributes();
- Class dstCategory = Destination.class;
- Class fdCategory = Fidelity.class;
+ // before any Desktop APIs are used, first check whether the API is
+ // supported by this particular VM on this particular host
+ if (Desktop.isDesktopSupported()) {
+ desktop = Desktop.getDesktop();
++ } else {
++ desktop = null;
+ }
+
+ document = orDocument;
+ Rocket rocket = orDocument.getRocket();
+
+ noStagedTree = RocketPrintTree.create(rocket.getName());
+ noStagedTree.setShowsRootHandles(false);
+ CheckTreeManager ctm = new net.sf.openrocket.gui.print.components.CheckTreeManager(noStagedTree);
+ ctm.addTreeSelectionListener(this);
+
+ final int stages = rocket.getStageCount();
+
- JLabel label = new JLabel("Select elements to include:");
- if (attributes.containsKey(dstCategory) &&
- !newas.containsKey(dstCategory)) {
- attributes.remove(dstCategory);
- }
++ JLabel label = new JLabel(trans.get("lbl.selectElements"));
+ panel.add(label, "wrap unrel");
+
+ // Create the tree
+ if (stages > 1) {
+ stagedTree = RocketPrintTree.create(rocket.getName(), rocket.getChildren());
+ ctm = new CheckTreeManager(stagedTree);
+ stagedTree.setShowsRootHandles(false);
+ ctm.addTreeSelectionListener(this);
+ } else {
+ stagedTree = noStagedTree;
+ }
+ currentTree = stagedTree;
+
+ // Add the tree to the UI
+ final JScrollPane scrollPane = new JScrollPane(stagedTree);
+ panel.add(scrollPane, "width 400lp, height 200lp, grow, wrap para");
+
- attributes.addAll(newas);
+ // Checkboxes and buttons
- final JCheckBox sortByStage = new JCheckBox(SHOW_BY_STAGE);
++ final JCheckBox sortByStage = new JCheckBox(trans.get("checkbox.showByStage"));
+ sortByStage.setEnabled(stages > 1);
+ sortByStage.setSelected(stages > 1);
+ sortByStage.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (sortByStage.isEnabled()) {
+ if (((JCheckBox) e.getSource()).isSelected()) {
+ scrollPane.setViewportView(stagedTree);
+ stagedTree.setExpandsSelectedPaths(true);
+ currentTree = stagedTree;
+ }
+ else {
+ scrollPane.setViewportView(noStagedTree);
+ noStagedTree.setExpandsSelectedPaths(true);
+ currentTree = noStagedTree;
+ }
+ }
+ }
+ });
+ panel.add(sortByStage, "aligny top, split");
+
- Fidelity fd = (Fidelity) attributes.get(fdCategory);
- if (fd != null) {
- if (fd == Fidelity.FIDELITY_TRUE) {
- removeUnsupportedAttributes(dialog.getPrintService(),
- flavor, attributes);
- }
- }
- return dialog.getPrintService();
- }
- else {
- return null;
- }
- }
+ panel.add(new JPanel(), "growx");
+
- JButton settingsButton = new JButton(SETTINGS_BUTTON_TEXT);
- private Component getDescendantOfClass (Class c, Container cont) {
- if (c == null || cont == null) {
- return null;
- }
- Component[] children = (cont instanceof JMenu)
- ? ((JMenu) cont).getMenuComponents()
- : cont.getComponents();
- for (int i = 0, n = children.length; i < n; i++) {
- Component comp = children[i];
- if (c.isInstance(comp)) {
- return comp;
- }
- comp = getDescendantOfClass(c, (Container) comp);
- if (comp != null) {
- return comp;
- }
- }
- return null;
- }
++ JButton settingsButton = new JButton(trans.get("printdlg.but.settings"));
+ settingsButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ PrintSettings settings = Prefs.getPrintSettings();
+ log.debug("settings=" + settings);
+ PrintSettingsDialog settingsDialog = new PrintSettingsDialog(PrintDialog.this, settings);
+ settingsDialog.setVisible(true);
+ Prefs.setPrintSettings(settings);
+ }
+ });
+ panel.add(settingsButton, "wrap para");
+
- previewButton = new JButton(PREVIEW_BUTTON_TEXT);
- /**
- * Removes any attributes from the given AttributeSet that are unsupported by the given PrintService/DocFlavor
- * combination.
- *
- * @param ps the print service for which unsupported attributes will be determined
- * @param flavor the document flavor; PDF in our case
- * @param aset the set of attributes requested
- */
- private static void removeUnsupportedAttributes (PrintService ps,
- DocFlavor flavor,
- AttributeSet aset) {
- AttributeSet asUnsupported = ps.getUnsupportedAttributes(flavor,
- aset);
++ previewButton = new JButton(trans.get("but.previewAndPrint"));
+ previewButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ onPreview();
+ PrintDialog.this.setVisible(false);
+ }
+ });
+ panel.add(previewButton, "split, right, gap para");
+
- saveAsPDF = new JButton(SAVE_AS_PDF_BUTTON_TEXT);
- if (asUnsupported != null) {
- Attribute[] usAttrs = asUnsupported.toArray();
++ saveAsPDF = new JButton(trans.get("printdlg.but.saveaspdf"));
+ saveAsPDF.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (onSavePDF()) {
+ PrintDialog.this.setVisible(false);
+ }
+ }
+ });
+ panel.add(saveAsPDF, "right, gap para");
+
- cancel = new JButton("Cancel");
- for (Attribute usAttr : usAttrs) {
- Class<? extends Attribute> category = usAttr.getCategory();
++ cancel = new JButton(trans.get("button.cancel"));
+ cancel.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ PrintDialog.this.setVisible(false);
+ }
+ });
+ panel.add(cancel, "right, gap para");
+
- if (ps.isAttributeCategorySupported(category)) {
- Attribute attr =
- (Attribute) ps.getDefaultAttributeValue(category);
+ expandAll(currentTree, true);
+ if (currentTree != noStagedTree) {
+ expandAll(noStagedTree, true);
+ }
+
- if (attr != null) {
- aset.add(attr);
- }
- else {
- aset.remove(category);
- }
- }
- else {
- aset.remove(category);
- }
- }
- }
- }
+ GUIUtil.setDisposableDialogOptions(this, previewButton);
+
+ }
+
+
+ @Override
+ public void valueChanged(final TreeSelectionEvent e) {
+ final TreePath path = e.getNewLeadSelectionPath();
+ if (path != null) {
+ previewButton.setEnabled(true);
+ saveAsPDF.setEnabled(true);
+ } else {
+ previewButton.setEnabled(false);
+ saveAsPDF.setEnabled(false);
+ }
+ }
+
+ /**
+ * If expand is true, expands all nodes in the tree. Otherwise, collapses all nodes in the theTree.
+ *
+ * @param theTree the tree to expand/contract
+ * @param expand expand if true, contract if not
+ */
+ public void expandAll(RocketPrintTree theTree, boolean expand) {
+ TreeNode root = (TreeNode) theTree.getModel().getRoot();
+ // Traverse theTree from root
+ expandAll(theTree, new TreePath(root), expand);
+ }
+
+ /**
+ * Recursively walk a tree, and if expand is true, expands all nodes in the tree. Otherwise, collapses all nodes in
+ * the theTree.
+ *
+ * @param theTree the tree to expand/contract
+ * @param parent the node to iterate/recurse over
+ * @param expand expand if true, contract if not
+ */
+ private void expandAll(RocketPrintTree theTree, TreePath parent, boolean expand) {
+ theTree.addSelectionPath(parent);
+ // Traverse children
+ TreeNode node = (TreeNode) parent.getLastPathComponent();
+ if (node.getChildCount() >= 0) {
+ for (Enumeration<?> e = node.children(); e.hasMoreElements();) {
+ TreeNode n = (TreeNode) e.nextElement();
+ TreePath path = parent.pathByAddingChild(n);
+ expandAll(theTree, path, expand);
+ }
+ }
+ // Expansion or collapse must be done bottom-up
+ if (expand) {
+ theTree.expandPath(parent);
+ } else {
+ theTree.collapsePath(parent);
+ }
+ }
+
+
- log.error("Could not create temporary file for previewing.", e);
- JOptionPane.showMessageDialog(this, "Could not create a temporary file for previewing.",
- "Error creating file", JOptionPane.ERROR_MESSAGE);
+ /**
+ * Generate a report using a temporary file. The file will be deleted upon JVM exit.
+ *
+ * @param paper the name of the paper size
+ *
+ * @return a file, populated with the "printed" output (the rocket info)
+ *
+ * @throws IOException thrown if the file could not be generated
+ */
+ private File generateReport(PrintSettings settings) throws IOException {
+ final File f = File.createTempFile("openrocket-", ".pdf");
+ f.deleteOnExit();
+ return generateReport(f, settings);
+ }
+
+ /**
+ * Generate a report to a specified file.
+ *
+ * @param f the file to which rocket data will be written
+ * @param paper the name of the paper size
+ *
+ * @return a file, populated with the "printed" output (the rocket info)
+ *
+ * @throws IOException thrown if the file could not be generated
+ */
+ private File generateReport(File f, PrintSettings settings) throws IOException {
+ Iterator<PrintableContext> toBePrinted = currentTree.getToBePrinted();
+ new PrintController().print(document, toBePrinted, new FileOutputStream(f), settings);
+ return f;
+ }
+
+
+ /**
+ * Handler for when the Preview button is clicked.
+ */
+ private void onPreview() {
+ if (desktop != null) {
+ try {
+ PrintSettings settings = Prefs.getPrintSettings();
+ // TODO: HIGH: Remove UIManager, and pass settings to the actual printing methods
+ TemplateProperties.setColors(settings);
+ File f = generateReport(settings);
+ desktop.open(f);
+ } catch (IOException e) {
- JOptionPane.showMessageDialog(this,
- "Your environment does not support automatically opening the default PDF viewer.",
- "Error creating file", JOptionPane.INFORMATION_MESSAGE);
++ log.error("Could not open preview.", e);
++ JOptionPane.showMessageDialog(this, new String[] {
++ trans.get("error.preview.desc1"),
++ trans.get("error.preview.desc2") },
++ trans.get("error.preview.title"),
++ JOptionPane.ERROR_MESSAGE);
+ }
+ } else {
- return "PDF files";
++ JOptionPane.showMessageDialog(this, new String[] {
++ trans.get("error.preview.desc1"),
++ trans.get("error.preview.desc2") },
++ trans.get("error.preview.title"),
++ JOptionPane.INFORMATION_MESSAGE);
+ }
+ }
+
+ /**
+ * Handler for when the "Save as PDF" button is clicked.
+ *
+ * @return true if the PDF was saved
+ */
+ private boolean onSavePDF() {
+
+ JFileChooser chooser = new JFileChooser();
+ // Note: source for ExampleFileFilter can be found in FileChooserDemo,
+ // under the demo/jfc directory in the Java 2 SDK, Standard Edition.
+ FileFilter filter = new FileFilter() {
+
+ //Accept all directories and all pdf files.
+ @Override
+ public boolean accept(File f) {
+ if (f.isDirectory())
+ return true;
+ return f.getName().toLowerCase().endsWith(".pdf");
+ }
+
+ //The description of this filter
+ @Override
+ public String getDescription() {
++ return trans.get("filetypes.pdf");
+ }
+ };
+ chooser.setFileFilter(filter);
+ int returnVal = chooser.showSaveDialog(this);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+
+ try {
+ String fname = chooser.getSelectedFile().getCanonicalPath();
+ if (!getExtension(fname).equals("pdf")) {
+ fname = fname + ".pdf";
+ }
+ File f = new File(fname);
+ PrintSettings settings = Prefs.getPrintSettings();
+ // TODO: HIGH: Remove UIManager, and pass settings to the actual printing methods
+ TemplateProperties.setColors(settings);
+ generateReport(f, settings);
+ } catch (IOException e) {
+ ExceptionHandler.handleErrorCondition(e);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Get the extension of a file.
+ */
+ private static String getExtension(String s) {
+ String ext = null;
+ int i = s.lastIndexOf('.');
+
+ if (i > 0 && i < s.length() - 1) {
+ ext = s.substring(i + 1).toLowerCase();
+ }
+ return ext != null ? ext : "";
+ }
}
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
-import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
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 / Export PDF...", 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
public void actionPerformed(ActionEvent e) {
+ log.user("Print action selected");
printAction();
}
});
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("Warnings while reading file: " + warnings);
WarningDialog.showWarnings(parent,
new Object[] {
- "The following problems were encountered while opening " + filename + ".",
- "Some design features may not have been loaded correctly."
- //// The following problems were encountered while opening
- trans.get("BasicFrame.WarningDialog.txt1") +" " + filename + ".",
++ //// The following problems were encountered while opening
++ trans.get("BasicFrame.WarningDialog.txt1") + " " + filename + ".",
+ //// Some design features may not have been loaded correctly.
- trans.get("BasicFrame.WarningDialog.txt2")
++ trans.get("BasicFrame.WarningDialog.txt2")
},
- "Warnings while opening file", warnings);
+ //// Warnings while opening file
+ trans.get("BasicFrame.WarningDialog.title"), warnings);
}
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.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
*
*/
public void printAction() {
- new PrintDialog(document);
+ if (!Prefs.getBoolean("printing.experimental.communicated", false)) {
+ log.info("Showing printing is experimental warning to the user");
+ JOptionPane.showMessageDialog(this, "Printing is an currently an experimental feature " +
+ "and might not fully work on all platforms",
+ "Experimental feature", JOptionPane.WARNING_MESSAGE);
+ Prefs.putBoolean("printing.experimental.communicated", true);
+ }
+ new PrintDialog(this, document).setVisible(true);
}
/**
Rocket rocket = new Rocket();
Stage stage = new Stage();
- stage.setName("Sustainer");
+ //// Sustainer
+ stage.setName(trans.get("BasicFrame.StageName.Sustainer"));
rocket.addChild(stage);
OpenRocketDocument doc = new OpenRocketDocument(rocket);
doc.setSaved(true);
/**
* A translator implementation that returns the logical key in brackets instead
-- * of an actual translation.
++ * of an actual translation. The class optionally verifies that the translation
++ * is actually obtainable from some other translator.
*
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class DebugTranslator implements Translator {
++ private final Translator translator;
++
++
++ /**
++ * Sole constructor.
++ *
++ * @param translator the translator to verify the translation exists, or <code>null</code> not to verify.
++ */
++ public DebugTranslator(Translator translator) {
++ this.translator = translator;
++ }
++
++
++
@Override
public String get(String key) {
++ if (translator != null) {
++ translator.get(key);
++ }
return "[" + key + "]";
}
package net.sf.openrocket.rocketcomponent;
- import net.sf.openrocket.motor.Motor;
- import net.sf.openrocket.util.Coordinate;
- import net.sf.openrocket.util.MathUtil;
-
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+ import net.sf.openrocket.l10n.Translator;
+ import net.sf.openrocket.motor.Motor;
+ import net.sf.openrocket.startup.Application;
+ import net.sf.openrocket.util.Coordinate;
+ import net.sf.openrocket.util.MathUtil;
+
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-
/**
* Rocket body tube component. Has only two parameters, a radius and length.
- *
+ *
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class BodyTube extends SymmetricComponent implements MotorMount, Coaxial {
-
+ private static final Translator trans = Application.getTranslator();
-
++
private double radius = 0;
private boolean autoRadius = false; // Radius chosen automatically based on parent component
-
+
// When changing the inner radius, thickness is modified
-
+
private boolean motorMount = false;
private HashMap<String, Double> ejectionDelays = new HashMap<String, Double>();
private HashMap<String, Motor> motors = new HashMap<String, Motor>();
private IgnitionEvent ignitionEvent = IgnitionEvent.AUTOMATIC;
private double ignitionDelay = 0;
private double overhang = 0;
-
-
+
+
public BodyTube() {
super();
this.radius = DEFAULT_RADIUS;
this.autoRadius = true;
}
-
+
public BodyTube(double length, double radius) {
super();
this.radius = Math.max(radius, 0);
this.length = Math.max(length, 0);
}
-
-
+
+
public BodyTube(double length, double radius, boolean filled) {
this(length, radius);
this.filled = filled;
}
-
+
public BodyTube(double length, double radius, double thickness) {
this(length, radius);
this.filled = false;
this.thickness = thickness;
}
-
-
+
+
/************ Get/set component parameter methods ************/
-
+
/**
* Return the outer radius of the body tube.
- *
- *
-- * @return the outside radius of the tube
++ *
++ * @return the outside radius of the tube
*/
-- @Override
-- public double getOuterRadius () {
++ @Override
++ public double getOuterRadius() {
if (autoRadius) {
// Return auto radius from front or rear
double r = -1;
}
return radius;
}
-
-
+
+
/**
* Set the outer radius of the body tube. If the radius is less than the wall thickness,
* the wall thickness is decreased accordingly of the value of the radius.
* This method sets the automatic radius off.
- *
- *
-- * @param radius the outside radius in standard units
++ *
++ * @param radius the outside radius in standard units
*/
-- @Override
-- public void setOuterRadius (double radius) {
++ @Override
++ public void setOuterRadius(double radius) {
if ((this.radius == radius) && (autoRadius == false))
return;
-
+
this.autoRadius = false;
this.radius = Math.max(radius, 0);
-
+
if (this.thickness > this.radius)
this.thickness = this.radius;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
/**
* Returns whether the radius is selected automatically or not.
* Returns false also in case automatic radius selection is not possible.
public boolean isRadiusAutomatic() {
return autoRadius;
}
-
+
/**
- * Sets whether the radius is selected automatically or not.
+ * Sets whether the radius is selected automatically or not.
*/
public void setRadiusAutomatic(boolean auto) {
if (autoRadius == auto)
return;
-
+
autoRadius = auto;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
@Override
-- public double getAftRadius() { return getOuterRadius(); }
++ public double getAftRadius() {
++ return getOuterRadius();
++ }
++
@Override
-- public double getForeRadius() { return getOuterRadius(); }
++ public double getForeRadius() {
++ return getOuterRadius();
++ }
++
@Override
public boolean isAftRadiusAutomatic() {
return isRadiusAutomatic();
}
-
+
@Override
public boolean isForeRadiusAutomatic() {
return isRadiusAutomatic();
}
-
-
+
+
@Override
protected double getFrontAutoRadius() {
}
return getOuterRadius();
}
-
+
@Override
protected double getRearAutoRadius() {
if (isRadiusAutomatic()) {
}
return getOuterRadius();
}
+
+
-
-
-
-
- @Override
+
-
-
-
-
-
- @Override
++ @Override
public double getInnerRadius() {
if (filled)
return 0;
-- return Math.max(getOuterRadius()-thickness, 0);
++ return Math.max(getOuterRadius() - thickness, 0);
}
-
- @Override
+
- @Override
++ @Override
public void setInnerRadius(double r) {
-- setThickness(getOuterRadius()-r);
++ setThickness(getOuterRadius() - r);
}
-
-
+
+
/**
*/
@Override
public String getComponentName() {
- return "Body tube";
+ //// Body tube
+ return trans.get("BodyTube.BodyTube");
}
-
- /**
- * Accept a visitor to this BodyTube in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this BodyTube
- */
- @Override
- public void accept (final ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
--
--
++
++
/************ Component calculations ***********/
-
+
// From SymmetricComponent
/**
* Returns the outer radius at the position x. This returns the same value as getOuterRadius().
public double getRadius(double x) {
return getOuterRadius();
}
-
+
/**
* Returns the inner radius at the position x. If the tube is filled, returns always zero.
*/
if (filled)
return 0.0;
else
-- return Math.max(getOuterRadius()-thickness,0);
++ return Math.max(getOuterRadius() - thickness, 0);
}
-
-
+
+
/**
* Returns the body tube's center of gravity.
*/
public Coordinate getComponentCG() {
return new Coordinate(length / 2, 0, 0, getComponentMass());
}
-
+
/**
* Returns the body tube's volume.
*/
else
return getFilledVolume(r, length) - getFilledVolume(getInnerRadius(0), length);
}
-
-
+
+
@Override
public double getLongitudinalUnitInertia() {
// 1/12 * (3 * (r1^2 + r2^2) + h^2)
-- return (3 * (MathUtil.pow2(getInnerRadius())) + MathUtil.pow2(getOuterRadius()) +
-- MathUtil.pow2(getLength())) / 12;
++ return (3 * (MathUtil.pow2(getInnerRadius())) + MathUtil.pow2(getOuterRadius()) + MathUtil.pow2(getLength())) / 12;
}
-
+
@Override
public double getRotationalUnitInertia() {
// 1/2 * (r1^2 + r2^2)
-- return (MathUtil.pow2(getInnerRadius()) + MathUtil.pow2(getOuterRadius()))/2;
++ return (MathUtil.pow2(getInnerRadius()) + MathUtil.pow2(getOuterRadius())) / 2;
}
-
-
+
+
/**
private static double getFilledVolume(double r, double l) {
return Math.PI * r * r * l;
}
-
-
+
+
/**
* Adds bounding coordinates to the given set. The body tube will fit within the
* convex hull of the points.
- *
+ *
* Currently the points are simply a rectangular box around the body tube.
*/
@Override
addBound(bounds, length, r);
return bounds;
}
-
-
+
+
/**
* Check whether the given type can be added to this component. BodyTubes allow any
* InternalComponents or ExternalComponents, excluding BodyComponents, to be added.
- *
+ *
* @param type The RocketComponent class type to add.
* @return Whether such a component can be added.
*/
return true;
return false;
}
-
+
//////////////// Motor mount /////////////////
-
+
@Override
public boolean isMotorMount() {
return motorMount;
}
-
+
@Override
public void setMotorMount(boolean mount) {
if (motorMount == mount)
motorMount = mount;
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
}
-
+
@Override
public Motor getMotor(String id) {
if (id == null)
return null;
-
+
// Check whether the id is valid for the current rocket
RocketComponent root = this.getRoot();
if (!(root instanceof Rocket))
return null;
if (!((Rocket) root).isMotorConfigurationID(id))
return null;
-
+
return motors.get(id);
}
-
+
@Override
public void setMotor(String id, Motor motor) {
if (id == null) {
motors.put(id, motor);
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
}
-
+
@Override
public double getMotorDelay(String id) {
Double delay = ejectionDelays.get(id);
return Motor.PLUGGED;
return delay;
}
-
+
@Override
public void setMotorDelay(String id, double delay) {
ejectionDelays.put(id, delay);
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
}
-
+
@Override
public int getMotorCount() {
return 1;
}
-
+
@Override
public double getMotorMountDiameter() {
return getInnerRadius() * 2;
}
-
+
@Override
public IgnitionEvent getIgnitionEvent() {
return ignitionEvent;
}
-
+
@Override
public void setIgnitionEvent(IgnitionEvent event) {
if (ignitionEvent == event)
ignitionEvent = event;
fireComponentChangeEvent(ComponentChangeEvent.EVENT_CHANGE);
}
-
-
+
+
@Override
public double getIgnitionDelay() {
return ignitionDelay;
}
-
+
@Override
public void setIgnitionDelay(double delay) {
if (MathUtil.equals(delay, ignitionDelay))
ignitionDelay = delay;
fireComponentChangeEvent(ComponentChangeEvent.EVENT_CHANGE);
}
-
-
+
+
@Override
public double getMotorOverhang() {
return overhang;
}
-
+
@Override
public void setMotorOverhang(double overhang) {
if (MathUtil.equals(this.overhang, overhang))
this.overhang = overhang;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
@Override
public Coordinate getMotorPosition(String id) {
Motor motor = motors.get(id);
if (motor == null) {
throw new IllegalArgumentException("No motor with id " + id + " defined.");
}
-
+
return new Coordinate(this.getLength() - motor.getLength() + this.getMotorOverhang());
}
-
-
+
+
/*
* (non-Javadoc)
* Copy the motor and ejection delay HashMaps.
- *
+ *
* @see rocketcomponent.RocketComponent#copy()
*/
@SuppressWarnings("unchecked")
package net.sf.openrocket.rocketcomponent;
-import java.util.List;
-
+ 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.util.Prefs;
+import java.util.List;
+
/**
* Class of components with well-defined physical appearance and which have an effect on
- * aerodynamic simulation. They have material defined for them, and the mass of the component
+ * aerodynamic simulation. They have material defined for them, and the mass of the component
* is calculated using the component's volume.
- *
+ *
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public abstract class ExternalComponent extends RocketComponent {
-
+
public enum Finish {
- ROUGH("Rough", 500e-6),
- UNFINISHED("Unfinished", 150e-6),
- NORMAL("Regular paint", 60e-6),
- SMOOTH("Smooth paint", 20e-6),
- POLISHED("Polished", 2e-6);
+ //// Rough
+ ROUGH("ExternalComponent.Rough", 500e-6),
+ //// Unfinished
+ UNFINISHED("ExternalComponent.Unfinished", 150e-6),
+ //// Regular paint
+ NORMAL("ExternalComponent.Regularpaint", 60e-6),
+ //// Smooth paint
+ SMOOTH("ExternalComponent.Smoothpaint", 20e-6),
+ //// Polished
+ POLISHED("ExternalComponent.Polished", 2e-6);
-
+
private final String name;
private final double roughnessSize;
-
+
Finish(String name, double roughness) {
this.name = name;
this.roughnessSize = roughness;
}
-
+
public double getRoughnessSize() {
return roughnessSize;
}
-
+
@Override
public String toString() {
- return name + " (" + UnitGroup.UNITS_ROUGHNESS.toStringUnit(roughnessSize) + ")";
+ final Translator trans = Application.getTranslator();
+ return trans.get(name) + " (" + UnitGroup.UNITS_ROUGHNESS.toStringUnit(roughnessSize) + ")";
}
}
-
-
+
+
/**
* The material of the component.
*/
protected Material material = null;
-
+
protected Finish finish = Finish.NORMAL;
-
-
+
+
/**
* Constructor that sets the relative position of the component.
super(relativePosition);
this.material = Prefs.getDefaultComponentMaterial(this.getClass(), Material.Type.BULK);
}
-
+
/**
* Returns the volume of the component. This value is used in calculating the mass
* of the object.
*/
public abstract double getComponentVolume();
-
+
/**
* Calculates the mass of the component as the product of the volume and interior density.
*/
public double getComponentMass() {
return material.getDensity() * getComponentVolume();
}
-
+
/**
* ExternalComponent has aerodynamic effect, so return true.
*/
public boolean isAerodynamic() {
return true;
}
-
+
/**
* ExternalComponent has effect on the mass, so return true.
*/
public boolean isMassive() {
return true;
}
-
-
+
+
public Material getMaterial() {
return material;
}
-
+
public void setMaterial(Material mat) {
if (mat.getType() != Material.Type.BULK) {
throw new IllegalArgumentException("ExternalComponent requires a bulk material" +
" type=" + mat.getType());
}
-
+
if (material.equals(mat))
return;
material = mat;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
public Finish getFinish() {
return finish;
}
-
+
public void setFinish(Finish finish) {
if (this.finish == finish)
return;
this.finish = finish;
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
}
-
-
+
@Override
protected List<RocketComponent> copyFrom(RocketComponent c) {
this.material = src.material;
return super.copyFrom(c);
}
-
- /**
- * Accept a visitor to this ExternalComponent in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this ExternalComponent
- */
- @Override
- public void accept (final ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
-
+
}
package net.sf.openrocket.rocketcomponent;
+ import java.util.Arrays;
+ import java.util.Collections;
+ import java.util.List;
+
+ import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.ArrayList;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.Coordinate;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.List;
-
public class FreeformFinSet extends FinSet {
private static final LogHelper log = Application.getLogger();
-
+ private static final Translator trans = Application.getTranslator();
-
++
private ArrayList<Coordinate> points = new ArrayList<Coordinate>();
-
+
public FreeformFinSet() {
points.add(Coordinate.NUL);
points.add(new Coordinate(0.025, 0.05));
points.add(new Coordinate(0.075, 0.05));
points.add(new Coordinate(0.05, 0));
-
+
this.length = 0.05;
}
-
-
+
+
public FreeformFinSet(Coordinate[] finpoints) throws IllegalFinPointException {
setPoints(finpoints);
}
-
+
/*
public FreeformFinSet(FinSet finset) {
Coordinate[] finpoints = finset.getFinPoints();
this.copyFrom(finset);
-
+
points.clear();
for (Coordinate c: finpoints) {
points.add(c);
* inserted in its stead.
* <p>
* The specified fin set should not be used after the call!
- *
+ *
* @param finset the fin set to convert.
* @return the new freeform fin set.
*/
final RocketComponent root = finset.getRoot();
FreeformFinSet freeform;
List<RocketComponent> toInvalidate = Collections.emptyList();
-
+
try {
if (root instanceof Rocket) {
((Rocket) root).freeze();
}
-
+
// Get fin set position and remove fin set
final RocketComponent parent = finset.getParent();
final int position;
} else {
position = -1;
}
-
+
// Create the freeform fin set
Coordinate[] finpoints = finset.getFinPoints();
"freeform fin, fin=" + finset + " points=" + Arrays.toString(finpoints),
e);
}
-
+
// Copy component attributes
toInvalidate = freeform.copyFrom(finset);
-
+
// Set name
final String componentTypeName = finset.getComponentName();
final String name = freeform.getName();
-
+
if (name.startsWith(componentTypeName)) {
freeform.setName(freeform.getComponentName() +
name.substring(componentTypeName.length()));
}
-
+
// Add freeform fin set to parent
if (parent != null) {
parent.addChild(freeform, position);
}
-
+
} finally {
if (root instanceof Rocket) {
((Rocket) root).thaw();
}
return freeform;
}
-
-
+
+
/**
* Add a fin point between indices <code>index-1</code> and <code>index</code>.
* The point is placed at the midpoint of the current segment.
- *
+ *
* @param index the fin point before which to add the new point.
*/
public void addPoint(int index) {
double x0, y0, x1, y1;
-
+
x0 = points.get(index - 1).x;
y0 = points.get(index - 1).y;
x1 = points.get(index).x;
y1 = points.get(index).y;
-
+
points.add(index, new Coordinate((x0 + x1) / 2, (y0 + y1) / 2));
// adding a point within the segment affects neither mass nor aerodynamics
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
-
+
+
/**
* Remove the fin point with the given index. The first and last fin points
* cannot be removed, and will cause an <code>IllegalFinPointException</code>
* if attempted.
- *
+ *
* @param index the fin point index to remove
* @throws IllegalFinPointException if removing would result in invalid fin planform
*/
if (index == 0 || index == points.size() - 1) {
throw new IllegalFinPointException("cannot remove first or last point");
}
-
+
ArrayList<Coordinate> copy = this.points.clone();
copy.remove(index);
validate(copy);
this.points = copy;
-
+
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
public int getPointCount() {
return points.size();
}
-
+
public void setPoints(Coordinate[] points) throws IllegalFinPointException {
ArrayList<Coordinate> list = new ArrayList<Coordinate>(points.length);
for (Coordinate p : points) {
}
validate(list);
this.points = list;
-
+
this.length = points[points.length - 1].x;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
/**
* Set the point at position <code>i</code> to coordinates (x,y).
* <p>
* Note that this method enforces basic fin shape restrictions (non-negative y,
- * first and last point locations) silently, but throws an
+ * first and last point locations) silently, but throws an
* <code>IllegalFinPointException</code> if the point causes fin segments to
* intersect.
* <p>
* Moving of the first point in the X-axis is allowed, but this actually moves
* all of the other points the corresponding distance back.
- *
+ *
* @param index the point index to modify.
* @param x the x-coordinate.
* @param y the y-coordinate.
public void setPoint(int index, double x, double y) throws IllegalFinPointException {
if (y < 0)
y = 0;
-
+
double x0, y0, x1, y1;
-
+
if (index == 0) {
-
+
// Restrict point
x = Math.min(x, points.get(points.size() - 1).x);
y = 0;
y0 = Double.NaN;
x1 = points.get(1).x;
y1 = points.get(1).y;
-
+
} else if (index == points.size() - 1) {
-
+
// Restrict point
x = Math.max(x, 0);
y = 0;
y0 = points.get(index - 1).y;
x1 = Double.NaN;
y1 = Double.NaN;
-
+
} else {
-
+
x0 = points.get(index - 1).x;
y0 = points.get(index - 1).y;
x1 = points.get(index + 1).x;
y1 = points.get(index + 1).y;
-
+
}
-
+
// Check for intersecting
for (int i = 1; i < points.size(); i++) {
px1 = points.get(i).x;
py1 = points.get(i).y;
-
+
if (i != index - 1 && i != index && i != index + 1) {
if (intersects(x0, y0, x, y, px0, py0, px1, py1)) {
throw new IllegalFinPointException("segments intersect");
throw new IllegalFinPointException("segments intersect");
}
}
-
+
px0 = px1;
py0 = py1;
}
-
+
if (index == 0) {
-
+
System.out.println("Set point zero to x:" + x);
for (int i = 1; i < points.size(); i++) {
Coordinate c = points.get(i);
points.set(i, c.setX(c.x - x));
}
-
+
} else {
-
+
points.set(index, new Coordinate(x, y));
-
+
}
if (index == 0 || index == points.size() - 1) {
this.length = points.get(points.size() - 1).x;
}
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
private boolean intersects(double ax0, double ay0, double ax1, double ay1,
double bx0, double by0, double bx1, double by1) {
-
+
double d = ((by1 - by0) * (ax1 - ax0) - (bx1 - bx0) * (ay1 - ay0));
-
+
double ua = ((bx1 - bx0) * (ay0 - by0) - (by1 - by0) * (ax0 - bx0)) / d;
double ub = ((ax1 - ax0) * (ay0 - by0) - (ay1 - ay0) * (ax0 - bx0)) / d;
-
+
return (ua >= 0) && (ua <= 1) && (ub >= 0) && (ub <= 1);
}
-
-
+
+
@Override
public Coordinate[] getFinPoints() {
return points.toArray(new Coordinate[0]);
}
-
+
@Override
public double getSpan() {
double max = 0;
}
return max;
}
-
+
@Override
public String getComponentName() {
- return "Freeform fin set";
+ //// Freeform fin set
+ return trans.get("FreeformFinSet.FreeformFinSet");
}
-
-
+
+
@Override
protected RocketComponent copyWithOriginalID() {
RocketComponent c = super.copyWithOriginalID();
((FreeformFinSet) c).points = this.points.clone();
return c;
}
-
- private void validate(ArrayList<Coordinate> points) throws IllegalFinPointException {
- final int n = points.size();
- if (points.get(0).x != 0 || points.get(0).y != 0 ||
- points.get(n - 1).x < 0 || points.get(n - 1).y != 0) {
+
- /**
- * Accept a visitor to this FreeformFinSet in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this FreeformFinSet
- */
- @Override
- public void accept(ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
-
- private void validate(ArrayList<Coordinate> points) throws IllegalFinPointException {
- final int n = points.size();
- if (points.get(0).x != 0 || points.get(0).y != 0 ||
- points.get(n - 1).x < 0 || points.get(n - 1).y != 0) {
++ private void validate(ArrayList<Coordinate> pts) throws IllegalFinPointException {
++ final int n = pts.size();
++ if (pts.get(0).x != 0 || pts.get(0).y != 0 ||
++ pts.get(n - 1).x < 0 || pts.get(n - 1).y != 0) {
throw new IllegalFinPointException("Start or end point illegal.");
}
for (int i = 0; i < n - 1; i++) {
for (int j = i + 2; j < n - 1; j++) {
-- if (intersects(points.get(i).x, points.get(i).y, points.get(i + 1).x, points.get(i + 1).y,
-- points.get(j).x, points.get(j).y, points.get(j + 1).x, points.get(j + 1).y)) {
++ if (intersects(pts.get(i).x, pts.get(i).y, pts.get(i + 1).x, pts.get(i + 1).y,
++ pts.get(j).x, pts.get(j).y, pts.get(j + 1).x, pts.get(j + 1).y)) {
throw new IllegalFinPointException("segments intersect");
}
}
-- if (points.get(i).z != 0) {
++ if (pts.get(i).z != 0) {
throw new IllegalFinPointException("z-coordinate not zero");
}
}
}
-
+
}
package net.sf.openrocket.rocketcomponent;
++import java.util.ArrayList;
++import java.util.HashMap;
++import java.util.List;
++
+ import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.motor.Motor;
+ import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil;
--import java.util.ArrayList;
--import java.util.HashMap;
--import java.util.List;
--
/**
* This class defines an inner tube that can be used as a motor mount. The component
* may also be clustered.
- *
+ *
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class InnerTube extends ThicknessRingComponent
implements Clusterable, RadialParent, MotorMount {
-
+ private static final Translator trans = Application.getTranslator();
-
++
private ClusterConfiguration cluster = ClusterConfiguration.SINGLE;
private double clusterScale = 1.0;
private double clusterRotation = 0.0;
-
+
private boolean motorMount = false;
private HashMap<String, Double> ejectionDelays = new HashMap<String, Double>();
private IgnitionEvent ignitionEvent = IgnitionEvent.AUTOMATIC;
private double ignitionDelay = 0;
private double overhang = 0;
-
-
+
+
/**
* Main constructor.
*/
this.setInnerRadius(0.018 / 2);
this.setLength(0.070);
}
-
-
+
+
@Override
public double getInnerRadius(double x) {
return getInnerRadius();
}
-
-
+
+
@Override
public double getOuterRadius(double x) {
return getOuterRadius();
}
-
-
+
+
@Override
public String getComponentName() {
- return "Inner Tube";
+ //// Inner Tube
+ return trans.get("InnerTube.InnerTube");
}
-
+
@Override
public boolean allowsChildren() {
return true;
}
-
+
/**
* Allow all InternalComponents to be added to this component.
*/
public boolean isCompatible(Class<? extends RocketComponent> type) {
return InternalComponent.class.isAssignableFrom(type);
}
-
-
+
+
///////////// Cluster methods //////////////
-
+
/**
* Get the current cluster configuration.
* @return The current cluster configuration.
*/
++ @Override
public ClusterConfiguration getClusterConfiguration() {
return cluster;
}
-
+
/**
* Set the current cluster configuration.
* @param cluster The cluster configuration.
*/
++ @Override
public void setClusterConfiguration(ClusterConfiguration cluster) {
this.cluster = cluster;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
/**
* Return the number of tubes in the cluster.
* @return Number of tubes in the current cluster.
public int getClusterCount() {
return cluster.getClusterCount();
}
-
+
/**
* Get the cluster scaling. A value of 1.0 indicates that the tubes are packed
* touching each other, larger values separate the tubes and smaller values
public double getClusterScale() {
return clusterScale;
}
-
+
/**
* Set the cluster scaling.
* @see #getClusterScale()
clusterScale = scale;
fireComponentChangeEvent(new ComponentChangeEvent(this, ComponentChangeEvent.MASS_CHANGE));
}
-
-
+
+
/**
* @return the clusterRotation
public double getClusterRotation() {
return clusterRotation;
}
-
-
+
+
/**
* @param rotation the clusterRotation to set
*/
this.clusterRotation = rotation;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
-
+
+
/**
* Return the distance between the closest two cluster inner tube center points.
* This is equivalent to the cluster scale multiplied by the tube diameter.
public double getClusterSeparation() {
return 2 * getOuterRadius() * clusterScale;
}
-
-
+
+
public List<Coordinate> getClusterPoints() {
List<Coordinate> list = new ArrayList<Coordinate>(getClusterCount());
List<Double> points = cluster.getPoints(clusterRotation - getRadialDirection());
}
return list;
}
-
-
+
+
@Override
public Coordinate[] shiftCoordinates(Coordinate[] array) {
array = super.shiftCoordinates(array);
-
+
int count = getClusterCount();
if (count == 1)
return array;
-
+
List<Coordinate> points = getClusterPoints();
if (points.size() != count) {
throw new BugException("Inconsistent cluster configuration, cluster count=" + count +
newArray[i * count + j] = array[i].add(points.get(j));
}
}
-
+
return newArray;
}
-
-
+
+
//////////////// Motor mount /////////////////
-
+
@Override
public boolean isMotorMount() {
return motorMount;
}
-
+
@Override
public void setMotorMount(boolean mount) {
if (motorMount == mount)
motorMount = mount;
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
}
-
+
@Override
public Motor getMotor(String id) {
if (id == null)
return null;
-
+
// Check whether the id is valid for the current rocket
RocketComponent root = this.getRoot();
if (!(root instanceof Rocket))
return null;
if (!((Rocket) root).isMotorConfigurationID(id))
return null;
-
+
return motors.get(id);
}
-
+
@Override
public void setMotor(String id, Motor motor) {
if (id == null) {
motors.put(id, motor);
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
}
-
+
@Override
public double getMotorDelay(String id) {
Double delay = ejectionDelays.get(id);
return Motor.PLUGGED;
return delay;
}
-
+
@Override
public void setMotorDelay(String id, double delay) {
ejectionDelays.put(id, delay);
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
}
-
+
@Deprecated
@Override
public int getMotorCount() {
return getClusterCount();
}
-
+
@Override
public double getMotorMountDiameter() {
return getInnerRadius() * 2;
}
-
+
@Override
public IgnitionEvent getIgnitionEvent() {
return ignitionEvent;
}
-
+
@Override
public void setIgnitionEvent(IgnitionEvent event) {
if (ignitionEvent == event)
ignitionEvent = event;
fireComponentChangeEvent(ComponentChangeEvent.EVENT_CHANGE);
}
-
-
+
+
@Override
public double getIgnitionDelay() {
return ignitionDelay;
}
-
+
@Override
public void setIgnitionDelay(double delay) {
if (MathUtil.equals(delay, ignitionDelay))
ignitionDelay = delay;
fireComponentChangeEvent(ComponentChangeEvent.EVENT_CHANGE);
}
-
-
+
+
@Override
public double getMotorOverhang() {
return overhang;
}
-
+
@Override
public void setMotorOverhang(double overhang) {
if (MathUtil.equals(this.overhang, overhang))
this.overhang = overhang;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
@Override
public Coordinate getMotorPosition(String id) {
Motor motor = motors.get(id);
if (motor == null) {
throw new IllegalArgumentException("No motor with id " + id + " defined.");
}
-
+
return new Coordinate(this.getLength() - motor.getLength() + this.getMotorOverhang());
}
- /**
- * Accept a visitor to an InnerTube object in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this InnerTube
- */
- @Override
- public void accept (final ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
-
-
-
/*
* (non-Javadoc)
* Copy the motor and ejection delay HashMaps.
- *
+ *
* @see rocketcomponent.RocketComponent#copy()
*/
@SuppressWarnings("unchecked")
((InnerTube) c).ejectionDelays = (HashMap<String, Double>) ejectionDelays.clone();
return c;
}
-
+
}
package net.sf.openrocket.rocketcomponent;
+ import net.sf.openrocket.l10n.Translator;
+ import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil;
public class LaunchLug extends ExternalComponent implements Coaxial {
+ private static final Translator trans = Application.getTranslator();
+
private double radius;
private double thickness;
-
+
private double radialDirection = 0;
-
+
/* These are calculated when the component is first attached to any Rocket */
private double shiftY, shiftZ;
-
-
+
+
public LaunchLug() {
super(Position.MIDDLE);
thickness = 0.001;
length = 0.03;
}
-
-
+
+
public double getOuterRadius () {
return radius;
}
-
+
public void setOuterRadius (double radius) {
if (MathUtil.equals(this.radius, radius))
return;
this.thickness = Math.min(this.thickness, this.radius);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
+
public double getInnerRadius() {
return radius - thickness;
}
-
+
public void setInnerRadius(double innerRadius) {
setOuterRadius(innerRadius + thickness);
}
-
+
public double getThickness() {
return thickness;
}
-
+
public void setThickness(double thickness) {
if (MathUtil.equals(this.thickness, thickness))
return;
this.thickness = MathUtil.clamp(thickness, 0, radius);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
public double getRadialDirection() {
return radialDirection;
}
-
+
public void setRadialDirection(double direction) {
direction = MathUtil.reduce180(direction);
if (MathUtil.equals(this.radialDirection, direction))
this.radialDirection = direction;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
public void setLength(double length) {
if (MathUtil.equals(this.length, length))
this.length = length;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
super.setRelativePosition(position);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
@Override
public void setPositionValue(double value) {
super.setPositionValue(value);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
@Override
public Coordinate[] shiftCoordinates(Coordinate[] array) {
array = super.shiftCoordinates(array);
-
+
for (int i = 0; i < array.length; i++) {
array[i] = array[i].add(0, shiftY, shiftZ);
}
-
+
return array;
}
-
-
+
+
@Override
public void componentChanged(ComponentChangeEvent e) {
super.componentChanged(e);
-
- /*
+
+ /*
* shiftY and shiftZ must be computed here since calculating them
* in shiftCoordinates() would cause an infinite loop due to .toRelative
*/
RocketComponent body;
double parentRadius;
-
+
for (body = this.getParent(); body != null; body = body.getParent()) {
if (body instanceof SymmetricComponent)
break;
}
-
+
if (body == null) {
parentRadius = 0;
} else {
x2 = MathUtil.clamp(x2, 0, body.getLength());
parentRadius = Math.max(s.getRadius(x1), s.getRadius(x2));
}
-
+
shiftY = Math.cos(radialDirection) * (parentRadius + radius);
shiftZ = Math.sin(radialDirection) * (parentRadius + radius);
-
+
// System.out.println("Computed shift: y="+shiftY+" z="+shiftZ);
}
-
-
+
+
@Override
public double getComponentVolume() {
return length * Math.PI * (MathUtil.pow2(radius) - MathUtil.pow2(radius - thickness));
}
-
+
@Override
public Collection<Coordinate> getComponentBounds() {
ArrayList<Coordinate> set = new ArrayList<Coordinate>();
addBound(set, length, radius);
return set;
}
-
+
@Override
public Coordinate getComponentCG() {
return new Coordinate(length / 2, 0, 0, getComponentMass());
}
-
+
@Override
public String getComponentName() {
- return "Launch lug";
+ //// Launch lug
+ return trans.get("LaunchLug.Launchlug");
}
-
+
@Override
public double getLongitudinalUnitInertia() {
// 1/12 * (3 * (r1^2 + r2^2) + h^2)
return (3 * (MathUtil.pow2(getInnerRadius())) + MathUtil.pow2(getOuterRadius()) +
MathUtil.pow2(getLength())) / 12;
}
-
+
@Override
public double getRotationalUnitInertia() {
// 1/2 * (r1^2 + r2^2)
return (MathUtil.pow2(getInnerRadius()) + MathUtil.pow2(getOuterRadius()))/2;
}
-
+
@Override
public boolean allowsChildren() {
return false;
}
-
+
@Override
public boolean isCompatible(Class<? extends RocketComponent> type) {
// Allow nothing to be attached to a LaunchLug
return false;
}
-
- /**
- * Accept a visitor to this LaunchLug in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this LaunchLug
- */
- @Override
- public void accept (final ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
-
+
}
package net.sf.openrocket.rocketcomponent;
+ import net.sf.openrocket.l10n.Translator;
+ import net.sf.openrocket.startup.Application;
+
/**
* Rocket nose cones of various types. Implemented as a transition with the
* fore radius == 0.
- *
+ *
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class NoseCone extends Transition {
-
-
+ private static final Translator trans = Application.getTranslator();
-
++
+
/********* Constructors **********/
public NoseCone() {
-- this(Transition.Shape.OGIVE, 6*DEFAULT_RADIUS, DEFAULT_RADIUS);
++ this(Transition.Shape.OGIVE, 6 * DEFAULT_RADIUS, DEFAULT_RADIUS);
}
-
+
public NoseCone(Transition.Shape type, double length, double radius) {
super();
super.setType(type);
super.setForeRadiusAutomatic(false);
super.setForeRadius(0);
super.setForeShoulderLength(0);
-- super.setForeShoulderRadius(0.9*radius);
++ super.setForeShoulderRadius(0.9 * radius);
super.setForeShoulderThickness(0);
super.setForeShoulderCapped(filled);
super.setThickness(0.002);
super.setLength(length);
super.setClipped(false);
-
+
}
-
-
+
-
++
/********** Get/set methods for component parameters **********/
--
++
@Override
public double getForeRadius() {
return 0;
}
-
+
@Override
public void setForeRadius(double r) {
// No-op
}
--
++
@Override
public boolean isForeRadiusAutomatic() {
return false;
}
-
+
@Override
public void setForeRadiusAutomatic(boolean b) {
// No-op
}
--
++
@Override
public double getForeShoulderLength() {
return 0;
}
--
++
@Override
public double getForeShoulderRadius() {
return 0;
}
--
++
@Override
public double getForeShoulderThickness() {
return 0;
}
--
++
@Override
public boolean isForeShoulderCapped() {
return false;
}
--
++
@Override
public void setForeShoulderCapped(boolean capped) {
// No-op
}
--
++
@Override
public void setForeShoulderLength(double foreShoulderLength) {
// No-op
}
--
++
@Override
public void setForeShoulderRadius(double foreShoulderRadius) {
// No-op
}
--
++
@Override
public void setForeShoulderThickness(double foreShoulderThickness) {
// No-op
}
--
++
@Override
public boolean isClipped() {
return false;
}
-
+
@Override
public void setClipped(boolean b) {
// No-op
}
-
-
+
-
+
- /********** RocketComponent methods **********/
-
+ /********** RocketComponent methods **********/
++
/**
* Return component name.
*/
@Override
public String getComponentName() {
- return "Nose cone";
+ //// Nose cone
+ return trans.get("NoseCone.NoseCone");
}
-
-
- /**
- * Accept a visitor to this NoseCone in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this NoseCone
- */
- @Override
- public void accept(ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
++
}
package net.sf.openrocket.rocketcomponent;
+ import java.util.Collection;
+ import java.util.Collections;
+ import java.util.HashMap;
+ import java.util.Iterator;
+ import java.util.LinkedList;
+ import java.util.List;
+ import java.util.UUID;
+
+ import javax.swing.event.ChangeListener;
+ import javax.swing.event.EventListenerList;
+
import net.sf.openrocket.gui.main.ExceptionHandler;
+ import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.ArrayList;
- import net.sf.openrocket.util.*;
-
- import javax.swing.event.ChangeListener;
- import javax.swing.event.EventListenerList;
- import java.util.*;
+ import net.sf.openrocket.util.Chars;
+ import net.sf.openrocket.util.Coordinate;
+ import net.sf.openrocket.util.MathUtil;
+ import net.sf.openrocket.util.UniqueID;
/**
* (eg. the rocket listener lists) and the methods defined in RocketComponent call these.
* It also defines some other methods that concern the whole rocket, and helper methods
* that keep information about the program state.
- *
+ *
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class Rocket extends RocketComponent {
private static final LogHelper log = Application.getLogger();
-
+ private static final Translator trans = Application.getTranslator();
+
public static final double DEFAULT_REFERENCE_LENGTH = 0.01;
-
+
/**
* List of component change listeners.
*/
private EventListenerList listenerList = new EventListenerList();
-
+
/**
* When freezeList != null, events are not dispatched but stored in the list.
* When the structure is thawed, a single combined event will be fired.
*/
private List<ComponentChangeEvent> freezeList = null;
-
+
private int modID;
private int massModID;
private int aeroModID;
private int treeModID;
private int functionalModID;
-
+
private ReferenceType refType = ReferenceType.MAXIMUM; // Set in constructor
private double customReferenceLength = DEFAULT_REFERENCE_LENGTH;
-
+
// The default configuration used in dialogs
private final Configuration defaultConfiguration;
-
+
private String designer = "";
private String revision = "";
-
+
// Motor configuration list
private ArrayList<String> motorConfigurationIDs = new ArrayList<String>();
{
motorConfigurationIDs.add(null);
}
-
+
// Does the rocket have a perfect finish (a notable amount of laminar flow)
private boolean perfectFinish = false;
-
-
+
+
///////////// Constructor /////////////
-
+
public Rocket() {
super(RocketComponent.Position.AFTER);
modID = UniqueID.next();
functionalModID = modID;
defaultConfiguration = new Configuration(this);
}
-
-
+
+
public String getDesigner() {
checkState();
return designer;
}
-
+
public void setDesigner(String s) {
if (s == null)
s = "";
designer = s;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
-
+
+
public String getRevision() {
checkState();
return revision;
}
-
+
public void setRevision(String s) {
if (s == null)
s = "";
revision = s;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
-
+
+
/**
* Return the number of stages in this rocket.
- *
+ *
* @return the number of stages in this rocket.
*/
public int getStageCount() {
checkState();
return this.getChildCount();
}
-
-
+
+
/**
* Return the non-negative modification ID of this rocket. The ID is changed
- * every time any change occurs in the rocket. This can be used to check
+ * every time any change occurs in the rocket. This can be used to check
* whether it is necessary to void cached data in cases where listeners can not
* or should not be used.
* <p>
* Three other modification IDs are also available, {@link #getMassModID()},
- * {@link #getAerodynamicModID()} {@link #getTreeModID()}, which change every time
- * a mass change, aerodynamic change, or tree change occur. Even though the values
- * of the different modification ID's may be equal, they should be treated totally
+ * {@link #getAerodynamicModID()} {@link #getTreeModID()}, which change every time
+ * a mass change, aerodynamic change, or tree change occur. Even though the values
+ * of the different modification ID's may be equal, they should be treated totally
* separate.
* <p>
* Note that undo events restore the modification IDs that were in use at the
* corresponding undo level. Subsequent modifications, however, produce modIDs
* distinct from those already used.
- *
+ *
* @return a unique ID number for this modification state.
*/
public int getModID() {
return modID;
}
-
+
/**
* Return the non-negative mass modification ID of this rocket. See
* {@link #getModID()} for details.
- *
+ *
* @return a unique ID number for this mass-modification state.
*/
public int getMassModID() {
return massModID;
}
-
+
/**
* Return the non-negative aerodynamic modification ID of this rocket. See
* {@link #getModID()} for details.
- *
+ *
* @return a unique ID number for this aerodynamic-modification state.
*/
public int getAerodynamicModID() {
return aeroModID;
}
-
+
/**
* Return the non-negative tree modification ID of this rocket. See
* {@link #getModID()} for details.
- *
+ *
* @return a unique ID number for this tree-modification state.
*/
public int getTreeModID() {
return treeModID;
}
-
+
/**
* Return the non-negative functional modificationID of this rocket.
* This changes every time a functional change occurs.
- *
+ *
* @return a unique ID number for this functional modification state.
*/
public int getFunctionalModID() {
return functionalModID;
}
-
-
+
+
public ReferenceType getReferenceType() {
checkState();
return refType;
}
-
+
public void setReferenceType(ReferenceType type) {
if (refType == type)
return;
refType = type;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
-
+
+
public double getCustomReferenceLength() {
checkState();
return customReferenceLength;
}
-
+
public void setCustomReferenceLength(double length) {
if (MathUtil.equals(customReferenceLength, length))
return;
-
+
this.customReferenceLength = Math.max(length, 0.001);
-
+
if (refType == ReferenceType.CUSTOM) {
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
}
-
-
+
+
/**
* Set whether the rocket has a perfect finish. This will affect whether the
* boundary layer is assumed to be fully turbulent or not.
- *
+ *
* @param perfectFinish whether the finish is perfect.
*/
public void setPerfectFinish(boolean perfectFinish) {
this.perfectFinish = perfectFinish;
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
}
-
-
+
+
/**
* Get whether the rocket has a perfect finish.
- *
+ *
* @return the perfectFinish
*/
public boolean isPerfectFinish() {
return perfectFinish;
}
-
-
+
+
copy.motorConfigurationNames =
(HashMap<String, String>) this.motorConfigurationNames.clone();
copy.resetListeners();
-
+
return copy;
}
-
+
/**
* Load the rocket structure from the source. The method loads the fields of this
* Rocket object and copies the references to siblings from the <code>source</code>.
*/
@SuppressWarnings("unchecked")
public void loadFrom(Rocket r) {
-
+
// Store list of components to invalidate after event has been fired
List<RocketComponent> toInvalidate = this.copyFrom(r);
-
+
int type = ComponentChangeEvent.UNDO_CHANGE | ComponentChangeEvent.NONFUNCTIONAL_CHANGE;
if (this.massModID != r.massModID)
type |= ComponentChangeEvent.MASS_CHANGE;
type |= ComponentChangeEvent.AERODYNAMIC_CHANGE;
// Loading a rocket is always a tree change since the component objects change
type |= ComponentChangeEvent.TREE_CHANGE;
-
+
this.modID = r.modID;
this.massModID = r.massModID;
this.aeroModID = r.aeroModID;
this.functionalModID = r.functionalModID;
this.refType = r.refType;
this.customReferenceLength = r.customReferenceLength;
-
+
this.motorConfigurationIDs = r.motorConfigurationIDs.clone();
this.motorConfigurationNames =
(HashMap<String, String>) r.motorConfigurationNames.clone();
this.perfectFinish = r.perfectFinish;
-
+
String id = defaultConfiguration.getMotorConfigurationID();
if (!this.motorConfigurationIDs.contains(id))
defaultConfiguration.setMotorConfigurationID(null);
-
+
this.checkComponentStructure();
-
+
fireComponentChangeEvent(type);
-
+
// Invalidate obsolete components after event
for (RocketComponent c : toInvalidate) {
c.invalidate();
}
}
-
-
+
+
/////// Implement the ComponentChangeListener lists
-
+
/**
* Creates a new EventListenerList for this component. This is necessary when cloning
* the structure.
// System.out.println("RESETTING LISTENER LIST of Rocket "+this);
listenerList = new EventListenerList();
}
-
-
+
+
public void printListeners() {
System.out.println("" + this + " has " + listenerList.getListenerCount() + " listeners:");
Object[] list = listenerList.getListenerList();
for (int i = 1; i < list.length; i += 2)
System.out.println(" " + ((i + 1) / 2) + ": " + list[i]);
}
-
+
@Override
public void addComponentChangeListener(ComponentChangeListener l) {
checkState();
log.verbose("Added ComponentChangeListener " + l + ", current number of listeners is " +
listenerList.getListenerCount());
}
-
+
@Override
public void removeComponentChangeListener(ComponentChangeListener l) {
listenerList.remove(ComponentChangeListener.class, l);
log.verbose("Removed ComponentChangeListener " + l + ", current number of listeners is " +
listenerList.getListenerCount());
}
-
-
+
+
@Override
public void addChangeListener(ChangeListener l) {
checkState();
log.verbose("Added ChangeListener " + l + ", current number of listeners is " +
listenerList.getListenerCount());
}
-
+
@Override
public void removeChangeListener(ChangeListener l) {
listenerList.remove(ChangeListener.class, l);
log.verbose("Removed ChangeListener " + l + ", current number of listeners is " +
listenerList.getListenerCount());
}
-
-
+
+
@Override
protected void fireComponentChangeEvent(ComponentChangeEvent e) {
mutex.lock("fireComponentChangeEvent");
try {
checkState();
-
+
// Update modification ID's only for normal (not undo/redo) events
if (!e.isUndoChange()) {
modID = UniqueID.next();
if (e.getType() != ComponentChangeEvent.NONFUNCTIONAL_CHANGE)
functionalModID = modID;
}
-
+
// Check whether frozen
if (freezeList != null) {
log.debug("Rocket is in frozen state, adding event " + e + " info freeze list");
freezeList.add(e);
return;
}
-
+
log.debug("Firing rocket change event " + e);
-
+
// Notify all components first
Iterator<RocketComponent> iterator = this.iterator(true);
while (iterator.hasNext()) {
iterator.next().componentChanged(e);
}
-
+
// Notify all listeners
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2) {
mutex.unlock("fireComponentChangeEvent");
}
}
-
-
+
+
/**
* Freezes the rocket structure from firing any events. This may be performed to
* combine several actions on the structure into a single large action.
* <code>thaw()</code> must always be called afterwards.
- *
+ *
* NOTE: Always use a try/finally to ensure <code>thaw()</code> is called:
* <pre>
* Rocket r = c.getRocket();
* r.thaw();
* }
* </pre>
- *
+ *
* @see #thaw()
*/
public void freeze() {
"freezeList=" + freezeList);
}
}
-
+
/**
* Thaws a frozen rocket structure and fires a combination of the events fired during
* the freeze. The event type is a combination of those fired and the source is the
freezeList = null;
return;
}
-
+
log.debug("Thawing rocket, freezeList=" + freezeList);
-
+
int type = 0;
Object c = null;
for (ComponentChangeEvent e : freezeList) {
c = e.getSource();
}
freezeList = null;
-
+
fireComponentChangeEvent(new ComponentChangeEvent((RocketComponent) c, type));
}
-
-
+
+
//////// Motor configurations ////////
-
+
/**
* Return the default configuration. This should be used in the user interface
* to ensure a consistent rocket configuration between dialogs. It should NOT
* be used in simulations not relating to the UI.
- *
+ *
* @return the default {@link Configuration}.
*/
public Configuration getDefaultConfiguration() {
checkState();
return defaultConfiguration;
}
-
-
+
+
/**
* Return an array of the motor configuration IDs. This array is guaranteed
* to contain the <code>null</code> ID as the first element.
- *
+ *
* @return an array of the motor configuration IDs.
*/
public String[] getMotorConfigurationIDs() {
checkState();
return motorConfigurationIDs.toArray(new String[0]);
}
-
+
/**
* Add a new motor configuration ID to the motor configurations. The new ID
* is returned.
- *
+ *
* @return the new motor configuration ID.
*/
public String newMotorConfigurationID() {
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
return id;
}
-
+
/**
* Add a specified motor configuration ID to the motor configurations.
- *
+ *
* @param id the motor configuration ID.
* @return true if successful, false if the ID was already used.
*/
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
return true;
}
-
+
/**
* Remove a motor configuration ID from the configuration IDs. The <code>null</code>
* ID cannot be removed, and an attempt to remove it will be silently ignored.
- *
+ *
* @param id the motor configuration ID to remove
*/
public void removeMotorConfigurationID(String id) {
motorConfigurationIDs.remove(id);
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
}
-
-
+
+
/**
* Check whether <code>id</code> is a valid motor configuration ID.
- *
+ *
* @param id the configuration ID.
* @return whether a motor configuration with that ID exists.
*/
checkState();
return motorConfigurationIDs.contains(id);
}
-
-
+
+
/**
* Check whether the given motor configuration ID has motors defined for it.
- *
+ *
* @param id the motor configuration ID (may be invalid).
* @return whether any motors are defined for it.
*/
checkState();
if (id == null)
return false;
-
+
Iterator<RocketComponent> iterator = this.iterator();
while (iterator.hasNext()) {
RocketComponent c = iterator.next();
-
+
if (c instanceof MotorMount) {
MotorMount mount = (MotorMount) c;
if (!mount.isMotorMount())
}
return false;
}
-
-
+
+
/**
* Return the user-set name of the motor configuration. If no name has been set,
* returns an empty string (not null).
- *
+ *
* @param id the motor configuration id
* @return the configuration name
*/
return "";
return s;
}
-
-
+
+
/**
* Set the name of the motor configuration. A name can be unset by passing
* <code>null</code> or an empty string.
- *
+ *
* @param id the motor configuration id
* @param name the name for the motor configuration
*/
motorConfigurationNames.put(id, name);
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
-
+
+
/**
- * Return either the motor configuration name (if set) or its description.
- *
+ * Return either the motor configuration name (if set) or its description.
+ *
* @param id the motor configuration ID.
* @return a textual representation of the configuration
*/
public String getMotorConfigurationNameOrDescription(String id) {
checkState();
String name;
-
+
name = getMotorConfigurationName(id);
if (name != null && !name.equals(""))
return name;
-
+
return getMotorConfigurationDescription(id);
}
-
+
/**
- * Return a description for the motor configuration, generated from the motor
+ * Return a description for the motor configuration, generated from the motor
* designations of the components.
- *
+ *
* @param id the motor configuration ID.
* @return a textual representation of the configuration
*/
checkState();
String name;
int motorCount = 0;
-
+
// Generate the description
-
+
// First iterate over each stage and store the designations of each motor
List<List<String>> list = new ArrayList<List<String>>();
List<String> currentList = null;
-
+
Iterator<RocketComponent> iterator = this.iterator();
while (iterator.hasNext()) {
RocketComponent c = iterator.next();
-
+
if (c instanceof Stage) {
-
+
currentList = new ArrayList<String>();
list.add(currentList);
-
+
} else if (c instanceof MotorMount) {
-
+
MotorMount mount = (MotorMount) c;
Motor motor = mount.getMotor(id);
-
+
if (mount.isMotorMount() && motor != null) {
String designation = motor.getDesignation(mount.getMotorDelay(id));
-
+
for (int i = 0; i < mount.getMotorCount(); i++) {
currentList.add(designation);
motorCount++;
}
}
-
+
}
}
-
+
if (motorCount == 0) {
- return "[No motors]";
+ //// [No motors]
+ return trans.get("Rocket.motorCount.Nomotor");
}
-
+
- // Change multiple occurrences of a motor to n x motor
+ // Change multiple occurrences of a motor to n x motor
List<String> stages = new ArrayList<String>();
-
+
for (List<String> stage : list) {
String stageName = "";
String previous = null;
int count = 0;
-
+
Collections.sort(stage);
for (String current : stage) {
if (current.equals(previous)) {
-
+
count++;
-
+
} else {
-
+
if (previous != null) {
String s = "";
if (count > 1) {
} else {
s = previous;
}
-
+
if (stageName.equals(""))
stageName = s;
else
stageName = stageName + "," + s;
}
-
+
previous = current;
count = 1;
-
+
}
}
if (previous != null) {
} else {
s = previous;
}
-
+
if (stageName.equals(""))
stageName = s;
else
stageName = stageName + "," + s;
}
-
+
stages.add(stageName);
}
-
+
name = "[";
for (int i = 0; i < stages.size(); i++) {
String s = stages.get(i);
name += "]";
return name;
}
-
-
+
+
//////// Obligatory component information
-
+
@Override
public String getComponentName() {
- return "Rocket";
+ //// Rocket
+ return trans.get("Rocket.compname.Rocket");
}
-
+
@Override
public Coordinate getComponentCG() {
return new Coordinate(0, 0, 0, 0);
}
-
+
@Override
public double getComponentMass() {
return 0;
}
-
+
@Override
public double getLongitudinalUnitInertia() {
return 0;
}
-
+
@Override
public double getRotationalUnitInertia() {
return 0;
}
-
+
@Override
public Collection<Coordinate> getComponentBounds() {
return Collections.emptyList();
}
-
+
@Override
public boolean isAerodynamic() {
return false;
}
-
+
@Override
public boolean isMassive() {
return false;
}
-
+
@Override
public boolean allowsChildren() {
return true;
}
-
+
/**
* Allows only <code>Stage</code> components to be added to the type Rocket.
*/
public boolean isCompatible(Class<? extends RocketComponent> type) {
return (Stage.class.isAssignableFrom(type));
}
-
+
- /**
- * Accept a visitor to this Rocket in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this Rocket
- */
- @Override
- public void accept(final ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
}
package net.sf.openrocket.rocketcomponent;
+ import java.awt.Color;
+ import java.util.ArrayDeque;
+ import java.util.Collection;
+ import java.util.Deque;
+ import java.util.Iterator;
+ import java.util.List;
+ import java.util.NoSuchElementException;
+
+ import javax.swing.event.ChangeListener;
+
+ import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.ArrayList;
- import net.sf.openrocket.util.*;
-
- import javax.swing.event.ChangeListener;
- import java.awt.*;
- import java.util.*;
- import java.util.List;
+ import net.sf.openrocket.util.BugException;
+ import net.sf.openrocket.util.ChangeSource;
+ import net.sf.openrocket.util.Coordinate;
+ import net.sf.openrocket.util.Invalidator;
+ import net.sf.openrocket.util.LineStyle;
+ import net.sf.openrocket.util.MathUtil;
+ import net.sf.openrocket.util.SafetyMutex;
+ import net.sf.openrocket.util.UniqueID;
-public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable<RocketComponent>,
- Visitable<ComponentVisitor, RocketComponent> {
+public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable<RocketComponent> {
private static final LogHelper log = Application.getLogger();
-
+ private static final Translator trans = Application.getTranslator();
-
++
/*
* Text is suitable to the form
* Position relative to: <title>
*/
public enum Position {
/** Position relative to the top of the parent component. */
- TOP("Top of the parent component"),
+ //// Top of the parent component
+ TOP(trans.get("RocketComponent.Position.TOP")),
/** Position relative to the middle of the parent component. */
- MIDDLE("Middle of the parent component"),
+ //// Middle of the parent component
+ MIDDLE(trans.get("RocketComponent.Position.MIDDLE")),
/** Position relative to the bottom of the parent component. */
- BOTTOM("Bottom of the parent component"),
+ //// Bottom of the parent component
+ BOTTOM(trans.get("RocketComponent.Position.BOTTOM")),
/** Position after the parent component (for body components). */
- AFTER("After the parent component"),
+ //// After the parent component
+ AFTER(trans.get("RocketComponent.Position.AFTER")),
/** Specify an absolute X-coordinate position. */
- ABSOLUTE("Tip of the nose cone");
-
+ //// Tip of the nose cone
+ ABSOLUTE(trans.get("RocketComponent.Position.ABSOLUTE"));
+
private String title;
-
+
Position(String title) {
this.title = title;
}
-
+
@Override
public String toString() {
return title;
}
}
-
+
/**
* A safety mutex that can be used to prevent concurrent access to this component.
*/
protected SafetyMutex mutex = SafetyMutex.newInstance();
-
+
//////// Parent/child trees
/**
* Parent component of the current component, or null if none exists.
*/
private RocketComponent parent = null;
-
+
/**
* List of child components of this component.
*/
private ArrayList<RocketComponent> children = new ArrayList<RocketComponent>();
-
+
//////// Parameters common to all components:
-
+
/**
* Characteristic length of the component. This is used in calculating the coordinate
* transformations and positions of other components in reference to this component.
* By default it is zero, i.e. no translation.
*/
protected double length = 0;
-
+
/**
* Positioning of this component relative to the parent component.
*/
protected Position relativePosition;
-
+
/**
* Offset of the position of this component relative to the normal position given by
* relativePosition. By default zero, i.e. no position change.
*/
protected double position = 0;
-
+
// Color of the component, null means to use the default color
private Color color = null;
private LineStyle lineStyle = null;
-
+
// Override mass/CG
private double overrideMass = 0;
private boolean massOverriden = false;
private double overrideCGX = 0;
private boolean cgOverriden = false;
-
+
private boolean overrideSubcomponents = false;
-
+
// User-given name of the component
private String name = null;
-
+
// User-specified comment
private String comment = "";
-
+
// Unique ID of the component
private String id = null;
-
+
/**
* Used to invalidate the component after calling {@link #copyFrom(RocketComponent)}.
*/
private Invalidator invalidator = new Invalidator(this);
-
-
+
+
//// NOTE !!! All fields must be copied in the method copyFrom()! ////
-
+
/**
this.relativePosition = relativePosition;
newID();
}
-
+
//////////// Methods that must be implemented ////////////
-
+
/**
* Static component name. The name may not vary of the parameters, it must be static.
*/
public abstract String getComponentName(); // Static component type name
-
+
/**
* Return the component mass (regardless of mass overriding).
*/
public abstract double getComponentMass(); // Mass of non-overridden component
-
+
/**
* Return the component CG and mass (regardless of CG or mass overriding).
*/
public abstract Coordinate getComponentCG(); // CG of non-overridden component
-
+
/**
- * Return the longitudinal (around the y- or z-axis) unitary moment of inertia.
+ * Return the longitudinal (around the y- or z-axis) unitary moment of inertia.
* The unitary moment of inertia is the moment of inertia with the assumption that
* the mass of the component is one kilogram. The inertia is measured in
* respect to the non-overridden CG.
- *
+ *
* @return the longitudinal unitary moment of inertia of this component.
*/
public abstract double getLongitudinalUnitInertia();
-
-
+
+
/**
- * Return the rotational (around the x-axis) unitary moment of inertia.
+ * Return the rotational (around the x-axis) unitary moment of inertia.
* The unitary moment of inertia is the moment of inertia with the assumption that
* the mass of the component is one kilogram. The inertia is measured in
* respect to the non-overridden CG.
- *
+ *
* @return the rotational unitary moment of inertia of this component.
*/
public abstract double getRotationalUnitInertia();
-
-
+
+
/**
* Test whether this component allows any children components. This method must
* return true if and only if {@link #isCompatible(Class)} returns true for any
* rocket component class.
- *
+ *
* @return <code>true</code> if children can be attached to this component, <code>false</code> otherwise.
*/
public abstract boolean allowsChildren();
-
+
/**
* Test whether the given component type can be added to this component. This type safety
* is enforced by the <code>addChild()</code> methods. The return value of this method
* may change to reflect the current state of this component (e.g. two components of some
* type cannot be placed as children).
- *
+ *
* @param type The RocketComponent class type to add.
* @return Whether such a component can be added.
*/
public abstract boolean isCompatible(Class<? extends RocketComponent> type);
-
-
+
+
/* Non-abstract helper method */
/**
* Test whether the given component can be added to this component. This is equivalent
* to calling <code>isCompatible(c.getClass())</code>.
- *
+ *
* @param c Component to test.
* @return Whether the component can be added.
* @see #isCompatible(Class)
mutex.verify();
return isCompatible(c.getClass());
}
-
-
+
+
/**
* Return a collection of bounding coordinates. The coordinates must be such that
* the component is fully enclosed in their convex hull.
- *
+ *
* @return a collection of coordinates that bound the component.
*/
public abstract Collection<Coordinate> getComponentBounds();
-
+
/**
* Return true if the component may have an aerodynamic effect on the rocket.
*/
public abstract boolean isAerodynamic();
-
+
/**
* Return true if the component may have an effect on the rocket's mass.
*/
public abstract boolean isMassive();
-
-
+
+
//////////// Methods that may be overridden ////////////
-
+
/**
* Shift the coordinates in the array corresponding to radial movement. A component
* coordinate for each cluster.
* <p>
* The default implementation simply returns the array, and thus produces no shift.
- *
+ *
* @param c an array of coordinates to shift.
* @return an array of shifted coordinates. The method may modify the contents
* of the passed array and return the array itself.
checkState();
return c;
}
-
-
+
+
/**
- * Called when any component in the tree fires a ComponentChangeEvent. This is by
- * default a no-op, but subclasses may override this method to e.g. invalidate
- * cached data. The overriding method *must* call
+ * Called when any component in the tree fires a ComponentChangeEvent. This is by
+ * default a no-op, but subclasses may override this method to e.g. invalidate
+ * cached data. The overriding method *must* call
* <code>super.componentChanged(e)</code> at some point.
- *
+ *
* @param e The event fired
*/
protected void componentChanged(ComponentChangeEvent e) {
// No-op
checkState();
}
-
-
+
+
/**
* Return the user-provided name of the component, or the component base
* name if the user-provided name is empty. This can be used in the UI.
- *
+ *
* @return A string describing the component.
*/
@Override
else
return name;
}
-
-
+
+
/**
* Create a string describing the basic component structure from this component downwards.
* @return a string containing the rocket structure
mutex.unlock("toDebugString");
}
}
-
+
private void toDebugString(StringBuilder sb) {
sb.append(this.getClass().getSimpleName()).append('@').append(System.identityHashCode(this));
sb.append("[\"").append(this.getName()).append('"');
}
sb.append(']');
}
-
-
+
+
/**
* Make a deep copy of the rocket component tree structure from this component
* downwards for copying purposes. Each component in the copy will be assigned
* a new component ID, making it a safe copy. This method does not fire any events.
- *
+ *
* @return A deep copy of the structure.
*/
public final RocketComponent copy() {
RocketComponent clone = copyWithOriginalID();
-
+
Iterator<RocketComponent> iterator = clone.iterator(true);
while (iterator.hasNext()) {
iterator.next().newID();
}
return clone;
}
-
-
+
+
/**
* Make a deep copy of the rocket component tree structure from this component
* undo/redo mechanism. This method should not be used for other purposes,
* such as copy/paste. This method does not fire any events.
* <p>
- * This method must be overridden by any component that refers to mutable objects,
+ * This method must be overridden by any component that refers to mutable objects,
* or if some fields should not be copied. This should be performed by
* <code>RocketComponent c = super.copyWithOriginalID();</code> and then cloning/modifying
* the appropriate fields.
* <p>
* This is not performed as serializing/deserializing for performance reasons.
- *
+ *
* @return A deep copy of the structure.
*/
protected RocketComponent copyWithOriginalID() {
} catch (CloneNotSupportedException e) {
throw new BugException("CloneNotSupportedException encountered, report a bug!", e);
}
-
+
// Reset the mutex
clone.mutex = SafetyMutex.newInstance();
-
+
// Reset all parent/child information
clone.parent = null;
clone.children = new ArrayList<RocketComponent>();
-
+
// Add copied children to the structure without firing events.
for (RocketComponent child : this.children) {
RocketComponent childCopy = child.copyWithOriginalID();
clone.children.add(childCopy);
childCopy.parent = clone;
}
-
+
this.checkComponentStructure();
clone.checkComponentStructure();
-
+
return clone;
} finally {
mutex.unlock("copyWithOriginalID");
}
}
-
-
+
+
- /**
- * Accept a visitor to this RocketComponent in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this RocketComponent
- */
- @Override
- public void accept(final ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
-
////////////// Methods that may not be overridden ////////////
-
+
////////// Common parameter setting/getting //////////
-
+
/**
* Return the color of the object to use in 2D figures, or <code>null</code>
* to use the default color.
mutex.verify();
return color;
}
-
+
/**
- * Set the color of the object to use in 2D figures.
+ * Set the color of the object to use in 2D figures.
*/
public final void setColor(Color c) {
if ((color == null && c == null) ||
(color != null && color.equals(c)))
return;
-
+
checkState();
this.color = c;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
-
+
+
public final LineStyle getLineStyle() {
mutex.verify();
return lineStyle;
}
-
+
public final void setLineStyle(LineStyle style) {
if (this.lineStyle == style)
return;
this.lineStyle = style;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
-
+
+
/**
* Get the current override mass. The mass is not necessarily in use
* at the moment.
- *
+ *
* @return the override mass
*/
public final double getOverrideMass() {
mutex.verify();
return overrideMass;
}
-
+
/**
* Set the current override mass. The mass is not set to use by this
* method.
- *
+ *
* @param m the override mass
*/
public final void setOverrideMass(double m) {
if (massOverriden)
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
/**
* Return whether mass override is active for this component. This does NOT
* take into account whether a parent component is overriding the mass.
- *
+ *
* @return whether the mass is overridden
*/
public final boolean isMassOverridden() {
mutex.verify();
return massOverriden;
}
-
+
/**
* Set whether the mass is currently overridden.
- *
+ *
* @param o whether the mass is overridden
*/
public final void setMassOverridden(boolean o) {
massOverriden = o;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
-
+
+
/**
* Return the current override CG. The CG is not necessarily overridden.
- *
+ *
* @return the override CG
*/
public final Coordinate getOverrideCG() {
mutex.verify();
return getComponentCG().setX(overrideCGX);
}
-
+
/**
* Return the x-coordinate of the current override CG.
- *
+ *
* @return the x-coordinate of the override CG.
*/
public final double getOverrideCGX() {
mutex.verify();
return overrideCGX;
}
-
+
/**
* Set the current override CG to (x,0,0).
- *
+ *
* @param x the x-coordinate of the override CG to set.
*/
public final void setOverrideCGX(double x) {
else
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
+
/**
* Return whether the CG is currently overridden.
- *
+ *
* @return whether the CG is overridden
*/
public final boolean isCGOverridden() {
mutex.verify();
return cgOverriden;
}
-
+
/**
* Set whether the CG is currently overridden.
- *
+ *
* @param o whether the CG is overridden
*/
public final void setCGOverridden(boolean o) {
cgOverriden = o;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
-
+
+
/**
* Return whether the mass and/or CG override overrides all subcomponent values
* always or never overrides subcomponents. In this case the subclass should
* also override {@link #isOverrideSubcomponentsEnabled()} to return
* <code>false</code>.
- *
+ *
* @return whether the current mass and/or CG override overrides subcomponents as well.
*/
public boolean getOverrideSubcomponents() {
mutex.verify();
return overrideSubcomponents;
}
-
-
+
+
/**
* Set whether the mass and/or CG override overrides all subcomponent values
* as well. See {@link #getOverrideSubcomponents()} for details.
- *
+ *
* @param override whether the mass and/or CG override overrides all subcomponent.
*/
public void setOverrideSubcomponents(boolean override) {
overrideSubcomponents = override;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
/**
* Return whether the option to override all subcomponents is enabled or not.
* The default implementation returns <code>false</code> if neither mass nor
* <p>
* This method may be overridden if the setting of overriding subcomponents
* cannot be set.
- *
+ *
* @return whether the option to override subcomponents is currently enabled.
*/
public boolean isOverrideSubcomponentsEnabled() {
mutex.verify();
return isCGOverridden() || isMassOverridden();
}
-
-
+
+
/**
mutex.verify();
return name;
}
-
+
/**
* Set the user-defined name of the component. If name==null, sets the name to
* the default name, currently the component name.
this.name = name;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
-
+
+
/**
* Return the comment of the component. The component may contain multiple lines
* using \n as a newline separator.
- *
+ *
* @return the comment of the component.
*/
public final String getComment() {
mutex.verify();
return comment;
}
-
+
/**
* Set the comment of the component.
- *
+ *
* @param comment the comment of the component.
*/
public final void setComment(String comment) {
this.comment = comment;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
-
-
+
+
/**
* Returns the unique ID of the component.
- *
+ *
* @return the ID of the component.
*/
public final String getID() {
return id;
}
-
+
/**
* Generate a new ID for this component.
*/
mutex.verify();
this.id = UniqueID.uuid();
}
-
-
+
+
/**
* Get the characteristic length of the component, for example the length of a body tube
* of the length of the root chord of a fin. This is used in positioning the component
* relative to its parent.
- *
+ *
* If the length of a component is settable, the class must define the setter method
* itself.
*/
mutex.verify();
return length;
}
-
+
/**
* Get the positioning of the component relative to its parent component.
* This is one of the enums of {@link Position}. A setter method is not provided,
mutex.verify();
return relativePosition;
}
-
-
+
+
/**
* Set the positioning of the component relative to its parent component.
* The actual position of the component is maintained to the best ability.
* do not support setting the relative position. A component that does support
* it should override this with a public method that simply calls this
* supermethod AND fire a suitable ComponentChangeEvent.
- *
+ *
* @param position the relative positioning.
*/
protected void setRelativePosition(RocketComponent.Position position) {
if (this.relativePosition == position)
return;
checkState();
-
+
// Update position so as not to move the component
if (this.parent != null) {
double thisPos = this.toRelative(Coordinate.NUL, this.parent)[0].x;
-
+
switch (position) {
case ABSOLUTE:
this.position = this.toAbsolute(Coordinate.NUL)[0].x;
break;
-
+
case TOP:
this.position = thisPos;
break;
-
+
case MIDDLE:
this.position = thisPos - (this.parent.length - this.length) / 2;
break;
-
+
case BOTTOM:
this.position = thisPos - (this.parent.length - this.length);
break;
-
+
default:
throw new BugException("Unknown position type: " + position);
}
}
-
+
this.relativePosition = position;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
/**
* Get the position value of the component. The exact meaning of the value is
* dependent on the current relative positioning.
- *
+ *
* @return the positional value.
*/
public final double getPositionValue() {
mutex.verify();
return position;
}
-
-
+
+
/**
* Set the position value of the component. The exact meaning of the value
* depends on the current relative positioning.
* do not support setting the relative position. A component that does support
* it should override this with a public method that simply calls this
* supermethod AND fire a suitable ComponentChangeEvent.
- *
+ *
* @param value the position value of the component.
*/
public void setPositionValue(double value) {
checkState();
this.position = value;
}
-
-
+
+
/////////// Coordinate changes ///////////
-
+
/**
* Returns coordinate c in absolute coordinates. Equivalent to toComponent(c,null).
*/
checkState();
return toRelative(c, null);
}
-
-
+
+
/**
- * Return coordinate <code>c</code> described in the coordinate system of
+ * Return coordinate <code>c</code> described in the coordinate system of
* <code>dest</code>. If <code>dest</code> is <code>null</code> returns
* absolute coordinates.
* <p>
* This method returns an array of coordinates, each of which represents a
* position of the coordinate in clustered cases. The array is guaranteed
- * to contain at least one element.
+ * to contain at least one element.
* <p>
* The current implementation does not support rotating components.
- *
+ *
* @param c Coordinate in the component's coordinate system.
* @param dest Destination component coordinate system.
* @return an array of coordinates describing <code>c</code> in coordinates
RocketComponent search = dest;
Coordinate[] array = new Coordinate[1];
array[0] = c;
-
+
RocketComponent component = this;
while ((component != search) && (component.parent != null)) {
-
+
array = component.shiftCoordinates(array);
-
+
switch (component.relativePosition) {
case TOP:
for (int i = 0; i < array.length; i++) {
array[i] = array[i].add(component.position, 0, 0);
}
break;
-
+
case MIDDLE:
for (int i = 0; i < array.length; i++) {
array[i] = array[i].add(component.position +
(component.parent.length - component.length) / 2, 0, 0);
}
break;
-
+
case BOTTOM:
for (int i = 0; i < array.length; i++) {
array[i] = array[i].add(component.position +
(component.parent.length - component.length), 0, 0);
}
break;
-
+
case AFTER:
// Add length of all previous brother-components with POSITION_RELATIVE_AFTER
int index = component.parent.children.indexOf(component);
array[i] = array[i].add(component.position + component.parent.length, 0, 0);
}
break;
-
+
case ABSOLUTE:
search = null; // Requires back-search if dest!=null
if (Double.isNaN(absoluteX)) {
absoluteX = component.position;
}
break;
-
+
default:
throw new BugException("Unknown relative positioning type of component" +
component + ": " + component.relativePosition);
}
-
+
component = component.parent; // parent != null
}
-
+
if (!Double.isNaN(absoluteX)) {
for (int i = 0; i < array.length; i++) {
array[i] = array[i].setX(absoluteX + c.x);
}
}
-
+
// Check whether destination has been found or whether to backtrack
- // TODO: LOW: Backtracking into clustered components uses only one component
+ // TODO: LOW: Backtracking into clustered components uses only one component
if ((dest != null) && (component != dest)) {
Coordinate[] origin = dest.toAbsolute(Coordinate.NUL);
for (int i = 0; i < array.length; i++) {
array[i] = array[i].sub(origin[0]);
}
}
-
+
return array;
} finally {
mutex.unlock("toRelative");
}
}
-
-
+
+
/**
- * Recursively sum the lengths of all subcomponents that have position
+ * Recursively sum the lengths of all subcomponents that have position
* Position.AFTER.
- *
+ *
* @return Sum of the lengths.
*/
private final double getTotalLength() {
mutex.unlock("getTotalLength");
}
}
-
-
+
+
/////////// Total mass and CG calculation ////////////
-
+
/**
* Return the (possibly overridden) mass of component.
- *
+ *
* @return The mass of the component or the given override mass.
*/
public final double getMass() {
return overrideMass;
return getComponentMass();
}
-
+
/**
* Return the (possibly overridden) center of gravity and mass.
- *
+ *
* Returns the CG with the weight of the coordinate set to the weight of the component.
* Both CG and mass may be separately overridden.
- *
+ *
* @return The CG of the component or the given override CG.
*/
public final Coordinate getCG() {
checkState();
if (cgOverriden)
return getOverrideCG().setWeight(getMass());
-
+
if (massOverriden)
return getComponentCG().setWeight(getMass());
-
+
return getComponentCG();
}
-
-
+
+
/**
* Return the longitudinal (around the y- or z-axis) moment of inertia of this component.
* The moment of inertia is scaled in reference to the (possibly overridden) mass
* and is relative to the non-overridden CG.
- *
+ *
* @return the longitudinal moment of inertia of this component.
*/
public final double getLongitudinalInertia() {
checkState();
return getLongitudinalUnitInertia() * getMass();
}
-
+
/**
* Return the rotational (around the y- or z-axis) moment of inertia of this component.
* The moment of inertia is scaled in reference to the (possibly overridden) mass
* and is relative to the non-overridden CG.
- *
+ *
* @return the rotational moment of inertia of this component.
*/
public final double getRotationalInertia() {
checkState();
return getRotationalUnitInertia() * getMass();
}
-
-
+
+
/////////// Children handling ///////////
-
+
/**
* Adds a child to the rocket component tree. The component is added to the end
- * of the component's child list. This is a helper method that calls
+ * of the component's child list. This is a helper method that calls
* {@link #addChild(RocketComponent,int)}.
- *
+ *
* @param component The component to add.
- * @throws IllegalArgumentException if the component is already part of some
+ * @throws IllegalArgumentException if the component is already part of some
* component tree.
* @see #addChild(RocketComponent,int)
*/
checkState();
addChild(component, children.size());
}
-
-
+
+
/**
- * Adds a child to the rocket component tree. The component is added to
+ * Adds a child to the rocket component tree. The component is added to
* the given position of the component's child list.
* <p>
- * This method may be overridden to enforce more strict component addition rules.
+ * This method may be overridden to enforce more strict component addition rules.
* The tests should be performed first and then this method called.
- *
+ *
* @param component The component to add.
* @param index Position to add component to.
- * @throws IllegalArgumentException If the component is already part of
+ * @throws IllegalArgumentException If the component is already part of
* some component tree.
*/
public void addChild(RocketComponent component, int index) {
throw new IllegalStateException("Component " + component.getComponentName() +
" not currently compatible with component " + getComponentName());
}
-
+
children.add(index, component);
component.parent = this;
-
+
this.checkComponentStructure();
component.checkComponentStructure();
-
+
fireAddRemoveEvent(component);
}
-
-
+
+
/**
* Removes a child from the rocket component tree.
- *
+ *
* @param n remove the n'th child.
* @throws IndexOutOfBoundsException if n is out of bounds
*/
checkState();
RocketComponent component = children.remove(n);
component.parent = null;
-
+
this.checkComponentStructure();
component.checkComponentStructure();
-
+
fireAddRemoveEvent(component);
}
-
+
/**
* Removes a child from the rocket component tree. Does nothing if the component
* is not present as a child.
- *
+ *
* @param component the component to remove
* @return whether the component was a child
*/
public final boolean removeChild(RocketComponent component) {
checkState();
-
+
component.checkComponentStructure();
-
+
if (children.remove(component)) {
component.parent = null;
-
+
this.checkComponentStructure();
component.checkComponentStructure();
-
+
fireAddRemoveEvent(component);
return true;
}
return false;
}
-
-
+
+
/**
* Move a child to another position.
- *
+ *
* @param component the component to move
* @param index the component's new position
* @throws IllegalArgumentException If an illegal placement was attempted.
checkState();
if (children.remove(component)) {
children.add(index, component);
-
+
this.checkComponentStructure();
component.checkComponentStructure();
-
+
fireAddRemoveEvent(component);
}
}
-
-
+
+
/**
* Fires an AERODYNAMIC_CHANGE, MASS_CHANGE or OTHER_CHANGE event depending on the
* type of component removed.
if (c.isMassive())
type |= ComponentChangeEvent.MASS_CHANGE;
}
-
+
fireComponentChangeEvent(type);
}
-
-
+
+
public final int getChildCount() {
checkState();
this.checkComponentStructure();
return children.size();
}
-
+
public final RocketComponent getChild(int n) {
checkState();
this.checkComponentStructure();
return children.get(n);
}
-
+
public final List<RocketComponent> getChildren() {
checkState();
this.checkComponentStructure();
return children.clone();
}
-
-
+
+
/**
* Returns the position of the child in this components child list, or -1 if the
* component is not a child of this component.
- *
+ *
* @param child The child to search for.
* @return Position in the list or -1 if not found.
*/
this.checkComponentStructure();
return children.indexOf(child);
}
-
+
/**
* Get the parent component of this component. Returns <code>null</code> if the component
* has no parent.
- *
+ *
* @return The parent of this component or <code>null</code>.
*/
public final RocketComponent getParent() {
checkState();
return parent;
}
-
+
/**
* Get the root component of the component tree.
- *
+ *
* @return The root component of the component tree.
*/
public final RocketComponent getRoot() {
gp = gp.parent;
return gp;
}
-
+
/**
- * Returns the root Rocket component of this component tree. Throws an
+ * Returns the root Rocket component of this component tree. Throws an
* IllegalStateException if the root component is not a Rocket.
- *
+ *
* @return The root Rocket component of the component tree.
* @throws IllegalStateException If the root component is not a Rocket.
*/
throw new IllegalStateException("getRocket() called with root component "
+ r.getComponentName());
}
-
-
+
+
/**
* Return the Stage component that this component belongs to. Throws an
* IllegalStateException if a Stage is not in the parentage of this component.
- *
+ *
* @return The Stage component this component belongs to.
* @throws IllegalStateException if a Stage component is not in the parentage.
*/
}
throw new IllegalStateException("getStage() called without Stage as a parent.");
}
-
+
/**
* Return the stage number of the stage this component belongs to. The stages
* are numbered from zero upwards.
- *
+ *
* @return the stage number this component belongs to.
*/
public final int getStageNumber() {
if (parent == null) {
throw new IllegalArgumentException("getStageNumber() called for root component");
}
-
+
RocketComponent stage = this;
while (!(stage instanceof Stage)) {
stage = stage.parent;
}
return stage.parent.getChildPosition(stage);
}
-
-
+
+
/**
* Find a component with the given ID. The component tree is searched from this component
* down (including this component) for the ID and the corresponding component is returned,
* or null if not found.
- *
+ *
* @param idToFind ID to search for.
* @return The component with the ID, or null if not found.
*/
}
return null;
}
-
-
+
+
// TODO: Move these methods elsewhere (used only in SymmetricComponent)
public final RocketComponent getPreviousComponent() {
checkState();
c = c.getChild(c.getChildCount() - 1);
return c;
}
-
+
// TODO: Move these methods elsewhere (used only in SymmetricComponent)
public final RocketComponent getNextComponent() {
checkState();
if (getChildCount() > 0)
return getChild(0);
-
+
RocketComponent current = this;
RocketComponent nextParent = this.parent;
-
+
while (nextParent != null) {
int pos = nextParent.getChildPosition(current);
if (pos < nextParent.getChildCount() - 1)
return nextParent.getChild(pos + 1);
-
+
current = nextParent;
nextParent = current.parent;
}
return null;
}
-
-
+
+
/////////// Event handling //////////
//
// Listener lists are provided by the root Rocket component,
// a single listener list for the whole rocket.
//
-
+
/**
* Adds a ComponentChangeListener to the rocket tree. The listener is added to the root
* component, which must be of type Rocket (which overrides this method). Events of all
* subcomponents are sent to all listeners.
- *
+ *
* @throws IllegalStateException - if the root component is not a Rocket
*/
public void addComponentChangeListener(ComponentChangeListener l) {
checkState();
getRocket().addComponentChangeListener(l);
}
-
+
/**
* Removes a ComponentChangeListener from the rocket tree. The listener is removed from
* the root component, which must be of type Rocket (which overrides this method).
* Does nothing if the root component is not a Rocket. (The asymmetry is so
* that listeners can always be removed just in case.)
- *
+ *
* @param l Listener to remove
*/
public void removeComponentChangeListener(ComponentChangeListener l) {
getRoot().removeComponentChangeListener(l);
}
}
-
-
+
+
/**
- * Adds a <code>ChangeListener</code> to the rocket tree. This is identical to
- * <code>addComponentChangeListener()</code> except that it uses a
+ * Adds a <code>ChangeListener</code> to the rocket tree. This is identical to
+ * <code>addComponentChangeListener()</code> except that it uses a
* <code>ChangeListener</code>. The same events are dispatched to the
- * <code>ChangeListener</code>, as <code>ComponentChangeEvent</code> is a subclass
+ * <code>ChangeListener</code>, as <code>ComponentChangeEvent</code> is a subclass
* of <code>ChangeEvent</code>.
- *
+ *
* @throws IllegalStateException - if the root component is not a <code>Rocket</code>
*/
@Override
checkState();
getRocket().addChangeListener(l);
}
-
+
/**
* Removes a ChangeListener from the rocket tree. This is identical to
* removeComponentChangeListener() except it uses a ChangeListener.
* Does nothing if the root component is not a Rocket. (The asymmetry is so
* that listeners can always be removed just in case.)
- *
+ *
* @param l Listener to remove
*/
@Override
getRoot().removeChangeListener(l);
}
}
-
-
+
+
/**
- * Fires a ComponentChangeEvent on the rocket structure. The call is passed to the
+ * Fires a ComponentChangeEvent on the rocket structure. The call is passed to the
* root component, which must be of type Rocket (which overrides this method).
* Events of all subcomponents are sent to all listeners.
- *
- * If the component tree root is not a Rocket, the event is ignored. This is the
- * case when constructing components not in any Rocket tree. In this case it
+ *
+ * If the component tree root is not a Rocket, the event is ignored. This is the
+ * case when constructing components not in any Rocket tree. In this case it
* would be impossible for the component to have listeners in any case.
- *
+ *
* @param e Event to send
*/
protected void fireComponentChangeEvent(ComponentChangeEvent e) {
}
getRoot().fireComponentChangeEvent(e);
}
-
-
+
+
/**
* Fires a ComponentChangeEvent of the given type. The source of the event is set to
* this component.
- *
+ *
* @param type Type of event
* @see #fireComponentChangeEvent(ComponentChangeEvent)
*/
protected void fireComponentChangeEvent(int type) {
fireComponentChangeEvent(new ComponentChangeEvent(this, type));
}
-
-
+
+
/**
* Checks whether this component has been invalidated and should no longer be used.
* This is a safety check that in-place replaced components are no longer used.
* All non-trivial methods (with the exception of methods simply getting a property)
* should call this method before changing or computing anything.
- *
+ *
* @throws BugException if this component has been invalidated by {@link #copyFrom(RocketComponent)}.
*/
protected void checkState() {
invalidator.check(true);
mutex.verify();
}
-
-
+
+
/**
* Check that the local component structure is correct. This can be called after changing
* the component structure in order to verify the integrity.
}
}
}
-
+
// Check whether the list contains exactly the searched-for component (with == operator)
private boolean containsExact(List<RocketComponent> haystack, RocketComponent needle) {
for (RocketComponent c : haystack) {
}
return false;
}
-
-
+
+
/////////// Iterators //////////
-
+
/**
* Returns an iterator that iterates over all children and sub-children.
* <p>
* <p>
* If an iterator iterating over only the direct children of the component is required,
* use <code>component.getChildren().iterator()</code>.
- *
+ *
* TODO: HIGH: Remove this after merges have been done
- *
- * @param returnSelf boolean value specifying whether the component itself should be
+ *
+ * @param returnSelf boolean value specifying whether the component itself should be
* returned
* @return An iterator for the children and sub-children.
* @deprecated Use {@link #iterator(boolean)} instead
public final Iterator<RocketComponent> deepIterator(boolean returnSelf) {
return iterator(returnSelf);
}
-
-
+
+
/**
* Returns an iterator that iterates over all children and sub-children, including itself.
* <p>
* This method is equivalent to <code>deepIterator(true)</code>.
- *
+ *
* TODO: HIGH: Remove this after merges have been done
- *
+ *
* @return An iterator for this component, its children and sub-children.
* @deprecated Use {@link #iterator()} instead
*/
public final Iterator<RocketComponent> deepIterator() {
return iterator();
}
-
-
+
+
/**
* Returns an iterator that iterates over all children and sub-children.
* <p>
* If an iterator iterating over only the direct children of the component is required,
* use <code>component.getChildren().iterator()</code>.
- *
- * @param returnSelf boolean value specifying whether the component itself should be
+ *
+ * @param returnSelf boolean value specifying whether the component itself should be
* returned
* @return An iterator for the children and sub-children.
*/
checkState();
return new RocketComponentIterator(this, returnSelf);
}
-
-
+
+
/**
* Returns an iterator that iterates over this components, its children and sub-children.
* <p>
* This method is equivalent to <code>iterator(true)</code>.
- *
+ *
* @return An iterator for this component, its children and sub-children.
*/
@Override
public final Iterator<RocketComponent> iterator() {
return iterator(true);
}
-
-
+
+
RocketComponent other = (RocketComponent) obj;
return this.id.equals(other.id);
}
-
-
+
+
@Override
public int hashCode() {
return id.hashCode();
}
-
-
+
+
//////////// Helper methods for subclasses
-
+
/**
* Helper method to add rotationally symmetric bounds at the specified coordinates.
* The X-axis value is <code>x</code> and the radius at the specified position is
- * <code>r</code>.
+ * <code>r</code>.
*/
protected static final void addBound(Collection<Coordinate> bounds, double x, double r) {
bounds.add(new Coordinate(x, -r, -r));
bounds.add(new Coordinate(x, r, r));
bounds.add(new Coordinate(x, -r, r));
}
-
-
+
+
protected static final Coordinate ringCG(double outerRadius, double innerRadius,
double x1, double x2, double density) {
return new Coordinate((x1 + x2) / 2, 0, 0,
ringMass(outerRadius, innerRadius, x2 - x1, density));
}
-
+
protected static final double ringMass(double outerRadius, double innerRadius,
double length, double density) {
return Math.PI * (MathUtil.pow2(outerRadius) - MathUtil.pow2(innerRadius)) *
length * density;
}
-
+
protected static final double ringLongitudinalUnitInertia(double outerRadius,
double innerRadius, double length) {
// 1/12 * (3 * (r1^2 + r2^2) + h^2)
return (3 * (MathUtil.pow2(innerRadius) + MathUtil.pow2(outerRadius)) + MathUtil.pow2(length)) / 12;
}
-
+
protected static final double ringRotationalUnitInertia(double outerRadius,
double innerRadius) {
// 1/2 * (r1^2 + r2^2)
return (MathUtil.pow2(innerRadius) + MathUtil.pow2(outerRadius)) / 2;
}
-
-
+
+
//////////// OTHER
-
+
/**
* Loads the RocketComponent fields from the given component. This method is meant
* to them have been removed (for example by firing appropriate events). The list contains
* all children and sub-children of the current component and the entire component
* tree of <code>src</code>.
- *
+ *
* @return a list of components that should not be used after this call.
*/
protected List<RocketComponent> copyFrom(RocketComponent src) {
checkState();
List<RocketComponent> toInvalidate = new ArrayList<RocketComponent>();
-
+
if (this.parent != null) {
throw new UnsupportedOperationException("copyFrom called for non-root component, parent=" +
this.parent.toDebugString() + ", this=" + this.toDebugString());
}
-
+
// Add current structure to be invalidated
Iterator<RocketComponent> iterator = this.iterator(false);
while (iterator.hasNext()) {
toInvalidate.add(iterator.next());
}
-
+
// Remove previous components
for (RocketComponent child : this.children) {
child.parent = null;
}
this.children.clear();
-
+
// Copy new children to this component
for (RocketComponent c : src.children) {
RocketComponent copy = c.copyWithOriginalID();
this.children.add(copy);
copy.parent = this;
}
-
+
this.checkComponentStructure();
src.checkComponentStructure();
-
+
// Set all parameters
this.length = src.length;
this.relativePosition = src.relativePosition;
this.name = src.name;
this.comment = src.comment;
this.id = src.id;
-
+
// Add source components to invalidation tree
for (RocketComponent c : src) {
toInvalidate.add(c);
}
-
+
return toInvalidate;
}
-
+
protected void invalidate() {
invalidator.invalidate();
}
-
-
+
+
////////// Iterator implementation ///////////
-
+
/**
* Private inner class to implement the Iterator.
- *
+ *
* This iterator is fail-fast if the root of the structure is a Rocket.
*/
private static class RocketComponentIterator implements Iterator<RocketComponent> {
// Stack holds iterators which still have some components left.
private final Deque<Iterator<RocketComponent>> iteratorStack = new ArrayDeque<Iterator<RocketComponent>>();
-
+
private final Rocket root;
private final int treeModID;
-
+
private final RocketComponent original;
private boolean returnSelf = false;
-
+
// Construct iterator with component's child's iterator, if it has elements
public RocketComponentIterator(RocketComponent c, boolean returnSelf) {
-
+
RocketComponent gp = c.getRoot();
if (gp instanceof Rocket) {
root = (Rocket) gp;
root = null;
treeModID = -1;
}
-
+
Iterator<RocketComponent> i = c.children.iterator();
if (i.hasNext())
iteratorStack.push(i);
-
+
this.original = c;
this.returnSelf = returnSelf;
}
-
+
@Override
public boolean hasNext() {
checkID();
return true;
return !iteratorStack.isEmpty(); // Elements remain if stack is not empty
}
-
+
@Override
public RocketComponent next() {
Iterator<RocketComponent> i;
-
+
checkID();
-
+
// Return original component first
if (returnSelf) {
returnSelf = false;
return original;
}
-
+
// Peek first iterator from stack, throw exception if empty
i = iteratorStack.peek();
if (i == null) {
throw new NoSuchElementException("No further elements in RocketComponent iterator");
}
-
+
// Retrieve next component of the iterator, remove iterator from stack if empty
RocketComponent c = i.next();
if (!i.hasNext())
iteratorStack.pop();
-
+
// Add iterator of component children to stack if it has children
i = c.children.iterator();
if (i.hasNext())
iteratorStack.push(i);
-
+
return c;
}
-
+
private void checkID() {
if (root != null) {
if (root.getTreeModID() != treeModID) {
}
}
}
-
+
@Override
public void remove() {
throw new UnsupportedOperationException("remove() not supported by " +
"RocketComponent iterator");
}
}
-
+
}
package net.sf.openrocket.rocketcomponent;
+ import net.sf.openrocket.l10n.Translator;
+ import net.sf.openrocket.startup.Application;
+
public class Stage extends ComponentAssembly {
-
+
+ private static final Translator trans = Application.getTranslator();
+
@Override
public String getComponentName () {
- return "Stage";
+ //// Stage
+ return trans.get("Stage.Stage");
}
-
-
+
+
@Override
public boolean allowsChildren() {
return true;
}
-
+
/**
- * Check whether the given type can be added to this component. A Stage allows
+ * Check whether the given type can be added to this component. A Stage allows
* only BodyComponents to be added.
*
* @param type The RocketComponent class type to add.
public boolean isCompatible (Class<? extends RocketComponent> type) {
return BodyComponent.class.isAssignableFrom(type);
}
-
- /**
- * Accept a visitor to this Stage in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this Stage
- */
- @Override
- public void accept (final ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
}
package net.sf.openrocket.rocketcomponent;
- import net.sf.openrocket.util.Coordinate;
- import net.sf.openrocket.util.MathUtil;
++import static java.lang.Math.*;
++import static net.sf.openrocket.util.MathUtil.*;
+
+import java.util.Collection;
+
- import static java.lang.Math.sin;
- import static java.lang.Math.sqrt;
- import static net.sf.openrocket.util.Chars.FRAC12;
- import static net.sf.openrocket.util.Chars.FRAC34;
- import static net.sf.openrocket.util.MathUtil.pow2;
- import static net.sf.openrocket.util.MathUtil.pow3;
+ import net.sf.openrocket.l10n.Translator;
+ import net.sf.openrocket.startup.Application;
+ import net.sf.openrocket.util.Coordinate;
+ import net.sf.openrocket.util.MathUtil;
-import java.util.Collection;
-
-import static java.lang.Math.sin;
-import static java.lang.Math.sqrt;
-import static net.sf.openrocket.util.Chars.FRAC12;
-import static net.sf.openrocket.util.Chars.FRAC34;
-import static net.sf.openrocket.util.MathUtil.pow2;
-import static net.sf.openrocket.util.MathUtil.pow3;
-
public class Transition extends SymmetricComponent {
++ private static final Translator trans = Application.getTranslator();
private static final double CLIP_PRECISION = 0.0001;
-
+
private Shape type;
private double shapeParameter;
private boolean clipped; // Not to be read - use isClipped(), which may be overriden
-
+
private double radius1, radius2;
private boolean autoRadius1, autoRadius2; // Whether the start radius is automatic
-
+
private double foreShoulderRadius;
private double foreShoulderThickness;
private double aftShoulderThickness;
private double aftShoulderLength;
private boolean aftShoulderCapped;
-
- private static final Translator trans = Application.getTranslator();
++
// Used to cache the clip length
private double clipLength = -1;
-
+
public Transition() {
super();
-
+
this.radius1 = DEFAULT_RADIUS;
this.radius2 = DEFAULT_RADIUS;
this.length = DEFAULT_RADIUS * 3;
this.autoRadius1 = true;
this.autoRadius2 = true;
-
+
this.type = Shape.CONICAL;
this.shapeParameter = 0;
this.clipped = true;
}
-
-
+
+
//////// Fore radius ////////
-
+
@Override
public double getForeRadius() {
}
return radius1;
}
-
+
public void setForeRadius(double radius) {
if ((this.radius1 == radius) && (autoRadius1 == false))
return;
-
+
this.autoRadius1 = false;
this.radius1 = Math.max(radius, 0);
-
+
if (this.thickness > this.radius1 && this.thickness > this.radius2)
this.thickness = Math.max(this.radius1, this.radius2);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
+
@Override
public boolean isForeRadiusAutomatic() {
return autoRadius1;
}
-
+
public void setForeRadiusAutomatic(boolean auto) {
if (autoRadius1 == auto)
return;
-
+
autoRadius1 = auto;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
//////// Aft radius /////////
-
+
@Override
public double getAftRadius() {
if (isAftRadiusAutomatic()) {
}
return radius2;
}
-
-
+
+
public void setAftRadius(double radius) {
if ((this.radius2 == radius) && (autoRadius2 == false))
return;
-
+
this.autoRadius2 = false;
this.radius2 = Math.max(radius, 0);
-
+
if (this.thickness > this.radius1 && this.thickness > this.radius2)
this.thickness = Math.max(this.radius1, this.radius2);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
+
@Override
public boolean isAftRadiusAutomatic() {
return autoRadius2;
}
-
+
public void setAftRadiusAutomatic(boolean auto) {
if (autoRadius2 == auto)
return;
-
+
autoRadius2 = auto;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
//// Radius automatics
-
+
@Override
protected double getFrontAutoRadius() {
if (isAftRadiusAutomatic())
return -1;
return getAftRadius();
}
-
-
+
+
@Override
protected double getRearAutoRadius() {
if (isForeRadiusAutomatic())
return -1;
return getForeRadius();
}
-
-
+
+
//////// Type & shape /////////
-
+
public Shape getType() {
return type;
}
-
+
public void setType(Shape type) {
if (type == null) {
throw new IllegalArgumentException("setType called with null argument");
this.shapeParameter = type.defaultParameter();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
+
public double getShapeParameter() {
return shapeParameter;
}
-
+
public void setShapeParameter(double n) {
if (shapeParameter == n)
return;
this.shapeParameter = MathUtil.clamp(n, type.minParameter(), type.maxParameter());
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
+
public boolean isClipped() {
if (!type.isClippable())
return false;
return clipped;
}
-
+
public void setClipped(boolean c) {
if (clipped == c)
return;
clipped = c;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
+
public boolean isClippedEnabled() {
return type.isClippable();
}
-
+
public double getShapeParameterMin() {
return type.minParameter();
}
-
+
public double getShapeParameterMax() {
return type.maxParameter();
}
-
-
+
+
//////// Shoulders ////////
-
+
public double getForeShoulderRadius() {
return foreShoulderRadius;
}
-
+
public void setForeShoulderRadius(double foreShoulderRadius) {
if (MathUtil.equals(this.foreShoulderRadius, foreShoulderRadius))
return;
this.foreShoulderRadius = foreShoulderRadius;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
public double getForeShoulderThickness() {
return foreShoulderThickness;
}
-
+
public void setForeShoulderThickness(double foreShoulderThickness) {
if (MathUtil.equals(this.foreShoulderThickness, foreShoulderThickness))
return;
this.foreShoulderThickness = foreShoulderThickness;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
public double getForeShoulderLength() {
return foreShoulderLength;
}
-
+
public void setForeShoulderLength(double foreShoulderLength) {
if (MathUtil.equals(this.foreShoulderLength, foreShoulderLength))
return;
this.foreShoulderLength = foreShoulderLength;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
public boolean isForeShoulderCapped() {
return foreShoulderCapped;
}
-
+
public void setForeShoulderCapped(boolean capped) {
if (this.foreShoulderCapped == capped)
return;
this.foreShoulderCapped = capped;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
-
+
+
public double getAftShoulderRadius() {
return aftShoulderRadius;
}
-
+
public void setAftShoulderRadius(double aftShoulderRadius) {
if (MathUtil.equals(this.aftShoulderRadius, aftShoulderRadius))
return;
this.aftShoulderRadius = aftShoulderRadius;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
public double getAftShoulderThickness() {
return aftShoulderThickness;
}
-
+
public void setAftShoulderThickness(double aftShoulderThickness) {
if (MathUtil.equals(this.aftShoulderThickness, aftShoulderThickness))
return;
this.aftShoulderThickness = aftShoulderThickness;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
public double getAftShoulderLength() {
return aftShoulderLength;
}
-
+
public void setAftShoulderLength(double aftShoulderLength) {
if (MathUtil.equals(this.aftShoulderLength, aftShoulderLength))
return;
this.aftShoulderLength = aftShoulderLength;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
+
public boolean isAftShoulderCapped() {
return aftShoulderCapped;
}
-
+
public void setAftShoulderCapped(boolean capped) {
if (this.aftShoulderCapped == capped)
return;
this.aftShoulderCapped = capped;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
-
-
+
+
/////////// Shape implementations ////////////
-
+
/**
public double getRadius(double x) {
if (x < 0 || x > length)
return 0;
-
+
double r1 = getForeRadius();
double r2 = getAftRadius();
-
+
if (r1 == r2)
return r1;
-
+
if (r1 > r2) {
x = length - x;
double tmp = r1;
r1 = r2;
r2 = tmp;
}
-
+
if (isClipped()) {
// Check clip calculation
if (clipLength < 0)
return r1 + type.getRadius(x, r2 - r1, length, shapeParameter);
}
}
-
+
/**
* Numerically solve clipLength from the equation
* r1 == type.getRadius(clipLength,r2,clipLength+length)
*/
private void calculateClip(double r1, double r2) {
double min = 0, max = length;
-
+
if (r1 >= r2) {
double tmp = r1;
r1 = r2;
r2 = tmp;
}
-
+
if (r1 == 0) {
clipLength = 0;
return;
}
-
+
if (length <= 0) {
clipLength = 0;
return;
}
-
+
// Required:
// getR(min,min+length,r2) - r1 < 0
// getR(max,max+length,r2) - r1 > 0
-
+
int n = 0;
while (type.getRadius(max, r2, max + length, shapeParameter) - r1 < 0) {
min = max;
if (n > 10)
break;
}
-
+
while (true) {
clipLength = (min + max) / 2;
if ((max - min) < CLIP_PRECISION)
}
}
}
-
-
+
+
@Override
public double getInnerRadius(double x) {
return Math.max(getRadius(x) - thickness, 0);
}
-
-
+
+
@Override
public Collection<Coordinate> getComponentBounds() {
addBound(bounds, getLength() + aftShoulderLength, aftShoulderRadius);
return bounds;
}
-
+
@Override
public double getComponentMass() {
double mass = super.getComponentMass();
final double ir = Math.max(getForeShoulderRadius() - getForeShoulderThickness(), 0);
mass += ringMass(ir, 0, getForeShoulderThickness(), getMaterial().getDensity());
}
-
+
if (getAftShoulderLength() > 0.001) {
final double or = getAftShoulderRadius();
final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0);
final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0);
mass += ringMass(ir, 0, getAftShoulderThickness(), getMaterial().getDensity());
}
-
+
return mass;
}
-
+
@Override
public Coordinate getComponentCG() {
Coordinate cg = super.getComponentCG();
getForeShoulderThickness() - getForeShoulderLength(),
getMaterial().getDensity()));
}
-
+
if (getAftShoulderLength() > 0.001) {
final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0);
cg = cg.average(ringCG(getAftShoulderRadius(), ir, getLength(),
}
return cg;
}
-
-
+
+
/*
* The moments of inertia are not explicitly corrected for the shoulders.
* However, since the mass is corrected, the inertia is automatically corrected
*/
@Override
public String getComponentName() {
- return "Transition";
+ //// Transition
+ return trans.get("Transition.Transition");
}
-
+
@Override
protected void componentChanged(ComponentChangeEvent e) {
super.componentChanged(e);
clipLength = -1;
}
-
+
- /**
- * Accept a visitor to this Transition in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this Transition
- */
- @Override
- public void accept (final ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
-
/**
* Check whether the given type can be added to this component. Transitions allow any
* InternalComponents to be added.
- *
- * @param type The RocketComponent class type to add.
+ *
- * @param type The RocketComponent class type to add.
++ * @param ctype The RocketComponent class type to add.
* @return Whether such a component can be added.
*/
@Override
-- public boolean isCompatible(Class<? extends RocketComponent> type) {
-- if (InternalComponent.class.isAssignableFrom(type))
++ public boolean isCompatible(Class<? extends RocketComponent> ctype) {
++ if (InternalComponent.class.isAssignableFrom(ctype))
return true;
return false;
}
-
-
+
+
/**
* An enumeration listing the possible shapes of transitions.
- *
+ *
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public static enum Shape {
-
+
/**
* Conical shape.
*/
- CONICAL("Conical",
- "A conical nose cone has a profile of a triangle.",
- "A conical transition has straight sides.") {
+ //// Conical
+ CONICAL(trans.get("Shape.Conical"),
+ //// A conical nose cone has a profile of a triangle.
+ trans.get("Shape.Conical.desc1"),
+ //// A conical transition has straight sides.
+ trans.get("Shape.Conical.desc2")) {
@Override
public double getRadius(double x, double radius, double length, double param) {
assert x >= 0;
return radius * x / length;
}
},
-
+
/**
* Ogive shape. The shape parameter is the portion of an extended tangent ogive
* that will be used. That is, for param==1 a tangent ogive will be produced, and
* for smaller values the shape straightens out into a cone at param==0.
*/
- OGIVE("Ogive",
- "An ogive nose cone has a profile that is a segment of a circle. " +
- "The shape parameter value 1 produces a <b>tangent ogive</b>, which has " +
- "a smooth transition to the body tube, values less than 1 produce " +
- "<b>secant ogives</b>.",
- "An ogive transition has a profile that is a segment of a circle. " +
- "The shape parameter value 1 produces a <b>tangent ogive</b>, which has " +
- "a smooth transition to the body tube at the aft end, values less than 1 " +
- "produce <b>secant ogives</b>.") {
+ //// Ogive
+ OGIVE(trans.get("Shape.Ogive"),
+ //// An ogive nose cone has a profile that is a segment of a circle. The shape parameter value 1 produces a <b>tangent ogive</b>, which has a smooth transition to the body tube, values less than 1 produce <b>secant ogives</b>.
+ trans.get("Shape.Ogive.desc1"),
+ //// An ogive transition has a profile that is a segment of a circle. The shape parameter value 1 produces a <b>tangent ogive</b>, which has a smooth transition to the body tube at the aft end, values less than 1 produce <b>secant ogives</b>.
+ trans.get("Shape.Ogive.desc2")) {
@Override
public boolean usesParameter() {
return true; // Range 0...1 is default
}
-
+
@Override
public double defaultParameter() {
return 1.0; // Tangent ogive by default
}
-
+
@Override
public double getRadius(double x, double radius, double length, double param) {
assert x >= 0;
assert radius >= 0;
assert param >= 0;
assert param <= 1;
-
+
// Impossible to calculate ogive for length < radius, scale instead
// TODO: LOW: secant ogive could be calculated lower
if (length < radius) {
x = x * radius / length;
length = radius;
}
-
+
if (param < 0.001)
return CONICAL.getRadius(x, radius, length, param);
-
+
// Radius of circle is:
double R = sqrt((pow2(length) + pow2(radius)) *
(pow2((2 - param) * length) + pow2(param * radius)) / (4 * pow2(param * radius)));
return sqrt(R * R - (L - x) * (L - x)) - y0;
}
},
-
+
/**
* Ellipsoidal shape.
*/
- ELLIPSOID("Ellipsoid",
- "An ellipsoidal nose cone has a profile of a half-ellipse " +
- "with major axes of lengths 2×<i>Length</i> and <i>Diameter</i>.",
- "An ellipsoidal transition has a profile of a half-ellipse " +
- "with major axes of lengths 2×<i>Length</i> and <i>Diameter</i>. If the " +
- "transition is not clipped, then the profile is extended at the center by the " +
- "corresponding radius.", true) {
+ //// Ellipsoid
+ ELLIPSOID(trans.get("Shape.Ellipsoid"),
+ //// An ellipsoidal nose cone has a profile of a half-ellipse with major axes of lengths 2×<i>Length</i> and <i>Diameter</i>.
+ trans.get("Shape.Ellipsoid.desc1"),
+ //// An ellipsoidal transition has a profile of a half-ellipse with major axes of lengths 2×<i>Length</i> and <i>Diameter</i>. If the transition is not clipped, then the profile is extended at the center by the corresponding radius.
+ trans.get("Shape.Ellipsoid.desc2"), true) {
@Override
public double getRadius(double x, double radius, double length, double param) {
assert x >= 0;
return sqrt(2 * radius * x - x * x); // radius/length * sphere
}
},
-
- POWER("Power series",
- "A power series nose cone has a profile of " +
- "<i>Radius</i> × (<i>x</i> / <i>Length</i>)" +
- "<sup><i>k</i></sup> " +
- "where <i>k</i> is the shape parameter. For <i>k</i>=0.5 this is a " +
- "<b>" + FRAC12 + "-power</b> or <b>parabolic</b> nose cone, for <i>k</i>=0.75 a " +
- "<b>" + FRAC34 + "-power</b>, and for <i>k</i>=1 a <b>conical</b> nose cone.",
- "A power series transition has a profile of " +
- "<i>Radius</i> × (<i>x</i> / <i>Length</i>)" +
- "<sup><i>k</i></sup> " +
- "where <i>k</i> is the shape parameter. For <i>k</i>=0.5 the transition is " +
- "<b>" + FRAC12 + "-power</b> or <b>parabolic</b>, for <i>k</i>=0.75 a " +
- "<b>" + FRAC34 + "-power</b>, and for <i>k</i>=1 <b>conical</b>.", true) {
++
+ //// Power series
+ POWER(trans.get("Shape.Powerseries"),
- //// A power series nose cone has a profile of <i>Radius</i> × (<i>x</i> / <i>Length</i>)<sup><i>k</i></sup> where <i>k</i> is the shape parameter. For <i>k</i>=0.5 this is a <b>
- trans.get("Shape.Powerseries.descA1") + FRAC12 +
- //// -power</b> or <b>parabolic</b> nose cone, for <i>k</i>=0.75 a <b>
- trans.get("Shape.Powerseries.descA2") + FRAC34 +
- //// -power</b>, and for <i>k</i>=1 a <b>conical</b> nose cone.
- trans.get("Shape.Powerseries.descA3"),
- //// A power series transition has a profile of <i>Radius</i> × (<i>x</i> / <i>Length</i>)<sup><i>k</i></sup> where <i>k</i> is the shape parameter. For <i>k</i>=0.5 the transition is <b>
- trans.get("Shape.Powerseries.descB1") + FRAC12 +
- //// -power</b> or <b>parabolic</b>, for <i>k</i>=0.75 a <b>
- trans.get("Shape.Powerseries.descB2") + FRAC34 +
- //// -power</b>, and for <i>k</i>=1 <b>conical</b>.
- trans.get("Shape.Powerseries.descB3"), true) {
++ trans.get("Shape.Powerseries.desc1"),
++ trans.get("Shape.Powerseries.desc2"), true) {
@Override
public boolean usesParameter() { // Range 0...1
return true;
}
-
+
@Override
public double defaultParameter() {
return 0.5;
}
-
+
@Override
public double getRadius(double x, double radius, double length, double param) {
assert x >= 0;
}
return radius * Math.pow(x / length, param);
}
-
+
},
-
- PARABOLIC("Parabolic series",
- "A parabolic series nose cone has a profile of a parabola. The shape " +
- "parameter defines the segment of the parabola to utilize. The shape " +
- "parameter 1.0 produces a <b>full parabola</b> which is tangent to the body " +
- "tube, 0.75 produces a <b>3/4 parabola</b>, 0.5 procudes a " +
- "<b>1/2 parabola</b> and 0 produces a <b>conical</b> nose cone.",
- "A parabolic series transition has a profile of a parabola. The shape " +
- "parameter defines the segment of the parabola to utilize. The shape " +
- "parameter 1.0 produces a <b>full parabola</b> which is tangent to the body " +
- "tube at the aft end, 0.75 produces a <b>3/4 parabola</b>, 0.5 procudes a " +
- "<b>1/2 parabola</b> and 0 produces a <b>conical</b> transition.") {
-
++
+ //// Parabolic series
+ PARABOLIC(trans.get("Shape.Parabolicseries"),
+ ////A parabolic series nose cone has a profile of a parabola. The shape parameter defines the segment of the parabola to utilize. The shape parameter 1.0 produces a <b>full parabola</b> which is tangent to the body tube, 0.75 produces a <b>3/4 parabola</b>, 0.5 procudes a <b>1/2 parabola</b> and 0 produces a <b>conical</b> nose cone.
+ trans.get("Shape.Parabolicseries.desc1"),
+ ////A parabolic series transition has a profile of a parabola. The shape parameter defines the segment of the parabola to utilize. The shape parameter 1.0 produces a <b>full parabola</b> which is tangent to the body tube at the aft end, 0.75 produces a <b>3/4 parabola</b>, 0.5 procudes a <b>1/2 parabola</b> and 0 produces a <b>conical</b> transition.
+ trans.get("Shape.Parabolicseries.desc2")) {
+
// In principle a parabolic transition is clippable, but the difference is
// negligible.
-
-
++
@Override
public boolean usesParameter() { // Range 0...1
return true;
}
-
+
@Override
public double defaultParameter() {
return 1.0;
}
-
+
@Override
public double getRadius(double x, double radius, double length, double param) {
assert x >= 0;
assert radius >= 0;
assert param >= 0;
assert param <= 1;
-
+
return radius * ((2 * x / length - param * pow2(x / length)) / (2 - param));
}
},
-
-
-
- HAACK("Haack series",
- "The Haack series nose cones are designed to minimize drag. The shape parameter " +
- "0 produces an <b>LD-Haack</b> or <b>Von Karman</b> nose cone, which minimizes " +
- "drag for fixed length and diameter, while a value of 0.333 produces an " +
- "<b>LV-Haack</b> nose cone, which minimizes drag for fixed length and volume.",
- "The Haack series <i>nose cones</i> are designed to minimize drag. " +
- "These transition shapes are their equivalents, but do not necessarily produce " +
- "optimal drag for transitions. " +
- "The shape parameter 0 produces an <b>LD-Haack</b> or <b>Von Karman</b> shape, " +
- "while a value of 0.333 produces an <b>LV-Haack</b> shape.", true) {
+
-
+ //// Haack series
+ HAACK(trans.get("Shape.Haackseries"),
+ //// The Haack series nose cones are designed to minimize drag. The shape parameter 0 produces an <b>LD-Haack</b> or <b>Von Karman</b> nose cone, which minimizes drag for fixed length and diameter, while a value of 0.333 produces an <b>LV-Haack</b> nose cone, which minimizes drag for fixed length and volume.
+ trans.get("Shape.Haackseries.desc1"),
+ //// The Haack series <i>nose cones</i> are designed to minimize drag. These transition shapes are their equivalents, but do not necessarily produce optimal drag for transitions. The shape parameter 0 produces an <b>LD-Haack</b> or <b>Von Karman</b> shape, while a value of 0.333 produces an <b>LV-Haack</b> shape.
+ trans.get("Shape.Haackseries.desc2"), true) {
++
@Override
public boolean usesParameter() {
return true;
}
-
+
@Override
public double maxParameter() {
return 1.0 / 3.0; // Range 0...1/3
}
-
+
@Override
public double getRadius(double x, double radius, double length, double param) {
assert x >= 0;
assert radius >= 0;
assert param >= 0;
assert param <= 2;
-
+
double theta = Math.acos(1 - 2 * x / length);
if (param == 0) {
return radius * sqrt((theta - sin(2 * theta) / 2) / Math.PI);
return radius * sqrt((theta - sin(2 * theta) / 2 + param * pow3(sin(theta))) / Math.PI);
}
},
-
+
// POLYNOMIAL("Smooth polynomial",
// "A polynomial is fitted such that the nose cone profile is horizontal "+
// "at the aft end of the transition. The angle at the tip is defined by "+
// }
// }
;
-
+
// Privete fields of the shapes
private final String name;
private final String transitionDesc;
private final String noseconeDesc;
private final boolean canClip;
-
+
// Non-clippable constructor
Shape(String name, String noseconeDesc, String transitionDesc) {
this(name, noseconeDesc, transitionDesc, false);
}
-
+
// Clippable constructor
Shape(String name, String noseconeDesc, String transitionDesc, boolean canClip) {
this.name = name;
this.noseconeDesc = noseconeDesc;
this.transitionDesc = transitionDesc;
}
-
-
+
+
/**
* Return the name of the transition shape name.
*/
public String getName() {
return name;
}
-
+
/**
* Get a description of the Transition shape.
*/
public String getTransitionDescription() {
return transitionDesc;
}
-
+
/**
* Get a description of the NoseCone shape.
*/
public String getNoseConeDescription() {
return noseconeDesc;
}
-
+
/**
* Check whether the shape differs in clipped mode. The clipping should be
* enabled by default if possible.
public boolean isClippable() {
return canClip;
}
-
+
/**
* Return whether the shape uses the shape parameter. (Default false.)
*/
public boolean usesParameter() {
return false;
}
-
+
/**
* Return the minimum value of the shape parameter. (Default 0.)
*/
public double minParameter() {
return 0.0;
}
-
+
/**
* Return the maximum value of the shape parameter. (Default 1.)
*/
public double maxParameter() {
return 1.0;
}
-
+
/**
* Return the default value of the shape parameter. (Default 0.)
*/
public double defaultParameter() {
return 0.0;
}
-
+
/**
* Calculate the basic radius of a transition with the given radius, length and
* shape parameter at the point x from the tip of the component. It is assumed
* that the fore radius if zero and the aft radius is <code>radius >= 0</code>.
* Boattails are achieved by reversing the component.
- *
+ *
* @param x Position from the tip of the component.
* @param radius Aft end radius >= 0.
* @param length Length of the transition >= 0.
* @return The basic radius at the given position.
*/
public abstract double getRadius(double x, double radius, double length, double param);
-
-
+
+
/**
* Returns the name of the shape (same as getName()).
*/
package net.sf.openrocket.rocketcomponent;
+ import net.sf.openrocket.l10n.Translator;
+ import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.Coordinate;
/**
* A set of trapezoidal fins. The root and tip chords are perpendicular to the rocket
* base line, while the leading and aft edges may be slanted.
- *
+ *
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class TrapezoidFinSet extends FinSet {
+ private static final Translator trans = Application.getTranslator();
+
public static final double MAX_SWEEP_ANGLE=(89*Math.PI/180.0);
/*
* sweep tipChord
* | |___________
* | / |
- * | / |
+ * | / |
* | / | height
* / |
* __________/________________|_____________
* length
* == rootChord
*/
-
+
// rootChord == length
private double tipChord = 0;
private double height = 0;
private double sweep = 0;
-
-
+
+
public TrapezoidFinSet() {
this (3, 0.05, 0.05, 0.025, 0.05);
}
-
+
// TODO: HIGH: height=0 -> CP = NaN
- public TrapezoidFinSet(int fins, double rootChord, double tipChord, double sweep,
+ public TrapezoidFinSet(int fins, double rootChord, double tipChord, double sweep,
double height) {
super();
-
+
this.setFinCount(fins);
this.length = rootChord;
this.tipChord = tipChord;
this.sweep = sweep;
this.height = height;
}
-
-
+
+
public void setFinShape(double rootChord, double tipChord, double sweep, double height,
double thickness) {
if (this.length==rootChord && this.tipChord==tipChord && this.sweep==sweep &&
length = Math.max(r,0);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
+
public double getTipChord() {
return tipChord;
}
sweep = r;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
+
/**
* Get the sweep angle. This is calculated from the true sweep and height, and is not
* stored separetely.
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
+
/**
* Returns the geometry of a trapezoidal fin.
@Override
public Coordinate[] getFinPoints() {
Coordinate[] c = new Coordinate[4];
-
+
c[0] = Coordinate.NUL;
c[1] = new Coordinate(sweep,height);
c[2] = new Coordinate(sweep+tipChord,height);
c[3] = new Coordinate(length,0);
-
+
return c;
}
-
+
/**
* Returns the span of a trapezoidal fin.
*/
public double getSpan() {
return height;
}
-
+
@Override
public String getComponentName() {
- return "Trapezoidal fin set";
+ //// Trapezoidal fin set
+ return trans.get("TrapezoidFinSet.TrapezoidFinSet");
}
- /**
- * Accept a visitor to this TrapezoidFinSet in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this TrapezoidFinSet
- */
- @Override
- public void accept(ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
}
package net.sf.openrocket.startup;
import net.sf.openrocket.database.ThrustCurveMotorSetDatabase;
+import net.sf.openrocket.l10n.ClassBasedTranslator;
import net.sf.openrocket.l10n.DebugTranslator;
+import net.sf.openrocket.l10n.ExceptionSuppressingTranslator;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.logging.LogLevel;
private static LogHelper logger;
private static LogLevelBufferLogger logBuffer;
- private static Translator baseTranslator = new DebugTranslator();
- private static Translator translator = new DebugTranslator();
++ private static Translator baseTranslator = new DebugTranslator(null);
private static ThrustCurveMotorSetDatabase motorSetDatabase;
* @return a translator.
*/
public static Translator getTranslator() {
- return translator;
+ Translator t = baseTranslator;
+ t = new ClassBasedTranslator(t, 1);
+ t = new ExceptionSuppressingTranslator(t);
+ return t;
}
/**
* Set the translator used in obtaining translated strings.
* @param translator the translator to set.
*/
- public static void setTranslator(Translator translator) {
- Application.translator = translator;
+ public static void setBaseTranslator(Translator translator) {
+ Application.baseTranslator = translator;
}
} else {
l = new Locale(split[0], split[1], split[2]);
}
+ log.info("Setting custom locale " + l);
Locale.setDefault(l);
}
Translator t;
++ t = new ResourceBundleTranslator("l10n.messages");
if (Locale.getDefault().getLanguage().equals("xx")) {
-- t = new DebugTranslator();
-- } else {
-- t = new ResourceBundleTranslator("l10n.messages");
++ t = new DebugTranslator(t);
}
log.info("Set up translation for locale " + Locale.getDefault() +
", debug.currentFile=" + t.get("debug.currentFile"));
- Application.setTranslator(t);
+ Application.setBaseTranslator(t);
}
import net.sf.openrocket.database.Databases;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.gui.main.ExceptionHandler;
+import net.sf.openrocket.gui.print.PrintSettings;
+ import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.rocketcomponent.BodyComponent;
* Within a holder class so they will load only when needed.
*/
private static class DefaultMaterialHolder {
-
+ private static final Translator trans = Application.getTranslator();
++
+ //// Elastic cord (round 2mm, 1/16 in)
private static final Material DEFAULT_LINE_MATERIAL =
- Databases.findMaterial(Material.Type.LINE, "Elastic cord (round 2mm, 1/16 in)",
+ Databases.findMaterial(Material.Type.LINE, trans.get("Databases.materials.Elasticcordround2mm"),
0.0018, false);
+ //// Ripstop nylon
private static final Material DEFAULT_SURFACE_MATERIAL =
- Databases.findMaterial(Material.Type.SURFACE, "Ripstop nylon", 0.067, false);
+ Databases.findMaterial(Material.Type.SURFACE, trans.get("Databases.materials.Ripstopnylon"), 0.067, false);
+ //// Cardboard
private static final Material DEFAULT_BULK_MATERIAL =
- Databases.findMaterial(Material.Type.BULK, "Cardboard", 680, false);
+ Databases.findMaterial(Material.Type.BULK, trans.get("Databases.materials.Cardboard"), 680, false);
}
//////////////////////
storeVersion();
}
+
+ /**
+ * Retrieve an enum value from the user preferences.
+ *
+ * @param <T> the enum type
+ * @param key the key
+ * @param def the default value, cannot be null
+ * @return the value in the preferences, or the default value
+ */
+ public static <T extends Enum<T>> T getEnum(String key, T def) {
+ if (def == null) {
+ throw new BugException("Default value cannot be null");
+ }
+
+ String value = getString(key, null);
+ if (value == null) {
+ return def;
+ }
+
+ try {
+ return Enum.valueOf(def.getDeclaringClass(), value);
+ } catch (IllegalArgumentException e) {
+ return def;
+ }
+ }
+
+ /**
+ * Store an enum value to the user preferences.
+ *
+ * @param key the key
+ * @param value the value to store, or null to remove the value
+ */
+ public static void putEnum(String key, Enum<?> value) {
+ if (value == null) {
+ putString(key, null);
+ } else {
+ putString(key, value.name());
+ }
+ }
+
+
/**
* Return a boolean preference.
*
if (color == null)
return Color.BLACK;
+ Color clr = parseColor(color);
+ if (clr != null) {
+ return clr;
+ } else {
+ return Color.BLACK;
+ }
+ }
+
+ public static void setDefaultColor(Class<? extends RocketComponent> c, Color color) {
+ if (color == null)
+ return;
+ set("componentColors", c, stringifyColor(color));
+ }
+
+
+ private static Color parseColor(String color) {
+ if (color == null) {
+ return null;
+ }
+
String[] rgb = color.split(",");
if (rgb.length == 3) {
try {
} catch (NumberFormatException ignore) {
}
}
-
- return Color.BLACK;
+ return null;
}
- public static void setDefaultColor(Class<? extends RocketComponent> c, Color color) {
- if (color == null)
- return;
+
+ private static String stringifyColor(Color color) {
String string = color.getRed() + "," + color.getGreen() + "," + color.getBlue();
- set("componentColors", c, string);
+ return string;
}
+
+
public static Color getMotorBorderColor() {
// TODO: MEDIUM: Motor color (settable?)
return new Color(0, 0, 0, 200);
}
+ //// Printing
+
+ public static PrintSettings getPrintSettings() {
+ PrintSettings settings = new PrintSettings();
+ Color c;
+
+ c = parseColor(getString("print.template.fillColor", null));
+ if (c != null) {
+ settings.setTemplateFillColor(c);
+ }
+
+ c = parseColor(getString("print.template.borderColor", null));
+ if (c != null) {
+ settings.setTemplateBorderColor(c);
+ }
+
+ settings.setPaperSize(getEnum("print.paper.size", settings.getPaperSize()));
+ settings.setPaperOrientation(getEnum("print.paper.orientation", settings.getPaperOrientation()));
+
+ return settings;
+ }
+
+ public static void setPrintSettings(PrintSettings settings) {
+ putString("print.template.fillColor", stringifyColor(settings.getTemplateFillColor()));
+ putString("print.template.borderColor", stringifyColor(settings.getTemplateBorderColor()));
+ putEnum("print.paper.size", settings.getPaperSize());
+ putEnum("print.paper.orientation", settings.getPaperOrientation());
+ }
+
//// Background flight data computation
public static boolean computeFlightInBackground() {