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):
------------------------------

View File

@ -1,7 +1,7 @@
# 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

View File

@ -57,7 +57,7 @@ RocketPanel.lbl.ViewType = View Type:
! BasicFrame
BasicFrame.tab.Rocketdesign = Rocket design
BasicFrame.tab.Flightconfig = Configurations
BasicFrame.tab.Flightconfig = Motors & Configuration
BasicFrame.tab.Flightsim = Flight simulations
BasicFrame.title.Addnewcomp = Add new component
BasicFrame.dlg.lbl1 = Design '
@ -454,6 +454,11 @@ SimuRunDlg.lbl.Velocity = Velocity:
SimuRunDlg.msg.Unabletosim = Unable to simulate:
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.
@ -1866,6 +1871,7 @@ MotorConfigurationPanel.btn.removeMotor = Remove motor
MotorConfigurationPanel.btn.selectMotor = Select motor
MotorConfigurationPanel.btn.selectIgnition = Select 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})
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.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.tab.Rocketdesign = \u041f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u043a\u0435\u0442\u044b
@ -114,21 +114,21 @@ AboutDialog.lbl.translatorIcon =
! Print dialog
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.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.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
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.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.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\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"
!PrintSettingsDialog
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.Templatebordercolor = \u0426\u0432\u0435\u0442 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \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.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\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.but.Reset = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\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
! 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.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.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.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
@ -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.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.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.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.
@ -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.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.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.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
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.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.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
@ -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.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.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.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.
@ -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.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.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.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>
@ -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.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.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.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.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.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>
! 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.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
! 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.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.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.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.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.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
@ -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.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.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.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.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.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.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
@ -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.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.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.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
@ -692,7 +697,7 @@ ringcompcfg.radialdirectionfrom = \u0420\u0430\u0434\u0438\u0430\u043b\u044c\u04
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.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
@ -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.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.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.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.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.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.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.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.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.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
@ -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.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.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.plus = \u043f\u043b\u044e\u0441
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.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.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.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
@ -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
! 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.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.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.seconds = \u0441\u0435\u043a\u0443\u043d\u0434
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.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.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
@ -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.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.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.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:
@ -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.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.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.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.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.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.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 = \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0442\u0440\u0443\u0431\u0430
! 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 = \u041e\u043f\u0435\u0440\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b
!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.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.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.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.Innertube = \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0442\u0440\u0443\u0431\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.Engineblock = \u0423\u043f\u043e\u0440 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f
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.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.EXCEPTION = Exception
FlightEvent.Type.EXCEPTION = \u041e\u0448\u0438\u0431\u043a\u0430
! ThrustCurveMotorColumns
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.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.shapeparameter = \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u043e\u0440\u0438\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 = \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\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.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.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.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.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.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.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
@ -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
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
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
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
@ -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.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.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.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.
@ -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.Finish = \u041e\u0442\u0434\u0435\u043b\u043a\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.Diameter = \u0414\u0438\u0430\u043c\u0435\u0442\u0440
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.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.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})
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.
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 (value.length() > 0) {
final File f = new File(value);
if (!f.exists()) {
//Find out how to get path of current rocksim file
//so I can look in it's directory
if (f.exists()) {
Attachment a = context.getAttachmentFactory().getAttachment(name);
setImage(context.getOpenRocketDocument().getDecalImage(a));
}
Attachment a = context.getAttachmentFactory().getAttachment(name);
setImage(context.getOpenRocketDocument().getDecalImage(a));
// else {
// If we can't find the file on the filesystem, we just ignore the decal.
//}
}
} else if ("repeat".equals(name)) {
repeat = "1".equals(value);

View File

@ -28,7 +28,7 @@ import org.slf4j.Logger;
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);
// 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
@Override
public void accept(RocketComponentVisitor visitor) {
public <R> R accept(RocketComponentVisitor<R> visitor) {
visitor.visit(this);
return visitor.getResult();
}
//////////// Helper methods for subclasses

View File

@ -1,5 +1,19 @@
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.RocketComponentVisitor;
public abstract class BredthFirstRecusiveVisitor implements RocketComponentVisitor {
public abstract class BredthFirstRecusiveVisitor<R> implements RocketComponentVisitor<R> {
@Override
public final void visit(RocketComponent visitable) {
this.doAction(visitable);
for ( RocketComponent child: visitable.getChildren() ) {
for (RocketComponent child : visitable.getChildren()) {
this.doAction(child);
}
for ( RocketComponent child: visitable.getChildren() ) {
for (RocketComponent child : visitable.getChildren()) {
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;
import net.sf.openrocket.rocketcomponent.RocketComponent;
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 newConfigId;
@ -13,14 +13,18 @@ public class CopyFlightConfigurationVisitor extends DepthFirstRecusiveVisitor {
this.oldConfigId = oldConfigId;
this.newConfigId = newConfigId;
}
@Override
public void doAction(RocketComponent visitable) {
if ( visitable instanceof FlightConfigurableComponent ) {
((FlightConfigurableComponent)visitable).cloneFlightConfiguration(oldConfigId, newConfigId);
if (visitable instanceof FlightConfigurableComponent) {
((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.RocketComponentVisitor;
public abstract class DepthFirstRecusiveVisitor implements RocketComponentVisitor {
public abstract class DepthFirstRecusiveVisitor<R> implements RocketComponentVisitor<R> {
@Override
public final void visit(RocketComponent visitable) {
this.doAction(visitable);
for ( RocketComponent child: visitable.getChildren() ) {
for (RocketComponent child : visitable.getChildren()) {
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();
MotorInstanceConfiguration motorConfiguration = setupMotorConfiguration(configuration);
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);
@ -403,7 +403,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
case BURNOUT: {
// If motor burnout occurs without lift-off, abort
if (!status.isLiftoff()) {
throw new SimulationLaunchException("Motor burnout without liftoff.");
throw new SimulationLaunchException(trans.get("BasicEventSimulationEngine.error.earlyMotorBurnout"));
}
// Add ejection charge event
MotorId motorId = (MotorId) event.getData();
@ -514,7 +514,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
// If no motor has ignited, abort
if (!status.isMotorIgnited()) {
throw new MotorIgnitionException("No motors ignited.");
throw new MotorIgnitionException(trans.get("BasicEventSimulationEngine.error.noIgnition"));
}
return ret;
@ -579,7 +579,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
" rocketOrientationQuaternion=" + status.getRocketOrientationQuaternion() +
" rocketRotationVelocity=" + status.getRocketRotationVelocity() +
" 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"];
$updates = "";
$unstable = "13.11.1";
$unstable = "13.11.2";
$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" .
"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)) {
$updates = "Version: " . $unstable . "\n" .

View File

@ -48,6 +48,10 @@
<div class="content">
<div class="news">
<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
<a href="download.html">released</a>! This release contains bug fixes
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>
</div>
<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>
<span>OpenRocket-13.11.1.jar</span>
<span>OpenRocket-13.11.2.jar</span>
</a>
<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.1/OpenRocket-13.11.1-src.zip/download">Source code</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.2/OpenRocket-13.11.2-src.zip/download">Source code</a>
</span>
</div>
<p>OpenRocket can be started in most graphical environments (including
Windows) by double-clicking the package icon. No installation is
required.</p>
<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>
<p>The Android version allows opening OpenRocket files, viewing
simulations and motors. Later versions will allow running

View File

@ -49,12 +49,12 @@
<h2>Introduction</h2>
<div class="rightpane">
<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>
<span>OpenRocket-13.11.1.jar</span>
<span>OpenRocket-13.11.2.jar</span>
</a>
<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>
</span>
</div>
@ -96,6 +96,10 @@
<div class="clear"></div>
<div class="news">
<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
<a href="download.html">released</a>! This release contains bug fixes
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">
<def name="downloadbox">

View File

@ -9,6 +9,11 @@
<!--- 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
<a href="download.html">released</a>! This release contains bug fixes
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 ) {
double diameter = 0;
if ( mount != null ) {
diameter = mount.getMotorMountDiameter();
}
if (currentConfig != null && mount != null) {
MotorConfiguration motorConf = mount.getMotorConfiguration().get(currentConfig);
selectedMotor = (ThrustCurveMotor) motorConf.getMotor();
selectedDelay = motorConf.getEjectionDelay();
diameter = mount.getMotorMountDiameter();
}
selectedMotorSet = null;
// If current motor is not found in db, add a new ThrustCurveMotorSet containing it
if (selectedMotor != null) {
for (ThrustCurveMotorSet motorSet : database) {
@ -426,6 +421,7 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec
curveSelectionBox.setEnabled(false);
curveSelectionLabel.setEnabled(false);
motorInformationPanel.clearData();
table.clearSelection();
return;
}

View File

@ -120,7 +120,8 @@ public class BasicFrame extends JFrame {
private static final int SHORTCUT_KEY = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
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
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.setSelectionModel(componentSelectionModel);

View File

@ -13,49 +13,49 @@ import org.slf4j.LoggerFactory;
public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, ExceptionHandler {
private static final Logger log = LoggerFactory.getLogger(SwingExceptionHandler.class);
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.
* <p>
* This field is package-private so that the JRE cannot optimize its use away.
*/
volatile byte[] memoryReserve = null;
private volatile boolean handling = false;
@Override
public void uncaughtException(final Thread thread, final Throwable throwable) {
// Free memory reserve if out of memory
if (isOutOfMemoryError(throwable)) {
memoryReserve = null;
handling = false;
log.error("Out of memory error detected", throwable);
}
if (isNonFatalJREBug(throwable)) {
log.warn("Ignoring non-fatal JRE bug", throwable);
return;
}
log.error("Handling uncaught exception on thread=" + thread, throwable);
throwable.printStackTrace();
if (handling) {
log.warn("Exception is currently being handled, ignoring");
return;
}
try {
handling = true;
// Show on the EDT
if (SwingUtilities.isEventDispatchThread()) {
log.info("Exception handler running on EDT, showing dialog");
@ -69,9 +69,9 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
}
});
}
} catch (Throwable ex) {
// Make sure the handler does not throw any exceptions
try {
log.error("Caught exception while handling exception", ex);
@ -79,15 +79,15 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
ex.printStackTrace();
} catch (Exception ignore) {
}
} finally {
// Mark handling as completed
handling = false;
}
}
/**
* Handle an error condition programmatically without throwing an exception.
* 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());
handleErrorCondition(new InternalException(message));
}
/**
* Handle an error condition programmatically without throwing an exception.
* 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);
handleErrorCondition(new InternalException(message, exception));
}
/**
* Handle an error condition programmatically without throwing an exception.
* 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);
}
final Thread thread = Thread.currentThread();
if (SwingUtilities.isEventDispatchThread()) {
log.info("Running in EDT, showing dialog");
this.showDialog(thread, exception);
@ -155,8 +155,8 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
log.error("Exception occurred in error handler", e);
}
}
/**
* The actual handling routine.
*
@ -164,82 +164,82 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
* @param e the exception.
*/
private void showDialog(Thread t, Throwable e) {
// Out of memory
if (isOutOfMemoryError(e)) {
log.info("Showing out-of-memory dialog");
JOptionPane.showMessageDialog(null,
new Object[] {
"OpenRocket is out of available memory!",
"You should immediately close unnecessary design windows,",
"save any unsaved designs and restart OpenRocket!"
}, "Out of memory", JOptionPane.ERROR_MESSAGE);
"OpenRocket is out of available memory!",
"You should immediately close unnecessary design windows,",
"save any unsaved designs and restart OpenRocket!"
}, "Out of memory", JOptionPane.ERROR_MESSAGE);
return;
}
// Create the message
String msg = e.getClass().getSimpleName() + ": " + e.getMessage();
if (msg.length() > 90) {
msg = msg.substring(0, 80) + "...";
}
// Unknown Error
if (!(e instanceof Exception) && !(e instanceof LinkageError)) {
log.info("Showing Error dialog");
JOptionPane.showMessageDialog(null,
new Object[] {
"An unknown Java error occurred:",
msg,
"<html>You should immediately close unnecessary design windows,<br>" +
"save any unsaved designs and restart OpenRocket!"
}, "Unknown Java error", JOptionPane.ERROR_MESSAGE);
"An unknown Java error occurred:",
msg,
"<html>You should immediately close unnecessary design windows,<br>" +
"save any unsaved designs and restart OpenRocket!"
}, "Unknown Java error", JOptionPane.ERROR_MESSAGE);
return;
}
// Normal exception, show question dialog
log.info("Showing Exception dialog");
int selection = JOptionPane.showOptionDialog(null, new Object[] {
"OpenRocket encountered an uncaught exception. This typically signifies " +
"a bug in the software.",
"<html><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + msg + "</em>",
" ",
"Please take a moment to report this bug to the developers.",
"This can be done automatically if you have an Internet connection."
"<html><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + msg + "</em>",
" ",
"Please take a moment to report this bug to the developers.",
"This can be done automatically if you have an Internet connection."
}, "Uncaught exception", JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE, null,
new Object[] { "View bug report", "Close" }, "View bug report");
JOptionPane.ERROR_MESSAGE, null,
new Object[] { "View bug report", "Close" }, "View bug report");
if (selection != 0) {
// User cancelled
log.info(Markers.USER_MARKER, "User chose not to fill bug report");
return;
}
// Show bug report dialog
log.info(Markers.USER_MARKER, "User requested sending bug report");
BugReportDialog.showExceptionDialog(null, t, e);
}
/**
* Registers the uncaught exception handler. This should be used to ensure that
* all necessary registrations are performed.
*/
public void registerExceptionHandler() {
Thread.setDefaultUncaughtExceptionHandler(this);
// Handler for modal dialogs of Sun's Java implementation
// See bug ID 4499199.
System.setProperty("sun.awt.exception.handler", AwtHandler.class.getName());
reserveMemory();
}
/**
* 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;
}
}
/**
* Return whether this throwable was caused by an OutOfMemoryError
* condition. An exception is deemed to be caused by OutOfMemoryError
@ -271,9 +271,9 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
}
return false;
}
/**
* 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);
}
}
/**
* 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
*/
private boolean isNonFatalJREBug(Throwable t) {
// NOTE: Calling method logs the entire throwable, so log only message here
/*
* Detect and ignore bug 6826104 in Sun JRE.
*/
if (t instanceof NullPointerException) {
StackTraceElement[] trace = t.getStackTrace();
if (trace.length > 3 &&
trace[0].getClassName().equals("sun.awt.X11.XWindowPeer") &&
trace[0].getMethodName().equals("restoreTransientFor") &&
trace[1].getClassName().equals("sun.awt.X11.XWindowPeer") &&
trace[1].getMethodName().equals("removeFromTransientFors") &&
trace[2].getClassName().equals("sun.awt.X11.XWindowPeer") &&
trace[2].getMethodName().equals("setModalBlocked")) {
log.warn("Ignoring Sun JRE bug (6826104): http://bugs.sun.com/view_bug.do?bug_id=6826104" + t);
return true;
}
}
/*
* 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 &&
(buggyClass.equals(elements[0].getClassName()) ||
buggyClass.equals(elements[1].getClassName()) ||
buggyClass.equals(elements[2].getClassName()))) {
buggyClass.equals(elements[2].getClassName()))) {
log.warn("Ignoring Sun JRE bug 6828938: " +
"(see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6828938): " + t);
return true;
}
}
/*
* Detect and ignore bug 6561072 in Sun JRE 1.6.0_?
*/
if (t instanceof NullPointerException) {
StackTraceElement[] trace = t.getStackTrace();
if (trace.length > 3 &&
trace[0].getClassName().equals("javax.swing.JComponent") &&
trace[0].getMethodName().equals("repaint") &&
trace[1].getClassName().equals("sun.swing.FilePane$2") &&
trace[1].getMethodName().equals("repaintListSelection") &&
trace[2].getClassName().equals("sun.swing.FilePane$2") &&
trace[2].getMethodName().equals("repaintSelection")) {
log.warn("Ignoring Sun JRE bug 6561072 " +
@ -353,14 +353,14 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
return true;
}
}
/*
* Detect and ignore bug 6933331 in Sun JRE 1.6.0_18 and others
*/
if (t instanceof IllegalStateException) {
StackTraceElement[] trace = t.getStackTrace();
if (trace.length > 1 &&
trace[0].getClassName().equals("sun.awt.windows.WComponentPeer") &&
trace[0].getMethodName().equals("getBackBuffer")) {
@ -369,20 +369,20 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
return true;
}
}
/*
* Detect and ignore bug in Sun JRE 1.6.0_19
*/
if (t instanceof NullPointerException) {
StackTraceElement[] trace = t.getStackTrace();
if (trace.length > 3 &&
trace[0].getClassName().equals("sun.awt.shell.Win32ShellFolder2") &&
trace[0].getMethodName().equals("pidlsEqual") &&
trace[1].getClassName().equals("sun.awt.shell.Win32ShellFolder2") &&
trace[1].getMethodName().equals("equals") &&
trace[2].getClassName().equals("sun.awt.shell.Win32ShellFolderManager2") &&
trace[2].getMethodName().equals("isFileSystemRoot")) {
log.warn("Ignoring Sun JRE bug " +
@ -390,7 +390,7 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
return true;
}
}
/*
* Detect Sun JRE bug in D3D
*/
@ -401,25 +401,43 @@ public class SwingExceptionHandler implements Thread.UncaughtExceptionHandler, E
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;
}
@SuppressWarnings("unused")
private static class InternalException extends Exception {
public InternalException() {
super();
}
public InternalException(String message, Throwable cause) {
super(message, cause);
}
public InternalException(String message) {
super(message);
}
public InternalException(Throwable 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.l10n.Translator;
import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent;
import net.sf.openrocket.rocketcomponent.RecoveryDevice;
import net.sf.openrocket.rocketcomponent.Rocket;
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.util.StateChangeListener;
@ -38,7 +41,11 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe
private final MotorConfigurationPanel motorConfigurationPanel;
private final RecoveryConfigurationPanel recoveryConfigurationPanel;
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
public void stateChanged(EventObject e) {
updateButtonState();
@ -178,9 +185,37 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe
private void updateButtonState() {
String currentId = rocket.getDefaultConfiguration().getFlightConfigurationID();
// Enable the remove/rename/copy buttons only when a configuration is selected.
removeConfButton.setEnabled(currentId != null);
renameConfButton.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;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
@ -22,6 +23,8 @@ import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellRenderer;
import net.miginfocom.swing.MigLayout;
@ -49,6 +52,10 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
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;
protected FlightConfigurableTableModel<MotorMount> configurationTableModel;
@ -57,7 +64,6 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
motorChooserDialog = new MotorChooserDialog(SwingUtilities.getWindowAncestor(flightConfigurationPanel));
{
//// Select motor mounts
JPanel subpanel = new JPanel(new MigLayout(""));
@ -75,8 +81,16 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
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);
this.add(scroll, "grow, wrap");
cards.add(scroll, TABLE_LABEL );
this.add(cards, "grow, wrap");
//// Select motor
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
protected JTable initializeTable() {
//// 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);
configurationTable.getTableHeader().setReorderingAllowed(false);
configurationTable.setCellSelectionEnabled(true);
@ -151,6 +183,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
}
}
});
return configurationTable;
}
@ -165,12 +198,21 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
}
private void updateButtonState() {
String currentID = rocket.getDefaultConfiguration().getFlightConfigurationID();
MotorMount currentMount = getSelectedComponent();
selectMotorButton.setEnabled(currentMount != null && currentID != null);
removeMotorButton.setEnabled(currentMount != null && currentID != null);
selectIgnitionButton.setEnabled(currentMount != null && currentID != null);
resetIgnitionButton.setEnabled(currentMount != null && currentID != null);
if( configurationTableModel.getColumnCount() > 1 ) {
showContent();
String currentID = rocket.getDefaultConfiguration().getFlightConfigurationID();
MotorMount currentMount = getSelectedComponent();
selectMotorButton.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;
static {
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("zh","CN"));

View File

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