Merge branch 'master' into photobooth-split

This commit is contained in:
bkuker 2014-01-11 15:59:44 -05:00
commit 0c6cf5a6ce
29 changed files with 1269 additions and 982 deletions

View File

@ -1,3 +1,12 @@
OpenRocket 13.11.2 (2014-01-01):
------------------------------
Bug Fixes:
* Numerous bug fixes and usability improvements in the new
flight configuration tab.
* Fix couple of layout issues
* Updated Spanish, French and Chinese translations
OpenRocket 13.11.1 (2013-11-15): OpenRocket 13.11.1 (2013-11-15):
------------------------------ ------------------------------

View File

@ -1,7 +1,7 @@
# The OpenRocket build version # The OpenRocket build version
build.version=13.11.1dev build.version=13.11.2dev
# The source of the package. When building a package for a specific # The source of the package. When building a package for a specific

View File

@ -57,7 +57,7 @@ RocketPanel.lbl.ViewType = View Type:
! BasicFrame ! BasicFrame
BasicFrame.tab.Rocketdesign = Rocket design BasicFrame.tab.Rocketdesign = Rocket design
BasicFrame.tab.Flightconfig = Configurations BasicFrame.tab.Flightconfig = Motors & Configuration
BasicFrame.tab.Flightsim = Flight simulations BasicFrame.tab.Flightsim = Flight simulations
BasicFrame.title.Addnewcomp = Add new component BasicFrame.title.Addnewcomp = Add new component
BasicFrame.dlg.lbl1 = Design ' BasicFrame.dlg.lbl1 = Design '
@ -454,6 +454,11 @@ SimuRunDlg.lbl.Velocity = Velocity:
SimuRunDlg.msg.Unabletosim = Unable to simulate: SimuRunDlg.msg.Unabletosim = Unable to simulate:
SimuRunDlg.msg.errorOccurred = An error occurred during the simulation: SimuRunDlg.msg.errorOccurred = An error occurred during the simulation:
BasicEventSimulationEngine.error.noMotorsDefined = No motors defined in the simulation.
BasicEventSimulationEngine.error.earlyMotorBurnout = Motor burnout without liftoff.
BasicEventSimulationEngine.error.noIgnition = No motors ignited.
BasicEventSimulationEngine.error.NaNResult = Simulation resulted in not-a-number (NaN) value, please report a bug.
RK4SimulationStepper.error.valuesTooLarge = Simulation values exceeded limits. Try selecting a shorter time step. RK4SimulationStepper.error.valuesTooLarge = Simulation values exceeded limits. Try selecting a shorter time step.
@ -1866,6 +1871,7 @@ MotorConfigurationPanel.btn.removeMotor = Remove motor
MotorConfigurationPanel.btn.selectMotor = Select motor MotorConfigurationPanel.btn.selectMotor = Select motor
MotorConfigurationPanel.btn.selectIgnition = Select ignition MotorConfigurationPanel.btn.selectIgnition = Select ignition
MotorConfigurationPanel.btn.resetIgnition = Reset ignition MotorConfigurationPanel.btn.resetIgnition = Reset ignition
MotorConfigurationPanel.lbl.nomotors = No motor mounts defined. Select one or more tubes from the list on the left as motor mounts.
MotorConfigurationTableModel.table.ignition.default = Default ({0}) MotorConfigurationTableModel.table.ignition.default = Default ({0})
RecoveryConfigurationPanel.table.deployment.default = Default ({0}) RecoveryConfigurationPanel.table.deployment.default = Default ({0})

File diff suppressed because it is too large Load Diff

View File

@ -53,7 +53,7 @@ RocketPanel.FigTypeAct.Unfinished = 3D \u0447\u0435\u0440\u043d\u043e\u0432\u043
RocketPanel.lbl.Flightcfg = \u041f\u043e\u043b\u0435\u0442\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f: RocketPanel.lbl.Flightcfg = \u041f\u043e\u043b\u0435\u0442\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:
RocketPanel.lbl.infoMessage = <html>\u041a\u043b\u0438\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 &nbsp;&nbsp; Shift+\u043a\u043b\u0438\u043a \u0434\u043b\u044f \u0441\u043c\u0435\u043d\u044b \u0432\u044b\u0431\u043e\u0440\u0430 &nbsp;&nbsp; \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f &nbsp;&nbsp; \u041a\u043b\u0438\u043a+\u0442\u0430\u0449\u0438\u0442\u044c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f RocketPanel.lbl.infoMessage = <html>\u041a\u043b\u0438\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 &nbsp;&nbsp; Shift+\u043a\u043b\u0438\u043a \u0434\u043b\u044f \u0441\u043c\u0435\u043d\u044b \u0432\u044b\u0431\u043e\u0440\u0430 &nbsp;&nbsp; \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f &nbsp;&nbsp; \u041a\u043b\u0438\u043a+\u0442\u0430\u0449\u0438\u0442\u044c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f
RocketPanel.lbl.ViewType = \u0412\u0438\u0434: RocketPanel.lbl.ViewType = \u0412\u0438\u0434:
! BasicFrame ! BasicFrame
BasicFrame.tab.Rocketdesign = \u041f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u043a\u0435\u0442\u044b BasicFrame.tab.Rocketdesign = \u041f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u043a\u0435\u0442\u044b
@ -114,21 +114,21 @@ AboutDialog.lbl.translatorIcon =
! Print dialog ! Print dialog
PrintDialog.title = \u041f\u0435\u0447\u0430\u0442\u044c \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442 PrintDialog.title = \u041f\u0435\u0447\u0430\u0442\u044c \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442
PrintDialog.but.previewAndPrint = \u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043f\u0435\u0447\u0430\u0442\u0438 PrintDialog.but.previewAndPrint = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438 \u043f\u0435\u0447\u0430\u0442\u044c
PrintDialog.checkbox.showByStage = \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u044f\u043c PrintDialog.checkbox.showByStage = \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u044f\u043c
PrintDialog.lbl.selectElements = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b: PrintDialog.lbl.selectElements = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:
printdlg.but.saveaspdf = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 PDF printdlg.but.saveaspdf = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 PDF
printdlg.but.preview = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 printdlg.but.preview = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440
printdlg.but.settings = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 printdlg.but.settings = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
PrintDialog.error.preview.title = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440. PrintDialog.error.preview.title = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440.
PrintDialog.error.preview.desc1 = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 PDF. PrintDialog.error.preview.desc1 = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 PDF.
PrintDialog.error.preview.desc2 = \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u043f\u0446\u0438\u0435\u0439 "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 PDF" PrintDialog.error.preview.desc2 = \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u043f\u0446\u0438\u0435\u0439 "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 PDF"
!PrintSettingsDialog !PrintSettingsDialog
PrintSettingsDialog.title = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0435\u0447\u0430\u0442\u0438 PrintSettingsDialog.title = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0435\u0447\u0430\u0442\u0438
PrintSettingsDialog.lbl.Templatefillcolor = \u0426\u0432\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432: PrintSettingsDialog.lbl.Templatefillcolor = \u0426\u0432\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432:
PrintSettingsDialog.lbl.Templatebordercolor = \u0426\u0432\u0435\u0442 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432: PrintSettingsDialog.lbl.Templatebordercolor = \u0426\u0432\u0435\u0442 \u0430\u0431\u0440\u0438\u0441\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432:
PrintSettingsDialog.lbl.Papersize = \u0420\u0430\u0437\u0432\u043c\u0435\u0440 \u0431\u0443\u043c\u0430\u0433\u0438: PrintSettingsDialog.lbl.Papersize = \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u043c\u0430\u0433\u0438:
PrintSettingsDialog.lbl.Paperorientation = \u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0431\u0443\u043c\u0430\u0433\u0438: PrintSettingsDialog.lbl.Paperorientation = \u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0431\u0443\u043c\u0430\u0433\u0438:
PrintSettingsDialog.but.Reset = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c PrintSettingsDialog.but.Reset = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c
PrintSettingsDialog.but.Close = \u0417\u0430\u043a\u0440\u044b\u0442\u044c PrintSettingsDialog.but.Close = \u0417\u0430\u043a\u0440\u044b\u0442\u044c
@ -204,7 +204,7 @@ edtmotorconfdlg.tbl.Stageheader = \u0421\u0442\u0443\u043f\u0435\u043d\u044c
edtmotorconfdlg.tbl.Separationheader = \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 edtmotorconfdlg.tbl.Separationheader = \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435
! Rename FlightConfiguration Dialog ! Rename FlightConfiguration Dialog
RenameConfigDialog.title = \u041f\u0435\u0440\u0435\u0438\u043c\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 RenameConfigDialog.title = \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438
RenameConfigDialog.lbl.name = \u0418\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438: RenameConfigDialog.lbl.name = \u0418\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:
RenameConfigDialog.but.reset = \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e RenameConfigDialog.but.reset = \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
@ -256,7 +256,7 @@ pref.dlg.tab.Options = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
pref.dlg.tab.Miscellaneousoptions = \u041f\u0440\u043e\u0447\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 pref.dlg.tab.Miscellaneousoptions = \u041f\u0440\u043e\u0447\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
pref.dlg.tab.Graphics = \u0413\u0440\u0430\u0444\u0438\u043a\u0430 pref.dlg.tab.Graphics = \u0413\u0440\u0430\u0444\u0438\u043a\u0430
pref.dlg.lbl.DecalEditor = \u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 pref.dlg.lbl.DecalEditor = \u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440
pref.dlg.opengl.lbl.title = 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0430 pref.dlg.opengl.lbl.title = 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0430
pref.dlg.opengl.but.enableGL = \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0443 pref.dlg.opengl.but.enableGL = \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0443
pref.dlg.opengl.but.enableAA = \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435 pref.dlg.opengl.but.enableAA = \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435
@ -296,7 +296,7 @@ pref.dlg.lbl.Stability = \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\
pref.dlg.lbl.FlightTime = \u0412\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u0430: pref.dlg.lbl.FlightTime = \u0412\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u0430:
pref.dlg.lbl.effect1 = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.. pref.dlg.lbl.effect1 = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b..
pref.dlg.lbl.Checkingupdates = \u041f\u043e\u0438\u0441\u043a \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439... pref.dlg.lbl.Checkingupdates = \u041f\u043e\u0438\u0441\u043a \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439...
pref.dlg.lbl.msg1 = \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. pref.dlg.lbl.msg1 = \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.
pref.dlg.lbl.msg2 = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u0445. pref.dlg.lbl.msg2 = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u0445.
pref.dlg.lbl.msg3 = \u0412\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 OpenRocket. pref.dlg.lbl.msg3 = \u0412\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 OpenRocket.
pref.dlg.lbl.msg4 = \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. pref.dlg.lbl.msg4 = \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.
@ -306,7 +306,7 @@ pref.dlg.PrefChoiseSelector3 = \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\
pref.dlg.PrefBooleanSelector1 = \u0423\u0434\u0430\u043b\u0438\u0442\u044c pref.dlg.PrefBooleanSelector1 = \u0423\u0434\u0430\u043b\u0438\u0442\u044c
pref.dlg.PrefBooleanSelector2 = \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c pref.dlg.PrefBooleanSelector2 = \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c
pref.dlg.Add = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c pref.dlg.Add = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c
pref.dlg.DescriptionArea.Adddirectories = \u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0432\u043e\u0438\u0445 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438, \u0444\u0430\u0439\u043b\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439 RASP (*.eng), \u0444\u0430\u0439\u043b\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439 RockSim (*.rse) \u0438\u043b\u0438 ZIP-\u0430\u0440\u0445\u0438\u0432\u044b, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u043e\u0439 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 (;). \u0418\u0437\u043c\u043d\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0443\u043f\u044f\u0442 \u0432 \u0441\u0438\u043b\u0443 \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 OpenRocket. pref.dlg.DescriptionArea.Adddirectories = \u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0432\u043e\u0438\u0445 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438, \u0444\u0430\u0439\u043b\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439 RASP (*.eng), \u0444\u0430\u0439\u043b\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439 RockSim (*.rse) \u0438\u043b\u0438 ZIP-\u0430\u0440\u0445\u0438\u0432\u044b, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u043e\u0439 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 (;). \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0443\u043f\u044f\u0442 \u0432 \u0441\u0438\u043b\u0443 \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 OpenRocket.
PreferencesDialog.lbl.language = \u042f\u0437\u044b\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430: PreferencesDialog.lbl.language = \u042f\u0437\u044b\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:
PreferencesDialog.languages.default = \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 PreferencesDialog.languages.default = \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439
@ -315,7 +315,7 @@ PreferencesDialog.lbl.languageEffect = \u042f\u0437\u044b\u043a \u0441\u043c\u04
! Simulation edit dialog ! Simulation edit dialog
simedtdlg.but.runsimulation = \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442 simedtdlg.but.runsimulation = \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442
simedtdlg.but.resettodefault = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e simedtdlg.but.resettodefault = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
simedtdlg.but.savedefault = Save as default simedtdlg.but.savedefault = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
simedtdlg.but.add = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c simedtdlg.but.add = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c
simedtdlg.but.remove = \u0423\u0434\u0430\u043b\u0438\u0442\u044c simedtdlg.but.remove = \u0423\u0434\u0430\u043b\u0438\u0442\u044c
simedtdlg.title.Editsim = \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0440\u0430\u0441\u0447\u0435\u0442\u0430 simedtdlg.title.Editsim = \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0440\u0430\u0441\u0447\u0435\u0442\u0430
@ -342,7 +342,7 @@ simedtdlg.checkbox.InterStdAtmosphere = \u0418\u0441\u043f\u043e\u043b\u044c\u04
simedtdlg.checkbox.ttip.InterStdAtmosphere1 = <html>\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b<br>\u0412 \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 simedtdlg.checkbox.ttip.InterStdAtmosphere1 = <html>\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u044b<br>\u0412 \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430
simedtdlg.checkbox.ttip.InterStdAtmosphere2 = \u0438 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 simedtdlg.checkbox.ttip.InterStdAtmosphere2 = \u0438 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435
simedtdlg.checkbox.ttip.InterStdAtmosphere3 = \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u043e\u0440\u044f. simedtdlg.checkbox.ttip.InterStdAtmosphere3 = \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u043e\u0440\u044f.
simedtdlg.lbl.Temperature = \u0422\u0435\u043c\u0435\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430: simedtdlg.lbl.Temperature = \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430:
simedtdlg.lbl.ttip.Temperature = \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0435. simedtdlg.lbl.ttip.Temperature = \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0435.
simedtdlg.lbl.Pressure = \u0414\u0430\u0432\u043b\u0435\u043d\u0438\u0435: simedtdlg.lbl.Pressure = \u0414\u0430\u0432\u043b\u0435\u043d\u0438\u0435:
simedtdlg.lbl.ttip.Pressure = \u0410\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u043e\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0435. simedtdlg.lbl.ttip.Pressure = \u0410\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u043e\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0435.
@ -366,7 +366,7 @@ simedtdlg.lbl.ttip.Direction2 = \u043a \u0432\u0435\u0442\u0440\u0443,
simedtdlg.lbl.ttip.Direction3 = \u043e\u0442 \u0432\u0435\u0442\u0440\u0430. simedtdlg.lbl.ttip.Direction3 = \u043e\u0442 \u0432\u0435\u0442\u0440\u0430.
simedtdlg.border.Simopt = \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0441\u0447\u0435\u0442\u0430 simedtdlg.border.Simopt = \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0441\u0447\u0435\u0442\u0430
simedtdlg.lbl.Calcmethod = \u041c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0447\u0435\u0442\u0430: simedtdlg.lbl.Calcmethod = \u041c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0447\u0435\u0442\u0430:
simedtdlg.lbl.ttip.Calcmethod = <html>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0411\u043e\u0440\u0440\u043e\u043c\u0430\u043d\u0430 \u0440\u0430\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0430\u044d\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u043e\u0437\u0434\u0435\u0441\u0442\u0432\u0438\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e<br>\u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c \u0411\u043e\u0440\u0440\u043e\u043c\u0430\u043d\u0430, \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u043c \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. simedtdlg.lbl.ttip.Calcmethod = <html>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0411\u043e\u0440\u0440\u043e\u043c\u0430\u043d\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0430\u044d\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e<br>\u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c \u0411\u043e\u0440\u0440\u043e\u043c\u0430\u043d\u0430, \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u043c \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.
simedtdlg.lbl.ExtBarrowman = \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0411\u043e\u0440\u0440\u043e\u043c\u0430\u043d\u0430 simedtdlg.lbl.ExtBarrowman = \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0411\u043e\u0440\u0440\u043e\u043c\u0430\u043d\u0430
simedtdlg.lbl.Simmethod = \u041c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0447\u0435\u0442\u0430: simedtdlg.lbl.Simmethod = \u041c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0447\u0435\u0442\u0430:
simedtdlg.lbl.ttip.Simmethod1 = <html>\u0420\u0430\u0441\u0447\u0435\u0442 \u0434\u043b\u044f \u0448\u0435\u0441\u0442\u0438 \u0441\u0442\u0435\u043f\u0435\u043d\u0435\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u044b \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u0443 \u0440\u0430\u043a\u0435\u0442\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u0430<br> simedtdlg.lbl.ttip.Simmethod1 = <html>\u0420\u0430\u0441\u0447\u0435\u0442 \u0434\u043b\u044f \u0448\u0435\u0441\u0442\u0438 \u0441\u0442\u0435\u043f\u0435\u043d\u0435\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u044b \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u0443 \u0440\u0430\u043a\u0435\u0442\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u0430<br>
@ -436,13 +436,13 @@ simpanel.col.Maxacceleration = \u041c\u0430\u043a\u0441. \u0443\u0441\u043a\u043
simpanel.col.Timetoapogee = \u0412\u0440\u0435\u043c\u044f \u0434\u043e \u0430\u043f\u043e\u0433\u0435\u044f simpanel.col.Timetoapogee = \u0412\u0440\u0435\u043c\u044f \u0434\u043e \u0430\u043f\u043e\u0433\u0435\u044f
simpanel.col.Flighttime = \u0412\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u0430 simpanel.col.Flighttime = \u0412\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u0430
simpanel.col.Groundhitvelocity = \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u044f simpanel.col.Groundhitvelocity = \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u044f
simpanel.ttip.uptodate = <i>\u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b</i> simpanel.ttip.uptodate = <i>\u0414\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b</i>
simpanel.ttip.loaded = <i>\u0414\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0438\u0437 \u0444\u0430\u0439\u043b\u0430</i> simpanel.ttip.loaded = <i>\u0414\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0438\u0437 \u0444\u0430\u0439\u043b\u0430</i>
simpanel.ttip.outdated = <i><font color=\"red\">\u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0438</font></i><br>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 <i><b>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442\u044b</b></i> \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430. simpanel.ttip.outdated = <i><font color=\"red\">\u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0438</font></i><br>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 <i><b>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442\u044b</b></i> \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430.
simpanel.ttip.external = <i>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435</i> simpanel.ttip.external = <i>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435</i>
simpanel.ttip.notSimulated = <i>\u0420\u0430\u0441\u0447\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f</i><br>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 <i><b>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442\u044b</b></i> \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430. simpanel.ttip.notSimulated = <i>\u0420\u0430\u0441\u0447\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f</i><br>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 <i><b>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442\u044b</b></i> \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430.
simpanel.ttip.noData = \u041d\u0435\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. simpanel.ttip.noData = \u041d\u0435\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.
simpanel.ttip.noWarnings = <font color=\"gray\">\u041d\u0435\u0442 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439</font> simpanel.ttip.noWarnings = <font color=\"gray\">\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439 \u043d\u0435\u0442.</font>
simpanel.ttip.warnings = <font color=\"red\">\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f:</font> simpanel.ttip.warnings = <font color=\"red\">\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f:</font>
! SimulationRunDialog ! SimulationRunDialog
@ -454,21 +454,26 @@ SimuRunDlg.lbl.Velocity = \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c:
SimuRunDlg.msg.Unabletosim = \u0420\u0430\u0441\u0447\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d: SimuRunDlg.msg.Unabletosim = \u0420\u0430\u0441\u0447\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d:
SimuRunDlg.msg.errorOccurred = \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430: SimuRunDlg.msg.errorOccurred = \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430:
BasicEventSimulationEngine.error.noMotorsDefined = \u0414\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0438.
BasicEventSimulationEngine.error.earlyMotorBurnout = \u0412\u044b\u0433\u043e\u0440\u0430\u043d\u0438\u0435 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f \u0431\u0435\u0437 \u043e\u0442\u0440\u044b\u0432\u0430 \u0440\u0430\u043a\u0435\u0442\u044b \u043e\u0442 \u0437\u0435\u043c\u043b\u0438.
BasicEventSimulationEngine.error.noIgnition = \u041d\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0437\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u0435.
BasicEventSimulationEngine.error.NaNResult = \u0420\u0430\u0441\u0447\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0435\u0435\u0441\u044f \u0447\u0438\u0441\u043b\u043e\u043c (NaN). \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043e\u0442\u0447\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.
RK4SimulationStepper.error.valuesTooLarge = \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b. \u041f\u043e\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0430\u0433.
RK4SimulationStepper.error.valuesTooLarge = \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0430\u0433.
SimulationModifierTree.OptimizationParameters = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b SimulationModifierTree.OptimizationParameters = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b
! SimulationExportPanel ! SimulationExportPanel
SimExpPan.desc = \u0422\u0435\u043a\u0441\u0442, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438 (*.csv) SimExpPan.desc = \u0422\u0435\u043a\u0441\u0442, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438 (*.csv)
SimExpPan.border.Vartoexport = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 SimExpPan.border.Vartoexport = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435
SimExpPan.border.Stage = Stage to export SimExpPan.border.Stage = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0443\u043f\u0435\u043d\u044c
SimExpPan.but.Selectall = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 SimExpPan.but.Selectall = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435
SimExpPan.but.Selectnone = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 SimExpPan.but.Selectnone = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440
SimExpPan.border.Fieldsep = \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0435\u0439 SimExpPan.border.Fieldsep = \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0435\u0439
SimExpPan.lbl.Fieldsepstr = \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0435\u0439: SimExpPan.lbl.Fieldsepstr = \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0435\u0439:
SimExpPan.lbl.longA1 = <html>\u0421\u0442\u0440\u043e\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435.<br> SimExpPan.lbl.longA1 = <html>\u0421\u0442\u0440\u043e\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435.<br>
SimExpPan.lbl.longA2 = \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438 (CSV) \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0437\u043d\u0430\u043a\u043e\u043c ',' SimExpPan.lbl.longA2 = \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438 (CSV) \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0437\u043d\u0430\u043a\u043e\u043c ','
SimExpPan.checkbox.Includesimudesc = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 SimExpPan.checkbox.Includesimudesc = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430
SimExpPan.checkbox.ttip.Includesimudesc = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0441\u0447\u0435\u0442\u0430 SimExpPan.checkbox.ttip.Includesimudesc = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0441\u0447\u0435\u0442\u0430
SimExpPan.border.Comments = \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f SimExpPan.border.Comments = \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f
@ -520,7 +525,7 @@ ExpressionBuilderDialog.InsertVariable = \u0412\u0441\u0442\u0430\u0432\u0438\u0
ExpressionBuilderDialog.InsertOperator = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 ExpressionBuilderDialog.InsertOperator = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440
ExpressionBuilderDialog.led.ttip.Name = \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c ExpressionBuilderDialog.led.ttip.Name = \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c
ExpressionBuilderDialog.led.ttip.Symbol = \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c ExpressionBuilderDialog.led.ttip.Symbol = \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c
ExpressionBuilderDialog.led.ttip.Expression = \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u0432\u0435\u0447\u0442\u043d\u044b\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b ExpressionBuilderDialog.led.ttip.Expression = \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b
ExpressionBuilderDialog.CopyToOtherSimulations = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b ExpressionBuilderDialog.CopyToOtherSimulations = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b
ExpressionBuilderDialog.CopyToOtherSimulations.ttip = <html>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430<br>\u0423\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b. ExpressionBuilderDialog.CopyToOtherSimulations.ttip = <html>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430<br>\u0423\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b.
@ -559,7 +564,7 @@ Operator.random = \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\
Operator.expm1 = \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e exp(x)-1, \u043d\u043e \u0431\u043b\u0434\u0435\u0435 \u0442\u043e\u0447\u043d\u043e\u0435 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 x Operator.expm1 = \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e exp(x)-1, \u043d\u043e \u0431\u043b\u0434\u0435\u0435 \u0442\u043e\u0447\u043d\u043e\u0435 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 x
Operator.mean = \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 Operator.mean = \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430
Operator.min = \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 Operator.min = \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430
Operator.max = \u041c\u0430\u043a\u0438\u0441\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 Operator.max = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430
Operator.var = \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 Operator.var = \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430
Operator.stdev = \u0414\u0435\u0432\u0438\u0430\u0442\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 Operator.stdev = \u0414\u0435\u0432\u0438\u0430\u0442\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430
Operator.rms = \u0421\u0440\u0435\u0434\u043d\u0435-\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 Operator.rms = \u0421\u0440\u0435\u0434\u043d\u0435-\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430
@ -607,7 +612,7 @@ compaddbuttons.Bodycompandfinsets = \u041a\u043e\u0440\u043f\u0443\u0441\u043d\u
compaddbuttons.Nosecone = \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439\n\u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044c compaddbuttons.Nosecone = \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439\n\u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044c
compaddbuttons.Bodytube = \u041a\u043e\u0440\u043f\u0443\u0441\u043d\u0430\u044f\n\u0442\u0440\u0443\u0431\u0430 compaddbuttons.Bodytube = \u041a\u043e\u0440\u043f\u0443\u0441\u043d\u0430\u044f\n\u0442\u0440\u0443\u0431\u0430
compaddbuttons.Transition = \u041f\u0435\u0440\u0435\u0445\u043e\u0434 compaddbuttons.Transition = \u041f\u0435\u0440\u0435\u0445\u043e\u0434
compaddbuttons.Trapezoidal = \u0422\u0440\u0430\u043f\u0435\u0446\u0438\u0435\u0434\u0430\u043b\u044c\u043d\u043e\u0435\n\u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 compaddbuttons.Trapezoidal = \u0422\u0440\u0430\u043f\u0435\u0446\u0435\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0435\n\u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435
compaddbuttons.Elliptical = \u042d\u043b\u043b\u0438\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435\n\u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 compaddbuttons.Elliptical = \u042d\u043b\u043b\u0438\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435\n\u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435
compaddbuttons.Freeform = \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439\n\u0444\u043e\u0440\u043c\u044b compaddbuttons.Freeform = \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439\n\u0444\u043e\u0440\u043c\u044b
compaddbuttons.Launchlug = \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435\n\u043a\u043e\u043b\u044c\u0446\u043e compaddbuttons.Launchlug = \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435\n\u043a\u043e\u043b\u044c\u0446\u043e
@ -692,7 +697,7 @@ ringcompcfg.radialdirectionfrom = \u0420\u0430\u0434\u0438\u0430\u043b\u044c\u04
ringcompcfg.but.Reset = \u0421\u0431\u0440\u043e\u0441 ringcompcfg.but.Reset = \u0421\u0431\u0440\u043e\u0441
ringcompcfg.but.Resetcomponant = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0430 \u043e\u0441\u0438 \u0440\u0430\u043a\u0435\u0442\u044b ringcompcfg.but.Resetcomponant = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0430 \u043e\u0441\u0438 \u0440\u0430\u043a\u0435\u0442\u044b
ringcompcfg.EngineBlock.desc = <html><b>\u0423\u043f\u043e\u0440 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f</b> \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f \u0432\u043f\u0435\u0440\u0435\u0434 \u0432 \u0442\u0440\u0443\u0431\u0435.<br><br>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c, \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 <b>\u041a\u043e\u0440\u043f\u0443\u0441\u043d\u0443\u044e \u0442\u0440\u0443\u0431\u0443</b> \u0438\u043b\u0438 <b>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0442\u0440\u0443\u0431\u0443</b> \u0438 \u043e\u0442\u043c\u0435\u0442\u044c\u0442\u0435 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u0430\u043a \u043a\u0440\u0435\u043f\u0435\u0436 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 <em>\u0414\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c</em> . ringcompcfg.EngineBlock.desc = <html><b>\u0423\u043f\u043e\u0440 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f</b> \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f \u0432\u043f\u0435\u0440\u0435\u0434 \u0432 \u0442\u0440\u0443\u0431\u0435.<br><br>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c, \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 <b>\u041a\u043e\u0440\u043f\u0443\u0441\u043d\u0443\u044e \u0442\u0440\u0443\u0431\u0443</b> \u0438\u043b\u0438 <b>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0442\u0440\u0443\u0431\u0443</b> \u0438 \u043e\u0442\u043c\u0435\u0442\u044c\u0442\u0435 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u0430\u043a \u043a\u0440\u0435\u043f\u0435\u0436 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 <em>\u0414\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c</em> .
ringcompcfg.note.desc = \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0442\u0440\u0443\u0431\u0430 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0430\u044d\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443, \u0434\u0430\u0436\u0435 \u0431\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043d\u043e\u0439 \u0437\u0430 \u043f\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043a\u043e\u0440\u043f\u0443\u0441\u0430. ringcompcfg.note.desc = \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0442\u0440\u0443\u0431\u0430 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0430\u044d\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443, \u0434\u0430\u0436\u0435 \u0431\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043d\u043e\u0439 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043a\u043e\u0440\u043f\u0443\u0441\u0430.
! Body Tube Config ! Body Tube Config
@ -705,7 +710,7 @@ BodyTubecfg.tab.Generalproperties = \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u
BodyTubecfg.tab.Motor = \u0414\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c BodyTubecfg.tab.Motor = \u0414\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c
BodyTubecfg.tab.Motormountconf = \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f BodyTubecfg.tab.Motormountconf = \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f
BodyTubecfg.checkbox.Automatic = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 BodyTubecfg.checkbox.Automatic = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438
BodyTubecfg.checkbox.Filled = \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0430\u044f BodyTubecfg.checkbox.Filled = \u0421\u043f\u043b\u043e\u0448\u043d\u0430\u044f
! FinSetConfig ! FinSetConfig
FinSetConfig.tab.Fintabs = \u041a\u0440\u0435\u043f\u0435\u0436\u043d\u044b\u0435 \u0432\u044b\u0441\u0442\u0443\u043f\u044b FinSetConfig.tab.Fintabs = \u041a\u0440\u0435\u043f\u0435\u0436\u043d\u044b\u0435 \u0432\u044b\u0441\u0442\u0443\u043f\u044b
@ -885,7 +890,7 @@ InnerTubeCfg.lbl.ttip.Rotation = \u0423\u0433\u043e\u043b \u043f\u043e\u0432\u04
InnerTubeCfg.lbl.Rotangle = \u0423\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 InnerTubeCfg.lbl.Rotangle = \u0423\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430
InnerTubeCfg.but.Splitcluster = \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 InnerTubeCfg.but.Splitcluster = \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440
InnerTubeCfg.lbl.longA1 = <html>\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<br> InnerTubeCfg.lbl.longA1 = <html>\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<br>
InnerTubeCfg.lbl.longA2 = \u042d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0442\u0440\u0443\u0431\u0435. InnerTubeCfg.lbl.longA2 = \u0422\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0442\u0440\u0443\u0431\u0435.
InnerTubeCfg.but.Resetsettings = \u0421\u0431\u0440\u043e\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a InnerTubeCfg.but.Resetsettings = \u0421\u0431\u0440\u043e\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a
InnerTubeCfg.but.ttip.Resetsettings = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e InnerTubeCfg.but.ttip.Resetsettings = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
@ -940,7 +945,7 @@ NoseConeCfg.lbl.Noseconelength = \u0414\u043b\u0438\u043d\u0430 \u043e\u0431\u04
NoseConeCfg.lbl.Basediam = \u0414\u0438\u0430\u043c\u0435\u0442\u0440 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f: NoseConeCfg.lbl.Basediam = \u0414\u0438\u0430\u043c\u0435\u0442\u0440 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f:
NoseConeCfg.checkbox.Automatic = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 NoseConeCfg.checkbox.Automatic = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438
NoseConeCfg.lbl.Wallthickness = \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0441\u0442\u0435\u043d\u043a\u0438: NoseConeCfg.lbl.Wallthickness = \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0441\u0442\u0435\u043d\u043a\u0438:
NoseConeCfg.checkbox.Filled = \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 NoseConeCfg.checkbox.Filled = \u0421\u043f\u043b\u043e\u0448\u043d\u043e\u0439
NoseConeCfg.tab.General = \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 NoseConeCfg.tab.General = \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435
NoseConeCfg.tab.ttip.General = \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b NoseConeCfg.tab.ttip.General = \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b
NoseConeCfg.tab.Shoulder = \u0412\u044b\u0441\u0442\u0443\u043f \u043c\u0443\u0444\u0442\u044b NoseConeCfg.tab.Shoulder = \u0412\u044b\u0441\u0442\u0443\u043f \u043c\u0443\u0444\u0442\u044b
@ -1005,7 +1010,7 @@ StreamerCfg.lbl.longA1 = <html>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\
StreamerCfg.lbl.longB1 = <html>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u0431\u0449\u0435\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043b\u0435\u043d\u0442\u044b.<br> StreamerCfg.lbl.longB1 = <html>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u0431\u0449\u0435\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043b\u0435\u043d\u0442\u044b.<br>
StreamerCfg.lbl.longB2 = \u0411\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043b\u043e\u0431\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f. StreamerCfg.lbl.longB2 = \u0411\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043b\u043e\u0431\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f.
StreamerCfg.lbl.Automatic = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 StreamerCfg.lbl.Automatic = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438
StreamerCfg.lbl.longC1 = \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0441\u043e\u043f\u0440\u043e\u0442\u043e\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043b\u0435\u043d\u0442\u044b. StreamerCfg.lbl.longC1 = \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043b\u0435\u043d\u0442\u044b.
StreamerCfg.lbl.Posrelativeto = \u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e: StreamerCfg.lbl.Posrelativeto = \u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e:
StreamerCfg.lbl.plus = \u043f\u043b\u044e\u0441 StreamerCfg.lbl.plus = \u043f\u043b\u044e\u0441
StreamerCfg.lbl.Packedlength = \u0414\u043b\u0438\u043d\u0430 \u0443\u043a\u043b\u0430\u0434\u043a\u0438: StreamerCfg.lbl.Packedlength = \u0414\u043b\u0438\u043d\u0430 \u0443\u043a\u043b\u0430\u0434\u043a\u0438:
@ -1039,7 +1044,7 @@ TransitionCfg.lbl.Forediam = \u0414\u0438\u0430\u043c\u0435\u0442\u0440 \u0432\u
TransitionCfg.checkbox.Automatic = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 TransitionCfg.checkbox.Automatic = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438
TransitionCfg.lbl.Aftdiam = \u0414\u0438\u0430\u043c\u0435\u0442\u0440 \u0432\u0445\u043e\u0434\u0430: TransitionCfg.lbl.Aftdiam = \u0414\u0438\u0430\u043c\u0435\u0442\u0440 \u0432\u0445\u043e\u0434\u0430:
TransitionCfg.lbl.Wallthickness = \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0441\u0442\u0435\u043d\u043a\u0438: TransitionCfg.lbl.Wallthickness = \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0441\u0442\u0435\u043d\u043a\u0438:
TransitionCfg.checkbox.Filled = \u0417\u0430\u043b\u0438\u0442 TransitionCfg.checkbox.Filled = \u0421\u043f\u043b\u043e\u0448\u043d\u043e\u0439
TransitionCfg.tab.General = \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 TransitionCfg.tab.General = \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435
TransitionCfg.tab.Generalproperties = \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b TransitionCfg.tab.Generalproperties = \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b
TransitionCfg.tab.Shoulder = \u0412\u044b\u0441\u0442\u0443\u043f TransitionCfg.tab.Shoulder = \u0412\u044b\u0441\u0442\u0443\u043f
@ -1065,18 +1070,18 @@ TrapezoidFinSetCfg.tab.General = \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u043
TrapezoidFinSetCfg.tab.Generalproperties = \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b TrapezoidFinSetCfg.tab.Generalproperties = \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b
! StorageOptionChooser ! StorageOptionChooser
StorageOptChooser.lbl.Simdatatostore = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0447\u0442\u043e\u0432: StorageOptChooser.lbl.Simdatatostore = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432:
StorageOptChooser.rdbut.Allsimdata = \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 StorageOptChooser.rdbut.Allsimdata = \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430
StorageOptChooser.lbl.longA1 = <html>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432.<br> StorageOptChooser.lbl.longA1 = <html>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432.<br>
StorageOptChooser.lbl.longA2 = \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c! StorageOptChooser.lbl.longA2 = \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c!
StorageOptChooser.rdbut.Every = \u041a\u0430\u0436\u0434\u044b\u0435 StorageOptChooser.rdbut.Every = \u041a\u0430\u0436\u0434\u044b\u0435
StorageOptChooser.lbl.longB1 = <html>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441 \u0442\u0430\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439.<br> StorageOptChooser.lbl.longB1 = <html>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441 \u0442\u0430\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439.<br>
StorageOptChooser.lbl.longB2 = \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430. StorageOptChooser.lbl.longB2 = \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430.
StorageOptChooser.lbl.seconds = \u0441\u0435\u043a\u0443\u043d\u0434 StorageOptChooser.lbl.seconds = \u0441\u0435\u043a\u0443\u043d\u0434
StorageOptChooser.rdbut.Onlyprimfig = \u0422\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u0435\u043c\u0443 StorageOptChooser.rdbut.Onlyprimfig = \u0422\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u0435\u043c\u0443
StorageOptChooser.lbl.longC1 = <html>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0432\u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<br> StorageOptChooser.lbl.longC1 = <html>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0432\u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<br>
StorageOptChooser.lbl.longC2 = \u042d\u0442\u043e \u0434\u0430\u0435\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430. StorageOptChooser.lbl.longC2 = \u042d\u0442\u043e \u0434\u0430\u0435\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430.
StorageOptChooser.lbl.longD1 = \u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0440\u0438\u0443\u044e\u0449\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438. StorageOptChooser.lbl.longD1 = \u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438.
StorageOptChooser.ttip.Saveopt = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 StorageOptChooser.ttip.Saveopt = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430
StorageOptChooser.lbl.Estfilesize = \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430: StorageOptChooser.lbl.Estfilesize = \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430:
StorageOptChooser.lbl.Saveopt = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f StorageOptChooser.lbl.Saveopt = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f
@ -1100,7 +1105,7 @@ TCMotorSelPan.equalsIgnoreCase.None = \u041d\u0435\u0442
TCMotorSelPan.lbl.NumberofsecondsorNone = (\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u043b\u0438 "\u041d\u0435\u0442") TCMotorSelPan.lbl.NumberofsecondsorNone = (\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u043b\u0438 "\u041d\u0435\u0442")
TCMotorSelPan.lbl.Totalimpulse = \u041e\u0431\u0449\u0438\u0439 \u0438\u043c\u043f\u0443\u043b\u044c\u0441: TCMotorSelPan.lbl.Totalimpulse = \u041e\u0431\u0449\u0438\u0439 \u0438\u043c\u043f\u0443\u043b\u044c\u0441:
TCMotorSelPan.lbl.Avgthrust = \u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0442\u044f\u0433\u0430: TCMotorSelPan.lbl.Avgthrust = \u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0442\u044f\u0433\u0430:
TCMotorSelPan.lbl.Maxthrust = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044f\u0430 \u0442\u044f\u0433\u0430: TCMotorSelPan.lbl.Maxthrust = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u044f\u0433\u0430:
TCMotorSelPan.lbl.Burntime = \u0412\u0440\u0435\u043c\u044f \u0433\u043e\u0440\u0435\u043d\u0438\u044f: TCMotorSelPan.lbl.Burntime = \u0412\u0440\u0435\u043c\u044f \u0433\u043e\u0440\u0435\u043d\u0438\u044f:
TCMotorSelPan.lbl.Launchmass = \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u0441\u0430: TCMotorSelPan.lbl.Launchmass = \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u0441\u0430:
TCMotorSelPan.lbl.Emptymass = \u041e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f \u043c\u0430\u0441\u0441\u0430: TCMotorSelPan.lbl.Emptymass = \u041e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f \u043c\u0430\u0441\u0441\u0430:
@ -1160,7 +1165,7 @@ main.menu.edit.paste = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c
main.menu.edit.delete = \u0423\u0434\u0430\u043b\u0438\u0442\u044c main.menu.edit.delete = \u0423\u0434\u0430\u043b\u0438\u0442\u044c
main.menu.edit.resize = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c... main.menu.edit.resize = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c...
main.menu.edit.resize.desc = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u0445\u0435\u043c\u044b main.menu.edit.resize.desc = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u0445\u0435\u043c\u044b
main.menu.edit.editprese = \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043e\u043a \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 main.menu.edit.editprese = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430
main.menu.edit.preferences = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 main.menu.edit.preferences = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
main.menu.edit.preferences.desc = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f main.menu.edit.preferences.desc = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f
@ -1169,7 +1174,7 @@ main.menu.analyze.desc = \u0410\u043d\u0430\u043b\u0438\u0437 \u0440\u0430\u043a
main.menu.analyze.componentAnalysis = \u0410\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 main.menu.analyze.componentAnalysis = \u0410\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432
main.menu.analyze.componentAnalysis.desc = \u0410\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u043a\u0435\u0442\u044b \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 main.menu.analyze.componentAnalysis.desc = \u0410\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u043a\u0435\u0442\u044b \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438
main.menu.analyze.optimization = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u043a\u0435\u0442\u044b main.menu.analyze.optimization = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u043a\u0435\u0442\u044b
main.menu.analyze.optimization.desc = \u041e\u0431\u0449\u0430\u044f\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0440\u0430\u043a\u0435\u0442\u044b main.menu.analyze.optimization.desc = \u041e\u0431\u0449\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0440\u0430\u043a\u0435\u0442\u044b
main.menu.analyze.customExpressions = \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f main.menu.analyze.customExpressions = \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f
main.menu.analyze.customExpressions.desc = \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 main.menu.analyze.customExpressions.desc = \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439
@ -1315,7 +1320,7 @@ TubeCoupler.TubeCoupler = \u041c\u0443\u0444\u0442\u0430
!InnerTube !InnerTube
InnerTube.InnerTube = \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0442\u0440\u0443\u0431\u0430 InnerTube.InnerTube = \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0442\u0440\u0443\u0431\u0430
! TrapezoidFinSet ! TrapezoidFinSet
TrapezoidFinSet.TrapezoidFinSet = \u0422\u0440\u0430\u043f\u0435\u0446\u0438\u0435\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 TrapezoidFinSet.TrapezoidFinSet = \u0422\u0440\u0430\u043f\u0435\u0446\u0435\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435
! FreeformFinSet ! FreeformFinSet
FreeformFinSet.FreeformFinSet = \u041e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b FreeformFinSet.FreeformFinSet = \u041e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b
!MassComponent !MassComponent
@ -1358,13 +1363,13 @@ MotorMount.IgnitionEvent.short.NEVER = \u041d\u0438\u043a\u043e\u0433\u0434\u043
ComponentIcons.Nosecone = \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044c ComponentIcons.Nosecone = \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044c
ComponentIcons.Bodytube = \u041a\u043e\u0440\u043f\u0443\u0441\u043d\u0430\u044f \u0442\u0440\u0443\u0431\u0430 ComponentIcons.Bodytube = \u041a\u043e\u0440\u043f\u0443\u0441\u043d\u0430\u044f \u0442\u0440\u0443\u0431\u0430
ComponentIcons.Transition = \u041f\u0435\u0440\u0435\u0445\u043e\u0434 ComponentIcons.Transition = \u041f\u0435\u0440\u0435\u0445\u043e\u0434
ComponentIcons.Trapezoidalfinset = \u0422\u0440\u0430\u043f\u0435\u0446\u0438\u0435\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 ComponentIcons.Trapezoidalfinset = \u0422\u0440\u0430\u043f\u0435\u0446\u0435\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435
ComponentIcons.Ellipticalfinset = \u042d\u043b\u043b\u0438\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 ComponentIcons.Ellipticalfinset = \u042d\u043b\u043b\u0438\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0435\u0440\u0435\u043d\u0438\u0435
ComponentIcons.Freeformfinset = \u041e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b ComponentIcons.Freeformfinset = \u041e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b
ComponentIcons.Launchlug = \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u043a\u043e\u043b\u044c\u0446\u043e ComponentIcons.Launchlug = \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u043a\u043e\u043b\u044c\u0446\u043e
ComponentIcons.Innertube = \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0442\u0440\u0443\u0431\u0430 ComponentIcons.Innertube = \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0442\u0440\u0443\u0431\u0430
ComponentIcons.Tubecoupler = \u041c\u0443\u0444\u0442\u0430 ComponentIcons.Tubecoupler = \u041c\u0443\u0444\u0442\u0430
ComponentIcons.Centeringring = \u0426\u0435\u043d\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043a\u043e\u043b\u044c\u0443\u043e ComponentIcons.Centeringring = \u0426\u0435\u043d\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043a\u043e\u043b\u044c\u0446\u043e
ComponentIcons.Bulkhead = \u041f\u0435\u0440\u0435\u0431\u043e\u0440\u043a\u0430 ComponentIcons.Bulkhead = \u041f\u0435\u0440\u0435\u0431\u043e\u0440\u043a\u0430
ComponentIcons.Engineblock = \u0423\u043f\u043e\u0440 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f ComponentIcons.Engineblock = \u0423\u043f\u043e\u0440 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f
ComponentIcons.Parachute = \u041f\u0430\u0440\u0430\u0448\u044e\u0442 ComponentIcons.Parachute = \u041f\u0430\u0440\u0430\u0448\u044e\u0442
@ -1408,7 +1413,7 @@ FlightEvent.Type.GROUND_HIT = \u041f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u
FlightEvent.Type.SIMULATION_END = \u041a\u043e\u043d\u0435\u0446 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 FlightEvent.Type.SIMULATION_END = \u041a\u043e\u043d\u0435\u0446 \u0440\u0430\u0441\u0447\u0435\u0442\u0430
FlightEvent.Type.ALTITUDE = \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b FlightEvent.Type.ALTITUDE = \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b
FlightEvent.Type.TUMBLE = \u041e\u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u043d\u0438\u0435 FlightEvent.Type.TUMBLE = \u041e\u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u043d\u0438\u0435
FlightEvent.Type.EXCEPTION = Exception FlightEvent.Type.EXCEPTION = \u041e\u0448\u0438\u0431\u043a\u0430
! ThrustCurveMotorColumns ! ThrustCurveMotorColumns
TCurveMotorCol.MANUFACTURER = \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c TCurveMotorCol.MANUFACTURER = \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c
@ -1584,8 +1589,8 @@ optimization.modifier.nosecone.diameter = \u0414\u0438\u0430\u043c\u0435\u0442\u
optimization.modifier.nosecone.diameter.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0430\u043c\u0435\u0442\u0440 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044f. optimization.modifier.nosecone.diameter.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0430\u043c\u0435\u0442\u0440 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044f.
optimization.modifier.nosecone.thickness = \u0422\u043e\u043b\u0449\u0438\u043d\u0430 optimization.modifier.nosecone.thickness = \u0422\u043e\u043b\u0449\u0438\u043d\u0430
optimization.modifier.nosecone.thickness.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u0449\u0438\u043d\u0443 \u0441\u0442\u0435\u043d\u043e\u043a \u043d\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044f. optimization.modifier.nosecone.thickness.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u0449\u0438\u043d\u0443 \u0441\u0442\u0435\u043d\u043e\u043a \u043d\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044f.
optimization.modifier.nosecone.shapeparameter = \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u043e\u0440\u0438\u044b optimization.modifier.nosecone.shapeparameter = \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u043e\u0440\u043c\u044b
optimization.modifier.nosecone.shapeparameter.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0442\u0440 \u0444\u043e\u0440\u043c\u044b \u043d\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044f. optimization.modifier.nosecone.shapeparameter.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u043e\u0440\u043c\u044b \u043d\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0442\u0435\u043a\u0430\u0442\u0435\u043b\u044f.
optimization.modifier.transition.length = \u0414\u043b\u0438\u043d\u0430 optimization.modifier.transition.length = \u0414\u043b\u0438\u043d\u0430
optimization.modifier.transition.length.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430. optimization.modifier.transition.length.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430.
@ -1638,7 +1643,7 @@ optimization.modifier.internalcomponent.position = \u041f\u043e\u043b\u043e\u043
optimization.modifier.internalcomponent.position.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e. optimization.modifier.internalcomponent.position.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e.
optimization.modifier.masscomponent.mass = \u041c\u0430\u0441\u0441\u0430 optimization.modifier.masscomponent.mass = \u041c\u0430\u0441\u0441\u0430
optimization.modifier.masscomponent.mass.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c the \u043c\u0430\u0441\u0441\u0443 \u0432\u0435\u0441\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. optimization.modifier.masscomponent.mass.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0443 \u0432\u0435\u0441\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
optimization.modifier.parachute.diameter = \u0414\u0438\u0430\u043c\u0435\u0442\u0440 optimization.modifier.parachute.diameter = \u0414\u0438\u0430\u043c\u0435\u0442\u0440
optimization.modifier.parachute.diameter.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0430\u043c\u0435\u0442\u0440 \u043f\u0430\u0440\u0430\u0448\u044e\u0442\u043d\u043e\u0433\u043e \u043a\u0443\u043f\u043e\u043b\u0430. optimization.modifier.parachute.diameter.desc = \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0430\u043c\u0435\u0442\u0440 \u043f\u0430\u0440\u0430\u0448\u044e\u0442\u043d\u043e\u0433\u043e \u043a\u0443\u043f\u043e\u043b\u0430.
@ -1712,7 +1717,7 @@ GeneralOptimizationDialog.status.stepSize.ttip = \u0422\u0435\u043a\u0443\u0449\
GeneralOptimizationDialog.btn.plotPath = \u0413\u0440\u0430\u0444\u0438\u043a \u043f\u0443\u0442\u0438 GeneralOptimizationDialog.btn.plotPath = \u0413\u0440\u0430\u0444\u0438\u043a \u043f\u0443\u0442\u0438
GeneralOptimizationDialog.btn.plotPath.ttip = \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u043f\u0443\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438 \u0434\u0432\u0443\u0445 \u0441\u0442\u0435\u043f\u0435\u043d\u0435\u0439) GeneralOptimizationDialog.btn.plotPath.ttip = \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u043f\u0443\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438 \u0434\u0432\u0443\u0445 \u0441\u0442\u0435\u043f\u0435\u043d\u0435\u0439)
GeneralOptimizationDialog.btn.save = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0443\u0442\u044c GeneralOptimizationDialog.btn.save = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0443\u0442\u044c
GeneralOptimizationDialog.btn.save.ttip = \u0421\u043e\u0445\u0440\u043d\u0430\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b CSV. GeneralOptimizationDialog.btn.save.ttip = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b CSV.
GeneralOptimizationDialog.btn.apply = \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e GeneralOptimizationDialog.btn.apply = \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e
GeneralOptimizationDialog.btn.apply.ttip = \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a \u0441\u0445\u0435\u043c\u0435 \u0440\u0430\u043a\u0435\u0442\u044b GeneralOptimizationDialog.btn.apply.ttip = \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a \u0441\u0445\u0435\u043c\u0435 \u0440\u0430\u043a\u0435\u0442\u044b
GeneralOptimizationDialog.btn.reset = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c GeneralOptimizationDialog.btn.reset = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c
@ -1751,7 +1756,7 @@ MaximumAltitudeParameter.name = \u0412\u044b\u0441\u043e\u0442\u0430 \u0430\u043
MaximumVelocityParameter.name = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c MaximumVelocityParameter.name = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c
MaximumAccelerationParameter.name = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 MaximumAccelerationParameter.name = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435
StabilityParameter.name = \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c StabilityParameter.name = \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c
GroundHitVelocityParameter.name = \u0421\u043a\u043e\u0440\u0441\u0442\u044c \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u044f GroundHitVelocityParameter.name = \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u044f
LandingDistanceParameter.name = \u0414\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u044f LandingDistanceParameter.name = \u0414\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u044f
TotalFlightTimeParameter.name = \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u0430 TotalFlightTimeParameter.name = \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0435\u0442\u0430
DeploymentVelocityParameter.name = \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0438 \u043f\u0430\u0440\u0430\u0448\u044e\u0442\u0430 DeploymentVelocityParameter.name = \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0438 \u043f\u0430\u0440\u0430\u0448\u044e\u0442\u0430
@ -1791,7 +1796,7 @@ GuidedTourSelectionDialog.btn.start = \u041d\u0430\u0447\u0430\u0442\u044c!
CustomFinImport.button.label = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f CustomFinImport.button.label = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f
CustomFinImport.badFinImage = \u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044c\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u043e\u0434\u0438\u043d\u043c \u0447\u0435\u0440\u043d\u044b\u043c \u0438\u043b\u0438 \u0442\u0435\u043c\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0438\u0437\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. CustomFinImport.badFinImage = \u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044c\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u043e\u0434\u0438\u043d\u043c \u0447\u0435\u0440\u043d\u044b\u043c \u0438\u043b\u0438 \u0442\u0435\u043c\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0438\u0437\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.
CustomFinImport.errorLoadingFile = \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430: CustomFinImport.errorLoadingFile = \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430:
CustomFinImport.errorParsingFile = \u041e\u0448\u0438\u0431\u043a\u0430 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430: CustomFinImport.errorParsingFile = \u041e\u0448\u0438\u0431\u043a\u0430 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430:
CustomFinImport.undo = \u0418\u043c\u043f\u043e\u0440\u0442 \u0444\u043e\u0440\u043c\u044b \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 CustomFinImport.undo = \u0418\u043c\u043f\u043e\u0440\u0442 \u0444\u043e\u0440\u043c\u044b \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430
CustomFinImport.error.title = \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 CustomFinImport.error.title = \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430
CustomFinImport.error.badimage = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438\u0437 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. CustomFinImport.error.badimage = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438\u0437 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.
@ -1838,7 +1843,7 @@ table.column.Shape = \u0424\u043e\u0440\u043c\u0430
table.column.Material = \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b table.column.Material = \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b
table.column.Finish = \u041e\u0442\u0434\u0435\u043b\u043a\u0430 table.column.Finish = \u041e\u0442\u0434\u0435\u043b\u043a\u0430
table.column.Thickness = \u0422\u043e\u043b\u0449\u0438\u043d\u0430 table.column.Thickness = \u0422\u043e\u043b\u0449\u0438\u043d\u0430
table.column.Filled = \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d table.column.Filled = \u0421\u043f\u043b\u043e\u0448\u043d\u043e\u0439
table.column.Mass = \u041c\u0430\u0441\u0441\u0430 table.column.Mass = \u041c\u0430\u0441\u0441\u0430
table.column.Diameter = \u0414\u0438\u0430\u043c\u0435\u0442\u0440 table.column.Diameter = \u0414\u0438\u0430\u043c\u0435\u0442\u0440
table.column.Sides = \u0421\u0442\u043e\u0440\u043e\u043d\u044b table.column.Sides = \u0421\u0442\u043e\u0440\u043e\u043d\u044b
@ -1866,6 +1871,7 @@ MotorConfigurationPanel.btn.removeMotor = \u0423\u0434\u0430\u043b\u0438\u0442\u
MotorConfigurationPanel.btn.selectMotor = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c MotorConfigurationPanel.btn.selectMotor = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c
MotorConfigurationPanel.btn.selectIgnition = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u0435 MotorConfigurationPanel.btn.selectIgnition = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u0435
MotorConfigurationPanel.btn.resetIgnition = \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0437\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u0435 MotorConfigurationPanel.btn.resetIgnition = \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0437\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u0435
MotorConfigurationPanel.lbl.nomotors = \u041a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043f\u0443\u0441\u043d\u044b\u0445 \u0442\u0440\u0443\u0431 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043b\u0435\u0432\u0430.
MotorConfigurationTableModel.table.ignition.default = \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e ({0}) MotorConfigurationTableModel.table.ignition.default = \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e ({0})
RecoveryConfigurationPanel.table.deployment.default = \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e ({0}) RecoveryConfigurationPanel.table.deployment.default = \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e ({0})
@ -1885,4 +1891,4 @@ SeparationSelectionDialog.opt.override = \u0418\u0437\u043c\u0435\u043d\u0438\u0
MotorConfigurationPanel.description = <b>\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0438 \u0438 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0435\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.</b><br> <em>\u041a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439:</em> \u0423\u043a\u0430\u0436\u0438\u0442\u0435, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439.<br> <em>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439:</em> \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u0438 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f. MotorConfigurationPanel.description = <b>\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0438 \u0438 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0435\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.</b><br> <em>\u041a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439:</em> \u0423\u043a\u0430\u0436\u0438\u0442\u0435, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439.<br> <em>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0435\u0439:</em> \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u0438 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f.
MotorDescriptionSubstitutor.description = \u0414\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 MotorDescriptionSubstitutor.description = \u0414\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438

View File

@ -0,0 +1,171 @@
#
# English base translation file
#
# Should you need to add new logical keys here is the proposed method
#
# className.ComponentType.componentName
#
#
# Text tokens within braces should not be translated, e.g.
# "The file '{filename}' exists."
# They are pieces that are inserted dynamically.
#
! Set to the name of the current translation file (used for debugging
purposes)
debug.currentFile = messages.properties
! RocketActions
RocketActions.checkbox.Donotaskmeagain = Yeniden Tekrarlama
RocketActions.lbl.Youcanchangedefop = Hatal\u0131 \u00c7al\u0131\u015fmay\u0131 De\u011fi\u015ftirebilirsin
in the preferences.
RocketActions.showConfirmDialog.lbl1 = Se\u00e7ili sim\u00fclasyonlar\u0131 silmek ister misiniz?
RocketActions.showConfirmDialog.lbl2 = <html><i>Bu \u00e7al\u0131\u015fma tamamlanmad\u0131.</i>
RocketActions.showConfirmDialog.title = Sim\u00fclasyonlar\u0131 Sil
RocketActions.DelCompAct.Delete = Sil
RocketActions.DelCompAct.ttip.Delete = Se\u00e7ili par\u00e7ay\u0131 sil.
RocketActions.DelSimuAct.Delete = Sil
RocketActions.DelSimuAct.ttip.Delete = Se\u00e7ili sim\u00fclasyonu sil.
RocketActions.DelAct.Delete = Sil
RocketActions.DelAct.ttip.Delete = Se\u00e7ilen par\u00e7ay\u0131 ya da sim\u00fclasyonu sil
RocketActions.CutAction.Cut = Kes
RocketActions.CutAction.ttip.Cut = Kes bu par\u00e7ay\u0131 yada sim\u00fclasyonun
haf\u0131zadan ve kald\u0131r bu tasar\u0131mdan
RocketActions.CopyAct.Copy = Kopyala
RocketActions.CopyAct.ttip.Copy = Bu par\u00e7ay\u0131 kopyala (ve altpar\u00e7alar\u0131)
haf\u0131zaya
RocketActions.PasteAct.Paste = Yap\u0131\u015ft\u0131r
RocketActions.PasteAct.ttip.Paste = Yap\u0131\u015ft\u0131r par\u00e7ay\u0131 ya da simulasyonu haf\u0131za \u00fczerinden
tasar\u0131ma do\u011fru.
RocketActions.EditAct.Edit = D\u00fczenle
RocketActions.EditAct.ttip.Edit = Se\u00e7ilmi\u015f par\u00e7ay\u0131 d\u00fczenle .
RocketActions.NewStageAct.Newstage = Yeni A\u015fama
RocketActions.NewStageAct.ttip.Newstage = Yeni bir roket tasar\u0131m\u0131 ekle
RocketActions.ActBoosterstage = Yard\u0131mc\u0131/Y\u00fckseltici A\u015fama
RocketActions.MoveUpAct.Moveup = Yukar\u0131 \u00c7\u0131kar
RocketActions.MoveUpAct.ttip.Moveup = Yukar\u0131ya do\u011fru bu par\u00e7ay\u0131 haraket ettir.
RocketActions.MoveDownAct.Movedown = A\u015fa\u011f\u0131ya \u0130ndir
RocketActions.MoveDownAct.ttip.Movedown = A\u015fa\u011f\u0131ya do\u011fru bu par\u00e7ay\u0131 haraket
ettir.
! RocketPanel
RocketPanel.FigTypeAct.Sideview = Yandan G\u00f6r\u00fcn\u00fc\u015f
RocketPanel.FigTypeAct.Backview = Arkadan G\u00f6r\u00fcn\u00fc\u015f
RocketPanel.FigTypeAct.Figure3D = 3D Resimlendirme
RocketPanel.FigTypeAct.Finished = 3D Bitmi\u015f
RocketPanel.FigTypeAct.Unfinished = 3D Bitmemi\u015f
RocketPanel.lbl.Flightcfg = U\u00e7u\u015f Bi\u00e7imi/Konumu:
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
RocketPanel.lbl.ViewType = G\u00f6r\u00fcn\u00fc\u015f \u015eekli:
! BasicFrame
BasicFrame.tab.Rocketdesign = Roket Tasar\u0131m\u0131
BasicFrame.tab.Flightconfig = Motorlar & Bi\u00e7imleri
BasicFrame.tab.Flightsim = U\u00e7u\u015f Sim\u00fclasyonlar\u0131
BasicFrame.title.Addnewcomp = Yeni par\u00e7a ekle
BasicFrame.dlg.lbl1 = Tasar\u0131m '
BasicFrame.dlg.lbl2 = ' Kaydedilmemi\u015f.
BasicFrame.dlg.lbl3 = Kaydetmek ister misiniz?
BasicFrame.dlg.title = Tasar\u0131m Kaydedilmedi
BasicFrame.StageName.Sustainer = Devam Et
BasicFrame.WarningDialog.txt1 = Problemler a\u00e7\u0131l\u0131rken d\u00fczenleniyor
BasicFrame.WarningDialog.txt2 = Baz\u0131 tasar\u0131m par\u00e7alar\u0131 d\u00fczg\u00fcnce
y\u00fcklenemedi.
BasicFrame.WarningDialog.title = Dosya a\u00e7\u0131l\u0131rken Tehlike
! General error messages used in multiple contexts
error.fileExists.title = File exists
error.fileExists.desc = File '{filename}' exists. \u00dczerine yazmak ister misiniz?
error.writing.title = Hata Dosya Yaz\u0131l\u0131rken
error.writing.desc = Bir hata dosya yaz\u0131l\u0131rken ortaya \u00e7\u0131kt\u0131:
Configuration.lbl.override = Bu durum baz\u0131 u\u00e7u\u015f bi\u00e7imlerinde ge\u00e7ersizdir.
! Labels used in buttons of dialog windows
# TODO: Rename these to "btn.xxx"
button.ok = Tamam
button.cancel = \u00c7\u0131k\u0131\u015f
button.close = Kapat
! Common labels used in buttons of dialog windows
dlg.but.ok = Tamam
dlg.but.cancel = \u00c7\u0131k\u0131\u015f
dlg.but.close = Kapat
! General file type names
filetypes.pdf = PDF files (*.pdf)
BasicFrame.SimpleFileFilter1 = All rocket designs (*.ork; *.rkt)
BasicFrame.SimpleFileFilter2 = OpenRocket designs (*.ork)
BasicFrame.SimpleFileFilter3 = RockSim designs (*.rkt)
BasicFrame.SimpleFileFilter4 = OpenRocket presets (*.orc)
filetypes.images = Resim Dosyalar\u0131
! Diyolog Hakk\u0131nda
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:Turkish
AboutDialog.lbl.translator =Batuhan Dereli
AboutDialog.lbl.translatorWebsite =www.batuhandereli.com
AboutDialog.lbl.translatorIcon =
! Yaz\u0131c\u0131
PrintDialog.title = Yazd\u0131r yada \u00c7\u0131kart
PrintDialog.but.previewAndPrint = \u00c7\u0131kt\u0131 \u00d6ncesi Bak & Yaz
PrintDialog.checkbox.showByStage = Par\u00e7a G\u00f6ster
PrintDialog.lbl.selectElements = \u0130\u00e7eren gruplar\u0131 se\u00e7:
printdlg.but.saveaspdf = Kaydet PDF Olarak
printdlg.but.preview = \u00d6nceki
printdlg.but.settings = Ayarlar
PrintDialog.error.preview.title = \u00d6nceki g\u00f6r\u00fcnt\u00fc ula\u015f\u0131lmaz
PrintDialog.error.preview.desc1 = Pdf g\u00f6r\u00fcnt\u00fc ula\u015f\u0131lmaz.
PrintDialog.error.preview.desc2 = L\u00fctfen kullan "Pdf Olarak Kaydet" i\u00e7eren
ayarlardan.
!PrintSettingsDialog
PrintSettingsDialog.title = Yaz\u0131c\u0131 Ayarlar\u0131
PrintSettingsDialog.lbl.Templatefillcolor = Kal\u0131p Renkli Doldur:
PrintSettingsDialog.lbl.Templatebordercolor = Kal\u0131b\u0131 S\u0131n\u0131rl\u0131 Doldur:
PrintSettingsDialog.lbl.Papersize = Ka\u011f\u0131t Boyutu:
PrintSettingsDialog.lbl.Paperorientation = Ka\u011f\u0131t Hizalama:
PrintSettingsDialog.but.Reset = Yeniden Ba\u015flat
PrintSettingsDialog.but.Close = Kapat
! Bug Report dialog
bugreport.dlg.title = Hata Raporu
bugreport.dlg.but.Sendbugreport = Hata Raporu G\u00f6nder
bugreport.dlg.but.Sendbugreport.Ttip = Atomatik olarak hata raporu g\u00f6nder OPEN ROCKET
geli\u015ftiricilerine.
bugreport.dlg.successmsg1 = Hata raporu sorunsuz yolland\u0131.
bugreport.dlg.successmsg2 = Te\u015fekk\u00fcrler sizin sayenizde OPENROCKET daha iyi geli\u015ficek!
bugreport.dlg.successmsg3 = Hata Raporu G\u00f6nderildi
bugreport.dlg.connectedInternet = <html>E\u011fer internet ba\u011flant\u0131n varsa,
basit\u00e7e t\u0131klay\u0131p<em>Hata Raporu G\u00f6nder</em>.
bugreport.dlg.otherwise = Ba\u015fka \u015fekilde,adrese yollay\u0131n:
bugreport.lbl.Theinformation = Genel hata raporlar\u0131hakk\u0131nda bilgi i\u00e7eriyor.Emin de\u011filsen ve
hislerinden \u00f6t\u00fcr\u00fc koyuyorsan hata raporunu koyma .
bugreport.dlg.failedmsg1 = OpenRocket hata raporunu g\u00f6ndermek i\u00e7in uygun de\u011fil:
bugreport.dlg.failedmsg2 = L\u00fctfen manual bir yolla g\u00f6nder
bugreport.dlg.failedmsg3 = Hata raporu g\u00f6nderiliyor
bugreport.reportDialog.txt = <html><b> OpenRocket i\u00e7erisindeki hatalar\u0131
form doldurarak yollayabilirsiniz.</b><br>Hatta hatalar\u0131 dosyalay\u0131p internet sitesi
\u00fczerinde proje sayfas\u0131na koyabilirsin.
bugreport.reportDialog.txt2 = <html><b>L\u00fctfen belirtiniz tam olarak nas\u0131l bir beklentiniz vard\u0131</b>
bugreport.dlg.provideDescription = L\u00fctfen Hatay\u0131 ilk ne zaman rastlad\u0131n\u0131z tam olarak a\u00e7\u0131klay\u0131n\u0131z
bugreport.dlg.provideDescription.title = Hata tan\u0131m\u0131 kayboluyor

View File

@ -69,12 +69,13 @@ public class RockSimAppearanceBuilder extends AppearanceBuilder {
if ("file".equals(name)) { if ("file".equals(name)) {
if (value.length() > 0) { if (value.length() > 0) {
final File f = new File(value); final File f = new File(value);
if (!f.exists()) { if (f.exists()) {
//Find out how to get path of current rocksim file Attachment a = context.getAttachmentFactory().getAttachment(name);
//so I can look in it's directory setImage(context.getOpenRocketDocument().getDecalImage(a));
} }
Attachment a = context.getAttachmentFactory().getAttachment(name); // else {
setImage(context.getOpenRocketDocument().getDecalImage(a)); // If we can't find the file on the filesystem, we just ignore the decal.
//}
} }
} else if ("repeat".equals(name)) { } else if ("repeat".equals(name)) {
repeat = "1".equals(value); repeat = "1".equals(value);

View File

@ -28,7 +28,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable<RocketComponent>, Visitable<RocketComponentVisitor, RocketComponent> { public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable<RocketComponent> {
private static final Logger log = LoggerFactory.getLogger(RocketComponent.class); private static final Logger log = LoggerFactory.getLogger(RocketComponent.class);
// Because of changes to Java 1.7.0-45's mechanism to construct DataFlavor objects (used in Drag and Drop) // Because of changes to Java 1.7.0-45's mechanism to construct DataFlavor objects (used in Drag and Drop)
@ -1736,9 +1736,9 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
} }
///////////// Visitor pattern implementation ///////////// Visitor pattern implementation
@Override public <R> R accept(RocketComponentVisitor<R> visitor) {
public void accept(RocketComponentVisitor visitor) {
visitor.visit(this); visitor.visit(this);
return visitor.getResult();
} }
//////////// Helper methods for subclasses //////////// Helper methods for subclasses

View File

@ -1,5 +1,19 @@
package net.sf.openrocket.rocketcomponent; package net.sf.openrocket.rocketcomponent;
public interface RocketComponentVisitor extends Visitor<RocketComponentVisitor, RocketComponent> { public interface RocketComponentVisitor<R> {
/**
* The callback method. This method is the 2nd leg of the double-dispatch, having been invoked from a
* corresponding <code>accept</code>.
*
* @param visitable the instance of the Visitable (the target of what is being visiting)
*/
void visit(RocketComponent visitable);
/**
* Return the final result
* @return
*/
R getResult();
} }

View File

@ -1,41 +0,0 @@
/*
* Visitable.java
*/
package net.sf.openrocket.rocketcomponent;
/**
* This interface describes a portion of the Visitor pattern, using generics to assure type-safety.
* The elements of the concrete object hierarchy are only visitable by an associated hierarchy of visitors,
* while these visitors are only able to visit the elements of that hierarchy.
*
* The key concept regarding the Visitor pattern is to realize that Java will only "discriminate" the type of an
* object being called, not the type of an object being passed.
*
* In order for the type of two objects to be determinable to the JVM, each object must be the receiver of an
* invocation. Here, when accept is called on a Visitable, the concrete type of the Visitable becomes "known" but the
* concrete type of the argument is still unknown. <code>visit</code> is then called on the parameter object, passing
* the Visitable back, which has type and identity. Flow of control has now been 'double-dispatched' such that the
* type (and identity) of both objects are known.
*
* Specifically, this interface is to be implemented by every class in the RocketComponent hierarchy that
* can be visited AND which are sufficiently specialized from their super class. If they only provide
* constraints to their superclass (such as TubeCoupler), then the implementation of this interface at
* the superclass level is sufficient.
*
* Admittedly, the syntax is a bit contorted here, as it is necessarily self-referential for type-safety.
*
* <V> The visitor type
* <T> The visitable (the concrete class that implements this interface)
*/
public interface Visitable<V extends Visitor<V, T>, T extends Visitable<V, T>> {
/**
* Any class in the hierarchy that allows itself to be visited will implement this method. The normal
* behavior is that the visitor will invoke this method of a Visitable, passing itself. The Visitable
* turns around calls the Visitor back. This idiom is also known as 'double-dispatching'.
*
* @param visitor the visitor that will be called back
*/
public void accept(V visitor);
}

View File

@ -1,39 +0,0 @@
/*
* Visitor.java
*/
package net.sf.openrocket.rocketcomponent;
/**
* This interface describes a portion of the Visitor pattern, using generics to assure type-safety.
* The elements of the concrete object hierarchy are only visitable by an associated hierarchy of visitors,
* while these visitors are only able to visit the elements of that hierarchy.
*
* The key concept regarding the Visitor pattern is to realize that Java will only "discriminate" the type of an
* object being called, not the type of an object being passed.
*
* In order for the type of two objects to be determinable to the JVM, each object must be the receiver of an
* invocation. Here, when accept is called on a Visitable, the concrete type of the Visitable becomes "known" but the
* concrete type of the argument is still unknown. <code>visit</code> is then called on the parameter object, passing
* the Visitable back, which has type and identity. Flow of control has now been 'double-dispatched' such that the
* type (and identity) of both objects are known.
*
* Specifically, this interface is to be implemented by every class in the RocketComponent hierarchy that
* can be visited AND which are sufficiently specialized from their super class. If they only provide
* constraints to their superclass (such as TubeCoupler), then the implementation of this interface at
* the superclass level is sufficient.
*
* Admittedly, the syntax is a bit contorted here, as it is necessarily self-referential for type-safety.
*
* <V> The visitor type (the concrete class that implements this interface)
* <T> The visitable
*/
public interface Visitor<V extends Visitor<V, T>, T extends Visitable<V, T>> {
/**
* The callback method. This method is the 2nd leg of the double-dispatch, having been invoked from a
* corresponding <code>accept</code>.
*
* @param visitable the instance of the Visitable (the target of what is being visiting)
*/
void visit(T visitable);
}

View File

@ -3,24 +3,24 @@ package net.sf.openrocket.rocketvisitors;
import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.RocketComponentVisitor; import net.sf.openrocket.rocketcomponent.RocketComponentVisitor;
public abstract class BredthFirstRecusiveVisitor implements RocketComponentVisitor { public abstract class BredthFirstRecusiveVisitor<R> implements RocketComponentVisitor<R> {
@Override @Override
public final void visit(RocketComponent visitable) { public final void visit(RocketComponent visitable) {
this.doAction(visitable); this.doAction(visitable);
for ( RocketComponent child: visitable.getChildren() ) { for (RocketComponent child : visitable.getChildren()) {
this.doAction(child); this.doAction(child);
} }
for ( RocketComponent child: visitable.getChildren() ) { for (RocketComponent child : visitable.getChildren()) {
this.visit(child); this.visit(child);
} }
} }
protected abstract void doAction( RocketComponent visitable ); protected abstract void doAction(RocketComponent visitable);
} }

View File

@ -1,10 +1,10 @@
package net.sf.openrocket.rocketvisitors; package net.sf.openrocket.rocketvisitors;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent; import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent;
import net.sf.openrocket.rocketcomponent.RocketComponent;
public class CopyFlightConfigurationVisitor extends DepthFirstRecusiveVisitor { public class CopyFlightConfigurationVisitor extends DepthFirstRecusiveVisitor<Void> {
private final String oldConfigId; private final String oldConfigId;
private final String newConfigId; private final String newConfigId;
@ -13,14 +13,18 @@ public class CopyFlightConfigurationVisitor extends DepthFirstRecusiveVisitor {
this.oldConfigId = oldConfigId; this.oldConfigId = oldConfigId;
this.newConfigId = newConfigId; this.newConfigId = newConfigId;
} }
@Override @Override
public void doAction(RocketComponent visitable) { public void doAction(RocketComponent visitable) {
if ( visitable instanceof FlightConfigurableComponent ) { if (visitable instanceof FlightConfigurableComponent) {
((FlightConfigurableComponent)visitable).cloneFlightConfiguration(oldConfigId, newConfigId); ((FlightConfigurableComponent) visitable).cloneFlightConfiguration(oldConfigId, newConfigId);
} }
} }
@Override
public Void getResult() {
return null;
}
} }

View File

@ -3,19 +3,19 @@ package net.sf.openrocket.rocketvisitors;
import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.RocketComponentVisitor; import net.sf.openrocket.rocketcomponent.RocketComponentVisitor;
public abstract class DepthFirstRecusiveVisitor implements RocketComponentVisitor { public abstract class DepthFirstRecusiveVisitor<R> implements RocketComponentVisitor<R> {
@Override @Override
public final void visit(RocketComponent visitable) { public final void visit(RocketComponent visitable) {
this.doAction(visitable); this.doAction(visitable);
for ( RocketComponent child: visitable.getChildren() ) { for (RocketComponent child : visitable.getChildren()) {
this.visit(child); this.visit(child);
} }
} }
protected abstract void doAction( RocketComponent visitable ); protected abstract void doAction(RocketComponent visitable);
} }

View File

@ -0,0 +1,30 @@
package net.sf.openrocket.rocketvisitors;
import java.util.ArrayList;
import java.util.List;
import net.sf.openrocket.rocketcomponent.RocketComponent;
public class ListComponents<T extends RocketComponent> extends DepthFirstRecusiveVisitor<List<T>> {
private final Class<T> componentClazz;
protected List<T> components = new ArrayList<T>();
public ListComponents(Class<T> componentClazz) {
super();
this.componentClazz = componentClazz;
}
@Override
public List<T> getResult() {
return components;
}
@Override
protected void doAction(RocketComponent visitable) {
if (componentClazz.isAssignableFrom(visitable.getClass())) {
components.add((T) visitable);
}
}
}

View File

@ -0,0 +1,18 @@
package net.sf.openrocket.rocketvisitors;
import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.rocketcomponent.RocketComponent;
public class ListMotorMounts extends ListComponents<RocketComponent> {
public ListMotorMounts() {
super(RocketComponent.class);
}
@Override
protected void doAction(RocketComponent visitable) {
if (visitable instanceof MotorMount && ((MotorMount) visitable).isMotorMount()) {
components.add(visitable);
}
}
}

View File

@ -66,7 +66,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
flightConfigurationId = configuration.getFlightConfigurationID(); flightConfigurationId = configuration.getFlightConfigurationID();
MotorInstanceConfiguration motorConfiguration = setupMotorConfiguration(configuration); MotorInstanceConfiguration motorConfiguration = setupMotorConfiguration(configuration);
if (motorConfiguration.getMotorIDs().isEmpty()) { if (motorConfiguration.getMotorIDs().isEmpty()) {
throw new MotorIgnitionException("No motors defined in the simulation."); throw new MotorIgnitionException(trans.get("BasicEventSimulationEngine.error.noMotorsDefined"));
} }
status = new SimulationStatus(configuration, motorConfiguration, simulationConditions); status = new SimulationStatus(configuration, motorConfiguration, simulationConditions);
@ -403,7 +403,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
case BURNOUT: { case BURNOUT: {
// If motor burnout occurs without lift-off, abort // If motor burnout occurs without lift-off, abort
if (!status.isLiftoff()) { if (!status.isLiftoff()) {
throw new SimulationLaunchException("Motor burnout without liftoff."); throw new SimulationLaunchException(trans.get("BasicEventSimulationEngine.error.earlyMotorBurnout"));
} }
// Add ejection charge event // Add ejection charge event
MotorId motorId = (MotorId) event.getData(); MotorId motorId = (MotorId) event.getData();
@ -514,7 +514,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
// If no motor has ignited, abort // If no motor has ignited, abort
if (!status.isMotorIgnited()) { if (!status.isMotorIgnited()) {
throw new MotorIgnitionException("No motors ignited."); throw new MotorIgnitionException(trans.get("BasicEventSimulationEngine.error.noIgnition"));
} }
return ret; return ret;
@ -579,7 +579,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
" rocketOrientationQuaternion=" + status.getRocketOrientationQuaternion() + " rocketOrientationQuaternion=" + status.getRocketOrientationQuaternion() +
" rocketRotationVelocity=" + status.getRocketRotationVelocity() + " rocketRotationVelocity=" + status.getRocketRotationVelocity() +
" effectiveLaunchRodLength=" + status.getEffectiveLaunchRodLength()); " effectiveLaunchRodLength=" + status.getEffectiveLaunchRodLength());
throw new SimulationException("Simulation resulted in not-a-number (NaN) value, please report a bug."); throw new SimulationException(trans.get("BasicEventSimulationEngine.error.NaNResult"));
} }
} }

View File

@ -80,13 +80,18 @@ header("Content-type: text/plain");
$version = $_GET["version"]; $version = $_GET["version"];
$updates = ""; $updates = "";
$unstable = "13.11.1"; $unstable = "13.11.2";
$stable = "1.0.0"; $stable = "1.0.0";
if (preg_match("/^13.11$/", $version)) { if (preg_match("/^13.11.1$/", $version)) {
$updates = "Version: " . $unstable . "\n" .
"4: Bug fixes - Various fixes to motor selection\n".
"";
} else if (preg_match("/^13.11$/", $version)) {
$updates = "Version: " . $unstable . "\n" . $updates = "Version: " . $unstable . "\n" .
"4: Bug fixes - Tube Coupler configuration among other things\n". "4: Bug fixes - Tube Coupler configuration among other things\n".
"4: Bug fixes - Various fixes to motor selection\n".
""; "";
} else if (preg_match("/^13.09.1$/", $version)) { } else if (preg_match("/^13.09.1$/", $version)) {
$updates = "Version: " . $unstable . "\n" . $updates = "Version: " . $unstable . "\n" .

View File

@ -48,6 +48,10 @@
<div class="content"> <div class="content">
<div class="news"> <div class="news">
<h2>Recent news:</h2> <h2>Recent news:</h2>
<p><span class="date">01.01.2014:</span> Version 13.11.2 is
<a href="download.html">released</a>! This release contains bug fixes,
usability improvements, and layout fixes.
</p>
<p><span class="date">15.11.2013:</span> Version 13.11.1 is <p><span class="date">15.11.2013:</span> Version 13.11.1 is
<a href="download.html">released</a>! This release contains bug fixes <a href="download.html">released</a>! This release contains bug fixes
including fixing Tube Coupler configuration, various exceptions in including fixing Tube Coupler configuration, various exceptions in
@ -97,20 +101,20 @@
<a href="http://sourceforge.net/donate/index.php?group_id=260357"><img src="project-support.jpg" width="88" height="32" alt="Support This Project" /></a> <a href="http://sourceforge.net/donate/index.php?group_id=260357"><img src="project-support.jpg" width="88" height="32" alt="Support This Project" /></a>
</div> </div>
<div class="downloadbox"> <div class="downloadbox">
<a class="main" href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.1/OpenRocket-13.11.1.jar/download"> <a class="main" href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.2/OpenRocket-13.11.2.jar/download">
<strong>Download now!</strong> <strong>Download now!</strong>
<span>OpenRocket-13.11.1.jar</span> <span>OpenRocket-13.11.2.jar</span>
</a> </a>
<span class="alternative"> <span class="alternative">
<a href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.1/ReleaseNotes/view">Release notes</a> | <a href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.2/ReleaseNotes/view">Release notes</a> |
<a href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.1/OpenRocket-13.11.1-src.zip/download">Source code</a> <a href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.2/OpenRocket-13.11.2-src.zip/download">Source code</a>
</span> </span>
</div> </div>
<p>OpenRocket can be started in most graphical environments (including <p>OpenRocket can be started in most graphical environments (including
Windows) by double-clicking the package icon. No installation is Windows) by double-clicking the package icon. No installation is
required.</p> required.</p>
<p>From the command line OpenRocket can be started by <p>From the command line OpenRocket can be started by
<span class="command">java -jar OpenRocket-13.11.1.jar</span></p> <span class="command">java -jar OpenRocket-13.11.2.jar</span></p>
<h3>Android version</h3> <h3>Android version</h3>
<p>The Android version allows opening OpenRocket files, viewing <p>The Android version allows opening OpenRocket files, viewing
simulations and motors. Later versions will allow running simulations and motors. Later versions will allow running

View File

@ -49,12 +49,12 @@
<h2>Introduction</h2> <h2>Introduction</h2>
<div class="rightpane"> <div class="rightpane">
<div class="downloadbox"> <div class="downloadbox">
<a class="main" href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.1/OpenRocket-13.11.1.jar/download"> <a class="main" href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.2/OpenRocket-13.11.2.jar/download">
<strong>Download now!</strong> <strong>Download now!</strong>
<span>OpenRocket-13.11.1.jar</span> <span>OpenRocket-13.11.2.jar</span>
</a> </a>
<span class="alternative"> <span class="alternative">
<a href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.1/ReleaseNotes/view">Release notes</a> | <a href="https://sourceforge.net/projects/openrocket/files/openrocket/13.11.2/ReleaseNotes/view">Release notes</a> |
<a href="download.html">Other versions</a> <a href="download.html">Other versions</a>
</span> </span>
</div> </div>
@ -96,6 +96,10 @@
<div class="clear"></div> <div class="clear"></div>
<div class="news"> <div class="news">
<h2>News</h2> <h2>News</h2>
<p><span class="date">01.01.2014:</span> Version 13.11.2 is
<a href="download.html">released</a>! This release contains bug fixes,
usability improvements, and layout fixes.
</p>
<p><span class="date">15.11.2013:</span> Version 13.11.1 is <p><span class="date">15.11.2013:</span> Version 13.11.1 is
<a href="download.html">released</a>! This release contains bug fixes <a href="download.html">released</a>! This release contains bug fixes
including fixing Tube Coupler configuration, various exceptions in including fixing Tube Coupler configuration, various exceptions in

View File

@ -1,4 +1,4 @@
<set version="13.11.1"> <set version="13.11.2">
<set androidversion="12.09"> <set androidversion="12.09">
<def name="downloadbox"> <def name="downloadbox">

View File

@ -9,6 +9,11 @@
<!--- Remember to move the position of "onlyrecent" below! ---> <!--- Remember to move the position of "onlyrecent" below! --->
<p><span class="date">01.01.2014:</span> Version 13.11.2 is
<a href="download.html">released</a>! This release contains bug fixes,
usability improvements, and layout fixes.
</p>
<p><span class="date">15.11.2013:</span> Version 13.11.1 is <p><span class="date">15.11.2013:</span> Version 13.11.1 is
<a href="download.html">released</a>! This release contains bug fixes <a href="download.html">released</a>! This release contains bug fixes
including fixing Tube Coupler configuration, various exceptions in including fixing Tube Coupler configuration, various exceptions in

View File

@ -311,19 +311,14 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
} }
public void setMotorMountAndConfig( MotorMount mount, String currentConfig ) { public void setMotorMountAndConfig( MotorMount mount, String currentConfig ) {
double diameter = 0;
if ( mount != null ) {
diameter = mount.getMotorMountDiameter();
}
if (currentConfig != null && mount != null) { if (currentConfig != null && mount != null) {
MotorConfiguration motorConf = mount.getMotorConfiguration().get(currentConfig); MotorConfiguration motorConf = mount.getMotorConfiguration().get(currentConfig);
selectedMotor = (ThrustCurveMotor) motorConf.getMotor(); selectedMotor = (ThrustCurveMotor) motorConf.getMotor();
selectedDelay = motorConf.getEjectionDelay(); selectedDelay = motorConf.getEjectionDelay();
diameter = mount.getMotorMountDiameter();
} }
selectedMotorSet = null;
// If current motor is not found in db, add a new ThrustCurveMotorSet containing it // If current motor is not found in db, add a new ThrustCurveMotorSet containing it
if (selectedMotor != null) { if (selectedMotor != null) {
for (ThrustCurveMotorSet motorSet : database) { for (ThrustCurveMotorSet motorSet : database) {
@ -426,6 +421,7 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
curveSelectionBox.setEnabled(false); curveSelectionBox.setEnabled(false);
curveSelectionLabel.setEnabled(false); curveSelectionLabel.setEnabled(false);
motorInformationPanel.clearData(); motorInformationPanel.clearData();
table.clearSelection();
return; return;
} }

View File

@ -120,7 +120,8 @@ public class BasicFrame extends JFrame {
private static final int SHORTCUT_KEY = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); private static final int SHORTCUT_KEY = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
public static final int COMPONENT_TAB = 0; public static final int COMPONENT_TAB = 0;
public static final int SIMULATION_TAB = 1; public static final int CONFIGURATION_TAB = 1;
public static final int SIMULATION_TAB = 2;
/** /**
@ -267,7 +268,7 @@ public class BasicFrame extends JFrame {
// Upper-left segment, component tree // Upper-left segment, component tree
JPanel panel = new JPanel(new MigLayout("fill, flowy", "", "[grow]")); JPanel panel = new JPanel(new MigLayout("fill, flowy", "[grow][grow 0]","[grow]"));
tree = new ComponentTree(document); tree = new ComponentTree(document);
tree.setSelectionModel(componentSelectionModel); tree.setSelectionModel(componentSelectionModel);

View File

@ -13,49 +13,49 @@ import org.slf4j.LoggerFactory;
public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, ExceptionHandler { public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, ExceptionHandler {
private static final Logger log = LoggerFactory.getLogger(SwingExceptionHandler.class); private static final Logger log = LoggerFactory.getLogger(SwingExceptionHandler.class);
private static final int MEMORY_RESERVE = 512 * 1024; private static final int MEMORY_RESERVE = 512 * 1024;
/** /**
* A memory reserve of 0.5 MB of memory, that can be freed when showing the dialog. * A memory reserve of 0.5 MB of memory, that can be freed when showing the dialog.
* <p> * <p>
* This field is package-private so that the JRE cannot optimize its use away. * This field is package-private so that the JRE cannot optimize its use away.
*/ */
volatile byte[] memoryReserve = null; volatile byte[] memoryReserve = null;
private volatile boolean handling = false; private volatile boolean handling = false;
@Override @Override
public void uncaughtException(final Thread thread, final Throwable throwable) { public void uncaughtException(final Thread thread, final Throwable throwable) {
// Free memory reserve if out of memory // Free memory reserve if out of memory
if (isOutOfMemoryError(throwable)) { if (isOutOfMemoryError(throwable)) {
memoryReserve = null; memoryReserve = null;
handling = false; handling = false;
log.error("Out of memory error detected", throwable); log.error("Out of memory error detected", throwable);
} }
if (isNonFatalJREBug(throwable)) { if (isNonFatalJREBug(throwable)) {
log.warn("Ignoring non-fatal JRE bug", throwable); log.warn("Ignoring non-fatal JRE bug", throwable);
return; return;
} }
log.error("Handling uncaught exception on thread=" + thread, throwable); log.error("Handling uncaught exception on thread=" + thread, throwable);
throwable.printStackTrace(); throwable.printStackTrace();
if (handling) { if (handling) {
log.warn("Exception is currently being handled, ignoring"); log.warn("Exception is currently being handled, ignoring");
return; return;
} }
try { try {
handling = true; handling = true;
// Show on the EDT // Show on the EDT
if (SwingUtilities.isEventDispatchThread()) { if (SwingUtilities.isEventDispatchThread()) {
log.info("Exception handler running on EDT, showing dialog"); log.info("Exception handler running on EDT, showing dialog");
@ -69,9 +69,9 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
} }
}); });
} }
} catch (Throwable ex) { } catch (Throwable ex) {
// Make sure the handler does not throw any exceptions // Make sure the handler does not throw any exceptions
try { try {
log.error("Caught exception while handling exception", ex); log.error("Caught exception while handling exception", ex);
@ -79,15 +79,15 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
ex.printStackTrace(); ex.printStackTrace();
} catch (Exception ignore) { } catch (Exception ignore) {
} }
} finally { } finally {
// Mark handling as completed // Mark handling as completed
handling = false; handling = false;
} }
} }
/** /**
* Handle an error condition programmatically without throwing an exception. * Handle an error condition programmatically without throwing an exception.
* This can be used in cases where recovery of the error is desirable. * This can be used in cases where recovery of the error is desirable.
@ -102,8 +102,8 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
log.error(message, new Throwable()); log.error(message, new Throwable());
handleErrorCondition(new InternalException(message)); handleErrorCondition(new InternalException(message));
} }
/** /**
* Handle an error condition programmatically without throwing an exception. * Handle an error condition programmatically without throwing an exception.
* This can be used in cases where recovery of the error is desirable. * This can be used in cases where recovery of the error is desirable.
@ -119,8 +119,8 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
log.error(message, exception); log.error(message, exception);
handleErrorCondition(new InternalException(message, exception)); handleErrorCondition(new InternalException(message, exception));
} }
/** /**
* Handle an error condition programmatically without throwing an exception. * Handle an error condition programmatically without throwing an exception.
* This can be used in cases where recovery of the error is desirable. * This can be used in cases where recovery of the error is desirable.
@ -137,7 +137,7 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
log.error("Error occurred", exception); log.error("Error occurred", exception);
} }
final Thread thread = Thread.currentThread(); final Thread thread = Thread.currentThread();
if (SwingUtilities.isEventDispatchThread()) { if (SwingUtilities.isEventDispatchThread()) {
log.info("Running in EDT, showing dialog"); log.info("Running in EDT, showing dialog");
this.showDialog(thread, exception); this.showDialog(thread, exception);
@ -155,8 +155,8 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
log.error("Exception occurred in error handler", e); log.error("Exception occurred in error handler", e);
} }
} }
/** /**
* The actual handling routine. * The actual handling routine.
* *
@ -164,82 +164,82 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
* @param e the exception. * @param e the exception.
*/ */
private void showDialog(Thread t, Throwable e) { private void showDialog(Thread t, Throwable e) {
// Out of memory // Out of memory
if (isOutOfMemoryError(e)) { if (isOutOfMemoryError(e)) {
log.info("Showing out-of-memory dialog"); log.info("Showing out-of-memory dialog");
JOptionPane.showMessageDialog(null, JOptionPane.showMessageDialog(null,
new Object[] { new Object[] {
"OpenRocket is out of available memory!", "OpenRocket is out of available memory!",
"You should immediately close unnecessary design windows,", "You should immediately close unnecessary design windows,",
"save any unsaved designs and restart OpenRocket!" "save any unsaved designs and restart OpenRocket!"
}, "Out of memory", JOptionPane.ERROR_MESSAGE); }, "Out of memory", JOptionPane.ERROR_MESSAGE);
return; return;
} }
// Create the message // Create the message
String msg = e.getClass().getSimpleName() + ": " + e.getMessage(); String msg = e.getClass().getSimpleName() + ": " + e.getMessage();
if (msg.length() > 90) { if (msg.length() > 90) {
msg = msg.substring(0, 80) + "..."; msg = msg.substring(0, 80) + "...";
} }
// Unknown Error // Unknown Error
if (!(e instanceof Exception) && !(e instanceof LinkageError)) { if (!(e instanceof Exception) && !(e instanceof LinkageError)) {
log.info("Showing Error dialog"); log.info("Showing Error dialog");
JOptionPane.showMessageDialog(null, JOptionPane.showMessageDialog(null,
new Object[] { new Object[] {
"An unknown Java error occurred:", "An unknown Java error occurred:",
msg, msg,
"<html>You should immediately close unnecessary design windows,<br>" + "<html>You should immediately close unnecessary design windows,<br>" +
"save any unsaved designs and restart OpenRocket!" "save any unsaved designs and restart OpenRocket!"
}, "Unknown Java error", JOptionPane.ERROR_MESSAGE); }, "Unknown Java error", JOptionPane.ERROR_MESSAGE);
return; return;
} }
// Normal exception, show question dialog // Normal exception, show question dialog
log.info("Showing Exception dialog"); log.info("Showing Exception dialog");
int selection = JOptionPane.showOptionDialog(null, new Object[] { int selection = JOptionPane.showOptionDialog(null, new Object[] {
"OpenRocket encountered an uncaught exception. This typically signifies " + "OpenRocket encountered an uncaught exception. This typically signifies " +
"a bug in the software.", "a bug in the software.",
"<html><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + msg + "</em>", "<html><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + msg + "</em>",
" ", " ",
"Please take a moment to report this bug to the developers.", "Please take a moment to report this bug to the developers.",
"This can be done automatically if you have an Internet connection." "This can be done automatically if you have an Internet connection."
}, "Uncaught exception", JOptionPane.DEFAULT_OPTION, }, "Uncaught exception", JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE, null, JOptionPane.ERROR_MESSAGE, null,
new Object[] { "View bug report", "Close" }, "View bug report"); new Object[] { "View bug report", "Close" }, "View bug report");
if (selection != 0) { if (selection != 0) {
// User cancelled // User cancelled
log.info(Markers.USER_MARKER, "User chose not to fill bug report"); log.info(Markers.USER_MARKER, "User chose not to fill bug report");
return; return;
} }
// Show bug report dialog // Show bug report dialog
log.info(Markers.USER_MARKER, "User requested sending bug report"); log.info(Markers.USER_MARKER, "User requested sending bug report");
BugReportDialog.showExceptionDialog(null, t, e); BugReportDialog.showExceptionDialog(null, t, e);
} }
/** /**
* Registers the uncaught exception handler. This should be used to ensure that * Registers the uncaught exception handler. This should be used to ensure that
* all necessary registrations are performed. * all necessary registrations are performed.
*/ */
public void registerExceptionHandler() { public void registerExceptionHandler() {
Thread.setDefaultUncaughtExceptionHandler(this); Thread.setDefaultUncaughtExceptionHandler(this);
// Handler for modal dialogs of Sun's Java implementation // Handler for modal dialogs of Sun's Java implementation
// See bug ID 4499199. // See bug ID 4499199.
System.setProperty("sun.awt.exception.handler", AwtHandler.class.getName()); System.setProperty("sun.awt.exception.handler", AwtHandler.class.getName());
reserveMemory(); reserveMemory();
} }
/** /**
* Reserve the buffer memory that is freed in case an OutOfMemoryError occurs. * Reserve the buffer memory that is freed in case an OutOfMemoryError occurs.
*/ */
@ -249,9 +249,9 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
memoryReserve[i] = (byte) i; memoryReserve[i] = (byte) i;
} }
} }
/** /**
* Return whether this throwable was caused by an OutOfMemoryError * Return whether this throwable was caused by an OutOfMemoryError
* condition. An exception is deemed to be caused by OutOfMemoryError * condition. An exception is deemed to be caused by OutOfMemoryError
@ -271,9 +271,9 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
} }
return false; return false;
} }
/** /**
* Handler used in modal dialogs by Sun Java implementation. * Handler used in modal dialogs by Sun Java implementation.
*/ */
@ -282,8 +282,8 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
Application.getExceptionHandler().uncaughtException(Thread.currentThread(), t); Application.getExceptionHandler().uncaughtException(Thread.currentThread(), t);
} }
} }
/** /**
* Detect various non-fatal Sun JRE bugs. * Detect various non-fatal Sun JRE bugs.
* *
@ -291,32 +291,32 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
* @return whether this exception should be ignored * @return whether this exception should be ignored
*/ */
private boolean isNonFatalJREBug(Throwable t) { private boolean isNonFatalJREBug(Throwable t) {
// NOTE: Calling method logs the entire throwable, so log only message here // NOTE: Calling method logs the entire throwable, so log only message here
/* /*
* Detect and ignore bug 6826104 in Sun JRE. * Detect and ignore bug 6826104 in Sun JRE.
*/ */
if (t instanceof NullPointerException) { if (t instanceof NullPointerException) {
StackTraceElement[] trace = t.getStackTrace(); StackTraceElement[] trace = t.getStackTrace();
if (trace.length > 3 && if (trace.length > 3 &&
trace[0].getClassName().equals("sun.awt.X11.XWindowPeer") && trace[0].getClassName().equals("sun.awt.X11.XWindowPeer") &&
trace[0].getMethodName().equals("restoreTransientFor") && trace[0].getMethodName().equals("restoreTransientFor") &&
trace[1].getClassName().equals("sun.awt.X11.XWindowPeer") && trace[1].getClassName().equals("sun.awt.X11.XWindowPeer") &&
trace[1].getMethodName().equals("removeFromTransientFors") && trace[1].getMethodName().equals("removeFromTransientFors") &&
trace[2].getClassName().equals("sun.awt.X11.XWindowPeer") && trace[2].getClassName().equals("sun.awt.X11.XWindowPeer") &&
trace[2].getMethodName().equals("setModalBlocked")) { trace[2].getMethodName().equals("setModalBlocked")) {
log.warn("Ignoring Sun JRE bug (6826104): http://bugs.sun.com/view_bug.do?bug_id=6826104" + t); log.warn("Ignoring Sun JRE bug (6826104): http://bugs.sun.com/view_bug.do?bug_id=6826104" + t);
return true; return true;
} }
} }
/* /*
* Detect and ignore bug 6828938 in Sun JRE 1.6.0_14 - 1.6.0_16. * Detect and ignore bug 6828938 in Sun JRE 1.6.0_14 - 1.6.0_16.
*/ */
@ -326,26 +326,26 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
if (elements.length >= 3 && if (elements.length >= 3 &&
(buggyClass.equals(elements[0].getClassName()) || (buggyClass.equals(elements[0].getClassName()) ||
buggyClass.equals(elements[1].getClassName()) || buggyClass.equals(elements[1].getClassName()) ||
buggyClass.equals(elements[2].getClassName()))) { buggyClass.equals(elements[2].getClassName()))) {
log.warn("Ignoring Sun JRE bug 6828938: " + log.warn("Ignoring Sun JRE bug 6828938: " +
"(see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6828938): " + t); "(see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6828938): " + t);
return true; return true;
} }
} }
/* /*
* Detect and ignore bug 6561072 in Sun JRE 1.6.0_? * Detect and ignore bug 6561072 in Sun JRE 1.6.0_?
*/ */
if (t instanceof NullPointerException) { if (t instanceof NullPointerException) {
StackTraceElement[] trace = t.getStackTrace(); StackTraceElement[] trace = t.getStackTrace();
if (trace.length > 3 && if (trace.length > 3 &&
trace[0].getClassName().equals("javax.swing.JComponent") && trace[0].getClassName().equals("javax.swing.JComponent") &&
trace[0].getMethodName().equals("repaint") && trace[0].getMethodName().equals("repaint") &&
trace[1].getClassName().equals("sun.swing.FilePane$2") && trace[1].getClassName().equals("sun.swing.FilePane$2") &&
trace[1].getMethodName().equals("repaintListSelection") && trace[1].getMethodName().equals("repaintListSelection") &&
trace[2].getClassName().equals("sun.swing.FilePane$2") && trace[2].getClassName().equals("sun.swing.FilePane$2") &&
trace[2].getMethodName().equals("repaintSelection")) { trace[2].getMethodName().equals("repaintSelection")) {
log.warn("Ignoring Sun JRE bug 6561072 " + log.warn("Ignoring Sun JRE bug 6561072 " +
@ -353,14 +353,14 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
return true; return true;
} }
} }
/* /*
* Detect and ignore bug 6933331 in Sun JRE 1.6.0_18 and others * Detect and ignore bug 6933331 in Sun JRE 1.6.0_18 and others
*/ */
if (t instanceof IllegalStateException) { if (t instanceof IllegalStateException) {
StackTraceElement[] trace = t.getStackTrace(); StackTraceElement[] trace = t.getStackTrace();
if (trace.length > 1 && if (trace.length > 1 &&
trace[0].getClassName().equals("sun.awt.windows.WComponentPeer") && trace[0].getClassName().equals("sun.awt.windows.WComponentPeer") &&
trace[0].getMethodName().equals("getBackBuffer")) { trace[0].getMethodName().equals("getBackBuffer")) {
@ -369,20 +369,20 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
return true; return true;
} }
} }
/* /*
* Detect and ignore bug in Sun JRE 1.6.0_19 * Detect and ignore bug in Sun JRE 1.6.0_19
*/ */
if (t instanceof NullPointerException) { if (t instanceof NullPointerException) {
StackTraceElement[] trace = t.getStackTrace(); StackTraceElement[] trace = t.getStackTrace();
if (trace.length > 3 && if (trace.length > 3 &&
trace[0].getClassName().equals("sun.awt.shell.Win32ShellFolder2") && trace[0].getClassName().equals("sun.awt.shell.Win32ShellFolder2") &&
trace[0].getMethodName().equals("pidlsEqual") && trace[0].getMethodName().equals("pidlsEqual") &&
trace[1].getClassName().equals("sun.awt.shell.Win32ShellFolder2") && trace[1].getClassName().equals("sun.awt.shell.Win32ShellFolder2") &&
trace[1].getMethodName().equals("equals") && trace[1].getMethodName().equals("equals") &&
trace[2].getClassName().equals("sun.awt.shell.Win32ShellFolderManager2") && trace[2].getClassName().equals("sun.awt.shell.Win32ShellFolderManager2") &&
trace[2].getMethodName().equals("isFileSystemRoot")) { trace[2].getMethodName().equals("isFileSystemRoot")) {
log.warn("Ignoring Sun JRE bug " + log.warn("Ignoring Sun JRE bug " +
@ -390,7 +390,7 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
return true; return true;
} }
} }
/* /*
* Detect Sun JRE bug in D3D * Detect Sun JRE bug in D3D
*/ */
@ -401,25 +401,43 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
return true; return true;
} }
} }
/*
* Detect and ignore DnD bug in component tree - related to 6560955 in Sun JRE.
*/
if (t instanceof NullPointerException) {
StackTraceElement[] trace = t.getStackTrace();
if (trace.length > 2 &&
trace[0].getClassName().equals("javax.swing.tree.TreePath") &&
trace[0].getMethodName().equals("pathByAddingChild") &&
trace[1].getClassName().equals("javax.swing.plaf.basic.BasicTreeUI") &&
trace[1].getMethodName().equals("getDropLineRect")) {
log.warn("Ignoring Sun JRE bug updating drop location " +
"(see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6560955): " + t);
return true;
}
}
return false; return false;
} }
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static class InternalException extends Exception { private static class InternalException extends Exception {
public InternalException() { public InternalException() {
super(); super();
} }
public InternalException(String message, Throwable cause) { public InternalException(String message, Throwable cause) {
super(message, cause); super(message, cause);
} }
public InternalException(String message) { public InternalException(String message) {
super(message); super(message);
} }
public InternalException(Throwable cause) { public InternalException(Throwable cause) {
super(cause); super(cause);
} }

View File

@ -16,8 +16,11 @@ import net.sf.openrocket.gui.dialogs.flightconfiguration.RenameConfigDialog;
import net.sf.openrocket.gui.main.BasicFrame; import net.sf.openrocket.gui.main.BasicFrame;
import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent; import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent;
import net.sf.openrocket.rocketcomponent.RecoveryDevice;
import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketvisitors.ListComponents;
import net.sf.openrocket.rocketvisitors.ListMotorMounts;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.StateChangeListener; import net.sf.openrocket.util.StateChangeListener;
@ -38,7 +41,11 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe
private final MotorConfigurationPanel motorConfigurationPanel; private final MotorConfigurationPanel motorConfigurationPanel;
private final RecoveryConfigurationPanel recoveryConfigurationPanel; private final RecoveryConfigurationPanel recoveryConfigurationPanel;
private final SeparationConfigurationPanel separationConfigurationPanel; private final SeparationConfigurationPanel separationConfigurationPanel;
private final static int MOTOR_TAB_INDEX = 0;
private final static int RECOVERY_TAB_INDEX = 1;
private final static int SEPARATION_TAB_INDEX = 2;
@Override @Override
public void stateChanged(EventObject e) { public void stateChanged(EventObject e) {
updateButtonState(); updateButtonState();
@ -178,9 +185,37 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe
private void updateButtonState() { private void updateButtonState() {
String currentId = rocket.getDefaultConfiguration().getFlightConfigurationID(); String currentId = rocket.getDefaultConfiguration().getFlightConfigurationID();
// Enable the remove/rename/copy buttons only when a configuration is selected.
removeConfButton.setEnabled(currentId != null); removeConfButton.setEnabled(currentId != null);
renameConfButton.setEnabled(currentId != null); renameConfButton.setEnabled(currentId != null);
copyConfButton.setEnabled(currentId != null); copyConfButton.setEnabled(currentId != null);
// Count the number of motor mounts
int motorMountCount = rocket.accept(new ListMotorMounts()).size();
// Count the number of recovery devices
int recoveryDeviceCount = rocket.accept(new ListComponents<RecoveryDevice>(RecoveryDevice.class)).size();
// Count the number of stages
int stageCount = rocket.getStageCount();
// Enable the new configuration button only when a motor mount is defined.
newConfButton.setEnabled(motorMountCount > 0);
// Only enable the recovery tab if there is a motor mount and there is a recovery device
tabs.setEnabledAt(RECOVERY_TAB_INDEX, motorMountCount > 0 && recoveryDeviceCount > 0);
// If the selected tab was the recovery tab, and there is no longer any recovery devices,
// switch to the motor tab.
if( recoveryDeviceCount == 0 && tabs.getSelectedIndex() == RECOVERY_TAB_INDEX ) {
tabs.setSelectedIndex(MOTOR_TAB_INDEX);
}
tabs.setEnabledAt(SEPARATION_TAB_INDEX, motorMountCount > 0 && stageCount > 1);
if ( stageCount ==1 && tabs.getSelectedIndex() == SEPARATION_TAB_INDEX ) {
tabs.setSelectedIndex(MOTOR_TAB_INDEX);
}
} }

View File

@ -1,5 +1,6 @@
package net.sf.openrocket.gui.main.flightconfigpanel; package net.sf.openrocket.gui.main.flightconfigpanel;
import java.awt.CardLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Component; import java.awt.Component;
import java.awt.Dimension; import java.awt.Dimension;
@ -22,6 +23,8 @@ import javax.swing.SwingUtilities;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.border.Border; import javax.swing.border.Border;
import javax.swing.border.EmptyBorder; import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellRenderer; import javax.swing.table.TableCellRenderer;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
@ -49,6 +52,10 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
private final JButton selectMotorButton, removeMotorButton, selectIgnitionButton, resetIgnitionButton; private final JButton selectMotorButton, removeMotorButton, selectIgnitionButton, resetIgnitionButton;
private final JPanel cards;
private final static String HELP_LABEL = "help";
private final static String TABLE_LABEL = "table";
private final MotorChooserDialog motorChooserDialog; private final MotorChooserDialog motorChooserDialog;
protected FlightConfigurableTableModel<MotorMount> configurationTableModel; protected FlightConfigurableTableModel<MotorMount> configurationTableModel;
@ -57,7 +64,6 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
motorChooserDialog = new MotorChooserDialog(SwingUtilities.getWindowAncestor(flightConfigurationPanel)); motorChooserDialog = new MotorChooserDialog(SwingUtilities.getWindowAncestor(flightConfigurationPanel));
{ {
//// Select motor mounts //// Select motor mounts
JPanel subpanel = new JPanel(new MigLayout("")); JPanel subpanel = new JPanel(new MigLayout(""));
@ -75,8 +81,16 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
this.add(subpanel, "split, w 200lp, growy"); this.add(subpanel, "split, w 200lp, growy");
} }
cards = new JPanel(new CardLayout());
this.add( cards );
JLabel helpText = new JLabel(trans.get("MotorConfigurationPanel.lbl.nomotors"));
cards.add(helpText, HELP_LABEL );
JScrollPane scroll = new JScrollPane(table); JScrollPane scroll = new JScrollPane(table);
this.add(scroll, "grow, wrap"); cards.add(scroll, TABLE_LABEL );
this.add(cards, "grow, wrap");
//// Select motor //// Select motor
selectMotorButton = new JButton(trans.get("MotorConfigurationPanel.btn.selectMotor")); selectMotorButton = new JButton(trans.get("MotorConfigurationPanel.btn.selectMotor"));
@ -122,6 +136,14 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
} }
protected void showEmptyText() {
((CardLayout)cards.getLayout()).show(cards, HELP_LABEL);
}
protected void showContent() {
((CardLayout)cards.getLayout()).show(cards, TABLE_LABEL);
}
@Override @Override
protected JTable initializeTable() { protected JTable initializeTable() {
//// Motor selection table. //// Motor selection table.
@ -133,6 +155,16 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
} }
}; };
// Listen to changes to the table so we can disable the help text when a
// motor mount is added through the edit body tube dialog.
configurationTableModel.addTableModelListener( new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
MotorConfigurationPanel.this.updateButtonState();
}
});
JTable configurationTable = new JTable(configurationTableModel); JTable configurationTable = new JTable(configurationTableModel);
configurationTable.getTableHeader().setReorderingAllowed(false); configurationTable.getTableHeader().setReorderingAllowed(false);
configurationTable.setCellSelectionEnabled(true); configurationTable.setCellSelectionEnabled(true);
@ -151,6 +183,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
} }
} }
}); });
return configurationTable; return configurationTable;
} }
@ -165,12 +198,21 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
} }
private void updateButtonState() { private void updateButtonState() {
String currentID = rocket.getDefaultConfiguration().getFlightConfigurationID(); if( configurationTableModel.getColumnCount() > 1 ) {
MotorMount currentMount = getSelectedComponent(); showContent();
selectMotorButton.setEnabled(currentMount != null && currentID != null); String currentID = rocket.getDefaultConfiguration().getFlightConfigurationID();
removeMotorButton.setEnabled(currentMount != null && currentID != null); MotorMount currentMount = getSelectedComponent();
selectIgnitionButton.setEnabled(currentMount != null && currentID != null); selectMotorButton.setEnabled(currentMount != null && currentID != null);
resetIgnitionButton.setEnabled(currentMount != null && currentID != null); removeMotorButton.setEnabled(currentMount != null && currentID != null);
selectIgnitionButton.setEnabled(currentMount != null && currentID != null);
resetIgnitionButton.setEnabled(currentMount != null && currentID != null);
} else {
showEmptyText();
selectMotorButton.setEnabled(false);
removeMotorButton.setEnabled(false);
selectIgnitionButton.setEnabled(false);
resetIgnitionButton.setEnabled(false);
}
} }

View File

@ -42,7 +42,7 @@ public class SwingPreferences extends net.sf.openrocket.startup.Preferences {
private static final List<Locale> SUPPORTED_LOCALES; private static final List<Locale> SUPPORTED_LOCALES;
static { static {
List<Locale> list = new ArrayList<Locale>(); List<Locale> list = new ArrayList<Locale>();
for (String lang : new String[] { "en", "de", "es", "fr", "it", "ru", "cs", "pl", "ja", "pt" }) { for (String lang : new String[] { "en", "de", "es", "fr", "it", "ru", "cs", "pl", "ja", "pt", "tr" }) {
list.add(new Locale(lang)); list.add(new Locale(lang));
} }
list.add(new Locale("zh","CN")); list.add(new Locale("zh","CN"));

View File

@ -10,6 +10,7 @@ import javax.swing.SwingUtilities;
import javax.swing.Timer; import javax.swing.Timer;
import javax.swing.ToolTipManager; import javax.swing.ToolTipManager;
import net.miginfocom.layout.LayoutUtil;
import net.sf.openrocket.arch.SystemInfo; import net.sf.openrocket.arch.SystemInfo;
import net.sf.openrocket.arch.SystemInfo.Platform; import net.sf.openrocket.arch.SystemInfo.Platform;
import net.sf.openrocket.communication.UpdateInfo; import net.sf.openrocket.communication.UpdateInfo;
@ -50,6 +51,10 @@ public class SwingStartup {
// Check for "openrocket.debug" property before anything else // Check for "openrocket.debug" property before anything else
checkDebugStatus(); checkDebugStatus();
if (System.getProperty("openrocket.debug.layout") != null) {
LayoutUtil.setGlobalDebugMillis(100);
}
// Initialize logging first so we can use it // Initialize logging first so we can use it
initializeLogging(); initializeLogging();