Merged l10n branch to trunk
authorplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sat, 18 Jun 2011 20:53:40 +0000 (20:53 +0000)
committerplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sat, 18 Jun 2011 20:53:40 +0000 (20:53 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@130 180e2498-e6e9-4542-8430-84ac67f01cd8

24 files changed:
1  2 
l10n/messages.properties
l10n/messages_de.properties
l10n/messages_es.properties
l10n/messages_fr.properties
src/net/sf/openrocket/database/Databases.java
src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java
src/net/sf/openrocket/gui/dialogs/AboutDialog.java
src/net/sf/openrocket/gui/dialogs/PrintDialog.java
src/net/sf/openrocket/gui/main/BasicFrame.java
src/net/sf/openrocket/l10n/DebugTranslator.java
src/net/sf/openrocket/rocketcomponent/BodyTube.java
src/net/sf/openrocket/rocketcomponent/ExternalComponent.java
src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java
src/net/sf/openrocket/rocketcomponent/InnerTube.java
src/net/sf/openrocket/rocketcomponent/LaunchLug.java
src/net/sf/openrocket/rocketcomponent/NoseCone.java
src/net/sf/openrocket/rocketcomponent/Rocket.java
src/net/sf/openrocket/rocketcomponent/RocketComponent.java
src/net/sf/openrocket/rocketcomponent/Stage.java
src/net/sf/openrocket/rocketcomponent/Transition.java
src/net/sf/openrocket/rocketcomponent/TrapezoidFinSet.java
src/net/sf/openrocket/startup/Application.java
src/net/sf/openrocket/startup/Startup.java
src/net/sf/openrocket/util/Prefs.java

diff --combined l10n/messages.properties
index 9defd41b64354d4ecdb7bff8d57c781962cfc4e7,65b4003eaf9f136eefea95b5e69b2e5c91d9162c..fcabdad2916c7c830abe78a17253a86517ca9a14
  #
  # 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 &nbsp;&nbsp; Shift+click to select other &nbsp;&nbsp; Double-click to edit &nbsp;&nbsp; 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
  
@@@ -22,6 -874,7 +896,7 @@@ main.menu.file.open = Open..
  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
  
@@@ -41,7 -894,289 +916,285 @@@ main.menu.help = Hel
  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&times;<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&times;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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.
index 0000000000000000000000000000000000000000,9731785f1af156ea7bacdf107f50f2e4863e9e1a..bd51927fb259a5eece8925c61ee58ca7e0833677
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,1171 +1,1171 @@@
 -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&nbsp;&nbsp; Shift+Klick andere auswählen &nbsp;&nbsp; Doppelklick zum Bearbeiten &nbsp;&nbsp; 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&times;<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&times;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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
index 0000000000000000000000000000000000000000,585ddbd8d62117bcf6e008f24450d3e95d12636e..b1aeebb9c3d8e406f7969dcc461da30806d6e7f1
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,1182 +1,1182 @@@
 -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&nbsp;&nbsp; Mayúsculas+click para seleccionar otro&nbsp;&nbsp; Doble-click to mostrar &nbsp;&nbsp; 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>&nbsp;&veces;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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>&nbsp;&veces;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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.
index 0000000000000000000000000000000000000000,e5c2f238663cbb367854661ee54521dc31e3e065..d4c0972aeedddfc88d53f3fae9a8b30c2850f549
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,1180 +1,1180 @@@
 -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 &nbsp;&nbsp; Shift+cliquer pour sélectionner plusieurs &nbsp;&nbsp; Double-cliquer pour modifier &nbsp;&nbsp; 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&times;<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&times;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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
index fe6abcbf2f29606dfa762f5e4c580cea44aa7f57,52b935348e72a5ee676c865209fe35b608c9e560..fae1eb47eeb8090748a8f410adf2062d942dce0b
@@@ -1,5 -1,6 +1,6 @@@
  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;
@@@ -15,7 -16,8 +16,8 @@@ import net.sf.openrocket.util.Prefs
   */
  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
index 44925a354bff4503e865fe3158e4616a7dcf3f0c,448a449c7295985c3ce07224ead21527878bf027..3779f5483876eda4cef9309dc882146f908b6cb6
@@@ -2,6 -2,8 +2,6 @@@ package net.sf.openrocket.gui.configdia
  
  
  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;
@@@ -11,6 -13,7 +11,6 @@@ import java.util.Iterator
  import java.util.List;
  
  import javax.swing.BorderFactory;
 -import javax.swing.Icon;
  import javax.swing.JButton;
  import javax.swing.JCheckBox;
  import javax.swing.JColorChooser;
@@@ -30,10 -33,10 +30,11 @@@ import net.sf.openrocket.gui.adaptors.D
  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;
@@@ -41,6 -44,7 +42,7 @@@ import net.sf.openrocket.rocketcomponen
  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;
@@@ -49,6 -53,8 +51,8 @@@ import net.sf.openrocket.util.Prefs
  
  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);
        }
                }
        }
        
 -}
 +}
index 6b8ec1ececf856c71442238a89e63d6f39c53b9b,f65749a205247695de68842418782b5324f25304..5eb2fde972b4565e04ae4778abc491dc16100a72
@@@ -10,9 -10,10 +10,12 @@@ import javax.swing.JLabel
  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;
@@@ -21,16 -22,8 +24,18 @@@ import net.sf.openrocket.util.Prefs
  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);
        }
        
--
  }
index 1d5556ba0c3b734f8af17f651bcde3cefa685071,06119318337be94e42fc64a8938024d6d62b23b5..c820c071e59e7358628c0a2f635b0d3d557eae8d
  /*
 - * 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 : "";
 +      }
  }
index 2605dc7d6bd120bbc1796f432dcc7cc8315dde81,966354bf8a1f0b3ab3f20c0307a28a5027bf269f..55df50394d49fbd9b3b5cbb00d384b031852ae69
@@@ -41,6 -41,7 +41,6 @@@ import javax.swing.JMenuItem
  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;
@@@ -80,6 -81,7 +80,7 @@@ import net.sf.openrocket.gui.dialogs.Wa
  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;
@@@ -108,20 -110,24 +109,24 @@@ public class BasicFrame extends JFrame 
        
        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);
index 19e6c84a7655c742ff9dae14016b3fbd5aa19783,19e6c84a7655c742ff9dae14016b3fbd5aa19783..5a2bf5920876a3c3b913f98727d3afd111856a13
@@@ -2,14 -2,14 +2,32 @@@ package net.sf.openrocket.l10n
  
  /**
   * 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 + "]";
        }
        
index adf0aa190134682296f72818f1dbf2aac297b30d,297ec1c3befa93382aa017d1667f240c1b3ee342..0b53eb0266c27ecf4ed87625582a7fadaa91ce22
@@@ -1,35 -1,38 +1,38 @@@
  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")
index a7fdbcecb310a6adf5d72399e5399845f09ee466,0f19b43057a2596f1a9cad8ecff84f31a2640e98..ed543c12fe352eab0890e31d04817621afd87b05
@@@ -1,55 -1,63 +1,63 @@@
  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.
         */
@@@ -72,7 -80,7 +80,7 @@@
        public double getComponentMass() {
                return material.getDensity() * getComponentVolume();
        }
 -      
 +
        /**
         * ExternalComponent has aerodynamic effect, so return true.
         */
@@@ -80,7 -88,7 +88,7 @@@
        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);
 -    }
 -    
 +
  }
index 792483d2618aa4cbd03c61e53b5cc2e7d0457728,cdbb7c3e607c833bab72f92c1440539314558933..ffa44be37b0bc04e1130afdaec234e064f007aa0
@@@ -1,40 -1,42 +1,42 @@@
  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);
@@@ -50,7 -52,7 +52,7 @@@
         * 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;
@@@ -74,7 -76,7 +76,7 @@@
                        } 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");
                        }
                }
        }
+       
  }
index a4d5af4defb039245bd6f16e7bc265f1a613b544,448da1549f9ab032346030589b3d0b5459dec980..0b8c92d242fbca6150d342fdbdc29400408263cb
@@@ -1,28 -1,31 +1,31 @@@
  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>();
@@@ -30,8 -33,8 +33,8 @@@
        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;
        }
+       
  }
index 70f92a7f451df489fecc163ba5c905cd7c4ebb36,f61ce7ed6bb2275ea0961b48b119da1b7f45aad1..8a6b2751da247f3136f99fcf76714b716500884e
@@@ -1,5 -1,7 +1,7 @@@
  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;
  
@@@ -10,15 -12,17 +12,17 @@@ import java.util.Collection
  
  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))
@@@ -71,8 -75,8 +75,8 @@@
                this.radialDirection = direction;
                fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
        }
 -      
 -      
 +
 +
  
        public void setLength(double length) {
                if (MathUtil.equals(this.length, length))
@@@ -80,8 -84,8 +84,8 @@@
                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);
 -    }
 -    
 +
  }
index 229fcbf5a93be462794f11d92f923d0313b35931,c271e2d442b6cd5044a24b298e35c6b082c97e7e..a4de3a9c8aeabcded7bc652c14c99b24539d0120
  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);
 -    }
++      
  }
index 64c1f687c02e549644a981118aa7a5f193bfa45e,0be57cd16b6dcb88b3274d5f3ddd50a0937f010e..4115c87b6f43551e728d1877ff12544eedd604b1
@@@ -1,15 -1,26 +1,26 @@@
  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);
 -      }
  }
index e109f6b389abdb4f0a57248e72a847d4938df140,b525a47d35e18dc16ebf77605fe23eb6697449e8..158c1b7d48c6910b8434f5bdd84167a99cab442e
@@@ -1,66 -1,86 +1,85 @@@
  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");
                }
        }
+       
  }
index 5acbe85439791e0b8687e7c73ce32b69ca57b452,b984a2a5861f8de9d4c9394d29615641b200d77f..f5079bfe649d8935eadad95137e4c8ea5a045885
@@@ -1,20 -1,26 +1,26 @@@
  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);
 -    }
  }
index 0daa5f7f185bc481cc6da67179cfbfe2b1f997bc,098183596bd976a0c0eb0552fc4ca5fd06c17a0c..1c2adb36cbdb1ccb8e9a7aa38d8ce123dd3bf294
@@@ -1,29 -1,31 +1,28 @@@
  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&times;<i>Length</i> and <i>Diameter</i>.",
-                               "An ellipsoidal transition has a profile of a half-ellipse " +
-                                               "with major axes of lengths 2&times;<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&times;<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&times;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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>&nbsp;&times;&nbsp;(<i>x</i>&nbsp;/&nbsp;<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()).
                 */
index 9c3076a3301474d5c7509b00a00e641997356ff3,fb276a7c03349248e532b3a71357e1b94b6676d4..288726b1fd38c344405f0d09fe4a274074d260b2
@@@ -1,52 -1,56 +1,56 @@@
  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 &&
@@@ -69,7 -73,7 +73,7 @@@
                length = Math.max(r,0);
                fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
        }
 -      
 +
        public double getTipChord() {
                return tipChord;
        }
@@@ -95,7 -99,7 +99,7 @@@
                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);
 -    }
  }
index 78d2941a7c3fa777c40ba57b983373a68d4a4e2a,020d714e57abb13c7f48c5554d320520e72b637f..bb8b20f771c452493804f23888207acc372cf4b6
@@@ -1,9 -1,7 +1,9 @@@
  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;
@@@ -20,7 -18,7 +20,7 @@@ public final class Application 
        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;
        }
        
        
index f1c4aa4d4e124196425fc216a9acd2c53d9e6255,802bdcc737673171c6ee9188715f05cffbf299b3..f4141f9b057746b22d928ce85da1bb0376cbd05b
@@@ -134,21 -134,20 +134,20 @@@ public class Startup 
                        } 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);
        }
        
        
index 9cd9e7abf8bb06d72fee8f4cd44fa72b3425882a,215389ab4d1d37109098a133f7a4f83be41582eb..047db50c7ae3c1a65599be088552aacb9a87168b
@@@ -22,7 -22,7 +22,8 @@@ import net.sf.openrocket.arch.SystemInf
  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;
@@@ -199,13 -199,18 +200,18 @@@ public class Prefs 
         * 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() {