chiark / gitweb /
Add initial support for i18n.
authorIlya Kulakov <kulakov.ilya@gmail.com>
Sun, 15 Sep 2013 09:20:00 +0000 (16:20 +0700)
committerIlya Kulakov <kulakov.ilya@gmail.com>
Sun, 15 Sep 2013 09:21:15 +0000 (16:21 +0700)
21 files changed:
Cura/cura.py
Cura/gui/app.py
Cura/gui/configWizard.py
Cura/gui/firmwareInstall.py
Cura/gui/mainWindow.py
Cura/gui/pluginPanel.py
Cura/gui/preferencesDialog.py
Cura/gui/printWindow.py
Cura/gui/sceneView.py
Cura/gui/simpleMode.py
Cura/gui/tools/batchRun.py
Cura/gui/tools/youmagineGui.py
Cura/gui/util/openglGui.py
Cura/resources/locale/Cura.in [new file with mode: 0644]
Cura/resources/locale/Cura.pot [new file with mode: 0644]
Cura/resources/locale/en/LC_MESSAGES/Cura.mo [new file with mode: 0644]
Cura/resources/locale/en/LC_MESSAGES/Cura.po [new file with mode: 0644]
Cura/resources/locale/ru/LC_MESSAGES/Cura.mo [new file with mode: 0644]
Cura/resources/locale/ru/LC_MESSAGES/Cura.po [new file with mode: 0644]
Cura/util/profile.py
Cura/util/resources.py

index 7c847c38a0a9196aa537a5757ff2227ac7d2a268..a475705b28b610cfd2eedf6f5b8a74c0a6fc1f42 100644 (file)
@@ -11,6 +11,8 @@ __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AG
 
 from optparse import OptionParser
 
+from Cura.util import resources
+resources.setupLocalization()  # it's important to set up localization at very beginning to install _
 from Cura.util import profile
 
 def main():
index 5ab0e28d7a2de944cb731596c4f1c9012733af9b..d428a0828b54ac80dac4b05ce636fb3eb8db65e8 100644 (file)
@@ -79,7 +79,7 @@ class CuraApp(wx.App):
                        if newVersion is not None:
                                if self.splash is not None:
                                        self.splash.Show(False)
-                               if wx.MessageBox('A new version of Cura is available, would you like to download?', 'New version available', wx.YES_NO | wx.ICON_INFORMATION) == wx.YES:
+                               if wx.MessageBox(_("A new version of Cura is available, would you like to download?"), _("New version available"), wx.YES_NO | wx.ICON_INFORMATION) == wx.YES:
                                        webbrowser.open(newVersion)
                                        return
                self.mainWindow = mainWindow.mainWindow()
index 1bafbeacfc9ee9659cb9eae141c1ddeb272dc9d5..214d76ece4aaf88edb5faa9531bdb885a197c56f 100644 (file)
@@ -133,7 +133,7 @@ class InfoPage(wx.wizard.WizardPageSimple):
                self.rowNr += 1
 
        def AddHiddenSeperator(self):
-               self.AddText('')
+               self.AddText("")
 
        def AddInfoBox(self):
                infoBox = InfoBox(self)
@@ -215,14 +215,14 @@ class InfoPage(wx.wizard.WizardPageSimple):
 
 class FirstInfoPage(InfoPage):
        def __init__(self, parent):
-               super(FirstInfoPage, self).__init__(parent, "First time run wizard")
-               self.AddText('Welcome, and thanks for trying Cura!')
+               super(FirstInfoPage, self).__init__(parent, _("First time run wizard"))
+               self.AddText(_("Welcome, and thanks for trying Cura!"))
                self.AddSeperator()
-               self.AddText('This wizard will help you with the following steps:')
-               self.AddText('* Configure Cura for your machine')
-               self.AddText('* Upgrade your firmware')
-               self.AddText('* Check if your machine is working safely')
-               self.AddText('* Level your printer bed')
+               self.AddText(_("This wizard will help you with the following steps:"))
+               self.AddText(_("* Configure Cura for your machine"))
+               self.AddText(_("* Upgrade your firmware"))
+               self.AddText(_("* Check if your machine is working safely"))
+               self.AddText(_("* Level your printer bed"))
 
                #self.AddText('* Calibrate your machine')
                #self.AddText('* Do your first print')
@@ -232,17 +232,17 @@ class RepRapInfoPage(InfoPage):
        def __init__(self, parent):
                super(RepRapInfoPage, self).__init__(parent, "RepRap information")
                self.AddText(
-                       'RepRap machines are vastly different, and there is no\ndefault configuration in Cura for any of them.')
-               self.AddText('If you like a default profile for your machine added,\nthen make an issue on github.')
+                       _("RepRap machines are vastly different, and there is no\ndefault configuration in Cura for any of them."))
+               self.AddText(_("If you like a default profile for your machine added,\nthen make an issue on github."))
                self.AddSeperator()
-               self.AddText('You will have to manually install Marlin or Sprinter firmware.')
+               self.AddText(_("You will have to manually install Marlin or Sprinter firmware."))
                self.AddSeperator()
-               self.machineWidth = self.AddLabelTextCtrl('Machine width (mm)', '80')
-               self.machineDepth = self.AddLabelTextCtrl('Machine depth (mm)', '80')
-               self.machineHeight = self.AddLabelTextCtrl('Machine height (mm)', '60')
-               self.nozzleSize = self.AddLabelTextCtrl('Nozzle size (mm)', '0.5')
-               self.heatedBed = self.AddCheckbox('Heated bed')
-               self.HomeAtCenter = self.AddCheckbox('Bed center is 0,0,0 (RoStock)')
+               self.machineWidth = self.AddLabelTextCtrl(_("Machine width (mm)"), "80")
+               self.machineDepth = self.AddLabelTextCtrl(_("Machine depth (mm)"), "80")
+               self.machineHeight = self.AddLabelTextCtrl(_("Machine height (mm)"), "60")
+               self.nozzleSize = self.AddLabelTextCtrl(_("Nozzle size (mm)"), "0.5")
+               self.heatedBed = self.AddCheckbox(_("Heated bed"))
+               self.HomeAtCenter = self.AddCheckbox(_("Bed center is 0,0,0 (RoStock)"))
 
        def StoreData(self):
                profile.putPreference('machine_width', self.machineWidth.GetValue())
@@ -261,19 +261,19 @@ class RepRapInfoPage(InfoPage):
 
 class MachineSelectPage(InfoPage):
        def __init__(self, parent):
-               super(MachineSelectPage, self).__init__(parent, "Select your machine")
-               self.AddText('What kind of machine do you have:')
+               super(MachineSelectPage, self).__init__(parent, _("Select your machine"))
+               self.AddText(_("What kind of machine do you have:"))
 
                self.UltimakerRadio = self.AddRadioButton("Ultimaker", style=wx.RB_GROUP)
                self.UltimakerRadio.SetValue(True)
                self.UltimakerRadio.Bind(wx.EVT_RADIOBUTTON, self.OnUltimakerSelect)
-               self.OtherRadio = self.AddRadioButton("Other (Ex: RepRap)")
+               self.OtherRadio = self.AddRadioButton(_("Other (Ex: RepRap)"))
                self.OtherRadio.Bind(wx.EVT_RADIOBUTTON, self.OnOtherSelect)
                self.AddSeperator()
-               self.AddText('The collection of anonymous usage information helps with the continued improvement of Cura.')
-               self.AddText('This does NOT submit your models online nor gathers any privacy related information.')
-               self.SubmitUserStats = self.AddCheckbox('Submit anonymous usage information:')
-               self.AddText('For full details see: http://wiki.ultimaker.com/Cura:stats')
+               self.AddText(_("The collection of anonymous usage information helps with the continued improvement of Cura."))
+               self.AddText(_("This does NOT submit your models online nor gathers any privacy related information."))
+               self.SubmitUserStats = self.AddCheckbox(_("Submit anonymous usage information:"))
+               self.AddText(_("For full details see: http://wiki.ultimaker.com/Cura:stats"))
                self.SubmitUserStats.SetValue(True)
 
        def OnUltimakerSelect(self, e):
@@ -310,15 +310,15 @@ class MachineSelectPage(InfoPage):
 
 class SelectParts(InfoPage):
        def __init__(self, parent):
-               super(SelectParts, self).__init__(parent, "Select upgraded parts you have")
-               self.AddText('To assist you in having better default settings for your Ultimaker\nCura would like to know which upgrades you have in your machine.')
+               super(SelectParts, self).__init__(parent, _("Select upgraded parts you have"))
+               self.AddText(_("To assist you in having better default settings for your Ultimaker\nCura would like to know which upgrades you have in your machine."))
                self.AddSeperator()
-               self.springExtruder = self.AddCheckbox('Extruder drive upgrade')
-               self.heatedBed = self.AddCheckbox('Heated printer bed (self built)')
-               self.dualExtrusion = self.AddCheckbox('Dual extrusion (experimental)')
+               self.springExtruder = self.AddCheckbox(_("Extruder drive upgrade"))
+               self.heatedBed = self.AddCheckbox(_("Heated printer bed (self built)"))
+               self.dualExtrusion = self.AddCheckbox(_("Dual extrusion (experimental)"))
                self.AddSeperator()
-               self.AddText('If you have an Ultimaker bought after october 2012 you will have the\nExtruder drive upgrade. If you do not have this upgrade,\nit is highly recommended to improve reliability.')
-               self.AddText('This upgrade can be bought from the Ultimaker webshop\nor found on thingiverse as thing:26094')
+               self.AddText(_("If you have an Ultimaker bought after october 2012 you will have the\nExtruder drive upgrade. If you do not have this upgrade,\nit is highly recommended to improve reliability."))
+               self.AddText(_("This upgrade can be bought from the Ultimaker webshop\nor found on thingiverse as thing:26094"))
                self.springExtruder.SetValue(True)
 
        def StoreData(self):
@@ -338,18 +338,18 @@ class SelectParts(InfoPage):
 class FirmwareUpgradePage(InfoPage):
        def __init__(self, parent):
                super(FirmwareUpgradePage, self).__init__(parent, "Upgrade Ultimaker Firmware")
-               self.AddText('Firmware is the piece of software running directly on your 3D printer.\nThis firmware controls the step motors, regulates the temperature\nand ultimately makes your printer work.')
+               self.AddText(_("Firmware is the piece of software running directly on your 3D printer.\nThis firmware controls the step motors, regulates the temperature\nand ultimately makes your printer work."))
                self.AddHiddenSeperator()
-               self.AddText('The firmware shipping with new Ultimakers works, but upgrades\nhave been made to make better prints, and make calibration easier.')
+               self.AddText(_("The firmware shipping with new Ultimakers works, but upgrades\nhave been made to make better prints, and make calibration easier."))
                self.AddHiddenSeperator()
-               self.AddText('Cura requires these new features and thus\nyour firmware will most likely need to be upgraded.\nYou will get the chance to do so now.')
+               self.AddText(_("Cura requires these new features and thus\nyour firmware will most likely need to be upgraded.\nYou will get the chance to do so now."))
                upgradeButton, skipUpgradeButton = self.AddDualButton('Upgrade to Marlin firmware', 'Skip upgrade')
                upgradeButton.Bind(wx.EVT_BUTTON, self.OnUpgradeClick)
                skipUpgradeButton.Bind(wx.EVT_BUTTON, self.OnSkipClick)
                self.AddHiddenSeperator()
-               self.AddText('Do not upgrade to this firmware if:')
-               self.AddText('* You have an older machine based on ATMega1280')
-               self.AddText('* Have other changes in the firmware')
+               self.AddText(_("Do not upgrade to this firmware if:"))
+               self.AddText(_("* You have an older machine based on ATMega1280"))
+               self.AddText(_("* Have other changes in the firmware"))
 #              button = self.AddButton('Goto this page for a custom firmware')
 #              button.Bind(wx.EVT_BUTTON, self.OnUrlClick)
 
@@ -384,19 +384,19 @@ class UltimakerCheckupPage(InfoPage):
                self.endStopZMaxBitmap = wx.Bitmap(getPathForImage('endstop_zmax.png'))
 
                self.AddText(
-                       'It is a good idea to do a few sanity checks now on your Ultimaker.\nYou can skip these if you know your machine is functional.')
-               b1, b2 = self.AddDualButton('Run checks', 'Skip checks')
+                       _("It is a good idea to do a few sanity checks now on your Ultimaker.\nYou can skip these if you know your machine is functional."))
+               b1, b2 = self.AddDualButton(_("Run checks"), _("Skip checks"))
                b1.Bind(wx.EVT_BUTTON, self.OnCheckClick)
                b2.Bind(wx.EVT_BUTTON, self.OnSkipClick)
                self.AddSeperator()
-               self.commState = self.AddCheckmark('Communication:', self.unknownBitmap)
-               self.tempState = self.AddCheckmark('Temperature:', self.unknownBitmap)
-               self.stopState = self.AddCheckmark('Endstops:', self.unknownBitmap)
+               self.commState = self.AddCheckmark(_("Communication:"), self.unknownBitmap)
+               self.tempState = self.AddCheckmark(_("Temperature:"), self.unknownBitmap)
+               self.stopState = self.AddCheckmark(_("Endstops:"), self.unknownBitmap)
                self.AddSeperator()
                self.infoBox = self.AddInfoBox()
-               self.machineState = self.AddText('')
-               self.temperatureLabel = self.AddText('')
-               self.errorLogButton = self.AddButton('Show error log')
+               self.machineState = self.AddText("")
+               self.temperatureLabel = self.AddText("")
+               self.errorLogButton = self.AddButton(_("Show error log"))
                self.errorLogButton.Show(False)
                self.AddSeperator()
                self.endstopBitmap = self.AddBitmap(self.endStopNoneBitmap)
@@ -430,7 +430,7 @@ class UltimakerCheckupPage(InfoPage):
                        self.comm = None
                        wx.CallAfter(self.OnCheckClick)
                        return
-               self.infoBox.SetBusy('Connecting to machine.')
+               self.infoBox.SetBusy(_("Connecting to machine."))
                self.commState.SetBitmap(self.unknownBitmap)
                self.tempState.SetBitmap(self.unknownBitmap)
                self.stopState.SetBitmap(self.unknownBitmap)
@@ -451,20 +451,20 @@ class UltimakerCheckupPage(InfoPage):
                        self.tempCheckTimeout = 20
                        if temp[self.checkExtruderNr] > 70:
                                self.checkupState = 1
-                               wx.CallAfter(self.infoBox.SetInfo, 'Cooldown before temperature check.')
-                               self.comm.sendCommand('M104 S0 T%d' % (self.checkExtruderNr))
+                               wx.CallAfter(self.infoBox.SetInfo, _("Cooldown before temperature check."))
+                               self.comm.sendCommand("M104 S0 T%d" % (self.checkExtruderNr))
                                self.comm.sendCommand('M104 S0 T%d' % (self.checkExtruderNr))
                        else:
                                self.startTemp = temp[self.checkExtruderNr]
                                self.checkupState = 2
-                               wx.CallAfter(self.infoBox.SetInfo, 'Checking the heater and temperature sensor.')
+                               wx.CallAfter(self.infoBox.SetInfo, _("Checking the heater and temperature sensor."))
                                self.comm.sendCommand('M104 S200 T%d' % (self.checkExtruderNr))
                                self.comm.sendCommand('M104 S200 T%d' % (self.checkExtruderNr))
                elif self.checkupState == 1:
                        if temp < 60:
                                self.startTemp = temp[self.checkExtruderNr]
                                self.checkupState = 2
-                               wx.CallAfter(self.infoBox.SetInfo, 'Checking the heater and temperature sensor.')
+                               wx.CallAfter(self.infoBox.SetInfo, _("Checking the heater and temperature sensor."))
                                self.comm.sendCommand('M104 S200 T%d' % (self.checkExtruderNr))
                                self.comm.sendCommand('M104 S200 T%d' % (self.checkExtruderNr))
                elif self.checkupState == 2:
@@ -475,7 +475,7 @@ class UltimakerCheckupPage(InfoPage):
                                if self.checkExtruderNr < int(profile.getPreference('extruder_amount')):
                                        self.checkExtruderNr = 0
                                        self.checkupState = 3
-                                       wx.CallAfter(self.infoBox.SetAttention, 'Please make sure none of the endstops are pressed.')
+                                       wx.CallAfter(self.infoBox.SetAttention, _("Please make sure none of the endstops are pressed."))
                                        wx.CallAfter(self.endstopBitmap.Show, True)
                                        wx.CallAfter(self.Layout)
                                        self.comm.sendCommand('M119')
@@ -488,28 +488,28 @@ class UltimakerCheckupPage(InfoPage):
                                if self.tempCheckTimeout < 1:
                                        self.checkupState = -1
                                        wx.CallAfter(self.tempState.SetBitmap, self.crossBitmap)
-                                       wx.CallAfter(self.infoBox.SetError, 'Temperature measurement FAILED!', 'http://wiki.ultimaker.com/Cura:_Temperature_measurement_problems')
+                                       wx.CallAfter(self.infoBox.SetError, _("Temperature measurement FAILED!"), 'http://wiki.ultimaker.com/Cura:_Temperature_measurement_problems')
                                        self.comm.sendCommand('M104 S0 T%d' % (self.checkExtruderNr))
                                        self.comm.sendCommand('M104 S0 T%d' % (self.checkExtruderNr))
                elif self.checkupState >= 3 and self.checkupState < 10:
                        self.comm.sendCommand('M119')
-               wx.CallAfter(self.temperatureLabel.SetLabel, 'Head temperature: %d' % (temp[self.checkExtruderNr]))
+               wx.CallAfter(self.temperatureLabel.SetLabel, _("Head temperature: %d") % (temp[self.checkExtruderNr]))
 
        def mcStateChange(self, state):
                if self.comm is None:
                        return
                if self.comm.isOperational():
                        wx.CallAfter(self.commState.SetBitmap, self.checkBitmap)
-                       wx.CallAfter(self.machineState.SetLabel, 'Communication State: %s' % (self.comm.getStateString()))
+                       wx.CallAfter(self.machineState.SetLabel, _("Communication State: %s") % (self.comm.getStateString()))
                elif self.comm.isError():
                        wx.CallAfter(self.commState.SetBitmap, self.crossBitmap)
-                       wx.CallAfter(self.infoBox.SetError, 'Failed to establish connection with the printer.', 'http://wiki.ultimaker.com/Cura:_Connection_problems')
+                       wx.CallAfter(self.infoBox.SetError, _("Failed to establish connection with the printer."), 'http://wiki.ultimaker.com/Cura:_Connection_problems')
                        wx.CallAfter(self.endstopBitmap.Show, False)
                        wx.CallAfter(self.machineState.SetLabel, '%s' % (self.comm.getErrorString()))
                        wx.CallAfter(self.errorLogButton.Show, True)
                        wx.CallAfter(self.Layout)
                else:
-                       wx.CallAfter(self.machineState.SetLabel, 'Communication State: %s' % (self.comm.getStateString()))
+                       wx.CallAfter(self.machineState.SetLabel, _("Communication State: %s") % (self.comm.getStateString()))
 
        def mcMessage(self, message):
                if self.checkupState >= 3 and self.checkupState < 10 and ('_min' in message or '_max' in message):
@@ -548,38 +548,38 @@ class UltimakerCheckupPage(InfoPage):
                        if self.checkupState == 3:
                                if not self.xMinStop and not self.xMaxStop and not self.yMinStop and not self.yMaxStop and not self.zMinStop and not self.zMaxStop:
                                        self.checkupState = 4
-                                       wx.CallAfter(self.infoBox.SetAttention, 'Please press the right X endstop.')
+                                       wx.CallAfter(self.infoBox.SetAttention, _("Please press the right X endstop."))
                                        wx.CallAfter(self.endstopBitmap.SetBitmap, self.endStopXMaxBitmap)
                        elif self.checkupState == 4:
                                if not self.xMinStop and self.xMaxStop and not self.yMinStop and not self.yMaxStop and not self.zMinStop and not self.zMaxStop:
                                        self.checkupState = 5
-                                       wx.CallAfter(self.infoBox.SetAttention, 'Please press the left X endstop.')
+                                       wx.CallAfter(self.infoBox.SetAttention, _("Please press the left X endstop."))
                                        wx.CallAfter(self.endstopBitmap.SetBitmap, self.endStopXMinBitmap)
                        elif self.checkupState == 5:
                                if self.xMinStop and not self.xMaxStop and not self.yMinStop and not self.yMaxStop and not self.zMinStop and not self.zMaxStop:
                                        self.checkupState = 6
-                                       wx.CallAfter(self.infoBox.SetAttention, 'Please press the front Y endstop.')
+                                       wx.CallAfter(self.infoBox.SetAttention, _("Please press the front Y endstop."))
                                        wx.CallAfter(self.endstopBitmap.SetBitmap, self.endStopYMinBitmap)
                        elif self.checkupState == 6:
                                if not self.xMinStop and not self.xMaxStop and self.yMinStop and not self.yMaxStop and not self.zMinStop and not self.zMaxStop:
                                        self.checkupState = 7
-                                       wx.CallAfter(self.infoBox.SetAttention, 'Please press the back Y endstop.')
+                                       wx.CallAfter(self.infoBox.SetAttention, _("Please press the back Y endstop."))
                                        wx.CallAfter(self.endstopBitmap.SetBitmap, self.endStopYMaxBitmap)
                        elif self.checkupState == 7:
                                if not self.xMinStop and not self.xMaxStop and not self.yMinStop and self.yMaxStop and not self.zMinStop and not self.zMaxStop:
                                        self.checkupState = 8
-                                       wx.CallAfter(self.infoBox.SetAttention, 'Please press the top Z endstop.')
+                                       wx.CallAfter(self.infoBox.SetAttention, _("Please press the top Z endstop."))
                                        wx.CallAfter(self.endstopBitmap.SetBitmap, self.endStopZMinBitmap)
                        elif self.checkupState == 8:
                                if not self.xMinStop and not self.xMaxStop and not self.yMinStop and not self.yMaxStop and self.zMinStop and not self.zMaxStop:
                                        self.checkupState = 9
-                                       wx.CallAfter(self.infoBox.SetAttention, 'Please press the bottom Z endstop.')
+                                       wx.CallAfter(self.infoBox.SetAttention, _("Please press the bottom Z endstop."))
                                        wx.CallAfter(self.endstopBitmap.SetBitmap, self.endStopZMaxBitmap)
                        elif self.checkupState == 9:
                                if not self.xMinStop and not self.xMaxStop and not self.yMinStop and not self.yMaxStop and not self.zMinStop and self.zMaxStop:
                                        self.checkupState = 10
                                        self.comm.close()
-                                       wx.CallAfter(self.infoBox.SetInfo, 'Checkup finished')
+                                       wx.CallAfter(self.infoBox.SetInfo, _("Checkup finished"))
                                        wx.CallAfter(self.infoBox.SetReadyIndicator)
                                        wx.CallAfter(self.endstopBitmap.Show, False)
                                        wx.CallAfter(self.stopState.SetBitmap, self.checkBitmap)
@@ -622,20 +622,20 @@ class UltimakerCalibrateStepsPerEPage(InfoPage):
                #if profile.getPreference('steps_per_e') == '0':
                #       profile.putPreference('steps_per_e', '865.888')
 
-               self.AddText("Calibrating the Steps Per E requires some manual actions.")
-               self.AddText("First remove any filament from your machine.")
-               self.AddText("Next put in your filament so the tip is aligned with the\ntop of the extruder drive.")
-               self.AddText("We'll push the filament 100mm")
-               self.extrudeButton = self.AddButton("Extrude 100mm filament")
-               self.AddText("Now measure the amount of extruded filament:\n(this can be more or less then 100mm)")
-               self.lengthInput, self.saveLengthButton = self.AddTextCtrlButton('100', 'Save')
-               self.AddText("This results in the following steps per E:")
+               self.AddText(_("Calibrating the Steps Per E requires some manual actions."))
+               self.AddText(_("First remove any filament from your machine."))
+               self.AddText(_("Next put in your filament so the tip is aligned with the\ntop of the extruder drive."))
+               self.AddText(_("We'll push the filament 100mm"))
+               self.extrudeButton = self.AddButton(_("Extrude 100mm filament"))
+               self.AddText(_("Now measure the amount of extruded filament:\n(this can be more or less then 100mm)"))
+               self.lengthInput, self.saveLengthButton = self.AddTextCtrlButton("100", _("Save"))
+               self.AddText(_("This results in the following steps per E:"))
                self.stepsPerEInput = self.AddTextCtrl(profile.getPreference('steps_per_e'))
-               self.AddText("You can repeat these steps to get better calibration.")
+               self.AddText(_("You can repeat these steps to get better calibration."))
                self.AddSeperator()
                self.AddText(
-                       "If you still have filament in your printer which needs\nheat to remove, press the heat up button below:")
-               self.heatButton = self.AddButton("Heatup for filament removal")
+                       _("If you still have filament in your printer which needs\nheat to remove, press the heat up button below:"))
+               self.heatButton = self.AddButton(_("Heatup for filament removal"))
 
                self.saveLengthButton.Bind(wx.EVT_BUTTON, self.OnSaveLengthClick)
                self.extrudeButton.Bind(wx.EVT_BUTTON, self.OnExtrudeClick)
@@ -658,7 +658,7 @@ class UltimakerCalibrateStepsPerEPage(InfoPage):
                self.comm = machineCom.MachineCom()
                if not self.comm.isOpen():
                        wx.MessageBox(
-                               "Error: Failed to open serial port to machine\nIf this keeps happening, try disconnecting and reconnecting the USB cable",
+                               _("Error: Failed to open serial port to machine\nIf this keeps happening, try disconnecting and reconnecting the USB cable"),
                                'Printer error', wx.OK | wx.ICON_INFORMATION)
                        self.heatButton.Enable(True)
                        self.extrudeButton.Enable(True)
@@ -690,7 +690,7 @@ class UltimakerCalibrateStepsPerEPage(InfoPage):
                self.comm = machineCom.MachineCom()
                if not self.comm.isOpen():
                        wx.MessageBox(
-                               "Error: Failed to open serial port to machine\nIf this keeps happening, try disconnecting and reconnecting the USB cable",
+                               _("Error: Failed to open serial port to machine\nIf this keeps happening, try disconnecting and reconnecting the USB cable"),
                                'Printer error', wx.OK | wx.ICON_INFORMATION)
                        self.heatButton.Enable(True)
                        self.extrudeButton.Enable(True)
index 098c07ebb130cbe93dbc01d519865e1acae42f01..2dc4ef74b303e1b10faac6de240c250b0ec21465 100644 (file)
@@ -36,22 +36,22 @@ class InstallFirmware(wx.Dialog):
                if filename is None:
                        filename = getDefaultFirmware()
                if filename is None:
-                       wx.MessageBox('I am sorry, but Cura does not ship with a default firmware for your machine configuration.', 'Firmware update', wx.OK | wx.ICON_ERROR)
+                       wx.MessageBox(_("I am sorry, but Cura does not ship with a default firmware for your machine configuration."), _("Firmware update"), wx.OK | wx.ICON_ERROR)
                        self.Destroy()
                        return
 
                sizer = wx.BoxSizer(wx.VERTICAL)
-               
+
                self.progressLabel = wx.StaticText(self, -1, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nX')
                sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER)
                self.progressGauge = wx.Gauge(self, -1)
                sizer.Add(self.progressGauge, 0, flag=wx.EXPAND)
-               self.okButton = wx.Button(self, -1, 'Ok')
+               self.okButton = wx.Button(self, -1, _("OK"))
                self.okButton.Disable()
                self.okButton.Bind(wx.EVT_BUTTON, self.OnOk)
                sizer.Add(self.okButton, 0, flag=wx.ALIGN_CENTER)
                self.SetSizer(sizer)
-               
+
                self.filename = filename
                self.port = port
 
@@ -59,15 +59,15 @@ class InstallFirmware(wx.Dialog):
                self.Fit()
 
                threading.Thread(target=self.OnRun).start()
-               
+
                self.ShowModal()
                self.Destroy()
                return
 
        def OnRun(self):
-               wx.CallAfter(self.updateLabel, "Reading firmware...")
+               wx.CallAfter(self.updateLabel, _("Reading firmware..."))
                hexFile = intelHex.readHex(self.filename)
-               wx.CallAfter(self.updateLabel, "Connecting to machine...")
+               wx.CallAfter(self.updateLabel, _("Connecting to machine..."))
                programmer = stk500v2.Stk500v2()
                programmer.progressCallback = self.OnProgress
                if self.port == 'AUTO':
@@ -82,21 +82,22 @@ class InstallFirmware(wx.Dialog):
                                programmer.connect(self.port)
                        except ispBase.IspError:
                                pass
-                               
+
                if programmer.isConnected():
-                       wx.CallAfter(self.updateLabel, "Uploading firmware...")
+                       wx.CallAfter(self.updateLabel, _("Uploading firmware..."))
                        try:
                                programmer.programChip(hexFile)
-                               wx.CallAfter(self.updateLabel, "Done!\nInstalled firmware: %s" % (os.path.basename(self.filename)))
+                               wx.CallAfter(self.updateLabel, _("Done!\nInstalled firmware: %s") % (os.path.basename(self.filename)))
                        except ispBase.IspError as e:
-                               wx.CallAfter(self.updateLabel, "Failed to write firmware.\n" + str(e))
-                               
+                               wx.CallAfter(self.updateLabel, _("Failed to write firmware.\n") + str(e))
+
                        programmer.close()
                        wx.CallAfter(self.okButton.Enable)
                        return
-               wx.MessageBox('Failed to find machine for firmware upgrade\nIs your machine connected to the PC?', 'Firmware update', wx.OK | wx.ICON_ERROR)
+               wx.MessageBox(_("Failed to find machine for firmware upgrade\nIs your machine connected to the PC?"),
+                                         _("Firmware update"), wx.OK | wx.ICON_ERROR)
                wx.CallAfter(self.Close)
-       
+
        def updateLabel(self, text):
                self.progressLabel.SetLabel(text)
                #self.Layout()
index da65a469b8396a41524dd45ced21a8a19d5cf208..cd656e74d64f9d640bd6ed33cc5dedb3081ceb61 100644 (file)
@@ -36,10 +36,10 @@ class mainWindow(wx.Frame):
                self.normalModeOnlyItems = []
 
                mruFile = os.path.join(profile.getBasePath(), 'mru_filelist.ini')
-               self.config = wx.FileConfig(appName="Cura", 
+               self.config = wx.FileConfig(appName="Cura",
                                                localFilename=mruFile,
                                                style=wx.CONFIG_USE_LOCAL_FILE)
-                                               
+
                self.ID_MRU_MODEL1, self.ID_MRU_MODEL2, self.ID_MRU_MODEL3, self.ID_MRU_MODEL4, self.ID_MRU_MODEL5, self.ID_MRU_MODEL6, self.ID_MRU_MODEL7, self.ID_MRU_MODEL8, self.ID_MRU_MODEL9, self.ID_MRU_MODEL10 = [wx.NewId() for line in xrange(10)]
                self.modelFileHistory = wx.FileHistory(10, self.ID_MRU_MODEL1)
                self.config.SetPath("/ModelMRU")
@@ -52,65 +52,65 @@ class mainWindow(wx.Frame):
 
                self.menubar = wx.MenuBar()
                self.fileMenu = wx.Menu()
-               i = self.fileMenu.Append(-1, 'Load model file...\tCTRL+L')
+               i = self.fileMenu.Append(-1, _("Load model file...\tCTRL+L"))
                self.Bind(wx.EVT_MENU, lambda e: self.scene.showLoadModel(), i)
-               i = self.fileMenu.Append(-1, 'Save model...\tCTRL+S')
+               i = self.fileMenu.Append(-1, _("Save model...\tCTRL+S"))
                self.Bind(wx.EVT_MENU, lambda e: self.scene.showSaveModel(), i)
-               i = self.fileMenu.Append(-1, 'Clear platform')
+               i = self.fileMenu.Append(-1, _("Clear platform"))
                self.Bind(wx.EVT_MENU, lambda e: self.scene.OnDeleteAll(e), i)
 
                self.fileMenu.AppendSeparator()
-               i = self.fileMenu.Append(-1, 'Print...\tCTRL+P')
+               i = self.fileMenu.Append(-1, _("Print...\tCTRL+P"))
                self.Bind(wx.EVT_MENU, lambda e: self.scene.showPrintWindow(), i)
-               i = self.fileMenu.Append(-1, 'Save GCode...')
+               i = self.fileMenu.Append(-1, _("Save GCode..."))
                self.Bind(wx.EVT_MENU, lambda e: self.scene.showSaveGCode(), i)
-               i = self.fileMenu.Append(-1, 'Show slice engine log...')
+               i = self.fileMenu.Append(-1, _("Show slice engine log..."))
                self.Bind(wx.EVT_MENU, lambda e: self.scene._showSliceLog(), i)
 
                self.fileMenu.AppendSeparator()
-               i = self.fileMenu.Append(-1, 'Open Profile...')
+               i = self.fileMenu.Append(-1, _("Open Profile..."))
                self.normalModeOnlyItems.append(i)
                self.Bind(wx.EVT_MENU, self.OnLoadProfile, i)
-               i = self.fileMenu.Append(-1, 'Save Profile...')
+               i = self.fileMenu.Append(-1, _("Save Profile..."))
                self.normalModeOnlyItems.append(i)
                self.Bind(wx.EVT_MENU, self.OnSaveProfile, i)
-               i = self.fileMenu.Append(-1, 'Load Profile from GCode...')
+               i = self.fileMenu.Append(-1, _("Load Profile from GCode..."))
                self.normalModeOnlyItems.append(i)
                self.Bind(wx.EVT_MENU, self.OnLoadProfileFromGcode, i)
                self.fileMenu.AppendSeparator()
-               i = self.fileMenu.Append(-1, 'Reset Profile to default')
+               i = self.fileMenu.Append(-1, _("Reset Profile to default"))
                self.normalModeOnlyItems.append(i)
                self.Bind(wx.EVT_MENU, self.OnResetProfile, i)
 
                self.fileMenu.AppendSeparator()
-               i = self.fileMenu.Append(-1, 'Preferences...\tCTRL+,')
+               i = self.fileMenu.Append(-1, _("Preferences...\tCTRL+,"))
                self.Bind(wx.EVT_MENU, self.OnPreferences, i)
                self.fileMenu.AppendSeparator()
 
                # Model MRU list
                modelHistoryMenu = wx.Menu()
-               self.fileMenu.AppendMenu(wx.NewId(), "&Recent Model Files", modelHistoryMenu)
+               self.fileMenu.AppendMenu(wx.NewId(), _("&Recent Model Files"), modelHistoryMenu)
                self.modelFileHistory.UseMenu(modelHistoryMenu)
                self.modelFileHistory.AddFilesToMenu()
                self.Bind(wx.EVT_MENU_RANGE, self.OnModelMRU, id=self.ID_MRU_MODEL1, id2=self.ID_MRU_MODEL10)
 
                # Profle MRU list
                profileHistoryMenu = wx.Menu()
-               self.fileMenu.AppendMenu(wx.NewId(), "&Recent Profile Files", profileHistoryMenu)
+               self.fileMenu.AppendMenu(wx.NewId(), _("&Recent Profile Files"), profileHistoryMenu)
                self.profileFileHistory.UseMenu(profileHistoryMenu)
                self.profileFileHistory.AddFilesToMenu()
                self.Bind(wx.EVT_MENU_RANGE, self.OnProfileMRU, id=self.ID_MRU_PROFILE1, id2=self.ID_MRU_PROFILE10)
-               
+
                self.fileMenu.AppendSeparator()
-               i = self.fileMenu.Append(wx.ID_EXIT, 'Quit')
+               i = self.fileMenu.Append(wx.ID_EXIT, _("Quit"))
                self.Bind(wx.EVT_MENU, self.OnQuit, i)
-               self.menubar.Append(self.fileMenu, '&File')
+               self.menubar.Append(self.fileMenu, _("&File"))
 
                toolsMenu = wx.Menu()
-               i = toolsMenu.Append(-1, 'Switch to quickprint...')
+               i = toolsMenu.Append(-1, _("Switch to quickprint..."))
                self.switchToQuickprintMenuItem = i
                self.Bind(wx.EVT_MENU, self.OnSimpleSwitch, i)
-               i = toolsMenu.Append(-1, 'Switch to full settings...')
+               i = toolsMenu.Append(-1, _("Switch to full settings..."))
                self.switchToNormalMenuItem = i
                self.Bind(wx.EVT_MENU, self.OnNormalSwitch, i)
                toolsMenu.AppendSeparator()
@@ -118,45 +118,45 @@ class mainWindow(wx.Frame):
                #self.Bind(wx.EVT_MENU, self.OnBatchRun, i)
                #self.normalModeOnlyItems.append(i)
                if minecraftImport.hasMinecraft():
-                       i = toolsMenu.Append(-1, 'Minecraft import...')
+                       i = toolsMenu.Append(-1, _("Minecraft import..."))
                        self.Bind(wx.EVT_MENU, self.OnMinecraftImport, i)
                if version.isDevVersion():
-                       i = toolsMenu.Append(-1, 'PID Debugger...')
+                       i = toolsMenu.Append(-1, _("PID Debugger..."))
                        self.Bind(wx.EVT_MENU, self.OnPIDDebugger, i)
-               self.menubar.Append(toolsMenu, 'Tools')
+               self.menubar.Append(toolsMenu, _("Tools"))
 
                expertMenu = wx.Menu()
-               i = expertMenu.Append(-1, 'Open expert settings...')
+               i = expertMenu.Append(-1, _("Open expert settings..."))
                self.normalModeOnlyItems.append(i)
                self.Bind(wx.EVT_MENU, self.OnExpertOpen, i)
                expertMenu.AppendSeparator()
                if firmwareInstall.getDefaultFirmware() is not None:
-                       i = expertMenu.Append(-1, 'Install default Marlin firmware')
+                       i = expertMenu.Append(-1, _("Install default Marlin firmware"))
                        self.Bind(wx.EVT_MENU, self.OnDefaultMarlinFirmware, i)
-               i = expertMenu.Append(-1, 'Install custom firmware')
+               i = expertMenu.Append(-1, _("Install custom firmware"))
                self.Bind(wx.EVT_MENU, self.OnCustomFirmware, i)
                expertMenu.AppendSeparator()
-               i = expertMenu.Append(-1, 'Run first run wizard...')
+               i = expertMenu.Append(-1, _("Run first run wizard..."))
                self.Bind(wx.EVT_MENU, self.OnFirstRunWizard, i)
-               i = expertMenu.Append(-1, 'Run bed leveling wizard...')
+               i = expertMenu.Append(-1, _("Run bed leveling wizard..."))
                self.Bind(wx.EVT_MENU, self.OnBedLevelWizard, i)
                if self.extruderCount > 1:
-                       i = expertMenu.Append(-1, 'Run head offset wizard...')
+                       i = expertMenu.Append(-1, _("Run head offset wizard..."))
                        self.Bind(wx.EVT_MENU, self.OnHeadOffsetWizard, i)
-               self.menubar.Append(expertMenu, 'Expert')
+               self.menubar.Append(expertMenu, _("Expert"))
 
                helpMenu = wx.Menu()
-               i = helpMenu.Append(-1, 'Online documentation...')
+               i = helpMenu.Append(-1, _("Online documentation..."))
                self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('http://daid.github.com/Cura'), i)
-               i = helpMenu.Append(-1, 'Report a problem...')
+               i = helpMenu.Append(-1, _("Report a problem..."))
                self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('https://github.com/daid/Cura/issues'), i)
-               i = helpMenu.Append(-1, 'Check for update...')
+               i = helpMenu.Append(-1, _("Check for update..."))
                self.Bind(wx.EVT_MENU, self.OnCheckForUpdate, i)
-               i = helpMenu.Append(-1, 'Open YouMagine website...')
+               i = helpMenu.Append(-1, _("Open YouMagine website..."))
                self.Bind(wx.EVT_MENU, lambda e: webbrowser.open('https://www.youmagine.com/'), i)
-               i = helpMenu.Append(-1, 'About Cura...')
+               i = helpMenu.Append(-1, _("About Cura..."))
                self.Bind(wx.EVT_MENU, self.OnAbout, i)
-               self.menubar.Append(helpMenu, 'Help')
+               self.menubar.Append(helpMenu, _("Help"))
                self.SetMenuBar(self.menubar)
 
                self.splitter = wx.SplitterWindow(self, style = wx.SP_3D | wx.SP_LIVE_UPDATE)
@@ -172,7 +172,7 @@ class mainWindow(wx.Frame):
                self.leftSizer.Add(self.simpleSettingsPanel, 1)
                self.leftSizer.Add(self.normalSettingsPanel, 1, wx.EXPAND)
                self.leftPane.SetSizer(self.leftSizer)
-               
+
                #Preview window
                self.scene = sceneView.SceneView(self.rightPane)
 
@@ -212,7 +212,7 @@ class mainWindow(wx.Frame):
                                        self.SetPosition((posx,posy))
                                if width > 0 and height > 0:
                                        self.SetSize((width,height))
-                               
+
                        self.normalSashPos = int(profile.getPreference('window_normal_sash'))
                except:
                        self.normalSashPos = 0
@@ -248,11 +248,11 @@ class mainWindow(wx.Frame):
                if isSimple:
                        # Save normal mode sash
                        self.normalSashPos = self.splitter.GetSashPosition()
-                       
+
                        # Change location of sash to width of quick mode pane 
-                       (width, height) = self.simpleSettingsPanel.GetSizer().GetSize() 
+                       (width, height) = self.simpleSettingsPanel.GetSizer().GetSize()
                        self.splitter.SetSashPosition(width, True)
-                       
+
                        # Disable sash
                        self.splitter.SetSashSize(0)
                else:
@@ -290,7 +290,7 @@ class mainWindow(wx.Frame):
                self.config.SetPath("/ModelMRU")
                self.modelFileHistory.Save(self.config)
                self.config.Flush()
-       
+
        def OnProfileMRU(self, e):
                fileNum = e.GetId() - self.ID_MRU_PROFILE1
                path = self.profileFileHistory.GetHistoryFile(fileNum)
@@ -315,7 +315,7 @@ class mainWindow(wx.Frame):
                self.simpleSettingsPanel.updateProfileToControls()
 
        def OnLoadProfile(self, e):
-               dlg=wx.FileDialog(self, "Select profile file to load", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
+               dlg=wx.FileDialog(self, _("Select profile file to load"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
                dlg.SetWildcard("ini files (*.ini)|*.ini")
                if dlg.ShowModal() == wx.ID_OK:
                        profileFile = dlg.GetPath()
@@ -327,7 +327,7 @@ class mainWindow(wx.Frame):
                dlg.Destroy()
 
        def OnLoadProfileFromGcode(self, e):
-               dlg=wx.FileDialog(self, "Select gcode file to load profile from", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
+               dlg=wx.FileDialog(self, _("Select gcode file to load profile from"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
                dlg.SetWildcard("gcode files (*.gcode)|*.gcode;*.g")
                if dlg.ShowModal() == wx.ID_OK:
                        gcodeFile = dlg.GetPath()
@@ -340,11 +340,11 @@ class mainWindow(wx.Frame):
                        if hasProfile:
                                self.updateProfileToControls()
                        else:
-                               wx.MessageBox('No profile found in GCode file.\nThis feature only works with GCode files made by Cura 12.07 or newer.', 'Profile load error', wx.OK | wx.ICON_INFORMATION)
+                               wx.MessageBox(_("No profile found in GCode file.\nThis feature only works with GCode files made by Cura 12.07 or newer."), _("Profile load error"), wx.OK | wx.ICON_INFORMATION)
                dlg.Destroy()
 
        def OnSaveProfile(self, e):
-               dlg=wx.FileDialog(self, "Select profile file to save", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE)
+               dlg=wx.FileDialog(self, _("Select profile file to save"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE)
                dlg.SetWildcard("ini files (*.ini)|*.ini")
                if dlg.ShowModal() == wx.ID_OK:
                        profileFile = dlg.GetPath()
@@ -352,7 +352,7 @@ class mainWindow(wx.Frame):
                dlg.Destroy()
 
        def OnResetProfile(self, e):
-               dlg = wx.MessageDialog(self, 'This will reset all profile settings to defaults.\nUnless you have saved your current profile, all settings will be lost!\nDo you really want to reset?', 'Profile reset', wx.YES_NO | wx.ICON_QUESTION)
+               dlg = wx.MessageDialog(self, _("This will reset all profile settings to defaults.\nUnless you have saved your current profile, all settings will be lost!\nDo you really want to reset?"), _("Profile reset"), wx.YES_NO | wx.ICON_QUESTION)
                result = dlg.ShowModal() == wx.ID_YES
                dlg.Destroy()
                if result:
@@ -372,8 +372,8 @@ class mainWindow(wx.Frame):
 
        def OnCustomFirmware(self, e):
                if profile.getPreference('machine_type').startswith('ultimaker'):
-                       wx.MessageBox('Warning: Installing a custom firmware does not guarantee that you machine will function correctly, and could damage your machine.', 'Firmware update', wx.OK | wx.ICON_EXCLAMATION)
-               dlg=wx.FileDialog(self, "Open firmware to upload", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
+                       wx.MessageBox(_("Warning: Installing a custom firmware does not guarantee that you machine will function correctly, and could damage your machine."), _("Firmware update"), wx.OK | wx.ICON_EXCLAMATION)
+               dlg=wx.FileDialog(self, _("Open firmware to upload"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
                dlg.SetWildcard("HEX file (*.hex)|*.hex;*.HEX")
                if dlg.ShowModal() == wx.ID_OK:
                        filename = dlg.GetPath()
@@ -410,17 +410,17 @@ class mainWindow(wx.Frame):
        def OnCheckForUpdate(self, e):
                newVersion = version.checkForNewerVersion()
                if newVersion is not None:
-                       if wx.MessageBox('A new version of Cura is available, would you like to download?', 'New version available', wx.YES_NO | wx.ICON_INFORMATION) == wx.YES:
+                       if wx.MessageBox(_("A new version of Cura is available, would you like to download?"), _("New version available"), wx.YES_NO | wx.ICON_INFORMATION) == wx.YES:
                                webbrowser.open(newVersion)
                else:
-                       wx.MessageBox('You are running the latest version of Cura!', 'Awesome!', wx.ICON_INFORMATION)
+                       wx.MessageBox(_("You are running the latest version of Cura!"), _("Awesome!"), wx.ICON_INFORMATION)
 
        def OnAbout(self, e):
                info = wx.AboutDialogInfo()
-               info.SetName('Cura')
-               info.SetDescription('End solution for Open Source Fused Filament Fabrication 3D printing.')
+               info.SetName("Cura")
+               info.SetDescription(_("End solution for Open Source Fused Filament Fabrication 3D printing."))
                info.SetWebSite('http://software.ultimaker.com/')
-               info.SetCopyright('Copyright (C) David Braam')
+               info.SetCopyright(_("Copyright (C) David Braam"))
                info.SetLicence("""
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU Affero General Public License as published by
index 83a50d68ed2a8f8a28e8dd347d7c34b6dc8419d4..b29912ea2b7615355617439efbb3db068eaaaaba 100644 (file)
@@ -17,22 +17,22 @@ class pluginPanel(wx.Panel):
 
                sizer = wx.GridBagSizer(2, 2)
                self.SetSizer(sizer)
-               
+
                effectStringList = []
                for effect in self.pluginList:
                        effectStringList.append(effect['name'])
-               
+
                self.listbox = wx.ListBox(self, -1, choices=effectStringList)
-               title = wx.StaticText(self, -1, "Plugins:")
+               title = wx.StaticText(self, -1, _("Plugins:"))
                title.SetFont(wx.Font(wx.SystemSettings.GetFont(wx.SYS_ANSI_VAR_FONT).GetPointSize(), wx.FONTFAMILY_DEFAULT, wx.NORMAL, wx.FONTWEIGHT_BOLD))
                helpButton = wx.Button(self, -1, '?', style=wx.BU_EXACTFIT)
                addButton = wx.Button(self, -1, 'V', style=wx.BU_EXACTFIT)
-               openPluginLocationButton = wx.Button(self, -1, 'Open plugin location')
-               sb = wx.StaticBox(self, label="Enabled plugins")
+               openPluginLocationButton = wx.Button(self, -1, _("Open plugin location"))
+               sb = wx.StaticBox(self, label=_("Enabled plugins"))
                boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
                self.pluginEnabledPanel = scrolledpanel.ScrolledPanel(self)
                self.pluginEnabledPanel.SetupScrolling(False, True)
-               
+
                sizer.Add(title, (0,0), border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.TOP)
                sizer.Add(helpButton, (0,1), border=10, flag=wx.ALIGN_RIGHT|wx.RIGHT|wx.TOP)
                sizer.Add(self.listbox, (1,0), span=(2,2), border=10, flag=wx.EXPAND|wx.LEFT|wx.RIGHT)
@@ -40,23 +40,23 @@ class pluginPanel(wx.Panel):
                sizer.Add(boxsizer, (4,0), span=(4,2), border=10, flag=wx.EXPAND|wx.LEFT|wx.RIGHT)
                sizer.Add(openPluginLocationButton, (8, 0), border=10, flag=wx.LEFT|wx.BOTTOM)
                boxsizer.Add(self.pluginEnabledPanel, 1, flag=wx.EXPAND)
-               
+
                sizer.AddGrowableCol(0)
                sizer.AddGrowableRow(1) # Plugins list box
                sizer.AddGrowableRow(4) # Enabled plugins
                sizer.AddGrowableRow(5) # Enabled plugins
                sizer.AddGrowableRow(6) # Enabled plugins
-               
+
                sizer = wx.BoxSizer(wx.VERTICAL)
                self.pluginEnabledPanel.SetSizer(sizer)
-               
+
                self.Bind(wx.EVT_BUTTON, self.OnAdd, addButton)
                self.Bind(wx.EVT_BUTTON, self.OnGeneralHelp, helpButton)
                self.Bind(wx.EVT_BUTTON, self.OnOpenPluginLocation, openPluginLocationButton)
                self.listbox.Bind(wx.EVT_LEFT_DCLICK, self.OnAdd)
                self.panelList = []
                self.updateProfileToControls()
-       
+
        def updateProfileToControls(self):
                self.pluginConfig = profile.getPluginConfig()
                for p in self.panelList:
@@ -65,7 +65,7 @@ class pluginPanel(wx.Panel):
                self.panelList = []
                for pluginConfig in self.pluginConfig:
                        self._buildPluginPanel(pluginConfig)
-       
+
        def _buildPluginPanel(self, pluginConfig):
                plugin = None
                for pluginTest in self.pluginList:
@@ -73,7 +73,7 @@ class pluginPanel(wx.Panel):
                                plugin = pluginTest
                if plugin is None:
                        return False
-               
+
                pluginPanel = wx.Panel(self.pluginEnabledPanel)
                s = wx.GridBagSizer(2, 2)
                pluginPanel.SetSizer(s)
@@ -88,22 +88,22 @@ class pluginPanel(wx.Panel):
                info = wx.StaticText(pluginPanel, -1, plugin['info'])
                info.Wrap(300)
                s.Add(info, pos=(2,0), span=(1,4), flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=3)
-               
+
                pluginPanel.paramCtrls = {}
                i = 0
                for param in plugin['params']:
                        value = param['default']
                        if param['name'] in pluginConfig['params']:
                                value = pluginConfig['params'][param['name']]
-                       
+
                        ctrl = wx.TextCtrl(pluginPanel, -1, value)
                        s.Add(wx.StaticText(pluginPanel, -1, param['description']), pos=(3+i,0), span=(1,2), flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL,border=3)
                        s.Add(ctrl, pos=(3+i,2), span=(1,2), flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=3)
 
                        ctrl.Bind(wx.EVT_TEXT, self.OnSettingChange)
-                       
+
                        pluginPanel.paramCtrls[param['name']] = ctrl
-                       
+
                        i += 1
                s.Add(wx.StaticLine(pluginPanel), pos=(3+i,0), span=(1,4), flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=3)
 
@@ -119,7 +119,7 @@ class pluginPanel(wx.Panel):
                self.pluginEnabledPanel.ScrollChildIntoView(pluginPanel)
                self.panelList.append(pluginPanel)
                return True
-       
+
        def OnSettingChange(self, e):
                for panel in self.panelList:
                        idx = self.panelList.index(panel)
@@ -127,10 +127,10 @@ class pluginPanel(wx.Panel):
                                self.pluginConfig[idx]['params'][k] = panel.paramCtrls[k].GetValue()
                profile.setPluginConfig(self.pluginConfig)
                self.callback()
-       
+
        def OnAdd(self, e):
                if self.listbox.GetSelection() < 0:
-                       wx.MessageBox('You need to select a plugin before you can add anything.', 'Error: no plugin selected', wx.OK | wx.ICON_INFORMATION)
+                       wx.MessageBox(_("You need to select a plugin before you can add anything."), _("Error: no plugin selected"), wx.OK | wx.ICON_INFORMATION)
                        return
                plugin = self.pluginList[self.listbox.GetSelection()]
                newConfig = {'filename': plugin['filename'], 'params': {}}
@@ -144,7 +144,7 @@ class pluginPanel(wx.Panel):
                panel = e.GetEventObject().GetParent()
                sizer = self.pluginEnabledPanel.GetSizer()
                idx = self.panelList.index(panel)
-               
+
                panel.Show(False)
                for p in self.panelList:
                        sizer.Detach(p)
@@ -164,14 +164,14 @@ class pluginPanel(wx.Panel):
                panel = e.GetEventObject().GetParent()
                sizer = self.pluginEnabledPanel.GetSizer()
                idx = self.panelList.index(panel)
-               
+
                fname = self.pluginConfig[idx]['filename'].lower()
                fname = fname[0].upper() + fname[1:]
                fname = fname[:fname.rfind('.')]
                webbrowser.open('http://wiki.ultimaker.com/CuraPlugin:_' + fname)
-       
+
        def OnGeneralHelp(self, e):
                webbrowser.open('http://wiki.ultimaker.com/Category:CuraPlugin')
-       
+
        def OnOpenPluginLocation(self, e):
                explorer.openExplorerPath(profile.getPluginBasePaths()[0])
index 2042defd491967bd94600805b0004c6399c117dc..6663bdb3785a6c89fa52effd6dccb3d9cd250aab 100644 (file)
@@ -11,16 +11,16 @@ from Cura.util import profile
 class preferencesDialog(wx.Dialog):
        def __init__(self, parent):
                super(preferencesDialog, self).__init__(None, title="Preferences")
-               
+
                wx.EVT_CLOSE(self, self.OnClose)
-               
+
                self.parent = parent
                self.oldExtruderAmount = int(profile.getPreference('extruder_amount'))
 
                self.panel = configBase.configPanelBase(self)
-               
+
                left, right, main = self.panel.CreateConfigPanel(self)
-               configBase.TitleRow(left, 'Machine settings')
+               configBase.TitleRow(left, _("Machine settings"))
                configBase.SettingRow(left, 'steps_per_e')
                configBase.SettingRow(left, 'machine_width')
                configBase.SettingRow(left, 'machine_depth')
@@ -29,7 +29,7 @@ class preferencesDialog(wx.Dialog):
                configBase.SettingRow(left, 'has_heated_bed')
                configBase.SettingRow(left, 'gcode_flavor')
 
-               configBase.TitleRow(left, 'Printer head size')
+               configBase.TitleRow(left, _("Printer head size"))
                configBase.SettingRow(left, 'extruder_head_size_min_x')
                configBase.SettingRow(left, 'extruder_head_size_min_y')
                configBase.SettingRow(left, 'extruder_head_size_max_x')
@@ -37,21 +37,21 @@ class preferencesDialog(wx.Dialog):
                configBase.SettingRow(left, 'extruder_head_size_height')
 
                for i in xrange(1, self.oldExtruderAmount):
-                       configBase.TitleRow(left, 'Extruder %d' % (i+1))
+                       configBase.TitleRow(left, _("Extruder %d") % (i+1))
                        configBase.SettingRow(left, 'extruder_offset_x%d' % (i))
                        configBase.SettingRow(left, 'extruder_offset_y%d' % (i))
 
-               configBase.TitleRow(right, 'Colours')
+               configBase.TitleRow(right, _("Colours"))
                configBase.SettingRow(right, 'model_colour', wx.Colour)
                for i in xrange(1, self.oldExtruderAmount):
                        configBase.SettingRow(right, 'model_colour%d' % (i+1), wx.Colour)
 
-               configBase.TitleRow(right, 'Filament settings')
+               configBase.TitleRow(right, _("Filament settings"))
                configBase.SettingRow(right, 'filament_physical_density')
                configBase.SettingRow(right, 'filament_cost_kg')
                configBase.SettingRow(right, 'filament_cost_meter')
 
-               configBase.TitleRow(right, 'Communication settings')
+               configBase.TitleRow(right, _("Communication settings"))
                configBase.SettingRow(right, 'serial_port', ['AUTO'] + machineCom.serialList())
                configBase.SettingRow(right, 'serial_baud', ['AUTO'] + map(str, machineCom.baudrateList()))
 
@@ -60,7 +60,7 @@ class preferencesDialog(wx.Dialog):
 
                #configBase.TitleRow(right, 'SD Card settings')
 
-               configBase.TitleRow(right, 'Cura settings')
+               configBase.TitleRow(right, _("Cura settings"))
                configBase.SettingRow(right, 'auto_detect_sd')
                configBase.SettingRow(right, 'check_for_updates')
                configBase.SettingRow(right, 'submit_slice_information')
@@ -68,12 +68,12 @@ class preferencesDialog(wx.Dialog):
                self.okButton = wx.Button(right, -1, 'Ok')
                right.GetSizer().Add(self.okButton, (right.GetSizer().GetRows(), 0), flag=wx.BOTTOM, border=5)
                self.okButton.Bind(wx.EVT_BUTTON, lambda e: self.Close())
-               
+
                main.Fit()
                self.Fit()
 
        def OnClose(self, e):
                if self.oldExtruderAmount != int(profile.getPreference('extruder_amount')):
-                       wx.MessageBox('After changing the amount of extruders you need to restart Cura for full effect.', 'Extruder amount warning.', wx.OK | wx.ICON_INFORMATION)
+                       wx.MessageBox(_("After changing the amount of extruders you need to restart Cura for full effect."), _("Extruder amount warning."), wx.OK | wx.ICON_INFORMATION)
                self.parent.updateProfileToControls()
                self.Destroy()
index e932e5876708b8c5f592410987c4b3063b522051..c3f637f6b5dcf5c7279df5f2d597487158ba1618 100644 (file)
@@ -124,7 +124,7 @@ class printWindow(wx.Frame):
        "Main user interface window"
 
        def __init__(self):
-               super(printWindow, self).__init__(None, -1, title='Printing')
+               super(printWindow, self).__init__(None, -1, title=_("Printing"))
                self.machineCom = None
                self.gcode = None
                self.gcodeList = None
@@ -153,12 +153,12 @@ class printWindow(wx.Frame):
                self.sizer = wx.GridBagSizer(2, 2)
                self.panel.SetSizer(self.sizer)
 
-               sb = wx.StaticBox(self.panel, label="Statistics")
+               sb = wx.StaticBox(self.panel, label=_("Statistics"))
                boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
 
                self.powerWarningText = wx.StaticText(parent=self.panel,
                        id=-1,
-                       label="Your computer is running on battery power.\nConnect your computer to AC power or your print might not finish.",
+                       label=_("Your computer is running on battery power.\nConnect your computer to AC power or your print might not finish."),
                        style=wx.ALIGN_CENTER)
                self.powerWarningText.SetBackgroundColour('red')
                self.powerWarningText.SetForegroundColour('white')
@@ -169,17 +169,17 @@ class printWindow(wx.Frame):
                self.OnPowerWarningChange(None)
                self.powerWarningTimer.Start(10000)
 
-               self.statsText = wx.StaticText(self.panel, -1, "Filament: ####.##m #.##g\nEstimated print time: #####:##\nMachine state:\nDetecting baudrateXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
+               self.statsText = wx.StaticText(self.panel, -1, _("Filament: ####.##m #.##g\nEstimated print time: #####:##\nMachine state:\nDetecting baudrateXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"))
                boxsizer.Add(self.statsText, flag=wx.LEFT, border=5)
 
                self.sizer.Add(boxsizer, pos=(0, 0), span=(7, 1), flag=wx.EXPAND)
 
-               self.connectButton = wx.Button(self.panel, -1, 'Connect')
+               self.connectButton = wx.Button(self.panel, -1, _("Connect"))
                #self.loadButton = wx.Button(self.panel, -1, 'Load')
-               self.printButton = wx.Button(self.panel, -1, 'Print')
-               self.pauseButton = wx.Button(self.panel, -1, 'Pause')
-               self.cancelButton = wx.Button(self.panel, -1, 'Cancel print')
-               self.machineLogButton = wx.Button(self.panel, -1, 'Error log')
+               self.printButton = wx.Button(self.panel, -1, _("Print"))
+               self.pauseButton = wx.Button(self.panel, -1, _("Pause"))
+               self.cancelButton = wx.Button(self.panel, -1, _("Cancel print"))
+               self.machineLogButton = wx.Button(self.panel, -1, _("Error log"))
                self.progress = wx.Gauge(self.panel, -1)
 
                self.sizer.Add(self.connectButton, pos=(1, 1), flag=wx.EXPAND)
@@ -200,7 +200,7 @@ class printWindow(wx.Frame):
                self.temperatureSelect = wx.SpinCtrl(self.temperaturePanel, -1, '0', size=(21 * 3, 21), style=wx.SP_ARROW_KEYS)
                self.temperatureSelect.SetRange(0, 400)
                self.temperatureHeatUpPLA = wx.Button(self.temperaturePanel, -1, '210C')
-               self.bedTemperatureLabel = wx.StaticText(self.temperaturePanel, -1, "BedTemp:")
+               self.bedTemperatureLabel = wx.StaticText(self.temperaturePanel, -1, _("BedTemp:"))
                self.bedTemperatureSelect = wx.SpinCtrl(self.temperaturePanel, -1, '0', size=(21 * 3, 21), style=wx.SP_ARROW_KEYS)
                self.bedTemperatureSelect.SetRange(0, 400)
                self.bedTemperatureLabel.Show(False)
@@ -208,7 +208,7 @@ class printWindow(wx.Frame):
 
                self.temperatureGraph = temperatureGraph(self.temperaturePanel)
 
-               sizer.Add(wx.StaticText(self.temperaturePanel, -1, "Temp:"), pos=(0, 0))
+               sizer.Add(wx.StaticText(self.temperaturePanel, -1, _("Temp:")), pos=(0, 0))
                sizer.Add(self.temperatureSelect, pos=(0, 1))
                sizer.Add(self.temperatureHeatUpPLA, pos=(0, 2))
                sizer.Add(self.bedTemperatureLabel, pos=(1, 0))
@@ -256,7 +256,7 @@ class printWindow(wx.Frame):
                sizer.Add(PrintCommandButton(self, ['G92 E0', 'G1 E-2 F120'], 'retract.png', size=(60, 20)), pos=(2, 10),
                        span=(1, 3), flag=wx.EXPAND)
 
-               nb.AddPage(self.directControlPanel, 'Jog')
+               nb.AddPage(self.directControlPanel, _("Jog"))
 
                self.speedPanel = wx.Panel(nb)
                sizer = wx.GridBagSizer(2, 2)
@@ -271,20 +271,20 @@ class printWindow(wx.Frame):
                self.supportSpeedSelect = wx.SpinCtrl(self.speedPanel, -1, '100', size=(21 * 3, 21), style=wx.SP_ARROW_KEYS)
                self.supportSpeedSelect.SetRange(5, 1000)
 
-               sizer.Add(wx.StaticText(self.speedPanel, -1, "Outer wall:"), pos=(0, 0))
+               sizer.Add(wx.StaticText(self.speedPanel, -1, _("Outer wall:")), pos=(0, 0))
                sizer.Add(self.outerWallSpeedSelect, pos=(0, 1))
                sizer.Add(wx.StaticText(self.speedPanel, -1, "%"), pos=(0, 2))
-               sizer.Add(wx.StaticText(self.speedPanel, -1, "Inner wall:"), pos=(1, 0))
+               sizer.Add(wx.StaticText(self.speedPanel, -1, _("Inner wall:")), pos=(1, 0))
                sizer.Add(self.innerWallSpeedSelect, pos=(1, 1))
                sizer.Add(wx.StaticText(self.speedPanel, -1, "%"), pos=(1, 2))
-               sizer.Add(wx.StaticText(self.speedPanel, -1, "Fill:"), pos=(2, 0))
+               sizer.Add(wx.StaticText(self.speedPanel, -1, _("Fill:")), pos=(2, 0))
                sizer.Add(self.fillSpeedSelect, pos=(2, 1))
                sizer.Add(wx.StaticText(self.speedPanel, -1, "%"), pos=(2, 2))
-               sizer.Add(wx.StaticText(self.speedPanel, -1, "Support:"), pos=(3, 0))
+               sizer.Add(wx.StaticText(self.speedPanel, -1, _("Support:")), pos=(3, 0))
                sizer.Add(self.supportSpeedSelect, pos=(3, 1))
                sizer.Add(wx.StaticText(self.speedPanel, -1, "%"), pos=(3, 2))
 
-               nb.AddPage(self.speedPanel, 'Speed')
+               nb.AddPage(self.speedPanel, _("Speed"))
 
                self.termPanel = wx.Panel(nb)
                sizer = wx.GridBagSizer(2, 2)
@@ -302,14 +302,14 @@ class printWindow(wx.Frame):
                sizer.AddGrowableCol(0)
                sizer.AddGrowableRow(0)
 
-               nb.AddPage(self.termPanel, 'Term')
+               nb.AddPage(self.termPanel, _("Term"))
 
                if self.cam is not None:
                        self.camPage = wx.Panel(nb)
                        sizer = wx.GridBagSizer(2, 2)
                        self.camPage.SetSizer(sizer)
 
-                       self.timelapsEnable = wx.CheckBox(self.camPage, -1, 'Enable timelapse movie recording')
+                       self.timelapsEnable = wx.CheckBox(self.camPage, -1, _("Enable timelapse movie recording"))
                        self.timelapsSavePath = wx.TextCtrl(self.camPage, -1, os.path.expanduser('~/timelaps_' + datetime.datetime.now().strftime('%Y-%m-%d_%H:%M') + '.mpg'))
                        sizer.Add(self.timelapsEnable, pos=(0, 0), span=(1, 2), flag=wx.EXPAND)
                        sizer.Add(self.timelapsSavePath, pos=(1, 0), span=(1, 2), flag=wx.EXPAND)
@@ -323,13 +323,13 @@ class printWindow(wx.Frame):
                                button.Bind(wx.EVT_BUTTON, self.OnPropertyPageButton)
                                self.cam.buttons.append(button)
 
-                       self.campreviewEnable = wx.CheckBox(self.camPage, -1, 'Show preview')
+                       self.campreviewEnable = wx.CheckBox(self.camPage, -1, _("Show preview"))
                        sizer.Add(self.campreviewEnable, pos=(3, 0), span=(1, 2), flag=wx.EXPAND)
 
                        self.camPreview = wx.Panel(self.camPage)
                        sizer.Add(self.camPreview, pos=(4, 0), span=(1, 2), flag=wx.EXPAND)
 
-                       nb.AddPage(self.camPage, 'Camera')
+                       nb.AddPage(self.camPage, _("Camera"))
                        self.camPreview.timer = wx.Timer(self)
                        self.Bind(wx.EVT_TIMER, self.OnCameraTimer, self.camPreview.timer)
                        self.camPreview.timer.Start(500)
@@ -412,9 +412,9 @@ class printWindow(wx.Frame):
                self.pauseButton.Enable(
                        self.machineCom is not None and (self.machineCom.isPrinting() or self.machineCom.isPaused()))
                if self.machineCom is not None and self.machineCom.isPaused():
-                       self.pauseButton.SetLabel('Resume')
+                       self.pauseButton.SetLabel(_("Resume"))
                else:
-                       self.pauseButton.SetLabel('Pause')
+                       self.pauseButton.SetLabel(_("Pause"))
                self.cancelButton.Enable(
                        self.machineCom is not None and (self.machineCom.isPrinting() or self.machineCom.isPaused()))
                self.temperatureSelect.Enable(self.machineCom is not None and self.machineCom.isOperational())
@@ -429,13 +429,13 @@ class printWindow(wx.Frame):
        def UpdateProgress(self):
                status = ""
                if self.gcode is None:
-                       status += "Loading gcode...\n"
+                       status += _("Loading gcode...\n")
                else:
-                       status += "Filament: %.2fm %.2fg\n" % (
+                       status += _("Filament: %(amount).2fm %(weight).2fg\n") % (
                        self.gcode.extrusionAmount / 1000, self.gcode.calculateWeight() * 1000)
                        cost = self.gcode.calculateCost()
                        if cost is not None:
-                               status += "Filament cost: %s\n" % (cost)
+                               status += _("Filament cost: %s\n") % (cost)
                        #status += "Estimated print time: %02d:%02d\n" % (int(self.gcode.totalMoveTimeMinute / 60), int(self.gcode.totalMoveTimeMinute % 60))
                if self.machineCom is None or not self.machineCom.isPrinting():
                        self.progress.SetValue(0)
index 5faaba102351bfa28db32d61e47b46bbdcc747a2..916eaa0262bd92bcca8ead1add297dfa0b14e984 100644 (file)
@@ -60,24 +60,24 @@ class SceneView(openglGui.glGuiPanel):
                self._projMatrix = None
                self.tempMatrix = None
 
-               self.openFileButton      = openglGui.glButton(self, 4, 'Load', (0,0), self.showLoadModel)
-               self.printButton         = openglGui.glButton(self, 6, 'Print', (1,0), self.OnPrintButton)
+               self.openFileButton      = openglGui.glButton(self, 4, _("Load"), (0,0), self.showLoadModel)
+               self.printButton         = openglGui.glButton(self, 6, _("Print"), (1,0), self.OnPrintButton)
                self.printButton.setDisabled(True)
 
                group = []
-               self.rotateToolButton = openglGui.glRadioButton(self, 8, 'Rotate', (0,-1), group, self.OnToolSelect)
-               self.scaleToolButton  = openglGui.glRadioButton(self, 9, 'Scale', (1,-1), group, self.OnToolSelect)
-               self.mirrorToolButton  = openglGui.glRadioButton(self, 10, 'Mirror', (2,-1), group, self.OnToolSelect)
+               self.rotateToolButton = openglGui.glRadioButton(self, 8, _("Rotate"), (0,-1), group, self.OnToolSelect)
+               self.scaleToolButton  = openglGui.glRadioButton(self, 9, _("Scale"), (1,-1), group, self.OnToolSelect)
+               self.mirrorToolButton  = openglGui.glRadioButton(self, 10, _("Mirror"), (2,-1), group, self.OnToolSelect)
 
-               self.resetRotationButton = openglGui.glButton(self, 12, 'Reset', (0,-2), self.OnRotateReset)
-               self.layFlatButton       = openglGui.glButton(self, 16, 'Lay flat', (0,-3), self.OnLayFlat)
+               self.resetRotationButton = openglGui.glButton(self, 12, _("Reset"), (0,-2), self.OnRotateReset)
+               self.layFlatButton       = openglGui.glButton(self, 16, _("Lay flat"), (0,-3), self.OnLayFlat)
 
-               self.resetScaleButton    = openglGui.glButton(self, 13, 'Reset', (1,-2), self.OnScaleReset)
-               self.scaleMaxButton      = openglGui.glButton(self, 17, 'To max', (1,-3), self.OnScaleMax)
+               self.resetScaleButton    = openglGui.glButton(self, 13, _("Reset"), (1,-2), self.OnScaleReset)
+               self.scaleMaxButton      = openglGui.glButton(self, 17, _("To max"), (1,-3), self.OnScaleMax)
 
-               self.mirrorXButton       = openglGui.glButton(self, 14, 'Mirror X', (2,-2), lambda button: self.OnMirror(0))
-               self.mirrorYButton       = openglGui.glButton(self, 18, 'Mirror Y', (2,-3), lambda button: self.OnMirror(1))
-               self.mirrorZButton       = openglGui.glButton(self, 22, 'Mirror Z', (2,-4), lambda button: self.OnMirror(2))
+               self.mirrorXButton       = openglGui.glButton(self, 14, _("Mirror X"), (2,-2), lambda button: self.OnMirror(0))
+               self.mirrorYButton       = openglGui.glButton(self, 18, _("Mirror Y"), (2,-3), lambda button: self.OnMirror(1))
+               self.mirrorZButton       = openglGui.glButton(self, 22, _("Mirror Z"), (2,-4), lambda button: self.OnMirror(2))
 
                self.rotateToolButton.setExpandArrow(True)
                self.scaleToolButton.setExpandArrow(True)
@@ -85,25 +85,25 @@ class SceneView(openglGui.glGuiPanel):
 
                self.scaleForm = openglGui.glFrame(self, (2, -2))
                openglGui.glGuiLayoutGrid(self.scaleForm)
-               openglGui.glLabel(self.scaleForm, 'Scale X', (0,0))
+               openglGui.glLabel(self.scaleForm, _("Scale X"), (0,0))
                self.scaleXctrl = openglGui.glNumberCtrl(self.scaleForm, '1.0', (1,0), lambda value: self.OnScaleEntry(value, 0))
-               openglGui.glLabel(self.scaleForm, 'Scale Y', (0,1))
+               openglGui.glLabel(self.scaleForm, _("Scale Y"), (0,1))
                self.scaleYctrl = openglGui.glNumberCtrl(self.scaleForm, '1.0', (1,1), lambda value: self.OnScaleEntry(value, 1))
-               openglGui.glLabel(self.scaleForm, 'Scale Z', (0,2))
+               openglGui.glLabel(self.scaleForm, _("Scale Z"), (0,2))
                self.scaleZctrl = openglGui.glNumberCtrl(self.scaleForm, '1.0', (1,2), lambda value: self.OnScaleEntry(value, 2))
-               openglGui.glLabel(self.scaleForm, 'Size X (mm)', (0,4))
+               openglGui.glLabel(self.scaleForm, _("Size X (mm)"), (0,4))
                self.scaleXmmctrl = openglGui.glNumberCtrl(self.scaleForm, '0.0', (1,4), lambda value: self.OnScaleEntryMM(value, 0))
-               openglGui.glLabel(self.scaleForm, 'Size Y (mm)', (0,5))
+               openglGui.glLabel(self.scaleForm, _("Size Y (mm)"), (0,5))
                self.scaleYmmctrl = openglGui.glNumberCtrl(self.scaleForm, '0.0', (1,5), lambda value: self.OnScaleEntryMM(value, 1))
-               openglGui.glLabel(self.scaleForm, 'Size Z (mm)', (0,6))
+               openglGui.glLabel(self.scaleForm, _("Size Z (mm)"), (0,6))
                self.scaleZmmctrl = openglGui.glNumberCtrl(self.scaleForm, '0.0', (1,6), lambda value: self.OnScaleEntryMM(value, 2))
-               openglGui.glLabel(self.scaleForm, 'Uniform scale', (0,8))
+               openglGui.glLabel(self.scaleForm, _("Uniform scale"), (0,8))
                self.scaleUniform = openglGui.glCheckbox(self.scaleForm, True, (1,8), None)
 
-               self.viewSelection = openglGui.glComboButton(self, 'View mode', [7,19,11,15,23], ['Normal', 'Overhang', 'Transparent', 'X-Ray', 'Layers'], (-1,0), self.OnViewChange)
+               self.viewSelection = openglGui.glComboButton(self, _("View mode"), [7,19,11,15,23], [_("Normal"), _("Overhang"), _("Transparent"), _("X-Ray"), _("Layers")], (-1,0), self.OnViewChange)
                self.layerSelect = openglGui.glSlider(self, 10000, 0, 1, (-1,-2), lambda : self.QueueRefresh())
 
-               self.youMagineButton = openglGui.glButton(self, 26, 'Share on YouMagine', (2,0), lambda button: youmagineGui.youmagineManager(self.GetTopLevelParent(), self._scene))
+               self.youMagineButton = openglGui.glButton(self, 26, _("Share on YouMagine"), (2,0), lambda button: youmagineGui.youmagineManager(self.GetTopLevelParent(), self._scene))
                self.youMagineButton.setDisabled(True)
 
                self.notification = openglGui.glNotification(self, (0, 0))
@@ -121,7 +121,7 @@ class SceneView(openglGui.glGuiPanel):
 
        def showLoadModel(self, button = 1):
                if button == 1:
-                       dlg=wx.FileDialog(self, 'Open 3D model', os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST|wx.FD_MULTIPLE)
+                       dlg=wx.FileDialog(self, _("Open 3D model"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST|wx.FD_MULTIPLE)
                        dlg.SetWildcard(meshLoader.loadWildcardFilter() + "|GCode file (*.gcode)|*.g;*.gcode;*.G;*.GCODE")
                        if dlg.ShowModal() != wx.ID_OK:
                                dlg.Destroy()
@@ -161,7 +161,7 @@ class SceneView(openglGui.glGuiPanel):
        def showSaveModel(self):
                if len(self._scene.objects()) < 1:
                        return
-               dlg=wx.FileDialog(self, 'Save 3D model', os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
+               dlg=wx.FileDialog(self, _("Save 3D model"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
                dlg.SetWildcard(meshLoader.saveWildcardFilter())
                if dlg.ShowModal() != wx.ID_OK:
                        dlg.Destroy()
@@ -191,9 +191,9 @@ class SceneView(openglGui.glGuiPanel):
                                self.showSaveGCode()
                if button == 3:
                        menu = wx.Menu()
-                       self.Bind(wx.EVT_MENU, lambda e: self.showPrintWindow(), menu.Append(-1, 'Print with USB'))
-                       self.Bind(wx.EVT_MENU, lambda e: self.showSaveGCode(), menu.Append(-1, 'Save GCode...'))
-                       self.Bind(wx.EVT_MENU, lambda e: self._showSliceLog(), menu.Append(-1, 'Slice engine log...'))
+                       self.Bind(wx.EVT_MENU, lambda e: self.showPrintWindow(), menu.Append(-1, _("Print with USB")))
+                       self.Bind(wx.EVT_MENU, lambda e: self.showSaveGCode(), menu.Append(-1, _("Save GCode...")))
+                       self.Bind(wx.EVT_MENU, lambda e: self._showSliceLog(), menu.Append(-1, _("Slice engine log...")))
                        self.PopupMenu(menu)
                        menu.Destroy()
 
@@ -207,7 +207,7 @@ class SceneView(openglGui.glGuiPanel):
        def showSaveGCode(self):
                defPath = profile.getPreference('lastFile')
                defPath = defPath[0:defPath.rfind('.')] + '.gcode'
-               dlg=wx.FileDialog(self, 'Save toolpath', defPath, style=wx.FD_SAVE)
+               dlg=wx.FileDialog(self, _("Save toolpath"), defPath, style=wx.FD_SAVE)
                dlg.SetFilename(self._scene._objectList[0].getName())
                dlg.SetWildcard('Toolpath (*.gcode)|*.gcode;*.g')
                if dlg.ShowModal() != wx.ID_OK:
@@ -244,7 +244,7 @@ class SceneView(openglGui.glGuiPanel):
                        self._slicer.submitSliceInfoOnline()
 
        def _showSliceLog(self):
-               dlg = wx.TextEntryDialog(self, "The slicing engine reported the following", "Engine log...", '\n'.join(self._slicer.getSliceLog()), wx.TE_MULTILINE | wx.OK | wx.CENTRE)
+               dlg = wx.TextEntryDialog(self, _("The slicing engine reported the following"), _("Engine log..."), '\n'.join(self._slicer.getSliceLog()), wx.TE_MULTILINE | wx.OK | wx.CENTRE)
                dlg.ShowModal()
                dlg.Destroy()
 
@@ -614,13 +614,13 @@ class SceneView(openglGui.glGuiPanel):
                        if e.GetButton() == 3:
                                        menu = wx.Menu()
                                        if self._focusObj is not None:
-                                               self.Bind(wx.EVT_MENU, lambda e: self._deleteObject(self._focusObj), menu.Append(-1, 'Delete'))
-                                               self.Bind(wx.EVT_MENU, self.OnMultiply, menu.Append(-1, 'Multiply'))
-                                               self.Bind(wx.EVT_MENU, self.OnSplitObject, menu.Append(-1, 'Split'))
+                                               self.Bind(wx.EVT_MENU, lambda e: self._deleteObject(self._focusObj), menu.Append(-1, _("Delete")))
+                                               self.Bind(wx.EVT_MENU, self.OnMultiply, menu.Append(-1, _("Multiply")))
+                                               self.Bind(wx.EVT_MENU, self.OnSplitObject, menu.Append(-1, _("Split")))
                                        if self._selectedObj != self._focusObj and self._focusObj is not None and int(profile.getPreference('extruder_amount')) > 1:
-                                               self.Bind(wx.EVT_MENU, self.OnMergeObjects, menu.Append(-1, 'Dual extrusion merge'))
+                                               self.Bind(wx.EVT_MENU, self.OnMergeObjects, menu.Append(-1, _("Dual extrusion merge")))
                                        if len(self._scene.objects()) > 0:
-                                               self.Bind(wx.EVT_MENU, self.OnDeleteAll, menu.Append(-1, 'Delete all'))
+                                               self.Bind(wx.EVT_MENU, self.OnDeleteAll, menu.Append(-1, _("Delete all")))
                                        if menu.MenuItemCount > 0:
                                                self.PopupMenu(menu)
                                        menu.Destroy()
@@ -742,13 +742,13 @@ class SceneView(openglGui.glGuiPanel):
        def OnPaint(self,e):
                if machineCom.machineIsConnected():
                        self.printButton._imageID = 6
-                       self.printButton._tooltip = 'Print'
+                       self.printButton._tooltip = _("Print")
                elif len(removableStorage.getPossibleSDcardDrives()) > 0:
                        self.printButton._imageID = 2
-                       self.printButton._tooltip = 'Toolpath to SD'
+                       self.printButton._tooltip = _("Toolpath to SD")
                else:
                        self.printButton._imageID = 3
-                       self.printButton._tooltip = 'Save toolpath'
+                       self.printButton._tooltip = _("Save toolpath")
 
                if self._animView is not None:
                        self._viewTarget = self._animView.getPosition()
@@ -1055,7 +1055,7 @@ void main(void)
                                glLoadIdentity()
                                glTranslate(0,-4,-10)
                                glColor4ub(60,60,60,255)
-                               opengl.glDrawStringCenter('Loading toolpath for visualization...')
+                               opengl.glDrawStringCenter(_("Loading toolpath for visualization..."))
                                glPopMatrix()
                else:
                        #Draw the object box-shadow, so you can see where it will collide with other objects.
@@ -1106,7 +1106,7 @@ void main(void)
                        glLoadIdentity()
                        glTranslate(0,-4,-10)
                        glColor4ub(60,60,60,255)
-                       opengl.glDrawStringCenter('Overhang view not working due to lack of OpenGL shaders support.')
+                       opengl.glDrawStringCenter(_("Overhang view not working due to lack of OpenGL shaders support."))
                        glPopMatrix()
 
        def _renderObject(self, obj, brightness = False, addSink = True):
index e2f5a2b07303aa63aaf78fcf5c3af19e9e6dcdc2..c5552230d3364fab433004d368d3b47b6607615c 100644 (file)
@@ -17,10 +17,10 @@ class simpleModePanel(wx.Panel):
                #self.menubar.Insert(1, toolsMenu, 'Normal mode')
 
                printTypePanel = wx.Panel(self)
-               self.printTypeHigh = wx.RadioButton(printTypePanel, -1, 'High quality print', style=wx.RB_GROUP)
-               self.printTypeNormal = wx.RadioButton(printTypePanel, -1, 'Normal quality print')
-               self.printTypeLow = wx.RadioButton(printTypePanel, -1, 'Fast low quality print')
-               self.printTypeJoris = wx.RadioButton(printTypePanel, -1, 'Thin walled cup or vase')
+               self.printTypeHigh = wx.RadioButton(printTypePanel, -1, _("High quality print"), style=wx.RB_GROUP)
+               self.printTypeNormal = wx.RadioButton(printTypePanel, -1, _("Normal quality print"))
+               self.printTypeLow = wx.RadioButton(printTypePanel, -1, _("Fast low quality print"))
+               self.printTypeJoris = wx.RadioButton(printTypePanel, -1, _("Thin walled cup or vase"))
                self.printTypeJoris.Hide()
 
                printMaterialPanel = wx.Panel(self)
@@ -28,12 +28,12 @@ class simpleModePanel(wx.Panel):
                self.printMaterialABS = wx.RadioButton(printMaterialPanel, -1, 'ABS')
                self.printMaterialDiameter = wx.TextCtrl(printMaterialPanel, -1, profile.getProfileSetting('filament_diameter'))
                
-               self.printSupport = wx.CheckBox(self, -1, 'Print support structure')
+               self.printSupport = wx.CheckBox(self, -1, _("Print support structure"))
 
                sizer = wx.GridBagSizer()
                self.SetSizer(sizer)
 
-               sb = wx.StaticBox(printTypePanel, label="Select a print type:")
+               sb = wx.StaticBox(printTypePanel, label=_("Select a print type:"))
                boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
                boxsizer.Add(self.printTypeHigh)
                boxsizer.Add(self.printTypeNormal)
@@ -43,17 +43,17 @@ class simpleModePanel(wx.Panel):
                printTypePanel.GetSizer().Add(boxsizer, flag=wx.EXPAND)
                sizer.Add(printTypePanel, (0,0), flag=wx.EXPAND)
 
-               sb = wx.StaticBox(printMaterialPanel, label="Material:")
+               sb = wx.StaticBox(printMaterialPanel, label=_("Material:"))
                boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
                boxsizer.Add(self.printMaterialPLA)
                boxsizer.Add(self.printMaterialABS)
-               boxsizer.Add(wx.StaticText(printMaterialPanel, -1, 'Diameter:'))
+               boxsizer.Add(wx.StaticText(printMaterialPanel, -1, _("Diameter:")))
                boxsizer.Add(self.printMaterialDiameter)
                printMaterialPanel.SetSizer(wx.BoxSizer(wx.VERTICAL))
                printMaterialPanel.GetSizer().Add(boxsizer, flag=wx.EXPAND)
                sizer.Add(printMaterialPanel, (1,0), flag=wx.EXPAND)
 
-               sb = wx.StaticBox(self, label="Other:")
+               sb = wx.StaticBox(self, label=_("Other:"))
                boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
                boxsizer.Add(self.printSupport)
                sizer.Add(boxsizer, (2,0), flag=wx.EXPAND)
@@ -114,7 +114,7 @@ class simpleModePanel(wx.Panel):
                put('bottom_thickness', '0.3')
 
                if self.printSupport.GetValue():
-                       put('support', 'Exterior Only')
+                       put('support', _("Exterior Only"))
 
                nozzle_size = float(get('nozzle_size'))
                if self.printTypeNormal.GetValue():
index 2e6705329076ecfc4d99723ccf8ac5376d954d3e..ddd8894bdb6221efe52aeedd7d7ebe18e908d799 100644 (file)
@@ -11,7 +11,7 @@ from Cura.gui.util import dropTarget
 
 class batchRunWindow(wx.Frame):
        def __init__(self, parent):
-               super(batchRunWindow, self).__init__(parent, title='Cura - Batch run')
+               super(batchRunWindow, self).__init__(parent, title=_("Cura - Batch run"))
                
                self.list = []
                
@@ -26,9 +26,9 @@ class batchRunWindow(wx.Frame):
                self.panel.SetSizer(self.sizer)
 
                self.listbox = wx.ListBox(self.panel, -1, choices=[])
-               self.addButton = wx.Button(self.panel, -1, "Add")
-               self.remButton = wx.Button(self.panel, -1, "Remove")
-               self.sliceButton = wx.Button(self.panel, -1, "Prepare all")
+               self.addButton = wx.Button(self.panel, -1, _("Add"))
+               self.remButton = wx.Button(self.panel, -1, _("Remove"))
+               self.sliceButton = wx.Button(self.panel, -1, _("Prepare all"))
 
                self.addButton.Bind(wx.EVT_BUTTON, self.OnAddModel)
                self.remButton.Bind(wx.EVT_BUTTON, self.OnRemModel)
@@ -44,7 +44,7 @@ class batchRunWindow(wx.Frame):
                self.sizer.AddGrowableRow(0)
 
        def OnAddModel(self, e):
-               dlg=wx.FileDialog(self, "Open file to batch prepare", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST|wx.FD_MULTIPLE)
+               dlg=wx.FileDialog(self, _("Open file to batch prepare"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST|wx.FD_MULTIPLE)
                dlg.SetWildcard("STL files (*.stl)|*.stl;*.STL")
                if dlg.ShowModal() == wx.ID_OK:
                        for filename in dlg.GetPaths():
@@ -131,13 +131,13 @@ class BatchSliceProgressWindow(wx.Frame):
                self.progressGauge = []
                self.statusText = []
                for i in xrange(0, self.threadCount):
-                       self.statusText.append(wx.StaticText(self, -1, "Building: %d                           " % (len(self.sliceCmdList))))
+                       self.statusText.append(wx.StaticText(self, -1, _("Building: %d                           ") % (len(self.sliceCmdList))))
                        self.progressGauge.append(wx.Gauge(self, -1))
                        self.progressGauge[i].SetRange(10000)
-               self.progressTextTotal = wx.StaticText(self, -1, "Done: 0/%d                           " % (len(self.sliceCmdList)))
+               self.progressTextTotal = wx.StaticText(self, -1, _("Done: 0/%d                           ") % (len(self.sliceCmdList)))
                self.progressGaugeTotal = wx.Gauge(self, -1)
                self.progressGaugeTotal.SetRange(len(self.sliceCmdList))
-               self.abortButton = wx.Button(self, -1, "Abort")
+               self.abortButton = wx.Button(self, -1, _("Abort"))
                for i in xrange(0, self.threadCount):
                        self.sizer.Add(self.statusText[i], (i*2,0), span=(1,4))
                        self.sizer.Add(self.progressGauge[i], (1+i*2, 0), span=(1,4), flag=wx.EXPAND)
@@ -160,7 +160,7 @@ class BatchSliceProgressWindow(wx.Frame):
                        self.Close()
                else:
                        self.abort = True
-                       self.abortButton.SetLabel('Close')
+                       self.abortButton.SetLabel(_("Close"))
 
        def SetProgress(self, index, stepName, layer, maxLayer):
                if self.prevStep[index] != stepName:
@@ -184,8 +184,8 @@ class BatchSliceProgressWindow(wx.Frame):
 
                self.abort = True
                sliceTime = time.time() - self.sliceStartTime
-               status = "Build: %d models" % (len(self.sliceCmdList))
-               status += "\nSlicing took: %02d:%02d" % (sliceTime / 60, sliceTime % 60)
+               status = _("Build: %d models") % (len(self.sliceCmdList))
+               status += _("\nSlicing took: %(hours)02d:%(minutes)02d") % (sliceTime / 60, sliceTime % 60)
 
                wx.CallAfter(self.statusText[0].SetLabel, status)
                wx.CallAfter(self.OnSliceDone)
@@ -195,7 +195,7 @@ class BatchSliceProgressWindow(wx.Frame):
                        cmdIndex = self.cmdIndex;
                        self.cmdIndex += 1                      
                        action = self.sliceCmdList[cmdIndex]
-                       wx.CallAfter(self.SetTitle, "Building: [%d/%d]"  % (self.sliceCmdList.index(action) + 1, len(self.sliceCmdList)))
+                       wx.CallAfter(self.SetTitle, _("Building: [%(index)d/%(size)d]")  % (self.sliceCmdList.index(action) + 1, len(self.sliceCmdList)))
 
                        p = sliceRun.startSliceCommandProcess(action)
                        line = p.stdout.readline()
@@ -211,7 +211,7 @@ class BatchSliceProgressWindow(wx.Frame):
                                        wx.CallAfter(self.statusText[index].SetLabel, line)
                                if self.abort:
                                        p.terminate()
-                                       wx.CallAfter(self.statusText[index].SetLabel, "Aborted by user.")
+                                       wx.CallAfter(self.statusText[index].SetLabel, _("Aborted by user."))
                                        return
                                line = p.stdout.readline()
                        self.returnCode = p.wait()
@@ -225,15 +225,15 @@ class BatchSliceProgressWindow(wx.Frame):
                        
                        wx.CallAfter(self.progressGauge[index].SetValue, 10000)
                        self.totalDoneFactor[index] = 0.0
-                       wx.CallAfter(self.progressTextTotal.SetLabel, "Done %d/%d" % (self.cmdIndex, len(self.sliceCmdList)))
+                       wx.CallAfter(self.progressTextTotal.SetLabel, _("Done %(index)d/%(size)d") % (self.cmdIndex, len(self.sliceCmdList)))
                        wx.CallAfter(self.progressGaugeTotal.SetValue, self.cmdIndex)
        
        def OnSliceDone(self):
                self.abortButton.Destroy()
-               self.closeButton = wx.Button(self, -1, "Close")
+               self.closeButton = wx.Button(self, -1, _("Close"))
                self.sizer.Add(self.closeButton, (2+self.threadCount*2,0), span=(1,1))
                if profile.getPreference('sdpath') != '':
-                       self.copyToSDButton = wx.Button(self, -1, "To SDCard")
+                       self.copyToSDButton = wx.Button(self, -1, _("To SDCard"))
                        self.Bind(wx.EVT_BUTTON, self.OnCopyToSD, self.copyToSDButton)
                        self.sizer.Add(self.copyToSDButton, (2+self.threadCount*2,1), span=(1,1))
                self.Bind(wx.EVT_BUTTON, self.OnAbort, self.closeButton)
index d62b25a7f33ccfbef3a3c6491e92028e9945a662..951acfeaf04707fec00ab076031fa994d10f504d 100644 (file)
@@ -76,11 +76,11 @@ class youmagineManager(object):
 
        #Do all the youmagine communication in a background thread, because it can take a while and block the UI thread otherwise
        def checkAuthorizationThread(self):
-               wx.CallAfter(self._indicatorWindow.showBusy, 'Checking token')
+               wx.CallAfter(self._indicatorWindow.showBusy, _("Checking token"))
                if not self._ym.isAuthorized():
                        wx.CallAfter(self._indicatorWindow.Hide)
                        if not self._ym.isHostReachable():
-                               wx.MessageBox('Failed to contact YouMagine.com', 'YouMagine error.', wx.OK | wx.ICON_ERROR)
+                               wx.MessageBox(_("Failed to contact YouMagine.com"), _("YouMagine error."), wx.OK | wx.ICON_ERROR)
                                return
                        wx.CallAfter(self._getAuthorizationWindow.Show)
                        lastTriedClipboard = ''
@@ -97,7 +97,7 @@ class youmagineManager(object):
                        profile.putPreference('youmagine_token', self._ym.getAuthToken())
                        wx.CallAfter(self._getAuthorizationWindow.Hide)
                        wx.CallAfter(self._getAuthorizationWindow.Destroy)
-                       wx.MessageBox('Cura is now authorized to share on YouMagine', 'YouMagine.', wx.OK | wx.ICON_INFORMATION)
+                       wx.MessageBox(_("Cura is now authorized to share on YouMagine"), _("YouMagine."), wx.OK | wx.ICON_INFORMATION)
                wx.CallAfter(self._indicatorWindow.Hide)
 
                #TODO: Would you like to create a new design or add the model to an existing design?
@@ -109,15 +109,15 @@ class youmagineManager(object):
                thread.start()
 
        def createNewDesignThread(self, name, description, category, license, imageList, extraFileList, publish):
-               wx.CallAfter(self._indicatorWindow.showBusy, 'Creating new design on YouMagine...')
+               wx.CallAfter(self._indicatorWindow.showBusy, _("Creating new design on YouMagine..."))
                id = self._ym.createDesign(name, description, category, license)
                wx.CallAfter(self._indicatorWindow.Hide)
                if id is None:
-                       wx.MessageBox('Failed to create a design, nothing uploaded!', 'YouMagine error.', wx.OK | wx.ICON_ERROR)
+                       wx.MessageBox(_("Failed to create a design, nothing uploaded!"), _("YouMagine error."), wx.OK | wx.ICON_ERROR)
                        return
 
                for obj in self._scene.objects():
-                       wx.CallAfter(self._indicatorWindow.showBusy, 'Building model %s...' % (obj.getName()))
+                       wx.CallAfter(self._indicatorWindow.showBusy, _("Building model %s...") % (obj.getName()))
                        time.sleep(0.1)
                        s = StringIO.StringIO()
                        filename = obj.getName()
@@ -128,34 +128,34 @@ class youmagineManager(object):
                                amf.saveSceneStream(s, filename, [obj])
                                filename += '.amf'
 
-                       wx.CallAfter(self._indicatorWindow.showBusy, 'Uploading model %s...' % (filename))
+                       wx.CallAfter(self._indicatorWindow.showBusy, _("Uploading model %s...") % (filename))
                        if self._ym.createDocument(id, filename, s.getvalue()) is None:
-                               wx.MessageBox('Failed to upload %s!' % (filename), 'YouMagine error.', wx.OK | wx.ICON_ERROR)
+                               wx.MessageBox(_("Failed to upload %s!") % (filename), _("YouMagine error."), wx.OK | wx.ICON_ERROR)
                        s.close()
 
                for extra in extraFileList:
-                       wx.CallAfter(self._indicatorWindow.showBusy, 'Uploading file %s...' % (os.path.basename(extra)))
+                       wx.CallAfter(self._indicatorWindow.showBusy, _("Uploading file %s...") % (os.path.basename(extra)))
                        with open(extra, "rb") as f:
                                if self._ym.createDocument(id, os.path.basename(extra), f.read()) is None:
-                                       wx.MessageBox('Failed to upload %s!' % (os.path.basename(extra)), 'YouMagine error.', wx.OK | wx.ICON_ERROR)
+                                       wx.MessageBox(_("Failed to upload %s!") % (os.path.basename(extra)), _("YouMagine error."), wx.OK | wx.ICON_ERROR)
 
                for image in imageList:
                        if type(image) in types.StringTypes:
                                filename = os.path.basename(image)
-                               wx.CallAfter(self._indicatorWindow.showBusy, 'Uploading image %s...' % (filename))
+                               wx.CallAfter(self._indicatorWindow.showBusy, _("Uploading image %s...") % (filename))
                                with open(image, "rb") as f:
                                        if self._ym.createImage(id, filename, f.read()) is None:
-                                               wx.MessageBox('Failed to upload %s!' % (filename), 'YouMagine error.', wx.OK | wx.ICON_ERROR)
+                                               wx.MessageBox(_("Failed to upload %s!") % (filename), _("YouMagine error."), wx.OK | wx.ICON_ERROR)
                        elif type(image) is wx.Bitmap:
                                s = StringIO.StringIO()
                                if wx.ImageFromBitmap(image).SaveStream(s, wx.BITMAP_TYPE_JPEG):
                                        if self._ym.createImage(id, "snapshot.jpg", s.getvalue()) is None:
-                                               wx.MessageBox('Failed to upload snapshot!', 'YouMagine error.', wx.OK | wx.ICON_ERROR)
+                                               wx.MessageBox(_("Failed to upload snapshot!"), _("YouMagine error."), wx.OK | wx.ICON_ERROR)
                        else:
                                print type(image)
 
                if publish:
-                       wx.CallAfter(self._indicatorWindow.showBusy, 'Publishing design...')
+                       wx.CallAfter(self._indicatorWindow.showBusy, _("Publishing design..."))
                        if not self._ym.publishDesign(id):
                                #If publishing failed try again after 1 second, this might help when you need to wait for the renderer. But does not always work.
                                time.sleep(1)
@@ -227,16 +227,16 @@ class getAuthorizationWindow(wx.Frame):
                self._ym = ym
                self.abort = False
 
-               self._requestButton = wx.Button(self._panel, -1, 'Request authorization from YouMagine')
-               self._authToken = wx.TextCtrl(self._panel, -1, 'Paste token here')
+               self._requestButton = wx.Button(self._panel, -1, _("Request authorization from YouMagine"))
+               self._authToken = wx.TextCtrl(self._panel, -1, _("Paste token here"))
 
                self._panel._sizer = wx.GridBagSizer(5, 5)
                self._panel.SetSizer(self._panel._sizer)
 
                self._panel._sizer.Add(wx.StaticBitmap(self._panel, -1, wx.Bitmap(getPathForImage('youmagine-text.png'))), (0,0), span=(1,4), flag=wx.ALIGN_CENTRE | wx.ALL, border=5)
-               self._panel._sizer.Add(wx.StaticText(self._panel, -1, 'To share your designs on YouMagine\nyou need an account on YouMagine.com\nand authorize Cura to access your account.'), (1, 1))
+               self._panel._sizer.Add(wx.StaticText(self._panel, -1, _("To share your designs on YouMagine\nyou need an account on YouMagine.com\nand authorize Cura to access your account.")), (1, 1))
                self._panel._sizer.Add(self._requestButton, (2, 1), flag=wx.ALL)
-               self._panel._sizer.Add(wx.StaticText(self._panel, -1, 'This will open a browser window where you can\nauthorize Cura to access your YouMagine account.\nYou can revoke access at any time\nfrom YouMagine.com'), (3, 1), flag=wx.ALL)
+               self._panel._sizer.Add(wx.StaticText(self._panel, -1, _("This will open a browser window where you can\nauthorize Cura to access your YouMagine account.\nYou can revoke access at any time\nfrom YouMagine.com")), (3, 1), flag=wx.ALL)
                self._panel._sizer.Add(wx.StaticLine(self._panel, -1), (4,0), span=(1,4), flag=wx.EXPAND | wx.ALL)
                self._panel._sizer.Add(self._authToken, (5, 1), flag=wx.EXPAND | wx.ALL)
                self._panel._sizer.Add(wx.StaticLine(self._panel, -1), (6,0), span=(1,4), flag=wx.EXPAND | wx.ALL)
@@ -271,12 +271,12 @@ class newDesignWindow(wx.Frame):
 
                categoryOptions = ym.getCategories()
                licenseOptions = ym.getLicenses()
-               self._designName = wx.TextCtrl(p, -1, 'Design name')
+               self._designName = wx.TextCtrl(p, -1, _("Design name"))
                self._designDescription = wx.TextCtrl(p, -1, '', size=(1, 150), style = wx.TE_MULTILINE)
                self._designLicense = wx.ComboBox(p, -1, licenseOptions[0], choices=licenseOptions, style=wx.CB_DROPDOWN|wx.CB_READONLY)
                self._category = wx.ComboBox(p, -1, categoryOptions[-1], choices=categoryOptions, style=wx.CB_DROPDOWN|wx.CB_READONLY)
-               self._publish = wx.CheckBox(p, -1, 'Publish after upload')
-               self._shareButton = wx.Button(p, -1, 'Upload')
+               self._publish = wx.CheckBox(p, -1, _("Publish after upload"))
+               self._shareButton = wx.Button(p, -1, _("Upload"))
                self._imageScroll = wx.lib.scrolledpanel.ScrolledPanel(p)
                self._additionalFiles = wx.CheckListBox(p, -1)
                self._additionalFiles.InsertItems(getAdditionalFiles(self._manager._scene.objects(), True), 0)
@@ -284,34 +284,35 @@ class newDesignWindow(wx.Frame):
                self._additionalFiles.InsertItems(getAdditionalFiles(self._manager._scene.objects(), False), self._additionalFiles.GetCount())
 
                self._imageScroll.SetSizer(wx.BoxSizer(wx.HORIZONTAL))
-               self._addImageButton = wx.Button(self._imageScroll, -1, 'Add...', size=(70,52))
+               self._addImageButton = wx.Button(self._imageScroll, -1, _("Add..."), size=(70,52))
                self._imageScroll.GetSizer().Add(self._addImageButton)
-               self._snapshotButton = wx.Button(self._imageScroll, -1, 'Webcam...', size=(70,52))
+               self._snapshotButton = wx.Button(self._imageScroll, -1, _("Webcam..."), size=(70,52))
                self._imageScroll.GetSizer().Add(self._snapshotButton)
                self._imageScroll.Fit()
                self._imageScroll.SetupScrolling(scroll_x=True, scroll_y=False)
                self._imageScroll.SetMinSize((20, self._imageScroll.GetSize()[1] + wx.SystemSettings_GetMetric(wx.SYS_HSCROLL_Y)))
 
                self._publish.SetValue(True)
-               self._publish.SetToolTipString('Directly publish the design after uploading.\nWithout this check the design will not be public\nuntil you publish it yourself on YouMagine.com')
+               self._publish.SetToolTipString(
+                       _("Directly publish the design after uploading.\nWithout this check the design will not be public\nuntil you publish it yourself on YouMagine.com"))
 
                s = wx.GridBagSizer(5, 5)
                p.SetSizer(s)
 
                s.Add(wx.StaticBitmap(p, -1, wx.Bitmap(getPathForImage('youmagine-text.png'))), (0,0), span=(1,3), flag=wx.ALIGN_CENTRE | wx.ALL, border=5)
-               s.Add(wx.StaticText(p, -1, 'Design name:'), (1, 0), flag=wx.LEFT|wx.TOP, border=5)
+               s.Add(wx.StaticText(p, -1, _("Design name:")), (1, 0), flag=wx.LEFT|wx.TOP, border=5)
                s.Add(self._designName, (1, 1), span=(1,2), flag=wx.EXPAND|wx.LEFT|wx.TOP|wx.RIGHT, border=5)
-               s.Add(wx.StaticText(p, -1, 'Description:'), (2, 0), flag=wx.LEFT|wx.TOP, border=5)
+               s.Add(wx.StaticText(p, -1, _("Description:")), (2, 0), flag=wx.LEFT|wx.TOP, border=5)
                s.Add(self._designDescription, (2, 1), span=(1,2), flag=wx.EXPAND|wx.LEFT|wx.TOP|wx.RIGHT, border=5)
-               s.Add(wx.StaticText(p, -1, 'Category:'), (3, 0), flag=wx.LEFT|wx.TOP, border=5)
+               s.Add(wx.StaticText(p, -1, _("Category:")), (3, 0), flag=wx.LEFT|wx.TOP, border=5)
                s.Add(self._category, (3, 1), span=(1,2), flag=wx.EXPAND|wx.LEFT|wx.TOP|wx.RIGHT, border=5)
-               s.Add(wx.StaticText(p, -1, 'License:'), (4, 0), flag=wx.LEFT|wx.TOP, border=5)
+               s.Add(wx.StaticText(p, -1, _("License:")), (4, 0), flag=wx.LEFT|wx.TOP, border=5)
                s.Add(self._designLicense, (4, 1), span=(1,2), flag=wx.EXPAND|wx.LEFT|wx.TOP|wx.RIGHT, border=5)
                s.Add(wx.StaticLine(p, -1), (5,0), span=(1,3), flag=wx.EXPAND|wx.ALL)
-               s.Add(wx.StaticText(p, -1, 'Images:'), (6, 0), flag=wx.LEFT|wx.TOP, border=5)
+               s.Add(wx.StaticText(p, -1, _("Images:")), (6, 0), flag=wx.LEFT|wx.TOP, border=5)
                s.Add(self._imageScroll, (6, 1), span=(1, 2), flag=wx.EXPAND|wx.LEFT|wx.TOP|wx.RIGHT, border=5)
                s.Add(wx.StaticLine(p, -1), (7,0), span=(1,3), flag=wx.EXPAND|wx.ALL)
-               s.Add(wx.StaticText(p, -1, 'Design files:'), (8, 0), flag=wx.LEFT|wx.TOP, border=5)
+               s.Add(wx.StaticText(p, -1, _("Design files:")), (8, 0), flag=wx.LEFT|wx.TOP, border=5)
                s.Add(self._additionalFiles, (8, 1), span=(1, 2), flag=wx.EXPAND|wx.LEFT|wx.TOP|wx.RIGHT, border=5)
                s.Add(wx.StaticLine(p, -1), (9,0), span=(1,3), flag=wx.EXPAND|wx.ALL)
                s.Add(self._shareButton, (10, 1), flag=wx.BOTTOM, border=15)
@@ -333,11 +334,11 @@ class newDesignWindow(wx.Frame):
 
        def OnShare(self, e):
                if self._designName.GetValue() == '':
-                       wx.MessageBox('The name cannot be empty', 'New design error.', wx.OK | wx.ICON_ERROR)
+                       wx.MessageBox(_("The name cannot be empty"), _("New design error."), wx.OK | wx.ICON_ERROR)
                        self._designName.SetFocus()
                        return
                if self._designDescription.GetValue() == '':
-                       wx.MessageBox('The description cannot be empty', 'New design error.', wx.OK | wx.ICON_ERROR)
+                       wx.MessageBox(_("The description cannot be empty"), _("New design error."), wx.OK | wx.ICON_ERROR)
                        self._designDescription.SetFocus()
                        return
                imageList = []
index abbcf1984fd21d9b9edeae98d50249c68476d6f6..3d105179dcdf431c79311b8b0252d44c6466cecf 100644 (file)
@@ -236,14 +236,14 @@ class glGuiPanel(glcanvas.GLCanvas):
                                opengl.glDrawStringLeft("fps:%d" % (1 / renderTime))
                        self.SwapBuffers()
                except:
-                       errStr = 'An error has occurred during the 3D view drawing.'
+                       errStr = _("An error has occurred during the 3D view drawing.")
                        tb = traceback.extract_tb(sys.exc_info()[2])
                        errStr += "\n%s: '%s'" % (str(sys.exc_info()[0].__name__), str(sys.exc_info()[1]))
                        for n in xrange(len(tb)-1, -1, -1):
                                locationInfo = tb[n]
                                errStr += "\n @ %s:%s:%d" % (os.path.basename(locationInfo[0]), locationInfo[2], locationInfo[1])
                        if not self._shownError:
-                               wx.CallAfter(wx.MessageBox, errStr, '3D window error', wx.OK | wx.ICON_EXCLAMATION)
+                               wx.CallAfter(wx.MessageBox, errStr, _("3D window error"), wx.OK | wx.ICON_EXCLAMATION)
                                self._shownError = True
 
        def _drawGui(self):
diff --git a/Cura/resources/locale/Cura.in b/Cura/resources/locale/Cura.in
new file mode 100644 (file)
index 0000000..28d2d47
--- /dev/null
@@ -0,0 +1,13 @@
+gui/app.py
+gui/tools/batchRun.py
+gui/configWizard.py
+gui/firmwareInstall.py
+gui/mainWindow.py
+gui/util/openglGui.py
+gui/pluginPanel.py
+gui/preferencesDialog.py
+gui/printWindow.py
+gui/sceneView.py
+gui/simpleMode.py
+gui/tools/youmagineGui.py
+util/profile.py
diff --git a/Cura/resources/locale/Cura.pot b/Cura/resources/locale/Cura.pot
new file mode 100644 (file)
index 0000000..28d0e9e
--- /dev/null
@@ -0,0 +1,1786 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2013
+# This file is distributed under the same license as the Cura package.
+# Ilya Kulakov <kulakov.ilya@gmail.com>, 2013.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Cura\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-09-15 15:40+0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: gui/app.py:82 gui/mainWindow.py:413
+msgid "A new version of Cura is available, would you like to download?"
+msgstr ""
+
+#: gui/app.py:82 gui/mainWindow.py:413
+msgid "New version available"
+msgstr ""
+
+#: gui/tools/batchRun.py:14
+msgid "Cura - Batch run"
+msgstr ""
+
+#: gui/tools/batchRun.py:29
+msgid "Add"
+msgstr ""
+
+#: gui/tools/batchRun.py:30
+msgid "Remove"
+msgstr ""
+
+#: gui/tools/batchRun.py:31
+msgid "Prepare all"
+msgstr ""
+
+#: gui/tools/batchRun.py:47
+msgid "Open file to batch prepare"
+msgstr ""
+
+#: gui/tools/batchRun.py:134
+#, possible-python-format
+msgid "Building: %d                           "
+msgstr ""
+
+#: gui/tools/batchRun.py:137
+#, possible-python-format
+msgid "Done: 0/%d                           "
+msgstr ""
+
+#: gui/tools/batchRun.py:140
+msgid "Abort"
+msgstr ""
+
+#: gui/tools/batchRun.py:163 gui/tools/batchRun.py:233
+msgid "Close"
+msgstr ""
+
+#: gui/tools/batchRun.py:187
+#, possible-python-format
+msgid "Build: %d models"
+msgstr ""
+
+#: gui/tools/batchRun.py:188
+#, possible-python-format
+msgid ""
+"\n"
+"Slicing took: %(hours)02d:%(minutes)02d"
+msgstr ""
+
+#: gui/tools/batchRun.py:198
+#, possible-python-format
+msgid "Building: [%(index)d/%(size)d]"
+msgstr ""
+
+#: gui/tools/batchRun.py:214
+msgid "Aborted by user."
+msgstr ""
+
+#: gui/tools/batchRun.py:228
+#, possible-python-format
+msgid "Done %(index)d/%(size)d"
+msgstr ""
+
+#: gui/tools/batchRun.py:236
+msgid "To SDCard"
+msgstr ""
+
+#: gui/configWizard.py:218
+msgid "First time run wizard"
+msgstr ""
+
+#: gui/configWizard.py:219
+msgid "Welcome, and thanks for trying Cura!"
+msgstr ""
+
+#: gui/configWizard.py:221
+msgid "This wizard will help you with the following steps:"
+msgstr ""
+
+#: gui/configWizard.py:222
+msgid "* Configure Cura for your machine"
+msgstr ""
+
+#: gui/configWizard.py:223
+msgid "* Upgrade your firmware"
+msgstr ""
+
+#: gui/configWizard.py:224
+msgid "* Check if your machine is working safely"
+msgstr ""
+
+#: gui/configWizard.py:225
+msgid "* Level your printer bed"
+msgstr ""
+
+#: gui/configWizard.py:235
+msgid ""
+"RepRap machines are vastly different, and there is no\n"
+"default configuration in Cura for any of them."
+msgstr ""
+
+#: gui/configWizard.py:236
+msgid ""
+"If you like a default profile for your machine added,\n"
+"then make an issue on github."
+msgstr ""
+
+#: gui/configWizard.py:238
+msgid "You will have to manually install Marlin or Sprinter firmware."
+msgstr ""
+
+#: gui/configWizard.py:240
+msgid "Machine width (mm)"
+msgstr ""
+
+#: gui/configWizard.py:241
+msgid "Machine depth (mm)"
+msgstr ""
+
+#: gui/configWizard.py:242
+msgid "Machine height (mm)"
+msgstr ""
+
+#: gui/configWizard.py:243 util/profile.py:119
+msgid "Nozzle size (mm)"
+msgstr ""
+
+#: gui/configWizard.py:244
+msgid "Heated bed"
+msgstr ""
+
+#: gui/configWizard.py:245
+msgid "Bed center is 0,0,0 (RoStock)"
+msgstr ""
+
+#: gui/configWizard.py:264
+msgid "Select your machine"
+msgstr ""
+
+#: gui/configWizard.py:265
+msgid "What kind of machine do you have:"
+msgstr ""
+
+#: gui/configWizard.py:270
+msgid "Other (Ex: RepRap)"
+msgstr ""
+
+#: gui/configWizard.py:273
+msgid ""
+"The collection of anonymous usage information helps with the continued "
+"improvement of Cura."
+msgstr ""
+
+#: gui/configWizard.py:274
+msgid ""
+"This does NOT submit your models online nor gathers any privacy related "
+"information."
+msgstr ""
+
+#: gui/configWizard.py:275
+msgid "Submit anonymous usage information:"
+msgstr ""
+
+#: gui/configWizard.py:276
+msgid "For full details see: http://wiki.ultimaker.com/Cura:stats"
+msgstr ""
+
+#: gui/configWizard.py:313
+msgid "Select upgraded parts you have"
+msgstr ""
+
+#: gui/configWizard.py:314
+msgid ""
+"To assist you in having better default settings for your Ultimaker\n"
+"Cura would like to know which upgrades you have in your machine."
+msgstr ""
+
+#: gui/configWizard.py:316
+msgid "Extruder drive upgrade"
+msgstr ""
+
+#: gui/configWizard.py:317
+msgid "Heated printer bed (self built)"
+msgstr ""
+
+#: gui/configWizard.py:318
+msgid "Dual extrusion (experimental)"
+msgstr ""
+
+#: gui/configWizard.py:320
+msgid ""
+"If you have an Ultimaker bought after october 2012 you will have the\n"
+"Extruder drive upgrade. If you do not have this upgrade,\n"
+"it is highly recommended to improve reliability."
+msgstr ""
+
+#: gui/configWizard.py:321
+msgid ""
+"This upgrade can be bought from the Ultimaker webshop\n"
+"or found on thingiverse as thing:26094"
+msgstr ""
+
+#: gui/configWizard.py:341
+msgid ""
+"Firmware is the piece of software running directly on your 3D printer.\n"
+"This firmware controls the step motors, regulates the temperature\n"
+"and ultimately makes your printer work."
+msgstr ""
+
+#: gui/configWizard.py:343
+msgid ""
+"The firmware shipping with new Ultimakers works, but upgrades\n"
+"have been made to make better prints, and make calibration easier."
+msgstr ""
+
+#: gui/configWizard.py:345
+msgid ""
+"Cura requires these new features and thus\n"
+"your firmware will most likely need to be upgraded.\n"
+"You will get the chance to do so now."
+msgstr ""
+
+#: gui/configWizard.py:350
+msgid "Do not upgrade to this firmware if:"
+msgstr ""
+
+#: gui/configWizard.py:351
+msgid "* You have an older machine based on ATMega1280"
+msgstr ""
+
+#: gui/configWizard.py:352
+msgid "* Have other changes in the firmware"
+msgstr ""
+
+#: gui/configWizard.py:387
+msgid ""
+"It is a good idea to do a few sanity checks now on your Ultimaker.\n"
+"You can skip these if you know your machine is functional."
+msgstr ""
+
+#: gui/configWizard.py:388
+msgid "Run checks"
+msgstr ""
+
+#: gui/configWizard.py:388
+msgid "Skip checks"
+msgstr ""
+
+#: gui/configWizard.py:392
+msgid "Communication:"
+msgstr ""
+
+#: gui/configWizard.py:393
+msgid "Temperature:"
+msgstr ""
+
+#: gui/configWizard.py:394
+msgid "Endstops:"
+msgstr ""
+
+#: gui/configWizard.py:399
+msgid "Show error log"
+msgstr ""
+
+#: gui/configWizard.py:433
+msgid "Connecting to machine."
+msgstr ""
+
+#: gui/configWizard.py:454
+msgid "Cooldown before temperature check."
+msgstr ""
+
+#: gui/configWizard.py:460 gui/configWizard.py:467
+msgid "Checking the heater and temperature sensor."
+msgstr ""
+
+#: gui/configWizard.py:478
+msgid "Please make sure none of the endstops are pressed."
+msgstr ""
+
+#: gui/configWizard.py:491
+msgid "Temperature measurement FAILED!"
+msgstr ""
+
+#: gui/configWizard.py:496
+#, possible-python-format
+msgid "Head temperature: %d"
+msgstr ""
+
+#: gui/configWizard.py:503 gui/configWizard.py:512
+#, possible-python-format
+msgid "Communication State: %s"
+msgstr ""
+
+#: gui/configWizard.py:506
+msgid "Failed to establish connection with the printer."
+msgstr ""
+
+#: gui/configWizard.py:551
+msgid "Please press the right X endstop."
+msgstr ""
+
+#: gui/configWizard.py:556
+msgid "Please press the left X endstop."
+msgstr ""
+
+#: gui/configWizard.py:561
+msgid "Please press the front Y endstop."
+msgstr ""
+
+#: gui/configWizard.py:566
+msgid "Please press the back Y endstop."
+msgstr ""
+
+#: gui/configWizard.py:571
+msgid "Please press the top Z endstop."
+msgstr ""
+
+#: gui/configWizard.py:576
+msgid "Please press the bottom Z endstop."
+msgstr ""
+
+#: gui/configWizard.py:582
+msgid "Checkup finished"
+msgstr ""
+
+#: gui/configWizard.py:625
+msgid "Calibrating the Steps Per E requires some manual actions."
+msgstr ""
+
+#: gui/configWizard.py:626
+msgid "First remove any filament from your machine."
+msgstr ""
+
+#: gui/configWizard.py:627
+msgid ""
+"Next put in your filament so the tip is aligned with the\n"
+"top of the extruder drive."
+msgstr ""
+
+#: gui/configWizard.py:628
+msgid "We'll push the filament 100mm"
+msgstr ""
+
+#: gui/configWizard.py:629
+msgid "Extrude 100mm filament"
+msgstr ""
+
+#: gui/configWizard.py:630
+msgid ""
+"Now measure the amount of extruded filament:\n"
+"(this can be more or less then 100mm)"
+msgstr ""
+
+#: gui/configWizard.py:631
+msgid "Save"
+msgstr ""
+
+#: gui/configWizard.py:632
+msgid "This results in the following steps per E:"
+msgstr ""
+
+#: gui/configWizard.py:634
+msgid "You can repeat these steps to get better calibration."
+msgstr ""
+
+#: gui/configWizard.py:637
+msgid ""
+"If you still have filament in your printer which needs\n"
+"heat to remove, press the heat up button below:"
+msgstr ""
+
+#: gui/configWizard.py:638
+msgid "Heatup for filament removal"
+msgstr ""
+
+#: gui/configWizard.py:661 gui/configWizard.py:693
+msgid ""
+"Error: Failed to open serial port to machine\n"
+"If this keeps happening, try disconnecting and reconnecting the USB cable"
+msgstr ""
+
+#: gui/firmwareInstall.py:39
+msgid ""
+"I am sorry, but Cura does not ship with a default firmware for your machine "
+"configuration."
+msgstr ""
+
+#: gui/firmwareInstall.py:39 gui/firmwareInstall.py:98 gui/mainWindow.py:375
+msgid "Firmware update"
+msgstr ""
+
+#: gui/firmwareInstall.py:49
+msgid "OK"
+msgstr ""
+
+#: gui/firmwareInstall.py:68
+msgid "Reading firmware..."
+msgstr ""
+
+#: gui/firmwareInstall.py:70
+msgid "Connecting to machine..."
+msgstr ""
+
+#: gui/firmwareInstall.py:87
+msgid "Uploading firmware..."
+msgstr ""
+
+#: gui/firmwareInstall.py:90
+#, possible-python-format
+msgid ""
+"Done!\n"
+"Installed firmware: %s"
+msgstr ""
+
+#: gui/firmwareInstall.py:92
+msgid "Failed to write firmware.\n"
+msgstr ""
+
+#: gui/firmwareInstall.py:97
+msgid ""
+"Failed to find machine for firmware upgrade\n"
+"Is your machine connected to the PC?"
+msgstr ""
+
+#: gui/mainWindow.py:55
+msgid "Load model file...\tCTRL+L"
+msgstr ""
+
+#: gui/mainWindow.py:57
+msgid "Save model...\tCTRL+S"
+msgstr ""
+
+#: gui/mainWindow.py:59
+msgid "Clear platform"
+msgstr ""
+
+#: gui/mainWindow.py:63
+msgid "Print...\tCTRL+P"
+msgstr ""
+
+#: gui/mainWindow.py:65 gui/sceneView.py:195
+msgid "Save GCode..."
+msgstr ""
+
+#: gui/mainWindow.py:67
+msgid "Show slice engine log..."
+msgstr ""
+
+#: gui/mainWindow.py:71
+msgid "Open Profile..."
+msgstr ""
+
+#: gui/mainWindow.py:74
+msgid "Save Profile..."
+msgstr ""
+
+#: gui/mainWindow.py:77
+msgid "Load Profile from GCode..."
+msgstr ""
+
+#: gui/mainWindow.py:81
+msgid "Reset Profile to default"
+msgstr ""
+
+#: gui/mainWindow.py:86
+msgid "Preferences...\tCTRL+,"
+msgstr ""
+
+#: gui/mainWindow.py:92
+msgid "&Recent Model Files"
+msgstr ""
+
+#: gui/mainWindow.py:99
+msgid "&Recent Profile Files"
+msgstr ""
+
+#: gui/mainWindow.py:105
+msgid "Quit"
+msgstr ""
+
+#: gui/mainWindow.py:107
+msgid "&File"
+msgstr ""
+
+#: gui/mainWindow.py:110
+msgid "Switch to quickprint..."
+msgstr ""
+
+#: gui/mainWindow.py:113
+msgid "Switch to full settings..."
+msgstr ""
+
+#: gui/mainWindow.py:121
+msgid "Minecraft import..."
+msgstr ""
+
+#: gui/mainWindow.py:124
+msgid "PID Debugger..."
+msgstr ""
+
+#: gui/mainWindow.py:126
+msgid "Tools"
+msgstr ""
+
+#: gui/mainWindow.py:129
+msgid "Open expert settings..."
+msgstr ""
+
+#: gui/mainWindow.py:134
+msgid "Install default Marlin firmware"
+msgstr ""
+
+#: gui/mainWindow.py:136
+msgid "Install custom firmware"
+msgstr ""
+
+#: gui/mainWindow.py:139
+msgid "Run first run wizard..."
+msgstr ""
+
+#: gui/mainWindow.py:141
+msgid "Run bed leveling wizard..."
+msgstr ""
+
+#: gui/mainWindow.py:144
+msgid "Run head offset wizard..."
+msgstr ""
+
+#: gui/mainWindow.py:146
+msgid "Expert"
+msgstr ""
+
+#: gui/mainWindow.py:149
+msgid "Online documentation..."
+msgstr ""
+
+#: gui/mainWindow.py:151
+msgid "Report a problem..."
+msgstr ""
+
+#: gui/mainWindow.py:153
+msgid "Check for update..."
+msgstr ""
+
+#: gui/mainWindow.py:155
+msgid "Open YouMagine website..."
+msgstr ""
+
+#: gui/mainWindow.py:157
+msgid "About Cura..."
+msgstr ""
+
+#: gui/mainWindow.py:159
+msgid "Help"
+msgstr ""
+
+#: gui/mainWindow.py:318
+msgid "Select profile file to load"
+msgstr ""
+
+#: gui/mainWindow.py:330
+msgid "Select gcode file to load profile from"
+msgstr ""
+
+#: gui/mainWindow.py:343
+msgid ""
+"No profile found in GCode file.\n"
+"This feature only works with GCode files made by Cura 12.07 or newer."
+msgstr ""
+
+#: gui/mainWindow.py:343
+msgid "Profile load error"
+msgstr ""
+
+#: gui/mainWindow.py:347
+msgid "Select profile file to save"
+msgstr ""
+
+#: gui/mainWindow.py:355
+msgid ""
+"This will reset all profile settings to defaults.\n"
+"Unless you have saved your current profile, all settings will be lost!\n"
+"Do you really want to reset?"
+msgstr ""
+
+#: gui/mainWindow.py:355
+msgid "Profile reset"
+msgstr ""
+
+#: gui/mainWindow.py:375
+msgid ""
+"Warning: Installing a custom firmware does not guarantee that you machine "
+"will function correctly, and could damage your machine."
+msgstr ""
+
+#: gui/mainWindow.py:376
+msgid "Open firmware to upload"
+msgstr ""
+
+#: gui/mainWindow.py:416
+msgid "You are running the latest version of Cura!"
+msgstr ""
+
+#: gui/mainWindow.py:416
+msgid "Awesome!"
+msgstr ""
+
+#: gui/mainWindow.py:421
+msgid "End solution for Open Source Fused Filament Fabrication 3D printing."
+msgstr ""
+
+#: gui/mainWindow.py:423
+msgid "Copyright (C) David Braam"
+msgstr ""
+
+#: gui/util/openglGui.py:239
+msgid "An error has occurred during the 3D view drawing."
+msgstr ""
+
+#: gui/util/openglGui.py:246
+msgid "3D window error"
+msgstr ""
+
+#: gui/pluginPanel.py:26
+msgid "Plugins:"
+msgstr ""
+
+#: gui/pluginPanel.py:30
+msgid "Open plugin location"
+msgstr ""
+
+#: gui/pluginPanel.py:31
+msgid "Enabled plugins"
+msgstr ""
+
+#: gui/pluginPanel.py:133
+msgid "You need to select a plugin before you can add anything."
+msgstr ""
+
+#: gui/pluginPanel.py:133
+msgid "Error: no plugin selected"
+msgstr ""
+
+#: gui/preferencesDialog.py:23
+msgid "Machine settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:32
+msgid "Printer head size"
+msgstr ""
+
+#: gui/preferencesDialog.py:40
+#, possible-python-format
+msgid "Extruder %d"
+msgstr ""
+
+#: gui/preferencesDialog.py:44
+msgid "Colours"
+msgstr ""
+
+#: gui/preferencesDialog.py:49
+msgid "Filament settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:54
+msgid "Communication settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:63
+msgid "Cura settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:77
+msgid ""
+"After changing the amount of extruders you need to restart Cura for full "
+"effect."
+msgstr ""
+
+#: gui/preferencesDialog.py:77
+msgid "Extruder amount warning."
+msgstr ""
+
+#: gui/printWindow.py:127
+msgid "Printing"
+msgstr ""
+
+#: gui/printWindow.py:156
+msgid "Statistics"
+msgstr ""
+
+#: gui/printWindow.py:161
+msgid ""
+"Your computer is running on battery power.\n"
+"Connect your computer to AC power or your print might not finish."
+msgstr ""
+
+#: gui/printWindow.py:172
+msgid ""
+"Filament: ####.##m #.##g\n"
+"Estimated print time: #####:##\n"
+"Machine state:\n"
+"Detecting baudrateXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+msgstr ""
+
+#: gui/printWindow.py:177
+msgid "Connect"
+msgstr ""
+
+#: gui/printWindow.py:179 gui/sceneView.py:64 gui/sceneView.py:745
+msgid "Print"
+msgstr ""
+
+#: gui/printWindow.py:180 gui/printWindow.py:417
+msgid "Pause"
+msgstr ""
+
+#: gui/printWindow.py:181
+msgid "Cancel print"
+msgstr ""
+
+#: gui/printWindow.py:182
+msgid "Error log"
+msgstr ""
+
+#: gui/printWindow.py:203
+msgid "BedTemp:"
+msgstr ""
+
+#: gui/printWindow.py:211
+msgid "Temp:"
+msgstr ""
+
+#: gui/printWindow.py:259
+msgid "Jog"
+msgstr ""
+
+#: gui/printWindow.py:274
+msgid "Outer wall:"
+msgstr ""
+
+#: gui/printWindow.py:277
+msgid "Inner wall:"
+msgstr ""
+
+#: gui/printWindow.py:280
+msgid "Fill:"
+msgstr ""
+
+#: gui/printWindow.py:283
+msgid "Support:"
+msgstr ""
+
+#: gui/printWindow.py:287
+msgid "Speed"
+msgstr ""
+
+#: gui/printWindow.py:305
+msgid "Term"
+msgstr ""
+
+#: gui/printWindow.py:312
+msgid "Enable timelapse movie recording"
+msgstr ""
+
+#: gui/printWindow.py:326
+msgid "Show preview"
+msgstr ""
+
+#: gui/printWindow.py:332
+msgid "Camera"
+msgstr ""
+
+#: gui/printWindow.py:415
+msgid "Resume"
+msgstr ""
+
+#: gui/printWindow.py:432
+msgid "Loading gcode...\n"
+msgstr ""
+
+#: gui/printWindow.py:434
+#, possible-python-format
+msgid "Filament: %(amount).2fm %(weight).2fg\n"
+msgstr ""
+
+#: gui/printWindow.py:438
+#, possible-python-format
+msgid "Filament cost: %s\n"
+msgstr ""
+
+#: gui/sceneView.py:63
+msgid "Load"
+msgstr ""
+
+#: gui/sceneView.py:68
+msgid "Rotate"
+msgstr ""
+
+#: gui/sceneView.py:69
+msgid "Scale"
+msgstr ""
+
+#: gui/sceneView.py:70
+msgid "Mirror"
+msgstr ""
+
+#: gui/sceneView.py:72 gui/sceneView.py:75
+msgid "Reset"
+msgstr ""
+
+#: gui/sceneView.py:73
+msgid "Lay flat"
+msgstr ""
+
+#: gui/sceneView.py:76
+msgid "To max"
+msgstr ""
+
+#: gui/sceneView.py:78
+msgid "Mirror X"
+msgstr ""
+
+#: gui/sceneView.py:79
+msgid "Mirror Y"
+msgstr ""
+
+#: gui/sceneView.py:80
+msgid "Mirror Z"
+msgstr ""
+
+#: gui/sceneView.py:88
+msgid "Scale X"
+msgstr ""
+
+#: gui/sceneView.py:90
+msgid "Scale Y"
+msgstr ""
+
+#: gui/sceneView.py:92
+msgid "Scale Z"
+msgstr ""
+
+#: gui/sceneView.py:94
+msgid "Size X (mm)"
+msgstr ""
+
+#: gui/sceneView.py:96
+msgid "Size Y (mm)"
+msgstr ""
+
+#: gui/sceneView.py:98
+msgid "Size Z (mm)"
+msgstr ""
+
+#: gui/sceneView.py:100
+msgid "Uniform scale"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "View mode"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Normal"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Overhang"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Transparent"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "X-Ray"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Layers"
+msgstr ""
+
+#: gui/sceneView.py:106
+msgid "Share on YouMagine"
+msgstr ""
+
+#: gui/sceneView.py:124
+msgid "Open 3D model"
+msgstr ""
+
+#: gui/sceneView.py:164
+msgid "Save 3D model"
+msgstr ""
+
+#: gui/sceneView.py:194
+msgid "Print with USB"
+msgstr ""
+
+#: gui/sceneView.py:196
+msgid "Slice engine log..."
+msgstr ""
+
+#: gui/sceneView.py:210 gui/sceneView.py:751
+msgid "Save toolpath"
+msgstr ""
+
+#: gui/sceneView.py:247
+msgid "The slicing engine reported the following"
+msgstr ""
+
+#: gui/sceneView.py:247
+msgid "Engine log..."
+msgstr ""
+
+#: gui/sceneView.py:617
+msgid "Delete"
+msgstr ""
+
+#: gui/sceneView.py:618
+msgid "Multiply"
+msgstr ""
+
+#: gui/sceneView.py:619
+msgid "Split"
+msgstr ""
+
+#: gui/sceneView.py:621
+msgid "Dual extrusion merge"
+msgstr ""
+
+#: gui/sceneView.py:623
+msgid "Delete all"
+msgstr ""
+
+#: gui/sceneView.py:748
+msgid "Toolpath to SD"
+msgstr ""
+
+#: gui/sceneView.py:1058
+msgid "Loading toolpath for visualization..."
+msgstr ""
+
+#: gui/sceneView.py:1109
+msgid "Overhang view not working due to lack of OpenGL shaders support."
+msgstr ""
+
+#: gui/simpleMode.py:20
+msgid "High quality print"
+msgstr ""
+
+#: gui/simpleMode.py:21
+msgid "Normal quality print"
+msgstr ""
+
+#: gui/simpleMode.py:22
+msgid "Fast low quality print"
+msgstr ""
+
+#: gui/simpleMode.py:23
+msgid "Thin walled cup or vase"
+msgstr ""
+
+#: gui/simpleMode.py:31
+msgid "Print support structure"
+msgstr ""
+
+#: gui/simpleMode.py:36
+msgid "Select a print type:"
+msgstr ""
+
+#: gui/simpleMode.py:46
+msgid "Material:"
+msgstr ""
+
+#: gui/simpleMode.py:50
+msgid "Diameter:"
+msgstr ""
+
+#: gui/simpleMode.py:56
+msgid "Other:"
+msgstr ""
+
+#: gui/simpleMode.py:117
+msgid "Exterior Only"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:79
+msgid "Checking token"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:83
+msgid "Failed to contact YouMagine.com"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:83 gui/tools/youmagineGui.py:116
+#: gui/tools/youmagineGui.py:133 gui/tools/youmagineGui.py:140
+#: gui/tools/youmagineGui.py:148 gui/tools/youmagineGui.py:153
+msgid "YouMagine error."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:100
+msgid "Cura is now authorized to share on YouMagine"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:100
+msgid "YouMagine."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:112
+msgid "Creating new design on YouMagine..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:116
+msgid "Failed to create a design, nothing uploaded!"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:120
+#, possible-python-format
+msgid "Building model %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:131
+#, possible-python-format
+msgid "Uploading model %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:133 gui/tools/youmagineGui.py:140
+#: gui/tools/youmagineGui.py:148
+#, possible-python-format
+msgid "Failed to upload %s!"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:137
+#, possible-python-format
+msgid "Uploading file %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:145
+#, possible-python-format
+msgid "Uploading image %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:153
+msgid "Failed to upload snapshot!"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:158
+msgid "Publishing design..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:230
+msgid "Request authorization from YouMagine"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:231
+msgid "Paste token here"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:237
+msgid ""
+"To share your designs on YouMagine\n"
+"you need an account on YouMagine.com\n"
+"and authorize Cura to access your account."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:239
+msgid ""
+"This will open a browser window where you can\n"
+"authorize Cura to access your YouMagine account.\n"
+"You can revoke access at any time\n"
+"from YouMagine.com"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:274
+msgid "Design name"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:278
+msgid "Publish after upload"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:279
+msgid "Upload"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:287
+msgid "Add..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:289
+msgid "Webcam..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:297
+msgid ""
+"Directly publish the design after uploading.\n"
+"Without this check the design will not be public\n"
+"until you publish it yourself on YouMagine.com"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:303
+msgid "Design name:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:305
+msgid "Description:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:307
+msgid "Category:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:309
+msgid "License:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:312
+msgid "Images:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:315
+msgid "Design files:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:337
+msgid "The name cannot be empty"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:337 gui/tools/youmagineGui.py:341
+msgid "New design error."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:341
+msgid "The description cannot be empty"
+msgstr ""
+
+#: util/profile.py:114
+msgid "Layer height (mm)"
+msgstr ""
+
+#: util/profile.py:114
+msgid ""
+"Layer height in millimeters.\n"
+"This is the most important setting to determine the quality of your print. "
+"Normal quality prints are 0.1mm, high quality is 0.06mm. You can go up to "
+"0.25mm with an Ultimaker for very fast prints at low quality."
+msgstr ""
+
+#: util/profile.py:115
+msgid "Shell thickness (mm)"
+msgstr ""
+
+#: util/profile.py:115
+msgid ""
+"Thickness of the outside shell in the horizontal direction.\n"
+"This is used in combination with the nozzle size to define the number\n"
+"of perimeter lines and the thickness of those perimeter lines."
+msgstr ""
+
+#: util/profile.py:116
+msgid "Enable retraction"
+msgstr ""
+
+#: util/profile.py:116
+msgid ""
+"Retract the filament when the nozzle is moving over a none-printed area. "
+"Details about the retraction can be configured in the advanced tab."
+msgstr ""
+
+#: util/profile.py:117
+msgid "Bottom/Top thickness (mm)"
+msgstr ""
+
+#: util/profile.py:117
+msgid ""
+"This controls the thickness of the bottom and top layers, the amount of "
+"solid layers put down is calculated by the layer thickness and this value.\n"
+"Having this value a multiple of the layer thickness makes sense. And keep it "
+"near your wall thickness to make an evenly strong part."
+msgstr ""
+
+#: util/profile.py:118
+msgid "Fill Density (%)"
+msgstr ""
+
+#: util/profile.py:118
+msgid ""
+"This controls how densely filled the insides of your print will be. For a "
+"solid part use 100%, for an empty part use 0%. A value around 20% is usually "
+"enough.\n"
+"This won't effect the outside of the print and only adjusts how strong the "
+"part becomes."
+msgstr ""
+
+#: util/profile.py:119
+msgid ""
+"The nozzle size is very important, this is used to calculate the line width "
+"of the infill, and used to calculate the amount of outside wall lines and "
+"thickness for the wall thickness you entered in the print settings."
+msgstr ""
+
+#: util/profile.py:120
+msgid "Print speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:120
+msgid ""
+"Speed at which printing happens. A well adjusted Ultimaker can reach 150mm/"
+"s, but for good quality prints you want to print slower. Printing speed "
+"depends on a lot of factors. So you will be experimenting with optimal "
+"settings for this."
+msgstr ""
+
+#: util/profile.py:121
+msgid "Printing temperature (C)"
+msgstr ""
+
+#: util/profile.py:121 util/profile.py:122 util/profile.py:123
+#: util/profile.py:124
+msgid ""
+"Temperature used for printing. Set at 0 to pre-heat yourself.\n"
+"For PLA a value of 210C is usually used.\n"
+"For ABS a value of 230C or higher is required."
+msgstr ""
+
+#: util/profile.py:122
+msgid "2nd nozzle temperature (C)"
+msgstr ""
+
+#: util/profile.py:123
+msgid "3th nozzle temperature (C)"
+msgstr ""
+
+#: util/profile.py:124
+msgid "4th nozzle temperature (C)"
+msgstr ""
+
+#: util/profile.py:125
+msgid "Bed temperature (C)"
+msgstr ""
+
+#: util/profile.py:125
+msgid ""
+"Temperature used for the heated printer bed. Set at 0 to pre-heat yourself."
+msgstr ""
+
+#: util/profile.py:126
+msgid "Support type"
+msgstr ""
+
+#: util/profile.py:126
+msgid ""
+"Type of support structure build.\n"
+"\"Touching buildplate\" is the most commonly used support setting.\n"
+"\n"
+"None does not do any support.\n"
+"Touching buildplate only creates support where the support structure will "
+"touch the build platform.\n"
+"Everywhere creates support even on top of parts of the model."
+msgstr ""
+
+#: util/profile.py:127
+msgid "Platform adhesion type"
+msgstr ""
+
+#: util/profile.py:127
+msgid ""
+"Different options that help in preventing corners from lifting due to "
+"warping.\n"
+"Brim adds a single layer thick flat area around your object which is easy to "
+"cut off afterwards, and the recommended option.\n"
+"Raft adds a thick raster at below the object and a thin interface between "
+"this and your object.\n"
+"(Note that enabling the brim or raft disables the skirt)"
+msgstr ""
+
+#: util/profile.py:128
+msgid "Support dual extrusion"
+msgstr ""
+
+#: util/profile.py:128
+msgid ""
+"Which extruder to use for support material, for break-away support you can "
+"use both extruders.\n"
+"But if one of the materials is more expensive then the other you could "
+"select an extruder to use for support material. This causes more extruder "
+"switches.\n"
+"You can also use the 2nd extruder for soluble support materials."
+msgstr ""
+
+#: util/profile.py:129
+msgid "Diameter (mm)"
+msgstr ""
+
+#: util/profile.py:129
+msgid ""
+"Diameter of your filament, as accurately as possible.\n"
+"If you cannot measure this value you will have to calibrate it, a higher "
+"number means less extrusion, a smaller number generates more extrusion."
+msgstr ""
+
+#: util/profile.py:130
+msgid "Diameter2 (mm)"
+msgstr ""
+
+#: util/profile.py:130
+msgid ""
+"Diameter of your filament for the 2nd nozzle. Use 0 to use the same diameter "
+"as for nozzle 1."
+msgstr ""
+
+#: util/profile.py:131
+msgid "Diameter3 (mm)"
+msgstr ""
+
+#: util/profile.py:131
+msgid ""
+"Diameter of your filament for the 3th nozzle. Use 0 to use the same diameter "
+"as for nozzle 1."
+msgstr ""
+
+#: util/profile.py:132
+msgid "Diameter4 (mm)"
+msgstr ""
+
+#: util/profile.py:132
+msgid ""
+"Diameter of your filament for the 4th nozzle. Use 0 to use the same diameter "
+"as for nozzle 1."
+msgstr ""
+
+#: util/profile.py:133
+msgid "Flow (%)"
+msgstr ""
+
+#: util/profile.py:133
+msgid ""
+"Flow compensation, the amount of material extruded is multiplied by this "
+"value"
+msgstr ""
+
+#: util/profile.py:134
+msgid "Speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:134
+msgid ""
+"Speed at which the filament is retracted, a higher retraction speed works "
+"better. But a very high retraction speed can lead to filament grinding."
+msgstr ""
+
+#: util/profile.py:135
+msgid "Distance (mm)"
+msgstr ""
+
+#: util/profile.py:135
+msgid ""
+"Amount of retraction, set at 0 for no retraction at all. A value of 4.5mm "
+"seems to generate good results."
+msgstr ""
+
+#: util/profile.py:136
+msgid "Dual extrusion switch amount (mm)"
+msgstr ""
+
+#: util/profile.py:136
+msgid ""
+"Amount of retraction when switching nozzle with dual-extrusion, set at 0 for "
+"no retraction at all. A value of 16.0mm seems to generate good results."
+msgstr ""
+
+#: util/profile.py:137
+msgid "Minimum travel (mm)"
+msgstr ""
+
+#: util/profile.py:137
+msgid ""
+"Minimum amount of travel needed for a retraction to happen at all. To make "
+"sure you do not get a lot of retractions in a small area."
+msgstr ""
+
+#: util/profile.py:138
+msgid "Enable combing"
+msgstr ""
+
+#: util/profile.py:138
+msgid ""
+"Combing is the act of avoiding holes in the print for the head to travel "
+"over. If combing is disabled the printer head moves straight from the start "
+"point to the end point and it will always retract."
+msgstr ""
+
+#: util/profile.py:139
+msgid "Minimal extrusion before retracting (mm)"
+msgstr ""
+
+#: util/profile.py:139
+msgid ""
+"The minimal amount of extrusion that needs to be done before retracting "
+"again if a retraction needs to happen before this minimal is reached the "
+"retraction is ignored.\n"
+"This avoids retraction a lot on the same piece of filament which flattens "
+"the filament and causes grinding issues."
+msgstr ""
+
+#: util/profile.py:140
+msgid "Initial layer thickness (mm)"
+msgstr ""
+
+#: util/profile.py:140
+msgid ""
+"Layer thickness of the bottom layer. A thicker bottom layer makes sticking "
+"to the bed easier. Set to 0.0 to have the bottom layer thickness the same as "
+"the other layers."
+msgstr ""
+
+#: util/profile.py:141
+msgid "Cut off object bottom (mm)"
+msgstr ""
+
+#: util/profile.py:141
+msgid ""
+"Sinks the object into the platform, this can be used for objects that do not "
+"have a flat bottom and thus create a too small first layer."
+msgstr ""
+
+#: util/profile.py:143
+msgid "Dual extrusion overlap (mm)"
+msgstr ""
+
+#: util/profile.py:143
+msgid ""
+"Add a certain amount of overlapping extrusion on dual-extrusion prints. This "
+"bonds the different colors better together."
+msgstr ""
+
+#: util/profile.py:144
+msgid "Travel speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:144
+msgid ""
+"Speed at which travel moves are done, a high quality build Ultimaker can "
+"reach speeds of 250mm/s. But some machines might miss steps then."
+msgstr ""
+
+#: util/profile.py:145
+msgid "Bottom layer speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:145
+msgid ""
+"Print speed for the bottom layer, you want to print the first layer slower "
+"so it sticks better to the printer bed."
+msgstr ""
+
+#: util/profile.py:146
+msgid "Infill speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:146
+msgid ""
+"Speed at which infill parts are printed. If set to 0 then the print speed is "
+"used for the infill. Printing the infill faster can greatly reduce printing, "
+"but this can negatively effect print quality.."
+msgstr ""
+
+#: util/profile.py:147
+msgid "Minimal layer time (sec)"
+msgstr ""
+
+#: util/profile.py:147
+msgid ""
+"Minimum time spend in a layer, gives the layer time to cool down before the "
+"next layer is put on top. If the layer will be placed down too fast the "
+"printer will slow down to make sure it has spend at least this amount of "
+"seconds printing this layer."
+msgstr ""
+
+#: util/profile.py:148
+msgid "Enable cooling fan"
+msgstr ""
+
+#: util/profile.py:148
+msgid ""
+"Enable the cooling fan during the print. The extra cooling from the cooling "
+"fan is essential during faster prints."
+msgstr ""
+
+#: util/profile.py:150
+msgid "Line count"
+msgstr ""
+
+#: util/profile.py:150
+msgid ""
+"The skirt is a line drawn around the object at the first layer. This helps "
+"to prime your extruder, and to see if the object fits on your platform.\n"
+"Setting this to 0 will disable the skirt. Multiple skirt lines can help "
+"priming your extruder better for small objects."
+msgstr ""
+
+#: util/profile.py:151
+msgid "Start distance (mm)"
+msgstr ""
+
+#: util/profile.py:151
+msgid ""
+"The distance between the skirt and the first layer.\n"
+"This is the minimal distance, multiple skirt lines will be put outwards from "
+"this distance."
+msgstr ""
+
+#: util/profile.py:152
+msgid "Minimal length (mm)"
+msgstr ""
+
+#: util/profile.py:152
+msgid ""
+"The minimal length of the skirt, if this minimal length is not reached it "
+"will add more skirt lines to reach this minimal lenght.\n"
+"Note: If the line count is set to 0 this is ignored."
+msgstr ""
+
+#: util/profile.py:155
+msgid "Fan on layer number"
+msgstr ""
+
+#: util/profile.py:155
+msgid ""
+"The layer at which the fan is turned on. The first layer is layer 0. The "
+"first layer can stick better if you turn on the fan on, on the 2nd layer."
+msgstr ""
+
+#: util/profile.py:156
+msgid "Fan speed min (%)"
+msgstr ""
+
+#: util/profile.py:156
+msgid ""
+"When the fan is turned on, it is enabled at this speed setting. If cool "
+"slows down the layer, the fan is adjusted between the min and max speed. "
+"Minimal fan speed is used if the layer is not slowed down due to cooling."
+msgstr ""
+
+#: util/profile.py:157
+msgid "Fan speed max (%)"
+msgstr ""
+
+#: util/profile.py:157
+msgid ""
+"When the fan is turned on, it is enabled at this speed setting. If cool "
+"slows down the layer, the fan is adjusted between the min and max speed. "
+"Maximal fan speed is used if the layer is slowed down due to cooling by more "
+"than 200%."
+msgstr ""
+
+#: util/profile.py:158
+msgid "Minimum speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:158
+msgid ""
+"The minimal layer time can cause the print to slow down so much it starts to "
+"ooze. The minimal feedrate protects against this. Even if a print gets slown "
+"down it will never be slower than this minimal speed."
+msgstr ""
+
+#: util/profile.py:159
+msgid "Cool head lift"
+msgstr ""
+
+#: util/profile.py:159
+msgid ""
+"Lift the head if the minimal speed is hit because of cool slowdown, and wait "
+"the extra time so the minimal layer time is always hit."
+msgstr ""
+
+#: util/profile.py:164
+msgid "Solid infill top"
+msgstr ""
+
+#: util/profile.py:164
+msgid ""
+"Create a solid top surface, if set to false the top is filled with the fill "
+"percentage. Useful for cups/vases."
+msgstr ""
+
+#: util/profile.py:165
+msgid "Solid infill bottom"
+msgstr ""
+
+#: util/profile.py:165
+msgid ""
+"Create a solid bottom surface, if set to false the bottom is filled with the "
+"fill percentage. Useful for buildings."
+msgstr ""
+
+#: util/profile.py:166
+msgid "Infill overlap (%)"
+msgstr ""
+
+#: util/profile.py:166
+msgid ""
+"Amount of overlap between the infill and the walls. There is a slight "
+"overlap with the walls and the infill so the walls connect firmly to the "
+"infill."
+msgstr ""
+
+#: util/profile.py:167
+msgid "Fill amount (%)"
+msgstr ""
+
+#: util/profile.py:167
+#, possible-python-format
+msgid ""
+"Amount of infill structure in the support material, less material gives "
+"weaker support which is easier to remove. 20% seems to be a good average."
+msgstr ""
+
+#: util/profile.py:168
+msgid "Distance X/Y (mm)"
+msgstr ""
+
+#: util/profile.py:168
+msgid ""
+"Distance of the support material from the print, in the X/Y directions.\n"
+"0.7mm gives a nice distance from the print so the support does not stick to "
+"the print."
+msgstr ""
+
+#: util/profile.py:169
+msgid "Distance Z (mm)"
+msgstr ""
+
+#: util/profile.py:169
+msgid ""
+"Distance from the top/bottom of the support to the print. A small gap here "
+"makes it easier to remove the support but makes the print a bit uglier.\n"
+"0.15mm gives a good seperation of the support material."
+msgstr ""
+
+#: util/profile.py:173
+msgid "Brim line amount"
+msgstr ""
+
+#: util/profile.py:173
+msgid ""
+"The amount of lines used for a brim, more lines means a larger brim which "
+"sticks better, but this also makes your effective print area smaller."
+msgstr ""
+
+#: util/profile.py:174
+msgid "Extra margin (mm)"
+msgstr ""
+
+#: util/profile.py:174
+msgid ""
+"If the raft is enabled, this is the extra raft area around the object which "
+"is also rafted. Increasing this margin will create a stronger raft while "
+"using more material and leaving less are for your print."
+msgstr ""
+
+#: util/profile.py:175
+msgid "Line spacing (mm)"
+msgstr ""
+
+#: util/profile.py:175
+msgid ""
+"When you are using the raft this is the distance between the centerlines of "
+"the raft line."
+msgstr ""
+
+#: util/profile.py:176
+msgid "Base thickness (mm)"
+msgstr ""
+
+#: util/profile.py:176
+msgid ""
+"When you are using the raft this is the thickness of the base layer which is "
+"put down."
+msgstr ""
+
+#: util/profile.py:177
+msgid "Base line width (mm)"
+msgstr ""
+
+#: util/profile.py:177
+msgid ""
+"When you are using the raft this is the width of the base layer lines which "
+"are put down."
+msgstr ""
+
+#: util/profile.py:178
+msgid "Interface thickness (mm)"
+msgstr ""
+
+#: util/profile.py:178
+msgid ""
+"When you are using the raft this is the thickness of the interface layer "
+"which is put down."
+msgstr ""
+
+#: util/profile.py:179
+msgid "Interface line width (mm)"
+msgstr ""
+
+#: util/profile.py:179
+msgid ""
+"When you are using the raft this is the width of the interface layer lines "
+"which are put down."
+msgstr ""
+
+#: util/profile.py:181
+msgid "Combine everything (Type-A)"
+msgstr ""
+
+#: util/profile.py:181 util/profile.py:182
+msgid ""
+"This expert option adds all parts of the model together. The result is "
+"usually that internal cavities disappear. Depending on the model this can be "
+"intended or not. Enabling this option is at your own risk. Type-A is "
+"depended on the model normals and tries to keep some internal holes intact. "
+"Type-B ignores all internal holes and only keeps the outside shape per layer."
+msgstr ""
+
+#: util/profile.py:182
+msgid "Combine everything (Type-B)"
+msgstr ""
+
+#: util/profile.py:183
+msgid "Keep open faces"
+msgstr ""
+
+#: util/profile.py:183
+msgid ""
+"This expert option keeps all the open bits of the model intact. Normally "
+"Cura tries to stitch up small holes and remove everything with big holes, "
+"but this option keeps bits that are not properly part of anything and just "
+"goes with whatever it is left. This option is usually not what you want, but "
+"it might enable you to slice models otherwise failing to produce proper "
+"paths.\n"
+"As with all \"Fix horrible\" options, results may vary and use at your own "
+"risk."
+msgstr ""
+
+#: util/profile.py:184
+msgid "Extensive stitching"
+msgstr ""
+
+#: util/profile.py:184
+msgid ""
+"Extrensive stitching tries to fix up open holes in the model by closing the "
+"hole with touching polygons. This algorthm is quite expensive and could "
+"introduce a lot of processing time.\n"
+"As with all \"Fix horrible\" options, results may vary and use at your own "
+"risk."
+msgstr ""
diff --git a/Cura/resources/locale/en/LC_MESSAGES/Cura.mo b/Cura/resources/locale/en/LC_MESSAGES/Cura.mo
new file mode 100644 (file)
index 0000000..84bf7e1
Binary files /dev/null and b/Cura/resources/locale/en/LC_MESSAGES/Cura.mo differ
diff --git a/Cura/resources/locale/en/LC_MESSAGES/Cura.po b/Cura/resources/locale/en/LC_MESSAGES/Cura.po
new file mode 100644 (file)
index 0000000..28d0e9e
--- /dev/null
@@ -0,0 +1,1786 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2013
+# This file is distributed under the same license as the Cura package.
+# Ilya Kulakov <kulakov.ilya@gmail.com>, 2013.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Cura\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-09-15 15:40+0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: gui/app.py:82 gui/mainWindow.py:413
+msgid "A new version of Cura is available, would you like to download?"
+msgstr ""
+
+#: gui/app.py:82 gui/mainWindow.py:413
+msgid "New version available"
+msgstr ""
+
+#: gui/tools/batchRun.py:14
+msgid "Cura - Batch run"
+msgstr ""
+
+#: gui/tools/batchRun.py:29
+msgid "Add"
+msgstr ""
+
+#: gui/tools/batchRun.py:30
+msgid "Remove"
+msgstr ""
+
+#: gui/tools/batchRun.py:31
+msgid "Prepare all"
+msgstr ""
+
+#: gui/tools/batchRun.py:47
+msgid "Open file to batch prepare"
+msgstr ""
+
+#: gui/tools/batchRun.py:134
+#, possible-python-format
+msgid "Building: %d                           "
+msgstr ""
+
+#: gui/tools/batchRun.py:137
+#, possible-python-format
+msgid "Done: 0/%d                           "
+msgstr ""
+
+#: gui/tools/batchRun.py:140
+msgid "Abort"
+msgstr ""
+
+#: gui/tools/batchRun.py:163 gui/tools/batchRun.py:233
+msgid "Close"
+msgstr ""
+
+#: gui/tools/batchRun.py:187
+#, possible-python-format
+msgid "Build: %d models"
+msgstr ""
+
+#: gui/tools/batchRun.py:188
+#, possible-python-format
+msgid ""
+"\n"
+"Slicing took: %(hours)02d:%(minutes)02d"
+msgstr ""
+
+#: gui/tools/batchRun.py:198
+#, possible-python-format
+msgid "Building: [%(index)d/%(size)d]"
+msgstr ""
+
+#: gui/tools/batchRun.py:214
+msgid "Aborted by user."
+msgstr ""
+
+#: gui/tools/batchRun.py:228
+#, possible-python-format
+msgid "Done %(index)d/%(size)d"
+msgstr ""
+
+#: gui/tools/batchRun.py:236
+msgid "To SDCard"
+msgstr ""
+
+#: gui/configWizard.py:218
+msgid "First time run wizard"
+msgstr ""
+
+#: gui/configWizard.py:219
+msgid "Welcome, and thanks for trying Cura!"
+msgstr ""
+
+#: gui/configWizard.py:221
+msgid "This wizard will help you with the following steps:"
+msgstr ""
+
+#: gui/configWizard.py:222
+msgid "* Configure Cura for your machine"
+msgstr ""
+
+#: gui/configWizard.py:223
+msgid "* Upgrade your firmware"
+msgstr ""
+
+#: gui/configWizard.py:224
+msgid "* Check if your machine is working safely"
+msgstr ""
+
+#: gui/configWizard.py:225
+msgid "* Level your printer bed"
+msgstr ""
+
+#: gui/configWizard.py:235
+msgid ""
+"RepRap machines are vastly different, and there is no\n"
+"default configuration in Cura for any of them."
+msgstr ""
+
+#: gui/configWizard.py:236
+msgid ""
+"If you like a default profile for your machine added,\n"
+"then make an issue on github."
+msgstr ""
+
+#: gui/configWizard.py:238
+msgid "You will have to manually install Marlin or Sprinter firmware."
+msgstr ""
+
+#: gui/configWizard.py:240
+msgid "Machine width (mm)"
+msgstr ""
+
+#: gui/configWizard.py:241
+msgid "Machine depth (mm)"
+msgstr ""
+
+#: gui/configWizard.py:242
+msgid "Machine height (mm)"
+msgstr ""
+
+#: gui/configWizard.py:243 util/profile.py:119
+msgid "Nozzle size (mm)"
+msgstr ""
+
+#: gui/configWizard.py:244
+msgid "Heated bed"
+msgstr ""
+
+#: gui/configWizard.py:245
+msgid "Bed center is 0,0,0 (RoStock)"
+msgstr ""
+
+#: gui/configWizard.py:264
+msgid "Select your machine"
+msgstr ""
+
+#: gui/configWizard.py:265
+msgid "What kind of machine do you have:"
+msgstr ""
+
+#: gui/configWizard.py:270
+msgid "Other (Ex: RepRap)"
+msgstr ""
+
+#: gui/configWizard.py:273
+msgid ""
+"The collection of anonymous usage information helps with the continued "
+"improvement of Cura."
+msgstr ""
+
+#: gui/configWizard.py:274
+msgid ""
+"This does NOT submit your models online nor gathers any privacy related "
+"information."
+msgstr ""
+
+#: gui/configWizard.py:275
+msgid "Submit anonymous usage information:"
+msgstr ""
+
+#: gui/configWizard.py:276
+msgid "For full details see: http://wiki.ultimaker.com/Cura:stats"
+msgstr ""
+
+#: gui/configWizard.py:313
+msgid "Select upgraded parts you have"
+msgstr ""
+
+#: gui/configWizard.py:314
+msgid ""
+"To assist you in having better default settings for your Ultimaker\n"
+"Cura would like to know which upgrades you have in your machine."
+msgstr ""
+
+#: gui/configWizard.py:316
+msgid "Extruder drive upgrade"
+msgstr ""
+
+#: gui/configWizard.py:317
+msgid "Heated printer bed (self built)"
+msgstr ""
+
+#: gui/configWizard.py:318
+msgid "Dual extrusion (experimental)"
+msgstr ""
+
+#: gui/configWizard.py:320
+msgid ""
+"If you have an Ultimaker bought after october 2012 you will have the\n"
+"Extruder drive upgrade. If you do not have this upgrade,\n"
+"it is highly recommended to improve reliability."
+msgstr ""
+
+#: gui/configWizard.py:321
+msgid ""
+"This upgrade can be bought from the Ultimaker webshop\n"
+"or found on thingiverse as thing:26094"
+msgstr ""
+
+#: gui/configWizard.py:341
+msgid ""
+"Firmware is the piece of software running directly on your 3D printer.\n"
+"This firmware controls the step motors, regulates the temperature\n"
+"and ultimately makes your printer work."
+msgstr ""
+
+#: gui/configWizard.py:343
+msgid ""
+"The firmware shipping with new Ultimakers works, but upgrades\n"
+"have been made to make better prints, and make calibration easier."
+msgstr ""
+
+#: gui/configWizard.py:345
+msgid ""
+"Cura requires these new features and thus\n"
+"your firmware will most likely need to be upgraded.\n"
+"You will get the chance to do so now."
+msgstr ""
+
+#: gui/configWizard.py:350
+msgid "Do not upgrade to this firmware if:"
+msgstr ""
+
+#: gui/configWizard.py:351
+msgid "* You have an older machine based on ATMega1280"
+msgstr ""
+
+#: gui/configWizard.py:352
+msgid "* Have other changes in the firmware"
+msgstr ""
+
+#: gui/configWizard.py:387
+msgid ""
+"It is a good idea to do a few sanity checks now on your Ultimaker.\n"
+"You can skip these if you know your machine is functional."
+msgstr ""
+
+#: gui/configWizard.py:388
+msgid "Run checks"
+msgstr ""
+
+#: gui/configWizard.py:388
+msgid "Skip checks"
+msgstr ""
+
+#: gui/configWizard.py:392
+msgid "Communication:"
+msgstr ""
+
+#: gui/configWizard.py:393
+msgid "Temperature:"
+msgstr ""
+
+#: gui/configWizard.py:394
+msgid "Endstops:"
+msgstr ""
+
+#: gui/configWizard.py:399
+msgid "Show error log"
+msgstr ""
+
+#: gui/configWizard.py:433
+msgid "Connecting to machine."
+msgstr ""
+
+#: gui/configWizard.py:454
+msgid "Cooldown before temperature check."
+msgstr ""
+
+#: gui/configWizard.py:460 gui/configWizard.py:467
+msgid "Checking the heater and temperature sensor."
+msgstr ""
+
+#: gui/configWizard.py:478
+msgid "Please make sure none of the endstops are pressed."
+msgstr ""
+
+#: gui/configWizard.py:491
+msgid "Temperature measurement FAILED!"
+msgstr ""
+
+#: gui/configWizard.py:496
+#, possible-python-format
+msgid "Head temperature: %d"
+msgstr ""
+
+#: gui/configWizard.py:503 gui/configWizard.py:512
+#, possible-python-format
+msgid "Communication State: %s"
+msgstr ""
+
+#: gui/configWizard.py:506
+msgid "Failed to establish connection with the printer."
+msgstr ""
+
+#: gui/configWizard.py:551
+msgid "Please press the right X endstop."
+msgstr ""
+
+#: gui/configWizard.py:556
+msgid "Please press the left X endstop."
+msgstr ""
+
+#: gui/configWizard.py:561
+msgid "Please press the front Y endstop."
+msgstr ""
+
+#: gui/configWizard.py:566
+msgid "Please press the back Y endstop."
+msgstr ""
+
+#: gui/configWizard.py:571
+msgid "Please press the top Z endstop."
+msgstr ""
+
+#: gui/configWizard.py:576
+msgid "Please press the bottom Z endstop."
+msgstr ""
+
+#: gui/configWizard.py:582
+msgid "Checkup finished"
+msgstr ""
+
+#: gui/configWizard.py:625
+msgid "Calibrating the Steps Per E requires some manual actions."
+msgstr ""
+
+#: gui/configWizard.py:626
+msgid "First remove any filament from your machine."
+msgstr ""
+
+#: gui/configWizard.py:627
+msgid ""
+"Next put in your filament so the tip is aligned with the\n"
+"top of the extruder drive."
+msgstr ""
+
+#: gui/configWizard.py:628
+msgid "We'll push the filament 100mm"
+msgstr ""
+
+#: gui/configWizard.py:629
+msgid "Extrude 100mm filament"
+msgstr ""
+
+#: gui/configWizard.py:630
+msgid ""
+"Now measure the amount of extruded filament:\n"
+"(this can be more or less then 100mm)"
+msgstr ""
+
+#: gui/configWizard.py:631
+msgid "Save"
+msgstr ""
+
+#: gui/configWizard.py:632
+msgid "This results in the following steps per E:"
+msgstr ""
+
+#: gui/configWizard.py:634
+msgid "You can repeat these steps to get better calibration."
+msgstr ""
+
+#: gui/configWizard.py:637
+msgid ""
+"If you still have filament in your printer which needs\n"
+"heat to remove, press the heat up button below:"
+msgstr ""
+
+#: gui/configWizard.py:638
+msgid "Heatup for filament removal"
+msgstr ""
+
+#: gui/configWizard.py:661 gui/configWizard.py:693
+msgid ""
+"Error: Failed to open serial port to machine\n"
+"If this keeps happening, try disconnecting and reconnecting the USB cable"
+msgstr ""
+
+#: gui/firmwareInstall.py:39
+msgid ""
+"I am sorry, but Cura does not ship with a default firmware for your machine "
+"configuration."
+msgstr ""
+
+#: gui/firmwareInstall.py:39 gui/firmwareInstall.py:98 gui/mainWindow.py:375
+msgid "Firmware update"
+msgstr ""
+
+#: gui/firmwareInstall.py:49
+msgid "OK"
+msgstr ""
+
+#: gui/firmwareInstall.py:68
+msgid "Reading firmware..."
+msgstr ""
+
+#: gui/firmwareInstall.py:70
+msgid "Connecting to machine..."
+msgstr ""
+
+#: gui/firmwareInstall.py:87
+msgid "Uploading firmware..."
+msgstr ""
+
+#: gui/firmwareInstall.py:90
+#, possible-python-format
+msgid ""
+"Done!\n"
+"Installed firmware: %s"
+msgstr ""
+
+#: gui/firmwareInstall.py:92
+msgid "Failed to write firmware.\n"
+msgstr ""
+
+#: gui/firmwareInstall.py:97
+msgid ""
+"Failed to find machine for firmware upgrade\n"
+"Is your machine connected to the PC?"
+msgstr ""
+
+#: gui/mainWindow.py:55
+msgid "Load model file...\tCTRL+L"
+msgstr ""
+
+#: gui/mainWindow.py:57
+msgid "Save model...\tCTRL+S"
+msgstr ""
+
+#: gui/mainWindow.py:59
+msgid "Clear platform"
+msgstr ""
+
+#: gui/mainWindow.py:63
+msgid "Print...\tCTRL+P"
+msgstr ""
+
+#: gui/mainWindow.py:65 gui/sceneView.py:195
+msgid "Save GCode..."
+msgstr ""
+
+#: gui/mainWindow.py:67
+msgid "Show slice engine log..."
+msgstr ""
+
+#: gui/mainWindow.py:71
+msgid "Open Profile..."
+msgstr ""
+
+#: gui/mainWindow.py:74
+msgid "Save Profile..."
+msgstr ""
+
+#: gui/mainWindow.py:77
+msgid "Load Profile from GCode..."
+msgstr ""
+
+#: gui/mainWindow.py:81
+msgid "Reset Profile to default"
+msgstr ""
+
+#: gui/mainWindow.py:86
+msgid "Preferences...\tCTRL+,"
+msgstr ""
+
+#: gui/mainWindow.py:92
+msgid "&Recent Model Files"
+msgstr ""
+
+#: gui/mainWindow.py:99
+msgid "&Recent Profile Files"
+msgstr ""
+
+#: gui/mainWindow.py:105
+msgid "Quit"
+msgstr ""
+
+#: gui/mainWindow.py:107
+msgid "&File"
+msgstr ""
+
+#: gui/mainWindow.py:110
+msgid "Switch to quickprint..."
+msgstr ""
+
+#: gui/mainWindow.py:113
+msgid "Switch to full settings..."
+msgstr ""
+
+#: gui/mainWindow.py:121
+msgid "Minecraft import..."
+msgstr ""
+
+#: gui/mainWindow.py:124
+msgid "PID Debugger..."
+msgstr ""
+
+#: gui/mainWindow.py:126
+msgid "Tools"
+msgstr ""
+
+#: gui/mainWindow.py:129
+msgid "Open expert settings..."
+msgstr ""
+
+#: gui/mainWindow.py:134
+msgid "Install default Marlin firmware"
+msgstr ""
+
+#: gui/mainWindow.py:136
+msgid "Install custom firmware"
+msgstr ""
+
+#: gui/mainWindow.py:139
+msgid "Run first run wizard..."
+msgstr ""
+
+#: gui/mainWindow.py:141
+msgid "Run bed leveling wizard..."
+msgstr ""
+
+#: gui/mainWindow.py:144
+msgid "Run head offset wizard..."
+msgstr ""
+
+#: gui/mainWindow.py:146
+msgid "Expert"
+msgstr ""
+
+#: gui/mainWindow.py:149
+msgid "Online documentation..."
+msgstr ""
+
+#: gui/mainWindow.py:151
+msgid "Report a problem..."
+msgstr ""
+
+#: gui/mainWindow.py:153
+msgid "Check for update..."
+msgstr ""
+
+#: gui/mainWindow.py:155
+msgid "Open YouMagine website..."
+msgstr ""
+
+#: gui/mainWindow.py:157
+msgid "About Cura..."
+msgstr ""
+
+#: gui/mainWindow.py:159
+msgid "Help"
+msgstr ""
+
+#: gui/mainWindow.py:318
+msgid "Select profile file to load"
+msgstr ""
+
+#: gui/mainWindow.py:330
+msgid "Select gcode file to load profile from"
+msgstr ""
+
+#: gui/mainWindow.py:343
+msgid ""
+"No profile found in GCode file.\n"
+"This feature only works with GCode files made by Cura 12.07 or newer."
+msgstr ""
+
+#: gui/mainWindow.py:343
+msgid "Profile load error"
+msgstr ""
+
+#: gui/mainWindow.py:347
+msgid "Select profile file to save"
+msgstr ""
+
+#: gui/mainWindow.py:355
+msgid ""
+"This will reset all profile settings to defaults.\n"
+"Unless you have saved your current profile, all settings will be lost!\n"
+"Do you really want to reset?"
+msgstr ""
+
+#: gui/mainWindow.py:355
+msgid "Profile reset"
+msgstr ""
+
+#: gui/mainWindow.py:375
+msgid ""
+"Warning: Installing a custom firmware does not guarantee that you machine "
+"will function correctly, and could damage your machine."
+msgstr ""
+
+#: gui/mainWindow.py:376
+msgid "Open firmware to upload"
+msgstr ""
+
+#: gui/mainWindow.py:416
+msgid "You are running the latest version of Cura!"
+msgstr ""
+
+#: gui/mainWindow.py:416
+msgid "Awesome!"
+msgstr ""
+
+#: gui/mainWindow.py:421
+msgid "End solution for Open Source Fused Filament Fabrication 3D printing."
+msgstr ""
+
+#: gui/mainWindow.py:423
+msgid "Copyright (C) David Braam"
+msgstr ""
+
+#: gui/util/openglGui.py:239
+msgid "An error has occurred during the 3D view drawing."
+msgstr ""
+
+#: gui/util/openglGui.py:246
+msgid "3D window error"
+msgstr ""
+
+#: gui/pluginPanel.py:26
+msgid "Plugins:"
+msgstr ""
+
+#: gui/pluginPanel.py:30
+msgid "Open plugin location"
+msgstr ""
+
+#: gui/pluginPanel.py:31
+msgid "Enabled plugins"
+msgstr ""
+
+#: gui/pluginPanel.py:133
+msgid "You need to select a plugin before you can add anything."
+msgstr ""
+
+#: gui/pluginPanel.py:133
+msgid "Error: no plugin selected"
+msgstr ""
+
+#: gui/preferencesDialog.py:23
+msgid "Machine settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:32
+msgid "Printer head size"
+msgstr ""
+
+#: gui/preferencesDialog.py:40
+#, possible-python-format
+msgid "Extruder %d"
+msgstr ""
+
+#: gui/preferencesDialog.py:44
+msgid "Colours"
+msgstr ""
+
+#: gui/preferencesDialog.py:49
+msgid "Filament settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:54
+msgid "Communication settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:63
+msgid "Cura settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:77
+msgid ""
+"After changing the amount of extruders you need to restart Cura for full "
+"effect."
+msgstr ""
+
+#: gui/preferencesDialog.py:77
+msgid "Extruder amount warning."
+msgstr ""
+
+#: gui/printWindow.py:127
+msgid "Printing"
+msgstr ""
+
+#: gui/printWindow.py:156
+msgid "Statistics"
+msgstr ""
+
+#: gui/printWindow.py:161
+msgid ""
+"Your computer is running on battery power.\n"
+"Connect your computer to AC power or your print might not finish."
+msgstr ""
+
+#: gui/printWindow.py:172
+msgid ""
+"Filament: ####.##m #.##g\n"
+"Estimated print time: #####:##\n"
+"Machine state:\n"
+"Detecting baudrateXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+msgstr ""
+
+#: gui/printWindow.py:177
+msgid "Connect"
+msgstr ""
+
+#: gui/printWindow.py:179 gui/sceneView.py:64 gui/sceneView.py:745
+msgid "Print"
+msgstr ""
+
+#: gui/printWindow.py:180 gui/printWindow.py:417
+msgid "Pause"
+msgstr ""
+
+#: gui/printWindow.py:181
+msgid "Cancel print"
+msgstr ""
+
+#: gui/printWindow.py:182
+msgid "Error log"
+msgstr ""
+
+#: gui/printWindow.py:203
+msgid "BedTemp:"
+msgstr ""
+
+#: gui/printWindow.py:211
+msgid "Temp:"
+msgstr ""
+
+#: gui/printWindow.py:259
+msgid "Jog"
+msgstr ""
+
+#: gui/printWindow.py:274
+msgid "Outer wall:"
+msgstr ""
+
+#: gui/printWindow.py:277
+msgid "Inner wall:"
+msgstr ""
+
+#: gui/printWindow.py:280
+msgid "Fill:"
+msgstr ""
+
+#: gui/printWindow.py:283
+msgid "Support:"
+msgstr ""
+
+#: gui/printWindow.py:287
+msgid "Speed"
+msgstr ""
+
+#: gui/printWindow.py:305
+msgid "Term"
+msgstr ""
+
+#: gui/printWindow.py:312
+msgid "Enable timelapse movie recording"
+msgstr ""
+
+#: gui/printWindow.py:326
+msgid "Show preview"
+msgstr ""
+
+#: gui/printWindow.py:332
+msgid "Camera"
+msgstr ""
+
+#: gui/printWindow.py:415
+msgid "Resume"
+msgstr ""
+
+#: gui/printWindow.py:432
+msgid "Loading gcode...\n"
+msgstr ""
+
+#: gui/printWindow.py:434
+#, possible-python-format
+msgid "Filament: %(amount).2fm %(weight).2fg\n"
+msgstr ""
+
+#: gui/printWindow.py:438
+#, possible-python-format
+msgid "Filament cost: %s\n"
+msgstr ""
+
+#: gui/sceneView.py:63
+msgid "Load"
+msgstr ""
+
+#: gui/sceneView.py:68
+msgid "Rotate"
+msgstr ""
+
+#: gui/sceneView.py:69
+msgid "Scale"
+msgstr ""
+
+#: gui/sceneView.py:70
+msgid "Mirror"
+msgstr ""
+
+#: gui/sceneView.py:72 gui/sceneView.py:75
+msgid "Reset"
+msgstr ""
+
+#: gui/sceneView.py:73
+msgid "Lay flat"
+msgstr ""
+
+#: gui/sceneView.py:76
+msgid "To max"
+msgstr ""
+
+#: gui/sceneView.py:78
+msgid "Mirror X"
+msgstr ""
+
+#: gui/sceneView.py:79
+msgid "Mirror Y"
+msgstr ""
+
+#: gui/sceneView.py:80
+msgid "Mirror Z"
+msgstr ""
+
+#: gui/sceneView.py:88
+msgid "Scale X"
+msgstr ""
+
+#: gui/sceneView.py:90
+msgid "Scale Y"
+msgstr ""
+
+#: gui/sceneView.py:92
+msgid "Scale Z"
+msgstr ""
+
+#: gui/sceneView.py:94
+msgid "Size X (mm)"
+msgstr ""
+
+#: gui/sceneView.py:96
+msgid "Size Y (mm)"
+msgstr ""
+
+#: gui/sceneView.py:98
+msgid "Size Z (mm)"
+msgstr ""
+
+#: gui/sceneView.py:100
+msgid "Uniform scale"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "View mode"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Normal"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Overhang"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Transparent"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "X-Ray"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Layers"
+msgstr ""
+
+#: gui/sceneView.py:106
+msgid "Share on YouMagine"
+msgstr ""
+
+#: gui/sceneView.py:124
+msgid "Open 3D model"
+msgstr ""
+
+#: gui/sceneView.py:164
+msgid "Save 3D model"
+msgstr ""
+
+#: gui/sceneView.py:194
+msgid "Print with USB"
+msgstr ""
+
+#: gui/sceneView.py:196
+msgid "Slice engine log..."
+msgstr ""
+
+#: gui/sceneView.py:210 gui/sceneView.py:751
+msgid "Save toolpath"
+msgstr ""
+
+#: gui/sceneView.py:247
+msgid "The slicing engine reported the following"
+msgstr ""
+
+#: gui/sceneView.py:247
+msgid "Engine log..."
+msgstr ""
+
+#: gui/sceneView.py:617
+msgid "Delete"
+msgstr ""
+
+#: gui/sceneView.py:618
+msgid "Multiply"
+msgstr ""
+
+#: gui/sceneView.py:619
+msgid "Split"
+msgstr ""
+
+#: gui/sceneView.py:621
+msgid "Dual extrusion merge"
+msgstr ""
+
+#: gui/sceneView.py:623
+msgid "Delete all"
+msgstr ""
+
+#: gui/sceneView.py:748
+msgid "Toolpath to SD"
+msgstr ""
+
+#: gui/sceneView.py:1058
+msgid "Loading toolpath for visualization..."
+msgstr ""
+
+#: gui/sceneView.py:1109
+msgid "Overhang view not working due to lack of OpenGL shaders support."
+msgstr ""
+
+#: gui/simpleMode.py:20
+msgid "High quality print"
+msgstr ""
+
+#: gui/simpleMode.py:21
+msgid "Normal quality print"
+msgstr ""
+
+#: gui/simpleMode.py:22
+msgid "Fast low quality print"
+msgstr ""
+
+#: gui/simpleMode.py:23
+msgid "Thin walled cup or vase"
+msgstr ""
+
+#: gui/simpleMode.py:31
+msgid "Print support structure"
+msgstr ""
+
+#: gui/simpleMode.py:36
+msgid "Select a print type:"
+msgstr ""
+
+#: gui/simpleMode.py:46
+msgid "Material:"
+msgstr ""
+
+#: gui/simpleMode.py:50
+msgid "Diameter:"
+msgstr ""
+
+#: gui/simpleMode.py:56
+msgid "Other:"
+msgstr ""
+
+#: gui/simpleMode.py:117
+msgid "Exterior Only"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:79
+msgid "Checking token"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:83
+msgid "Failed to contact YouMagine.com"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:83 gui/tools/youmagineGui.py:116
+#: gui/tools/youmagineGui.py:133 gui/tools/youmagineGui.py:140
+#: gui/tools/youmagineGui.py:148 gui/tools/youmagineGui.py:153
+msgid "YouMagine error."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:100
+msgid "Cura is now authorized to share on YouMagine"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:100
+msgid "YouMagine."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:112
+msgid "Creating new design on YouMagine..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:116
+msgid "Failed to create a design, nothing uploaded!"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:120
+#, possible-python-format
+msgid "Building model %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:131
+#, possible-python-format
+msgid "Uploading model %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:133 gui/tools/youmagineGui.py:140
+#: gui/tools/youmagineGui.py:148
+#, possible-python-format
+msgid "Failed to upload %s!"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:137
+#, possible-python-format
+msgid "Uploading file %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:145
+#, possible-python-format
+msgid "Uploading image %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:153
+msgid "Failed to upload snapshot!"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:158
+msgid "Publishing design..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:230
+msgid "Request authorization from YouMagine"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:231
+msgid "Paste token here"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:237
+msgid ""
+"To share your designs on YouMagine\n"
+"you need an account on YouMagine.com\n"
+"and authorize Cura to access your account."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:239
+msgid ""
+"This will open a browser window where you can\n"
+"authorize Cura to access your YouMagine account.\n"
+"You can revoke access at any time\n"
+"from YouMagine.com"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:274
+msgid "Design name"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:278
+msgid "Publish after upload"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:279
+msgid "Upload"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:287
+msgid "Add..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:289
+msgid "Webcam..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:297
+msgid ""
+"Directly publish the design after uploading.\n"
+"Without this check the design will not be public\n"
+"until you publish it yourself on YouMagine.com"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:303
+msgid "Design name:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:305
+msgid "Description:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:307
+msgid "Category:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:309
+msgid "License:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:312
+msgid "Images:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:315
+msgid "Design files:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:337
+msgid "The name cannot be empty"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:337 gui/tools/youmagineGui.py:341
+msgid "New design error."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:341
+msgid "The description cannot be empty"
+msgstr ""
+
+#: util/profile.py:114
+msgid "Layer height (mm)"
+msgstr ""
+
+#: util/profile.py:114
+msgid ""
+"Layer height in millimeters.\n"
+"This is the most important setting to determine the quality of your print. "
+"Normal quality prints are 0.1mm, high quality is 0.06mm. You can go up to "
+"0.25mm with an Ultimaker for very fast prints at low quality."
+msgstr ""
+
+#: util/profile.py:115
+msgid "Shell thickness (mm)"
+msgstr ""
+
+#: util/profile.py:115
+msgid ""
+"Thickness of the outside shell in the horizontal direction.\n"
+"This is used in combination with the nozzle size to define the number\n"
+"of perimeter lines and the thickness of those perimeter lines."
+msgstr ""
+
+#: util/profile.py:116
+msgid "Enable retraction"
+msgstr ""
+
+#: util/profile.py:116
+msgid ""
+"Retract the filament when the nozzle is moving over a none-printed area. "
+"Details about the retraction can be configured in the advanced tab."
+msgstr ""
+
+#: util/profile.py:117
+msgid "Bottom/Top thickness (mm)"
+msgstr ""
+
+#: util/profile.py:117
+msgid ""
+"This controls the thickness of the bottom and top layers, the amount of "
+"solid layers put down is calculated by the layer thickness and this value.\n"
+"Having this value a multiple of the layer thickness makes sense. And keep it "
+"near your wall thickness to make an evenly strong part."
+msgstr ""
+
+#: util/profile.py:118
+msgid "Fill Density (%)"
+msgstr ""
+
+#: util/profile.py:118
+msgid ""
+"This controls how densely filled the insides of your print will be. For a "
+"solid part use 100%, for an empty part use 0%. A value around 20% is usually "
+"enough.\n"
+"This won't effect the outside of the print and only adjusts how strong the "
+"part becomes."
+msgstr ""
+
+#: util/profile.py:119
+msgid ""
+"The nozzle size is very important, this is used to calculate the line width "
+"of the infill, and used to calculate the amount of outside wall lines and "
+"thickness for the wall thickness you entered in the print settings."
+msgstr ""
+
+#: util/profile.py:120
+msgid "Print speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:120
+msgid ""
+"Speed at which printing happens. A well adjusted Ultimaker can reach 150mm/"
+"s, but for good quality prints you want to print slower. Printing speed "
+"depends on a lot of factors. So you will be experimenting with optimal "
+"settings for this."
+msgstr ""
+
+#: util/profile.py:121
+msgid "Printing temperature (C)"
+msgstr ""
+
+#: util/profile.py:121 util/profile.py:122 util/profile.py:123
+#: util/profile.py:124
+msgid ""
+"Temperature used for printing. Set at 0 to pre-heat yourself.\n"
+"For PLA a value of 210C is usually used.\n"
+"For ABS a value of 230C or higher is required."
+msgstr ""
+
+#: util/profile.py:122
+msgid "2nd nozzle temperature (C)"
+msgstr ""
+
+#: util/profile.py:123
+msgid "3th nozzle temperature (C)"
+msgstr ""
+
+#: util/profile.py:124
+msgid "4th nozzle temperature (C)"
+msgstr ""
+
+#: util/profile.py:125
+msgid "Bed temperature (C)"
+msgstr ""
+
+#: util/profile.py:125
+msgid ""
+"Temperature used for the heated printer bed. Set at 0 to pre-heat yourself."
+msgstr ""
+
+#: util/profile.py:126
+msgid "Support type"
+msgstr ""
+
+#: util/profile.py:126
+msgid ""
+"Type of support structure build.\n"
+"\"Touching buildplate\" is the most commonly used support setting.\n"
+"\n"
+"None does not do any support.\n"
+"Touching buildplate only creates support where the support structure will "
+"touch the build platform.\n"
+"Everywhere creates support even on top of parts of the model."
+msgstr ""
+
+#: util/profile.py:127
+msgid "Platform adhesion type"
+msgstr ""
+
+#: util/profile.py:127
+msgid ""
+"Different options that help in preventing corners from lifting due to "
+"warping.\n"
+"Brim adds a single layer thick flat area around your object which is easy to "
+"cut off afterwards, and the recommended option.\n"
+"Raft adds a thick raster at below the object and a thin interface between "
+"this and your object.\n"
+"(Note that enabling the brim or raft disables the skirt)"
+msgstr ""
+
+#: util/profile.py:128
+msgid "Support dual extrusion"
+msgstr ""
+
+#: util/profile.py:128
+msgid ""
+"Which extruder to use for support material, for break-away support you can "
+"use both extruders.\n"
+"But if one of the materials is more expensive then the other you could "
+"select an extruder to use for support material. This causes more extruder "
+"switches.\n"
+"You can also use the 2nd extruder for soluble support materials."
+msgstr ""
+
+#: util/profile.py:129
+msgid "Diameter (mm)"
+msgstr ""
+
+#: util/profile.py:129
+msgid ""
+"Diameter of your filament, as accurately as possible.\n"
+"If you cannot measure this value you will have to calibrate it, a higher "
+"number means less extrusion, a smaller number generates more extrusion."
+msgstr ""
+
+#: util/profile.py:130
+msgid "Diameter2 (mm)"
+msgstr ""
+
+#: util/profile.py:130
+msgid ""
+"Diameter of your filament for the 2nd nozzle. Use 0 to use the same diameter "
+"as for nozzle 1."
+msgstr ""
+
+#: util/profile.py:131
+msgid "Diameter3 (mm)"
+msgstr ""
+
+#: util/profile.py:131
+msgid ""
+"Diameter of your filament for the 3th nozzle. Use 0 to use the same diameter "
+"as for nozzle 1."
+msgstr ""
+
+#: util/profile.py:132
+msgid "Diameter4 (mm)"
+msgstr ""
+
+#: util/profile.py:132
+msgid ""
+"Diameter of your filament for the 4th nozzle. Use 0 to use the same diameter "
+"as for nozzle 1."
+msgstr ""
+
+#: util/profile.py:133
+msgid "Flow (%)"
+msgstr ""
+
+#: util/profile.py:133
+msgid ""
+"Flow compensation, the amount of material extruded is multiplied by this "
+"value"
+msgstr ""
+
+#: util/profile.py:134
+msgid "Speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:134
+msgid ""
+"Speed at which the filament is retracted, a higher retraction speed works "
+"better. But a very high retraction speed can lead to filament grinding."
+msgstr ""
+
+#: util/profile.py:135
+msgid "Distance (mm)"
+msgstr ""
+
+#: util/profile.py:135
+msgid ""
+"Amount of retraction, set at 0 for no retraction at all. A value of 4.5mm "
+"seems to generate good results."
+msgstr ""
+
+#: util/profile.py:136
+msgid "Dual extrusion switch amount (mm)"
+msgstr ""
+
+#: util/profile.py:136
+msgid ""
+"Amount of retraction when switching nozzle with dual-extrusion, set at 0 for "
+"no retraction at all. A value of 16.0mm seems to generate good results."
+msgstr ""
+
+#: util/profile.py:137
+msgid "Minimum travel (mm)"
+msgstr ""
+
+#: util/profile.py:137
+msgid ""
+"Minimum amount of travel needed for a retraction to happen at all. To make "
+"sure you do not get a lot of retractions in a small area."
+msgstr ""
+
+#: util/profile.py:138
+msgid "Enable combing"
+msgstr ""
+
+#: util/profile.py:138
+msgid ""
+"Combing is the act of avoiding holes in the print for the head to travel "
+"over. If combing is disabled the printer head moves straight from the start "
+"point to the end point and it will always retract."
+msgstr ""
+
+#: util/profile.py:139
+msgid "Minimal extrusion before retracting (mm)"
+msgstr ""
+
+#: util/profile.py:139
+msgid ""
+"The minimal amount of extrusion that needs to be done before retracting "
+"again if a retraction needs to happen before this minimal is reached the "
+"retraction is ignored.\n"
+"This avoids retraction a lot on the same piece of filament which flattens "
+"the filament and causes grinding issues."
+msgstr ""
+
+#: util/profile.py:140
+msgid "Initial layer thickness (mm)"
+msgstr ""
+
+#: util/profile.py:140
+msgid ""
+"Layer thickness of the bottom layer. A thicker bottom layer makes sticking "
+"to the bed easier. Set to 0.0 to have the bottom layer thickness the same as "
+"the other layers."
+msgstr ""
+
+#: util/profile.py:141
+msgid "Cut off object bottom (mm)"
+msgstr ""
+
+#: util/profile.py:141
+msgid ""
+"Sinks the object into the platform, this can be used for objects that do not "
+"have a flat bottom and thus create a too small first layer."
+msgstr ""
+
+#: util/profile.py:143
+msgid "Dual extrusion overlap (mm)"
+msgstr ""
+
+#: util/profile.py:143
+msgid ""
+"Add a certain amount of overlapping extrusion on dual-extrusion prints. This "
+"bonds the different colors better together."
+msgstr ""
+
+#: util/profile.py:144
+msgid "Travel speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:144
+msgid ""
+"Speed at which travel moves are done, a high quality build Ultimaker can "
+"reach speeds of 250mm/s. But some machines might miss steps then."
+msgstr ""
+
+#: util/profile.py:145
+msgid "Bottom layer speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:145
+msgid ""
+"Print speed for the bottom layer, you want to print the first layer slower "
+"so it sticks better to the printer bed."
+msgstr ""
+
+#: util/profile.py:146
+msgid "Infill speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:146
+msgid ""
+"Speed at which infill parts are printed. If set to 0 then the print speed is "
+"used for the infill. Printing the infill faster can greatly reduce printing, "
+"but this can negatively effect print quality.."
+msgstr ""
+
+#: util/profile.py:147
+msgid "Minimal layer time (sec)"
+msgstr ""
+
+#: util/profile.py:147
+msgid ""
+"Minimum time spend in a layer, gives the layer time to cool down before the "
+"next layer is put on top. If the layer will be placed down too fast the "
+"printer will slow down to make sure it has spend at least this amount of "
+"seconds printing this layer."
+msgstr ""
+
+#: util/profile.py:148
+msgid "Enable cooling fan"
+msgstr ""
+
+#: util/profile.py:148
+msgid ""
+"Enable the cooling fan during the print. The extra cooling from the cooling "
+"fan is essential during faster prints."
+msgstr ""
+
+#: util/profile.py:150
+msgid "Line count"
+msgstr ""
+
+#: util/profile.py:150
+msgid ""
+"The skirt is a line drawn around the object at the first layer. This helps "
+"to prime your extruder, and to see if the object fits on your platform.\n"
+"Setting this to 0 will disable the skirt. Multiple skirt lines can help "
+"priming your extruder better for small objects."
+msgstr ""
+
+#: util/profile.py:151
+msgid "Start distance (mm)"
+msgstr ""
+
+#: util/profile.py:151
+msgid ""
+"The distance between the skirt and the first layer.\n"
+"This is the minimal distance, multiple skirt lines will be put outwards from "
+"this distance."
+msgstr ""
+
+#: util/profile.py:152
+msgid "Minimal length (mm)"
+msgstr ""
+
+#: util/profile.py:152
+msgid ""
+"The minimal length of the skirt, if this minimal length is not reached it "
+"will add more skirt lines to reach this minimal lenght.\n"
+"Note: If the line count is set to 0 this is ignored."
+msgstr ""
+
+#: util/profile.py:155
+msgid "Fan on layer number"
+msgstr ""
+
+#: util/profile.py:155
+msgid ""
+"The layer at which the fan is turned on. The first layer is layer 0. The "
+"first layer can stick better if you turn on the fan on, on the 2nd layer."
+msgstr ""
+
+#: util/profile.py:156
+msgid "Fan speed min (%)"
+msgstr ""
+
+#: util/profile.py:156
+msgid ""
+"When the fan is turned on, it is enabled at this speed setting. If cool "
+"slows down the layer, the fan is adjusted between the min and max speed. "
+"Minimal fan speed is used if the layer is not slowed down due to cooling."
+msgstr ""
+
+#: util/profile.py:157
+msgid "Fan speed max (%)"
+msgstr ""
+
+#: util/profile.py:157
+msgid ""
+"When the fan is turned on, it is enabled at this speed setting. If cool "
+"slows down the layer, the fan is adjusted between the min and max speed. "
+"Maximal fan speed is used if the layer is slowed down due to cooling by more "
+"than 200%."
+msgstr ""
+
+#: util/profile.py:158
+msgid "Minimum speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:158
+msgid ""
+"The minimal layer time can cause the print to slow down so much it starts to "
+"ooze. The minimal feedrate protects against this. Even if a print gets slown "
+"down it will never be slower than this minimal speed."
+msgstr ""
+
+#: util/profile.py:159
+msgid "Cool head lift"
+msgstr ""
+
+#: util/profile.py:159
+msgid ""
+"Lift the head if the minimal speed is hit because of cool slowdown, and wait "
+"the extra time so the minimal layer time is always hit."
+msgstr ""
+
+#: util/profile.py:164
+msgid "Solid infill top"
+msgstr ""
+
+#: util/profile.py:164
+msgid ""
+"Create a solid top surface, if set to false the top is filled with the fill "
+"percentage. Useful for cups/vases."
+msgstr ""
+
+#: util/profile.py:165
+msgid "Solid infill bottom"
+msgstr ""
+
+#: util/profile.py:165
+msgid ""
+"Create a solid bottom surface, if set to false the bottom is filled with the "
+"fill percentage. Useful for buildings."
+msgstr ""
+
+#: util/profile.py:166
+msgid "Infill overlap (%)"
+msgstr ""
+
+#: util/profile.py:166
+msgid ""
+"Amount of overlap between the infill and the walls. There is a slight "
+"overlap with the walls and the infill so the walls connect firmly to the "
+"infill."
+msgstr ""
+
+#: util/profile.py:167
+msgid "Fill amount (%)"
+msgstr ""
+
+#: util/profile.py:167
+#, possible-python-format
+msgid ""
+"Amount of infill structure in the support material, less material gives "
+"weaker support which is easier to remove. 20% seems to be a good average."
+msgstr ""
+
+#: util/profile.py:168
+msgid "Distance X/Y (mm)"
+msgstr ""
+
+#: util/profile.py:168
+msgid ""
+"Distance of the support material from the print, in the X/Y directions.\n"
+"0.7mm gives a nice distance from the print so the support does not stick to "
+"the print."
+msgstr ""
+
+#: util/profile.py:169
+msgid "Distance Z (mm)"
+msgstr ""
+
+#: util/profile.py:169
+msgid ""
+"Distance from the top/bottom of the support to the print. A small gap here "
+"makes it easier to remove the support but makes the print a bit uglier.\n"
+"0.15mm gives a good seperation of the support material."
+msgstr ""
+
+#: util/profile.py:173
+msgid "Brim line amount"
+msgstr ""
+
+#: util/profile.py:173
+msgid ""
+"The amount of lines used for a brim, more lines means a larger brim which "
+"sticks better, but this also makes your effective print area smaller."
+msgstr ""
+
+#: util/profile.py:174
+msgid "Extra margin (mm)"
+msgstr ""
+
+#: util/profile.py:174
+msgid ""
+"If the raft is enabled, this is the extra raft area around the object which "
+"is also rafted. Increasing this margin will create a stronger raft while "
+"using more material and leaving less are for your print."
+msgstr ""
+
+#: util/profile.py:175
+msgid "Line spacing (mm)"
+msgstr ""
+
+#: util/profile.py:175
+msgid ""
+"When you are using the raft this is the distance between the centerlines of "
+"the raft line."
+msgstr ""
+
+#: util/profile.py:176
+msgid "Base thickness (mm)"
+msgstr ""
+
+#: util/profile.py:176
+msgid ""
+"When you are using the raft this is the thickness of the base layer which is "
+"put down."
+msgstr ""
+
+#: util/profile.py:177
+msgid "Base line width (mm)"
+msgstr ""
+
+#: util/profile.py:177
+msgid ""
+"When you are using the raft this is the width of the base layer lines which "
+"are put down."
+msgstr ""
+
+#: util/profile.py:178
+msgid "Interface thickness (mm)"
+msgstr ""
+
+#: util/profile.py:178
+msgid ""
+"When you are using the raft this is the thickness of the interface layer "
+"which is put down."
+msgstr ""
+
+#: util/profile.py:179
+msgid "Interface line width (mm)"
+msgstr ""
+
+#: util/profile.py:179
+msgid ""
+"When you are using the raft this is the width of the interface layer lines "
+"which are put down."
+msgstr ""
+
+#: util/profile.py:181
+msgid "Combine everything (Type-A)"
+msgstr ""
+
+#: util/profile.py:181 util/profile.py:182
+msgid ""
+"This expert option adds all parts of the model together. The result is "
+"usually that internal cavities disappear. Depending on the model this can be "
+"intended or not. Enabling this option is at your own risk. Type-A is "
+"depended on the model normals and tries to keep some internal holes intact. "
+"Type-B ignores all internal holes and only keeps the outside shape per layer."
+msgstr ""
+
+#: util/profile.py:182
+msgid "Combine everything (Type-B)"
+msgstr ""
+
+#: util/profile.py:183
+msgid "Keep open faces"
+msgstr ""
+
+#: util/profile.py:183
+msgid ""
+"This expert option keeps all the open bits of the model intact. Normally "
+"Cura tries to stitch up small holes and remove everything with big holes, "
+"but this option keeps bits that are not properly part of anything and just "
+"goes with whatever it is left. This option is usually not what you want, but "
+"it might enable you to slice models otherwise failing to produce proper "
+"paths.\n"
+"As with all \"Fix horrible\" options, results may vary and use at your own "
+"risk."
+msgstr ""
+
+#: util/profile.py:184
+msgid "Extensive stitching"
+msgstr ""
+
+#: util/profile.py:184
+msgid ""
+"Extrensive stitching tries to fix up open holes in the model by closing the "
+"hole with touching polygons. This algorthm is quite expensive and could "
+"introduce a lot of processing time.\n"
+"As with all \"Fix horrible\" options, results may vary and use at your own "
+"risk."
+msgstr ""
diff --git a/Cura/resources/locale/ru/LC_MESSAGES/Cura.mo b/Cura/resources/locale/ru/LC_MESSAGES/Cura.mo
new file mode 100644 (file)
index 0000000..84bf7e1
Binary files /dev/null and b/Cura/resources/locale/ru/LC_MESSAGES/Cura.mo differ
diff --git a/Cura/resources/locale/ru/LC_MESSAGES/Cura.po b/Cura/resources/locale/ru/LC_MESSAGES/Cura.po
new file mode 100644 (file)
index 0000000..28d0e9e
--- /dev/null
@@ -0,0 +1,1786 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2013
+# This file is distributed under the same license as the Cura package.
+# Ilya Kulakov <kulakov.ilya@gmail.com>, 2013.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Cura\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-09-15 15:40+0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: gui/app.py:82 gui/mainWindow.py:413
+msgid "A new version of Cura is available, would you like to download?"
+msgstr ""
+
+#: gui/app.py:82 gui/mainWindow.py:413
+msgid "New version available"
+msgstr ""
+
+#: gui/tools/batchRun.py:14
+msgid "Cura - Batch run"
+msgstr ""
+
+#: gui/tools/batchRun.py:29
+msgid "Add"
+msgstr ""
+
+#: gui/tools/batchRun.py:30
+msgid "Remove"
+msgstr ""
+
+#: gui/tools/batchRun.py:31
+msgid "Prepare all"
+msgstr ""
+
+#: gui/tools/batchRun.py:47
+msgid "Open file to batch prepare"
+msgstr ""
+
+#: gui/tools/batchRun.py:134
+#, possible-python-format
+msgid "Building: %d                           "
+msgstr ""
+
+#: gui/tools/batchRun.py:137
+#, possible-python-format
+msgid "Done: 0/%d                           "
+msgstr ""
+
+#: gui/tools/batchRun.py:140
+msgid "Abort"
+msgstr ""
+
+#: gui/tools/batchRun.py:163 gui/tools/batchRun.py:233
+msgid "Close"
+msgstr ""
+
+#: gui/tools/batchRun.py:187
+#, possible-python-format
+msgid "Build: %d models"
+msgstr ""
+
+#: gui/tools/batchRun.py:188
+#, possible-python-format
+msgid ""
+"\n"
+"Slicing took: %(hours)02d:%(minutes)02d"
+msgstr ""
+
+#: gui/tools/batchRun.py:198
+#, possible-python-format
+msgid "Building: [%(index)d/%(size)d]"
+msgstr ""
+
+#: gui/tools/batchRun.py:214
+msgid "Aborted by user."
+msgstr ""
+
+#: gui/tools/batchRun.py:228
+#, possible-python-format
+msgid "Done %(index)d/%(size)d"
+msgstr ""
+
+#: gui/tools/batchRun.py:236
+msgid "To SDCard"
+msgstr ""
+
+#: gui/configWizard.py:218
+msgid "First time run wizard"
+msgstr ""
+
+#: gui/configWizard.py:219
+msgid "Welcome, and thanks for trying Cura!"
+msgstr ""
+
+#: gui/configWizard.py:221
+msgid "This wizard will help you with the following steps:"
+msgstr ""
+
+#: gui/configWizard.py:222
+msgid "* Configure Cura for your machine"
+msgstr ""
+
+#: gui/configWizard.py:223
+msgid "* Upgrade your firmware"
+msgstr ""
+
+#: gui/configWizard.py:224
+msgid "* Check if your machine is working safely"
+msgstr ""
+
+#: gui/configWizard.py:225
+msgid "* Level your printer bed"
+msgstr ""
+
+#: gui/configWizard.py:235
+msgid ""
+"RepRap machines are vastly different, and there is no\n"
+"default configuration in Cura for any of them."
+msgstr ""
+
+#: gui/configWizard.py:236
+msgid ""
+"If you like a default profile for your machine added,\n"
+"then make an issue on github."
+msgstr ""
+
+#: gui/configWizard.py:238
+msgid "You will have to manually install Marlin or Sprinter firmware."
+msgstr ""
+
+#: gui/configWizard.py:240
+msgid "Machine width (mm)"
+msgstr ""
+
+#: gui/configWizard.py:241
+msgid "Machine depth (mm)"
+msgstr ""
+
+#: gui/configWizard.py:242
+msgid "Machine height (mm)"
+msgstr ""
+
+#: gui/configWizard.py:243 util/profile.py:119
+msgid "Nozzle size (mm)"
+msgstr ""
+
+#: gui/configWizard.py:244
+msgid "Heated bed"
+msgstr ""
+
+#: gui/configWizard.py:245
+msgid "Bed center is 0,0,0 (RoStock)"
+msgstr ""
+
+#: gui/configWizard.py:264
+msgid "Select your machine"
+msgstr ""
+
+#: gui/configWizard.py:265
+msgid "What kind of machine do you have:"
+msgstr ""
+
+#: gui/configWizard.py:270
+msgid "Other (Ex: RepRap)"
+msgstr ""
+
+#: gui/configWizard.py:273
+msgid ""
+"The collection of anonymous usage information helps with the continued "
+"improvement of Cura."
+msgstr ""
+
+#: gui/configWizard.py:274
+msgid ""
+"This does NOT submit your models online nor gathers any privacy related "
+"information."
+msgstr ""
+
+#: gui/configWizard.py:275
+msgid "Submit anonymous usage information:"
+msgstr ""
+
+#: gui/configWizard.py:276
+msgid "For full details see: http://wiki.ultimaker.com/Cura:stats"
+msgstr ""
+
+#: gui/configWizard.py:313
+msgid "Select upgraded parts you have"
+msgstr ""
+
+#: gui/configWizard.py:314
+msgid ""
+"To assist you in having better default settings for your Ultimaker\n"
+"Cura would like to know which upgrades you have in your machine."
+msgstr ""
+
+#: gui/configWizard.py:316
+msgid "Extruder drive upgrade"
+msgstr ""
+
+#: gui/configWizard.py:317
+msgid "Heated printer bed (self built)"
+msgstr ""
+
+#: gui/configWizard.py:318
+msgid "Dual extrusion (experimental)"
+msgstr ""
+
+#: gui/configWizard.py:320
+msgid ""
+"If you have an Ultimaker bought after october 2012 you will have the\n"
+"Extruder drive upgrade. If you do not have this upgrade,\n"
+"it is highly recommended to improve reliability."
+msgstr ""
+
+#: gui/configWizard.py:321
+msgid ""
+"This upgrade can be bought from the Ultimaker webshop\n"
+"or found on thingiverse as thing:26094"
+msgstr ""
+
+#: gui/configWizard.py:341
+msgid ""
+"Firmware is the piece of software running directly on your 3D printer.\n"
+"This firmware controls the step motors, regulates the temperature\n"
+"and ultimately makes your printer work."
+msgstr ""
+
+#: gui/configWizard.py:343
+msgid ""
+"The firmware shipping with new Ultimakers works, but upgrades\n"
+"have been made to make better prints, and make calibration easier."
+msgstr ""
+
+#: gui/configWizard.py:345
+msgid ""
+"Cura requires these new features and thus\n"
+"your firmware will most likely need to be upgraded.\n"
+"You will get the chance to do so now."
+msgstr ""
+
+#: gui/configWizard.py:350
+msgid "Do not upgrade to this firmware if:"
+msgstr ""
+
+#: gui/configWizard.py:351
+msgid "* You have an older machine based on ATMega1280"
+msgstr ""
+
+#: gui/configWizard.py:352
+msgid "* Have other changes in the firmware"
+msgstr ""
+
+#: gui/configWizard.py:387
+msgid ""
+"It is a good idea to do a few sanity checks now on your Ultimaker.\n"
+"You can skip these if you know your machine is functional."
+msgstr ""
+
+#: gui/configWizard.py:388
+msgid "Run checks"
+msgstr ""
+
+#: gui/configWizard.py:388
+msgid "Skip checks"
+msgstr ""
+
+#: gui/configWizard.py:392
+msgid "Communication:"
+msgstr ""
+
+#: gui/configWizard.py:393
+msgid "Temperature:"
+msgstr ""
+
+#: gui/configWizard.py:394
+msgid "Endstops:"
+msgstr ""
+
+#: gui/configWizard.py:399
+msgid "Show error log"
+msgstr ""
+
+#: gui/configWizard.py:433
+msgid "Connecting to machine."
+msgstr ""
+
+#: gui/configWizard.py:454
+msgid "Cooldown before temperature check."
+msgstr ""
+
+#: gui/configWizard.py:460 gui/configWizard.py:467
+msgid "Checking the heater and temperature sensor."
+msgstr ""
+
+#: gui/configWizard.py:478
+msgid "Please make sure none of the endstops are pressed."
+msgstr ""
+
+#: gui/configWizard.py:491
+msgid "Temperature measurement FAILED!"
+msgstr ""
+
+#: gui/configWizard.py:496
+#, possible-python-format
+msgid "Head temperature: %d"
+msgstr ""
+
+#: gui/configWizard.py:503 gui/configWizard.py:512
+#, possible-python-format
+msgid "Communication State: %s"
+msgstr ""
+
+#: gui/configWizard.py:506
+msgid "Failed to establish connection with the printer."
+msgstr ""
+
+#: gui/configWizard.py:551
+msgid "Please press the right X endstop."
+msgstr ""
+
+#: gui/configWizard.py:556
+msgid "Please press the left X endstop."
+msgstr ""
+
+#: gui/configWizard.py:561
+msgid "Please press the front Y endstop."
+msgstr ""
+
+#: gui/configWizard.py:566
+msgid "Please press the back Y endstop."
+msgstr ""
+
+#: gui/configWizard.py:571
+msgid "Please press the top Z endstop."
+msgstr ""
+
+#: gui/configWizard.py:576
+msgid "Please press the bottom Z endstop."
+msgstr ""
+
+#: gui/configWizard.py:582
+msgid "Checkup finished"
+msgstr ""
+
+#: gui/configWizard.py:625
+msgid "Calibrating the Steps Per E requires some manual actions."
+msgstr ""
+
+#: gui/configWizard.py:626
+msgid "First remove any filament from your machine."
+msgstr ""
+
+#: gui/configWizard.py:627
+msgid ""
+"Next put in your filament so the tip is aligned with the\n"
+"top of the extruder drive."
+msgstr ""
+
+#: gui/configWizard.py:628
+msgid "We'll push the filament 100mm"
+msgstr ""
+
+#: gui/configWizard.py:629
+msgid "Extrude 100mm filament"
+msgstr ""
+
+#: gui/configWizard.py:630
+msgid ""
+"Now measure the amount of extruded filament:\n"
+"(this can be more or less then 100mm)"
+msgstr ""
+
+#: gui/configWizard.py:631
+msgid "Save"
+msgstr ""
+
+#: gui/configWizard.py:632
+msgid "This results in the following steps per E:"
+msgstr ""
+
+#: gui/configWizard.py:634
+msgid "You can repeat these steps to get better calibration."
+msgstr ""
+
+#: gui/configWizard.py:637
+msgid ""
+"If you still have filament in your printer which needs\n"
+"heat to remove, press the heat up button below:"
+msgstr ""
+
+#: gui/configWizard.py:638
+msgid "Heatup for filament removal"
+msgstr ""
+
+#: gui/configWizard.py:661 gui/configWizard.py:693
+msgid ""
+"Error: Failed to open serial port to machine\n"
+"If this keeps happening, try disconnecting and reconnecting the USB cable"
+msgstr ""
+
+#: gui/firmwareInstall.py:39
+msgid ""
+"I am sorry, but Cura does not ship with a default firmware for your machine "
+"configuration."
+msgstr ""
+
+#: gui/firmwareInstall.py:39 gui/firmwareInstall.py:98 gui/mainWindow.py:375
+msgid "Firmware update"
+msgstr ""
+
+#: gui/firmwareInstall.py:49
+msgid "OK"
+msgstr ""
+
+#: gui/firmwareInstall.py:68
+msgid "Reading firmware..."
+msgstr ""
+
+#: gui/firmwareInstall.py:70
+msgid "Connecting to machine..."
+msgstr ""
+
+#: gui/firmwareInstall.py:87
+msgid "Uploading firmware..."
+msgstr ""
+
+#: gui/firmwareInstall.py:90
+#, possible-python-format
+msgid ""
+"Done!\n"
+"Installed firmware: %s"
+msgstr ""
+
+#: gui/firmwareInstall.py:92
+msgid "Failed to write firmware.\n"
+msgstr ""
+
+#: gui/firmwareInstall.py:97
+msgid ""
+"Failed to find machine for firmware upgrade\n"
+"Is your machine connected to the PC?"
+msgstr ""
+
+#: gui/mainWindow.py:55
+msgid "Load model file...\tCTRL+L"
+msgstr ""
+
+#: gui/mainWindow.py:57
+msgid "Save model...\tCTRL+S"
+msgstr ""
+
+#: gui/mainWindow.py:59
+msgid "Clear platform"
+msgstr ""
+
+#: gui/mainWindow.py:63
+msgid "Print...\tCTRL+P"
+msgstr ""
+
+#: gui/mainWindow.py:65 gui/sceneView.py:195
+msgid "Save GCode..."
+msgstr ""
+
+#: gui/mainWindow.py:67
+msgid "Show slice engine log..."
+msgstr ""
+
+#: gui/mainWindow.py:71
+msgid "Open Profile..."
+msgstr ""
+
+#: gui/mainWindow.py:74
+msgid "Save Profile..."
+msgstr ""
+
+#: gui/mainWindow.py:77
+msgid "Load Profile from GCode..."
+msgstr ""
+
+#: gui/mainWindow.py:81
+msgid "Reset Profile to default"
+msgstr ""
+
+#: gui/mainWindow.py:86
+msgid "Preferences...\tCTRL+,"
+msgstr ""
+
+#: gui/mainWindow.py:92
+msgid "&Recent Model Files"
+msgstr ""
+
+#: gui/mainWindow.py:99
+msgid "&Recent Profile Files"
+msgstr ""
+
+#: gui/mainWindow.py:105
+msgid "Quit"
+msgstr ""
+
+#: gui/mainWindow.py:107
+msgid "&File"
+msgstr ""
+
+#: gui/mainWindow.py:110
+msgid "Switch to quickprint..."
+msgstr ""
+
+#: gui/mainWindow.py:113
+msgid "Switch to full settings..."
+msgstr ""
+
+#: gui/mainWindow.py:121
+msgid "Minecraft import..."
+msgstr ""
+
+#: gui/mainWindow.py:124
+msgid "PID Debugger..."
+msgstr ""
+
+#: gui/mainWindow.py:126
+msgid "Tools"
+msgstr ""
+
+#: gui/mainWindow.py:129
+msgid "Open expert settings..."
+msgstr ""
+
+#: gui/mainWindow.py:134
+msgid "Install default Marlin firmware"
+msgstr ""
+
+#: gui/mainWindow.py:136
+msgid "Install custom firmware"
+msgstr ""
+
+#: gui/mainWindow.py:139
+msgid "Run first run wizard..."
+msgstr ""
+
+#: gui/mainWindow.py:141
+msgid "Run bed leveling wizard..."
+msgstr ""
+
+#: gui/mainWindow.py:144
+msgid "Run head offset wizard..."
+msgstr ""
+
+#: gui/mainWindow.py:146
+msgid "Expert"
+msgstr ""
+
+#: gui/mainWindow.py:149
+msgid "Online documentation..."
+msgstr ""
+
+#: gui/mainWindow.py:151
+msgid "Report a problem..."
+msgstr ""
+
+#: gui/mainWindow.py:153
+msgid "Check for update..."
+msgstr ""
+
+#: gui/mainWindow.py:155
+msgid "Open YouMagine website..."
+msgstr ""
+
+#: gui/mainWindow.py:157
+msgid "About Cura..."
+msgstr ""
+
+#: gui/mainWindow.py:159
+msgid "Help"
+msgstr ""
+
+#: gui/mainWindow.py:318
+msgid "Select profile file to load"
+msgstr ""
+
+#: gui/mainWindow.py:330
+msgid "Select gcode file to load profile from"
+msgstr ""
+
+#: gui/mainWindow.py:343
+msgid ""
+"No profile found in GCode file.\n"
+"This feature only works with GCode files made by Cura 12.07 or newer."
+msgstr ""
+
+#: gui/mainWindow.py:343
+msgid "Profile load error"
+msgstr ""
+
+#: gui/mainWindow.py:347
+msgid "Select profile file to save"
+msgstr ""
+
+#: gui/mainWindow.py:355
+msgid ""
+"This will reset all profile settings to defaults.\n"
+"Unless you have saved your current profile, all settings will be lost!\n"
+"Do you really want to reset?"
+msgstr ""
+
+#: gui/mainWindow.py:355
+msgid "Profile reset"
+msgstr ""
+
+#: gui/mainWindow.py:375
+msgid ""
+"Warning: Installing a custom firmware does not guarantee that you machine "
+"will function correctly, and could damage your machine."
+msgstr ""
+
+#: gui/mainWindow.py:376
+msgid "Open firmware to upload"
+msgstr ""
+
+#: gui/mainWindow.py:416
+msgid "You are running the latest version of Cura!"
+msgstr ""
+
+#: gui/mainWindow.py:416
+msgid "Awesome!"
+msgstr ""
+
+#: gui/mainWindow.py:421
+msgid "End solution for Open Source Fused Filament Fabrication 3D printing."
+msgstr ""
+
+#: gui/mainWindow.py:423
+msgid "Copyright (C) David Braam"
+msgstr ""
+
+#: gui/util/openglGui.py:239
+msgid "An error has occurred during the 3D view drawing."
+msgstr ""
+
+#: gui/util/openglGui.py:246
+msgid "3D window error"
+msgstr ""
+
+#: gui/pluginPanel.py:26
+msgid "Plugins:"
+msgstr ""
+
+#: gui/pluginPanel.py:30
+msgid "Open plugin location"
+msgstr ""
+
+#: gui/pluginPanel.py:31
+msgid "Enabled plugins"
+msgstr ""
+
+#: gui/pluginPanel.py:133
+msgid "You need to select a plugin before you can add anything."
+msgstr ""
+
+#: gui/pluginPanel.py:133
+msgid "Error: no plugin selected"
+msgstr ""
+
+#: gui/preferencesDialog.py:23
+msgid "Machine settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:32
+msgid "Printer head size"
+msgstr ""
+
+#: gui/preferencesDialog.py:40
+#, possible-python-format
+msgid "Extruder %d"
+msgstr ""
+
+#: gui/preferencesDialog.py:44
+msgid "Colours"
+msgstr ""
+
+#: gui/preferencesDialog.py:49
+msgid "Filament settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:54
+msgid "Communication settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:63
+msgid "Cura settings"
+msgstr ""
+
+#: gui/preferencesDialog.py:77
+msgid ""
+"After changing the amount of extruders you need to restart Cura for full "
+"effect."
+msgstr ""
+
+#: gui/preferencesDialog.py:77
+msgid "Extruder amount warning."
+msgstr ""
+
+#: gui/printWindow.py:127
+msgid "Printing"
+msgstr ""
+
+#: gui/printWindow.py:156
+msgid "Statistics"
+msgstr ""
+
+#: gui/printWindow.py:161
+msgid ""
+"Your computer is running on battery power.\n"
+"Connect your computer to AC power or your print might not finish."
+msgstr ""
+
+#: gui/printWindow.py:172
+msgid ""
+"Filament: ####.##m #.##g\n"
+"Estimated print time: #####:##\n"
+"Machine state:\n"
+"Detecting baudrateXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+msgstr ""
+
+#: gui/printWindow.py:177
+msgid "Connect"
+msgstr ""
+
+#: gui/printWindow.py:179 gui/sceneView.py:64 gui/sceneView.py:745
+msgid "Print"
+msgstr ""
+
+#: gui/printWindow.py:180 gui/printWindow.py:417
+msgid "Pause"
+msgstr ""
+
+#: gui/printWindow.py:181
+msgid "Cancel print"
+msgstr ""
+
+#: gui/printWindow.py:182
+msgid "Error log"
+msgstr ""
+
+#: gui/printWindow.py:203
+msgid "BedTemp:"
+msgstr ""
+
+#: gui/printWindow.py:211
+msgid "Temp:"
+msgstr ""
+
+#: gui/printWindow.py:259
+msgid "Jog"
+msgstr ""
+
+#: gui/printWindow.py:274
+msgid "Outer wall:"
+msgstr ""
+
+#: gui/printWindow.py:277
+msgid "Inner wall:"
+msgstr ""
+
+#: gui/printWindow.py:280
+msgid "Fill:"
+msgstr ""
+
+#: gui/printWindow.py:283
+msgid "Support:"
+msgstr ""
+
+#: gui/printWindow.py:287
+msgid "Speed"
+msgstr ""
+
+#: gui/printWindow.py:305
+msgid "Term"
+msgstr ""
+
+#: gui/printWindow.py:312
+msgid "Enable timelapse movie recording"
+msgstr ""
+
+#: gui/printWindow.py:326
+msgid "Show preview"
+msgstr ""
+
+#: gui/printWindow.py:332
+msgid "Camera"
+msgstr ""
+
+#: gui/printWindow.py:415
+msgid "Resume"
+msgstr ""
+
+#: gui/printWindow.py:432
+msgid "Loading gcode...\n"
+msgstr ""
+
+#: gui/printWindow.py:434
+#, possible-python-format
+msgid "Filament: %(amount).2fm %(weight).2fg\n"
+msgstr ""
+
+#: gui/printWindow.py:438
+#, possible-python-format
+msgid "Filament cost: %s\n"
+msgstr ""
+
+#: gui/sceneView.py:63
+msgid "Load"
+msgstr ""
+
+#: gui/sceneView.py:68
+msgid "Rotate"
+msgstr ""
+
+#: gui/sceneView.py:69
+msgid "Scale"
+msgstr ""
+
+#: gui/sceneView.py:70
+msgid "Mirror"
+msgstr ""
+
+#: gui/sceneView.py:72 gui/sceneView.py:75
+msgid "Reset"
+msgstr ""
+
+#: gui/sceneView.py:73
+msgid "Lay flat"
+msgstr ""
+
+#: gui/sceneView.py:76
+msgid "To max"
+msgstr ""
+
+#: gui/sceneView.py:78
+msgid "Mirror X"
+msgstr ""
+
+#: gui/sceneView.py:79
+msgid "Mirror Y"
+msgstr ""
+
+#: gui/sceneView.py:80
+msgid "Mirror Z"
+msgstr ""
+
+#: gui/sceneView.py:88
+msgid "Scale X"
+msgstr ""
+
+#: gui/sceneView.py:90
+msgid "Scale Y"
+msgstr ""
+
+#: gui/sceneView.py:92
+msgid "Scale Z"
+msgstr ""
+
+#: gui/sceneView.py:94
+msgid "Size X (mm)"
+msgstr ""
+
+#: gui/sceneView.py:96
+msgid "Size Y (mm)"
+msgstr ""
+
+#: gui/sceneView.py:98
+msgid "Size Z (mm)"
+msgstr ""
+
+#: gui/sceneView.py:100
+msgid "Uniform scale"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "View mode"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Normal"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Overhang"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Transparent"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "X-Ray"
+msgstr ""
+
+#: gui/sceneView.py:103
+msgid "Layers"
+msgstr ""
+
+#: gui/sceneView.py:106
+msgid "Share on YouMagine"
+msgstr ""
+
+#: gui/sceneView.py:124
+msgid "Open 3D model"
+msgstr ""
+
+#: gui/sceneView.py:164
+msgid "Save 3D model"
+msgstr ""
+
+#: gui/sceneView.py:194
+msgid "Print with USB"
+msgstr ""
+
+#: gui/sceneView.py:196
+msgid "Slice engine log..."
+msgstr ""
+
+#: gui/sceneView.py:210 gui/sceneView.py:751
+msgid "Save toolpath"
+msgstr ""
+
+#: gui/sceneView.py:247
+msgid "The slicing engine reported the following"
+msgstr ""
+
+#: gui/sceneView.py:247
+msgid "Engine log..."
+msgstr ""
+
+#: gui/sceneView.py:617
+msgid "Delete"
+msgstr ""
+
+#: gui/sceneView.py:618
+msgid "Multiply"
+msgstr ""
+
+#: gui/sceneView.py:619
+msgid "Split"
+msgstr ""
+
+#: gui/sceneView.py:621
+msgid "Dual extrusion merge"
+msgstr ""
+
+#: gui/sceneView.py:623
+msgid "Delete all"
+msgstr ""
+
+#: gui/sceneView.py:748
+msgid "Toolpath to SD"
+msgstr ""
+
+#: gui/sceneView.py:1058
+msgid "Loading toolpath for visualization..."
+msgstr ""
+
+#: gui/sceneView.py:1109
+msgid "Overhang view not working due to lack of OpenGL shaders support."
+msgstr ""
+
+#: gui/simpleMode.py:20
+msgid "High quality print"
+msgstr ""
+
+#: gui/simpleMode.py:21
+msgid "Normal quality print"
+msgstr ""
+
+#: gui/simpleMode.py:22
+msgid "Fast low quality print"
+msgstr ""
+
+#: gui/simpleMode.py:23
+msgid "Thin walled cup or vase"
+msgstr ""
+
+#: gui/simpleMode.py:31
+msgid "Print support structure"
+msgstr ""
+
+#: gui/simpleMode.py:36
+msgid "Select a print type:"
+msgstr ""
+
+#: gui/simpleMode.py:46
+msgid "Material:"
+msgstr ""
+
+#: gui/simpleMode.py:50
+msgid "Diameter:"
+msgstr ""
+
+#: gui/simpleMode.py:56
+msgid "Other:"
+msgstr ""
+
+#: gui/simpleMode.py:117
+msgid "Exterior Only"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:79
+msgid "Checking token"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:83
+msgid "Failed to contact YouMagine.com"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:83 gui/tools/youmagineGui.py:116
+#: gui/tools/youmagineGui.py:133 gui/tools/youmagineGui.py:140
+#: gui/tools/youmagineGui.py:148 gui/tools/youmagineGui.py:153
+msgid "YouMagine error."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:100
+msgid "Cura is now authorized to share on YouMagine"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:100
+msgid "YouMagine."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:112
+msgid "Creating new design on YouMagine..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:116
+msgid "Failed to create a design, nothing uploaded!"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:120
+#, possible-python-format
+msgid "Building model %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:131
+#, possible-python-format
+msgid "Uploading model %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:133 gui/tools/youmagineGui.py:140
+#: gui/tools/youmagineGui.py:148
+#, possible-python-format
+msgid "Failed to upload %s!"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:137
+#, possible-python-format
+msgid "Uploading file %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:145
+#, possible-python-format
+msgid "Uploading image %s..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:153
+msgid "Failed to upload snapshot!"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:158
+msgid "Publishing design..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:230
+msgid "Request authorization from YouMagine"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:231
+msgid "Paste token here"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:237
+msgid ""
+"To share your designs on YouMagine\n"
+"you need an account on YouMagine.com\n"
+"and authorize Cura to access your account."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:239
+msgid ""
+"This will open a browser window where you can\n"
+"authorize Cura to access your YouMagine account.\n"
+"You can revoke access at any time\n"
+"from YouMagine.com"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:274
+msgid "Design name"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:278
+msgid "Publish after upload"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:279
+msgid "Upload"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:287
+msgid "Add..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:289
+msgid "Webcam..."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:297
+msgid ""
+"Directly publish the design after uploading.\n"
+"Without this check the design will not be public\n"
+"until you publish it yourself on YouMagine.com"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:303
+msgid "Design name:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:305
+msgid "Description:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:307
+msgid "Category:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:309
+msgid "License:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:312
+msgid "Images:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:315
+msgid "Design files:"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:337
+msgid "The name cannot be empty"
+msgstr ""
+
+#: gui/tools/youmagineGui.py:337 gui/tools/youmagineGui.py:341
+msgid "New design error."
+msgstr ""
+
+#: gui/tools/youmagineGui.py:341
+msgid "The description cannot be empty"
+msgstr ""
+
+#: util/profile.py:114
+msgid "Layer height (mm)"
+msgstr ""
+
+#: util/profile.py:114
+msgid ""
+"Layer height in millimeters.\n"
+"This is the most important setting to determine the quality of your print. "
+"Normal quality prints are 0.1mm, high quality is 0.06mm. You can go up to "
+"0.25mm with an Ultimaker for very fast prints at low quality."
+msgstr ""
+
+#: util/profile.py:115
+msgid "Shell thickness (mm)"
+msgstr ""
+
+#: util/profile.py:115
+msgid ""
+"Thickness of the outside shell in the horizontal direction.\n"
+"This is used in combination with the nozzle size to define the number\n"
+"of perimeter lines and the thickness of those perimeter lines."
+msgstr ""
+
+#: util/profile.py:116
+msgid "Enable retraction"
+msgstr ""
+
+#: util/profile.py:116
+msgid ""
+"Retract the filament when the nozzle is moving over a none-printed area. "
+"Details about the retraction can be configured in the advanced tab."
+msgstr ""
+
+#: util/profile.py:117
+msgid "Bottom/Top thickness (mm)"
+msgstr ""
+
+#: util/profile.py:117
+msgid ""
+"This controls the thickness of the bottom and top layers, the amount of "
+"solid layers put down is calculated by the layer thickness and this value.\n"
+"Having this value a multiple of the layer thickness makes sense. And keep it "
+"near your wall thickness to make an evenly strong part."
+msgstr ""
+
+#: util/profile.py:118
+msgid "Fill Density (%)"
+msgstr ""
+
+#: util/profile.py:118
+msgid ""
+"This controls how densely filled the insides of your print will be. For a "
+"solid part use 100%, for an empty part use 0%. A value around 20% is usually "
+"enough.\n"
+"This won't effect the outside of the print and only adjusts how strong the "
+"part becomes."
+msgstr ""
+
+#: util/profile.py:119
+msgid ""
+"The nozzle size is very important, this is used to calculate the line width "
+"of the infill, and used to calculate the amount of outside wall lines and "
+"thickness for the wall thickness you entered in the print settings."
+msgstr ""
+
+#: util/profile.py:120
+msgid "Print speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:120
+msgid ""
+"Speed at which printing happens. A well adjusted Ultimaker can reach 150mm/"
+"s, but for good quality prints you want to print slower. Printing speed "
+"depends on a lot of factors. So you will be experimenting with optimal "
+"settings for this."
+msgstr ""
+
+#: util/profile.py:121
+msgid "Printing temperature (C)"
+msgstr ""
+
+#: util/profile.py:121 util/profile.py:122 util/profile.py:123
+#: util/profile.py:124
+msgid ""
+"Temperature used for printing. Set at 0 to pre-heat yourself.\n"
+"For PLA a value of 210C is usually used.\n"
+"For ABS a value of 230C or higher is required."
+msgstr ""
+
+#: util/profile.py:122
+msgid "2nd nozzle temperature (C)"
+msgstr ""
+
+#: util/profile.py:123
+msgid "3th nozzle temperature (C)"
+msgstr ""
+
+#: util/profile.py:124
+msgid "4th nozzle temperature (C)"
+msgstr ""
+
+#: util/profile.py:125
+msgid "Bed temperature (C)"
+msgstr ""
+
+#: util/profile.py:125
+msgid ""
+"Temperature used for the heated printer bed. Set at 0 to pre-heat yourself."
+msgstr ""
+
+#: util/profile.py:126
+msgid "Support type"
+msgstr ""
+
+#: util/profile.py:126
+msgid ""
+"Type of support structure build.\n"
+"\"Touching buildplate\" is the most commonly used support setting.\n"
+"\n"
+"None does not do any support.\n"
+"Touching buildplate only creates support where the support structure will "
+"touch the build platform.\n"
+"Everywhere creates support even on top of parts of the model."
+msgstr ""
+
+#: util/profile.py:127
+msgid "Platform adhesion type"
+msgstr ""
+
+#: util/profile.py:127
+msgid ""
+"Different options that help in preventing corners from lifting due to "
+"warping.\n"
+"Brim adds a single layer thick flat area around your object which is easy to "
+"cut off afterwards, and the recommended option.\n"
+"Raft adds a thick raster at below the object and a thin interface between "
+"this and your object.\n"
+"(Note that enabling the brim or raft disables the skirt)"
+msgstr ""
+
+#: util/profile.py:128
+msgid "Support dual extrusion"
+msgstr ""
+
+#: util/profile.py:128
+msgid ""
+"Which extruder to use for support material, for break-away support you can "
+"use both extruders.\n"
+"But if one of the materials is more expensive then the other you could "
+"select an extruder to use for support material. This causes more extruder "
+"switches.\n"
+"You can also use the 2nd extruder for soluble support materials."
+msgstr ""
+
+#: util/profile.py:129
+msgid "Diameter (mm)"
+msgstr ""
+
+#: util/profile.py:129
+msgid ""
+"Diameter of your filament, as accurately as possible.\n"
+"If you cannot measure this value you will have to calibrate it, a higher "
+"number means less extrusion, a smaller number generates more extrusion."
+msgstr ""
+
+#: util/profile.py:130
+msgid "Diameter2 (mm)"
+msgstr ""
+
+#: util/profile.py:130
+msgid ""
+"Diameter of your filament for the 2nd nozzle. Use 0 to use the same diameter "
+"as for nozzle 1."
+msgstr ""
+
+#: util/profile.py:131
+msgid "Diameter3 (mm)"
+msgstr ""
+
+#: util/profile.py:131
+msgid ""
+"Diameter of your filament for the 3th nozzle. Use 0 to use the same diameter "
+"as for nozzle 1."
+msgstr ""
+
+#: util/profile.py:132
+msgid "Diameter4 (mm)"
+msgstr ""
+
+#: util/profile.py:132
+msgid ""
+"Diameter of your filament for the 4th nozzle. Use 0 to use the same diameter "
+"as for nozzle 1."
+msgstr ""
+
+#: util/profile.py:133
+msgid "Flow (%)"
+msgstr ""
+
+#: util/profile.py:133
+msgid ""
+"Flow compensation, the amount of material extruded is multiplied by this "
+"value"
+msgstr ""
+
+#: util/profile.py:134
+msgid "Speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:134
+msgid ""
+"Speed at which the filament is retracted, a higher retraction speed works "
+"better. But a very high retraction speed can lead to filament grinding."
+msgstr ""
+
+#: util/profile.py:135
+msgid "Distance (mm)"
+msgstr ""
+
+#: util/profile.py:135
+msgid ""
+"Amount of retraction, set at 0 for no retraction at all. A value of 4.5mm "
+"seems to generate good results."
+msgstr ""
+
+#: util/profile.py:136
+msgid "Dual extrusion switch amount (mm)"
+msgstr ""
+
+#: util/profile.py:136
+msgid ""
+"Amount of retraction when switching nozzle with dual-extrusion, set at 0 for "
+"no retraction at all. A value of 16.0mm seems to generate good results."
+msgstr ""
+
+#: util/profile.py:137
+msgid "Minimum travel (mm)"
+msgstr ""
+
+#: util/profile.py:137
+msgid ""
+"Minimum amount of travel needed for a retraction to happen at all. To make "
+"sure you do not get a lot of retractions in a small area."
+msgstr ""
+
+#: util/profile.py:138
+msgid "Enable combing"
+msgstr ""
+
+#: util/profile.py:138
+msgid ""
+"Combing is the act of avoiding holes in the print for the head to travel "
+"over. If combing is disabled the printer head moves straight from the start "
+"point to the end point and it will always retract."
+msgstr ""
+
+#: util/profile.py:139
+msgid "Minimal extrusion before retracting (mm)"
+msgstr ""
+
+#: util/profile.py:139
+msgid ""
+"The minimal amount of extrusion that needs to be done before retracting "
+"again if a retraction needs to happen before this minimal is reached the "
+"retraction is ignored.\n"
+"This avoids retraction a lot on the same piece of filament which flattens "
+"the filament and causes grinding issues."
+msgstr ""
+
+#: util/profile.py:140
+msgid "Initial layer thickness (mm)"
+msgstr ""
+
+#: util/profile.py:140
+msgid ""
+"Layer thickness of the bottom layer. A thicker bottom layer makes sticking "
+"to the bed easier. Set to 0.0 to have the bottom layer thickness the same as "
+"the other layers."
+msgstr ""
+
+#: util/profile.py:141
+msgid "Cut off object bottom (mm)"
+msgstr ""
+
+#: util/profile.py:141
+msgid ""
+"Sinks the object into the platform, this can be used for objects that do not "
+"have a flat bottom and thus create a too small first layer."
+msgstr ""
+
+#: util/profile.py:143
+msgid "Dual extrusion overlap (mm)"
+msgstr ""
+
+#: util/profile.py:143
+msgid ""
+"Add a certain amount of overlapping extrusion on dual-extrusion prints. This "
+"bonds the different colors better together."
+msgstr ""
+
+#: util/profile.py:144
+msgid "Travel speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:144
+msgid ""
+"Speed at which travel moves are done, a high quality build Ultimaker can "
+"reach speeds of 250mm/s. But some machines might miss steps then."
+msgstr ""
+
+#: util/profile.py:145
+msgid "Bottom layer speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:145
+msgid ""
+"Print speed for the bottom layer, you want to print the first layer slower "
+"so it sticks better to the printer bed."
+msgstr ""
+
+#: util/profile.py:146
+msgid "Infill speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:146
+msgid ""
+"Speed at which infill parts are printed. If set to 0 then the print speed is "
+"used for the infill. Printing the infill faster can greatly reduce printing, "
+"but this can negatively effect print quality.."
+msgstr ""
+
+#: util/profile.py:147
+msgid "Minimal layer time (sec)"
+msgstr ""
+
+#: util/profile.py:147
+msgid ""
+"Minimum time spend in a layer, gives the layer time to cool down before the "
+"next layer is put on top. If the layer will be placed down too fast the "
+"printer will slow down to make sure it has spend at least this amount of "
+"seconds printing this layer."
+msgstr ""
+
+#: util/profile.py:148
+msgid "Enable cooling fan"
+msgstr ""
+
+#: util/profile.py:148
+msgid ""
+"Enable the cooling fan during the print. The extra cooling from the cooling "
+"fan is essential during faster prints."
+msgstr ""
+
+#: util/profile.py:150
+msgid "Line count"
+msgstr ""
+
+#: util/profile.py:150
+msgid ""
+"The skirt is a line drawn around the object at the first layer. This helps "
+"to prime your extruder, and to see if the object fits on your platform.\n"
+"Setting this to 0 will disable the skirt. Multiple skirt lines can help "
+"priming your extruder better for small objects."
+msgstr ""
+
+#: util/profile.py:151
+msgid "Start distance (mm)"
+msgstr ""
+
+#: util/profile.py:151
+msgid ""
+"The distance between the skirt and the first layer.\n"
+"This is the minimal distance, multiple skirt lines will be put outwards from "
+"this distance."
+msgstr ""
+
+#: util/profile.py:152
+msgid "Minimal length (mm)"
+msgstr ""
+
+#: util/profile.py:152
+msgid ""
+"The minimal length of the skirt, if this minimal length is not reached it "
+"will add more skirt lines to reach this minimal lenght.\n"
+"Note: If the line count is set to 0 this is ignored."
+msgstr ""
+
+#: util/profile.py:155
+msgid "Fan on layer number"
+msgstr ""
+
+#: util/profile.py:155
+msgid ""
+"The layer at which the fan is turned on. The first layer is layer 0. The "
+"first layer can stick better if you turn on the fan on, on the 2nd layer."
+msgstr ""
+
+#: util/profile.py:156
+msgid "Fan speed min (%)"
+msgstr ""
+
+#: util/profile.py:156
+msgid ""
+"When the fan is turned on, it is enabled at this speed setting. If cool "
+"slows down the layer, the fan is adjusted between the min and max speed. "
+"Minimal fan speed is used if the layer is not slowed down due to cooling."
+msgstr ""
+
+#: util/profile.py:157
+msgid "Fan speed max (%)"
+msgstr ""
+
+#: util/profile.py:157
+msgid ""
+"When the fan is turned on, it is enabled at this speed setting. If cool "
+"slows down the layer, the fan is adjusted between the min and max speed. "
+"Maximal fan speed is used if the layer is slowed down due to cooling by more "
+"than 200%."
+msgstr ""
+
+#: util/profile.py:158
+msgid "Minimum speed (mm/s)"
+msgstr ""
+
+#: util/profile.py:158
+msgid ""
+"The minimal layer time can cause the print to slow down so much it starts to "
+"ooze. The minimal feedrate protects against this. Even if a print gets slown "
+"down it will never be slower than this minimal speed."
+msgstr ""
+
+#: util/profile.py:159
+msgid "Cool head lift"
+msgstr ""
+
+#: util/profile.py:159
+msgid ""
+"Lift the head if the minimal speed is hit because of cool slowdown, and wait "
+"the extra time so the minimal layer time is always hit."
+msgstr ""
+
+#: util/profile.py:164
+msgid "Solid infill top"
+msgstr ""
+
+#: util/profile.py:164
+msgid ""
+"Create a solid top surface, if set to false the top is filled with the fill "
+"percentage. Useful for cups/vases."
+msgstr ""
+
+#: util/profile.py:165
+msgid "Solid infill bottom"
+msgstr ""
+
+#: util/profile.py:165
+msgid ""
+"Create a solid bottom surface, if set to false the bottom is filled with the "
+"fill percentage. Useful for buildings."
+msgstr ""
+
+#: util/profile.py:166
+msgid "Infill overlap (%)"
+msgstr ""
+
+#: util/profile.py:166
+msgid ""
+"Amount of overlap between the infill and the walls. There is a slight "
+"overlap with the walls and the infill so the walls connect firmly to the "
+"infill."
+msgstr ""
+
+#: util/profile.py:167
+msgid "Fill amount (%)"
+msgstr ""
+
+#: util/profile.py:167
+#, possible-python-format
+msgid ""
+"Amount of infill structure in the support material, less material gives "
+"weaker support which is easier to remove. 20% seems to be a good average."
+msgstr ""
+
+#: util/profile.py:168
+msgid "Distance X/Y (mm)"
+msgstr ""
+
+#: util/profile.py:168
+msgid ""
+"Distance of the support material from the print, in the X/Y directions.\n"
+"0.7mm gives a nice distance from the print so the support does not stick to "
+"the print."
+msgstr ""
+
+#: util/profile.py:169
+msgid "Distance Z (mm)"
+msgstr ""
+
+#: util/profile.py:169
+msgid ""
+"Distance from the top/bottom of the support to the print. A small gap here "
+"makes it easier to remove the support but makes the print a bit uglier.\n"
+"0.15mm gives a good seperation of the support material."
+msgstr ""
+
+#: util/profile.py:173
+msgid "Brim line amount"
+msgstr ""
+
+#: util/profile.py:173
+msgid ""
+"The amount of lines used for a brim, more lines means a larger brim which "
+"sticks better, but this also makes your effective print area smaller."
+msgstr ""
+
+#: util/profile.py:174
+msgid "Extra margin (mm)"
+msgstr ""
+
+#: util/profile.py:174
+msgid ""
+"If the raft is enabled, this is the extra raft area around the object which "
+"is also rafted. Increasing this margin will create a stronger raft while "
+"using more material and leaving less are for your print."
+msgstr ""
+
+#: util/profile.py:175
+msgid "Line spacing (mm)"
+msgstr ""
+
+#: util/profile.py:175
+msgid ""
+"When you are using the raft this is the distance between the centerlines of "
+"the raft line."
+msgstr ""
+
+#: util/profile.py:176
+msgid "Base thickness (mm)"
+msgstr ""
+
+#: util/profile.py:176
+msgid ""
+"When you are using the raft this is the thickness of the base layer which is "
+"put down."
+msgstr ""
+
+#: util/profile.py:177
+msgid "Base line width (mm)"
+msgstr ""
+
+#: util/profile.py:177
+msgid ""
+"When you are using the raft this is the width of the base layer lines which "
+"are put down."
+msgstr ""
+
+#: util/profile.py:178
+msgid "Interface thickness (mm)"
+msgstr ""
+
+#: util/profile.py:178
+msgid ""
+"When you are using the raft this is the thickness of the interface layer "
+"which is put down."
+msgstr ""
+
+#: util/profile.py:179
+msgid "Interface line width (mm)"
+msgstr ""
+
+#: util/profile.py:179
+msgid ""
+"When you are using the raft this is the width of the interface layer lines "
+"which are put down."
+msgstr ""
+
+#: util/profile.py:181
+msgid "Combine everything (Type-A)"
+msgstr ""
+
+#: util/profile.py:181 util/profile.py:182
+msgid ""
+"This expert option adds all parts of the model together. The result is "
+"usually that internal cavities disappear. Depending on the model this can be "
+"intended or not. Enabling this option is at your own risk. Type-A is "
+"depended on the model normals and tries to keep some internal holes intact. "
+"Type-B ignores all internal holes and only keeps the outside shape per layer."
+msgstr ""
+
+#: util/profile.py:182
+msgid "Combine everything (Type-B)"
+msgstr ""
+
+#: util/profile.py:183
+msgid "Keep open faces"
+msgstr ""
+
+#: util/profile.py:183
+msgid ""
+"This expert option keeps all the open bits of the model intact. Normally "
+"Cura tries to stitch up small holes and remove everything with big holes, "
+"but this option keeps bits that are not properly part of anything and just "
+"goes with whatever it is left. This option is usually not what you want, but "
+"it might enable you to slice models otherwise failing to produce proper "
+"paths.\n"
+"As with all \"Fix horrible\" options, results may vary and use at your own "
+"risk."
+msgstr ""
+
+#: util/profile.py:184
+msgid "Extensive stitching"
+msgstr ""
+
+#: util/profile.py:184
+msgid ""
+"Extrensive stitching tries to fix up open holes in the model by closing the "
+"hole with touching polygons. This algorthm is quite expensive and could "
+"introduce a lot of processing time.\n"
+"As with all \"Fix horrible\" options, results may vary and use at your own "
+"risk."
+msgstr ""
index a886f1d1a3d8031711bc88bea5c83249102f665c..ae415aad03255308a28fc84c116b7ccdcd732a03 100644 (file)
@@ -111,77 +111,77 @@ class setting(object):
 #########################################################
 ## Settings
 #########################################################
-setting('layer_height',              0.1, float, 'basic',    'Quality').setRange(0.0001).setLabel('Layer height (mm)', 'Layer height in millimeters.\nThis is the most important setting to determine the quality of your print. Normal quality prints are 0.1mm, high quality is 0.06mm. You can go up to 0.25mm with an Ultimaker for very fast prints at low quality.')
-setting('wall_thickness',            0.8, float, 'basic',    'Quality').setRange(0.0).setLabel('Shell thickness (mm)', 'Thickness of the outside shell in the horizontal direction.\nThis is used in combination with the nozzle size to define the number\nof perimeter lines and the thickness of those perimeter lines.')
-setting('retraction_enable',       False, bool,  'basic',    'Quality').setLabel('Enable retraction', 'Retract the filament when the nozzle is moving over a none-printed area. Details about the retraction can be configured in the advanced tab.')
-setting('solid_layer_thickness',     0.6, float, 'basic',    'Fill').setRange(0).setLabel('Bottom/Top thickness (mm)', 'This controls the thickness of the bottom and top layers, the amount of solid layers put down is calculated by the layer thickness and this value.\nHaving this value a multiple of the layer thickness makes sense. And keep it near your wall thickness to make an evenly strong part.')
-setting('fill_density',               20, float, 'basic',    'Fill').setRange(0, 100).setLabel('Fill Density (%)', 'This controls how densely filled the insides of your print will be. For a solid part use 100%, for an empty part use 0%. A value around 20% is usually enough.\nThis won\'t effect the outside of the print and only adjusts how strong the part becomes.')
-setting('nozzle_size',               0.4, float, 'advanced', 'Machine').setRange(0.1,10).setLabel('Nozzle size (mm)', 'The nozzle size is very important, this is used to calculate the line width of the infill, and used to calculate the amount of outside wall lines and thickness for the wall thickness you entered in the print settings.')
-setting('print_speed',                50, float, 'basic',    'Speed & Temperature').setRange(1).setLabel('Print speed (mm/s)', 'Speed at which printing happens. A well adjusted Ultimaker can reach 150mm/s, but for good quality prints you want to print slower. Printing speed depends on a lot of factors. So you will be experimenting with optimal settings for this.')
-setting('print_temperature',         220, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel('Printing temperature (C)', 'Temperature used for printing. Set at 0 to pre-heat yourself.\nFor PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required.')
-setting('print_temperature2',          0, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel('2nd nozzle temperature (C)', 'Temperature used for printing. Set at 0 to pre-heat yourself.\nFor PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required.')
-setting('print_temperature3',          0, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel('3th nozzle temperature (C)', 'Temperature used for printing. Set at 0 to pre-heat yourself.\nFor PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required.')
-setting('print_temperature4',          0, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel('4th nozzle temperature (C)', 'Temperature used for printing. Set at 0 to pre-heat yourself.\nFor PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required.')
-setting('print_bed_temperature',      70, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel('Bed temperature (C)', 'Temperature used for the heated printer bed. Set at 0 to pre-heat yourself.')
-setting('support',                'None', ['None', 'Touching buildplate', 'Everywhere'], 'basic', 'Support').setLabel('Support type', 'Type of support structure build.\n"Touching buildplate" is the most commonly used support setting.\n\nNone does not do any support.\nTouching buildplate only creates support where the support structure will touch the build platform.\nEverywhere creates support even on top of parts of the model.')
-setting('platform_adhesion',      'None', ['None', 'Brim', 'Raft'], 'basic', 'Support').setLabel('Platform adhesion type', 'Different options that help in preventing corners from lifting due to warping.\nBrim adds a single layer thick flat area around your object which is easy to cut off afterwards, and the recommended option.\nRaft adds a thick raster at below the object and a thin interface between this and your object.\n(Note that enabling the brim or raft disables the skirt)')
-setting('support_dual_extrusion',  'Both', ['Both', 'First extruder', 'Second extruder'], 'basic', 'Support').setLabel('Support dual extrusion', 'Which extruder to use for support material, for break-away support you can use both extruders.\nBut if one of the materials is more expensive then the other you could select an extruder to use for support material. This causes more extruder switches.\nYou can also use the 2nd extruder for soluble support materials.')
-setting('filament_diameter',        2.85, float, 'basic',    'Filament').setRange(1).setLabel('Diameter (mm)', 'Diameter of your filament, as accurately as possible.\nIf you cannot measure this value you will have to calibrate it, a higher number means less extrusion, a smaller number generates more extrusion.')
-setting('filament_diameter2',          0, float, 'basic',    'Filament').setRange(0).setLabel('Diameter2 (mm)', 'Diameter of your filament for the 2nd nozzle. Use 0 to use the same diameter as for nozzle 1.')
-setting('filament_diameter3',          0, float, 'basic',    'Filament').setRange(0).setLabel('Diameter3 (mm)', 'Diameter of your filament for the 3th nozzle. Use 0 to use the same diameter as for nozzle 1.')
-setting('filament_diameter4',          0, float, 'basic',    'Filament').setRange(0).setLabel('Diameter4 (mm)', 'Diameter of your filament for the 4th nozzle. Use 0 to use the same diameter as for nozzle 1.')
-setting('filament_flow',            100., float, 'basic',    'Filament').setRange(1,300).setLabel('Flow (%)', 'Flow compensation, the amount of material extruded is multiplied by this value')
-setting('retraction_speed',         40.0, float, 'advanced', 'Retraction').setRange(0.1).setLabel('Speed (mm/s)', 'Speed at which the filament is retracted, a higher retraction speed works better. But a very high retraction speed can lead to filament grinding.')
-setting('retraction_amount',         4.5, float, 'advanced', 'Retraction').setRange(0).setLabel('Distance (mm)', 'Amount of retraction, set at 0 for no retraction at all. A value of 4.5mm seems to generate good results.')
-setting('retraction_dual_amount',   16.5, float, 'advanced', 'Retraction').setRange(0).setLabel('Dual extrusion switch amount (mm)', 'Amount of retraction when switching nozzle with dual-extrusion, set at 0 for no retraction at all. A value of 16.0mm seems to generate good results.')
-setting('retraction_min_travel',     1.5, float, 'expert',   'Retraction').setRange(0).setLabel('Minimum travel (mm)', 'Minimum amount of travel needed for a retraction to happen at all. To make sure you do not get a lot of retractions in a small area.')
-setting('retraction_combing',       True, bool,  'expert',   'Retraction').setLabel('Enable combing', 'Combing is the act of avoiding holes in the print for the head to travel over. If combing is disabled the printer head moves straight from the start point to the end point and it will always retract.')
-setting('retraction_minimal_extrusion',0.5, float,'expert',  'Retraction').setRange(0).setLabel('Minimal extrusion before retracting (mm)', 'The minimal amount of extrusion that needs to be done before retracting again if a retraction needs to happen before this minimal is reached the retraction is ignored.\nThis avoids retraction a lot on the same piece of filament which flattens the filament and causes grinding issues.')
-setting('bottom_thickness',          0.3, float, 'advanced', 'Quality').setRange(0).setLabel('Initial layer thickness (mm)', 'Layer thickness of the bottom layer. A thicker bottom layer makes sticking to the bed easier. Set to 0.0 to have the bottom layer thickness the same as the other layers.')
-setting('object_sink',               0.0, float, 'advanced', 'Quality').setLabel('Cut off object bottom (mm)', 'Sinks the object into the platform, this can be used for objects that do not have a flat bottom and thus create a too small first layer.')
+setting('layer_height',              0.1, float, 'basic',    'Quality').setRange(0.0001).setLabel(_("Layer height (mm)"), _("Layer height in millimeters.\nThis is the most important setting to determine the quality of your print. Normal quality prints are 0.1mm, high quality is 0.06mm. You can go up to 0.25mm with an Ultimaker for very fast prints at low quality."))
+setting('wall_thickness',            0.8, float, 'basic',    'Quality').setRange(0.0).setLabel(_("Shell thickness (mm)"), _("Thickness of the outside shell in the horizontal direction.\nThis is used in combination with the nozzle size to define the number\nof perimeter lines and the thickness of those perimeter lines."))
+setting('retraction_enable',       False, bool,  'basic',    'Quality').setLabel(_("Enable retraction"), _("Retract the filament when the nozzle is moving over a none-printed area. Details about the retraction can be configured in the advanced tab."))
+setting('solid_layer_thickness',     0.6, float, 'basic',    'Fill').setRange(0).setLabel(_("Bottom/Top thickness (mm)"), _("This controls the thickness of the bottom and top layers, the amount of solid layers put down is calculated by the layer thickness and this value.\nHaving this value a multiple of the layer thickness makes sense. And keep it near your wall thickness to make an evenly strong part."))
+setting('fill_density',               20, float, 'basic',    'Fill').setRange(0, 100).setLabel(_("Fill Density (%)"), _("This controls how densely filled the insides of your print will be. For a solid part use 100%, for an empty part use 0%. A value around 20% is usually enough.\nThis won't effect the outside of the print and only adjusts how strong the part becomes."))
+setting('nozzle_size',               0.4, float, 'advanced', 'Machine').setRange(0.1,10).setLabel(_("Nozzle size (mm)"), _("The nozzle size is very important, this is used to calculate the line width of the infill, and used to calculate the amount of outside wall lines and thickness for the wall thickness you entered in the print settings."))
+setting('print_speed',                50, float, 'basic',    'Speed & Temperature').setRange(1).setLabel(_("Print speed (mm/s)"), _("Speed at which printing happens. A well adjusted Ultimaker can reach 150mm/s, but for good quality prints you want to print slower. Printing speed depends on a lot of factors. So you will be experimenting with optimal settings for this."))
+setting('print_temperature',         220, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel(_("Printing temperature (C)"), _("Temperature used for printing. Set at 0 to pre-heat yourself.\nFor PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required."))
+setting('print_temperature2',          0, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel(_("2nd nozzle temperature (C)"), _("Temperature used for printing. Set at 0 to pre-heat yourself.\nFor PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required."))
+setting('print_temperature3',          0, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel(_("3th nozzle temperature (C)"), _("Temperature used for printing. Set at 0 to pre-heat yourself.\nFor PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required."))
+setting('print_temperature4',          0, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel(_("4th nozzle temperature (C)"), _("Temperature used for printing. Set at 0 to pre-heat yourself.\nFor PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required."))
+setting('print_bed_temperature',      70, int,   'basic',    'Speed & Temperature').setRange(0,340).setLabel(_("Bed temperature (C)"), _("Temperature used for the heated printer bed. Set at 0 to pre-heat yourself."))
+setting('support',                'None', ['None', 'Touching buildplate', 'Everywhere'], 'basic', 'Support').setLabel(_("Support type"), _("Type of support structure build.\n\"Touching buildplate\" is the most commonly used support setting.\n\nNone does not do any support.\nTouching buildplate only creates support where the support structure will touch the build platform.\nEverywhere creates support even on top of parts of the model."))
+setting('platform_adhesion',      'None', ['None', 'Brim', 'Raft'], 'basic', 'Support').setLabel(_("Platform adhesion type"), _("Different options that help in preventing corners from lifting due to warping.\nBrim adds a single layer thick flat area around your object which is easy to cut off afterwards, and the recommended option.\nRaft adds a thick raster at below the object and a thin interface between this and your object.\n(Note that enabling the brim or raft disables the skirt)"))
+setting('support_dual_extrusion',  'Both', ['Both', 'First extruder', 'Second extruder'], 'basic', 'Support').setLabel(_("Support dual extrusion"), _("Which extruder to use for support material, for break-away support you can use both extruders.\nBut if one of the materials is more expensive then the other you could select an extruder to use for support material. This causes more extruder switches.\nYou can also use the 2nd extruder for soluble support materials."))
+setting('filament_diameter',        2.85, float, 'basic',    'Filament').setRange(1).setLabel(_("Diameter (mm)"), _("Diameter of your filament, as accurately as possible.\nIf you cannot measure this value you will have to calibrate it, a higher number means less extrusion, a smaller number generates more extrusion."))
+setting('filament_diameter2',          0, float, 'basic',    'Filament').setRange(0).setLabel(_("Diameter2 (mm)"), _("Diameter of your filament for the 2nd nozzle. Use 0 to use the same diameter as for nozzle 1."))
+setting('filament_diameter3',          0, float, 'basic',    'Filament').setRange(0).setLabel(_("Diameter3 (mm)"), _("Diameter of your filament for the 3th nozzle. Use 0 to use the same diameter as for nozzle 1."))
+setting('filament_diameter4',          0, float, 'basic',    'Filament').setRange(0).setLabel(_("Diameter4 (mm)"), _("Diameter of your filament for the 4th nozzle. Use 0 to use the same diameter as for nozzle 1."))
+setting('filament_flow',            100., float, 'basic',    'Filament').setRange(1,300).setLabel(_("Flow (%)"), _("Flow compensation, the amount of material extruded is multiplied by this value"))
+setting('retraction_speed',         40.0, float, 'advanced', 'Retraction').setRange(0.1).setLabel(_("Speed (mm/s)"), _("Speed at which the filament is retracted, a higher retraction speed works better. But a very high retraction speed can lead to filament grinding."))
+setting('retraction_amount',         4.5, float, 'advanced', 'Retraction').setRange(0).setLabel(_("Distance (mm)"), _("Amount of retraction, set at 0 for no retraction at all. A value of 4.5mm seems to generate good results."))
+setting('retraction_dual_amount',   16.5, float, 'advanced', 'Retraction').setRange(0).setLabel(_("Dual extrusion switch amount (mm)"), _("Amount of retraction when switching nozzle with dual-extrusion, set at 0 for no retraction at all. A value of 16.0mm seems to generate good results."))
+setting('retraction_min_travel',     1.5, float, 'expert',   'Retraction').setRange(0).setLabel(_("Minimum travel (mm)"), _("Minimum amount of travel needed for a retraction to happen at all. To make sure you do not get a lot of retractions in a small area."))
+setting('retraction_combing',       True, bool,  'expert',   'Retraction').setLabel(_("Enable combing"), _("Combing is the act of avoiding holes in the print for the head to travel over. If combing is disabled the printer head moves straight from the start point to the end point and it will always retract."))
+setting('retraction_minimal_extrusion',0.5, float,'expert',  'Retraction').setRange(0).setLabel(_("Minimal extrusion before retracting (mm)"), _("The minimal amount of extrusion that needs to be done before retracting again if a retraction needs to happen before this minimal is reached the retraction is ignored.\nThis avoids retraction a lot on the same piece of filament which flattens the filament and causes grinding issues."))
+setting('bottom_thickness',          0.3, float, 'advanced', 'Quality').setRange(0).setLabel(_("Initial layer thickness (mm)"), _("Layer thickness of the bottom layer. A thicker bottom layer makes sticking to the bed easier. Set to 0.0 to have the bottom layer thickness the same as the other layers."))
+setting('object_sink',               0.0, float, 'advanced', 'Quality').setLabel(_("Cut off object bottom (mm)"), _("Sinks the object into the platform, this can be used for objects that do not have a flat bottom and thus create a too small first layer."))
 #setting('enable_skin',             False, bool,  'advanced', 'Quality').setLabel('Duplicate outlines', 'Skin prints the outer lines of the prints twice, each time with half the thickness. This gives the illusion of a higher print quality.')
-setting('overlap_dual',              0.2, float, 'advanced', 'Quality').setLabel('Dual extrusion overlap (mm)', 'Add a certain amount of overlapping extrusion on dual-extrusion prints. This bonds the different colors better together.')
-setting('travel_speed',            150.0, float, 'advanced', 'Speed').setRange(0.1).setLabel('Travel speed (mm/s)', 'Speed at which travel moves are done, a high quality build Ultimaker can reach speeds of 250mm/s. But some machines might miss steps then.')
-setting('bottom_layer_speed',         20, float, 'advanced', 'Speed').setRange(0.1).setLabel('Bottom layer speed (mm/s)', 'Print speed for the bottom layer, you want to print the first layer slower so it sticks better to the printer bed.')
-setting('infill_speed',              0.0, float, 'advanced', 'Speed').setRange(0.0).setLabel('Infill speed (mm/s)', 'Speed at which infill parts are printed. If set to 0 then the print speed is used for the infill. Printing the infill faster can greatly reduce printing, but this can negatively effect print quality..')
-setting('cool_min_layer_time',         5, float, 'advanced', 'Cool').setRange(0).setLabel('Minimal layer time (sec)', 'Minimum time spend in a layer, gives the layer time to cool down before the next layer is put on top. If the layer will be placed down too fast the printer will slow down to make sure it has spend at least this amount of seconds printing this layer.')
-setting('fan_enabled',              True, bool,  'advanced', 'Cool').setLabel('Enable cooling fan', 'Enable the cooling fan during the print. The extra cooling from the cooling fan is essential during faster prints.')
-
-setting('skirt_line_count',            1, int,   'expert', 'Skirt').setRange(0).setLabel('Line count', 'The skirt is a line drawn around the object at the first layer. This helps to prime your extruder, and to see if the object fits on your platform.\nSetting this to 0 will disable the skirt. Multiple skirt lines can help priming your extruder better for small objects.')
-setting('skirt_gap',                 3.0, float, 'expert', 'Skirt').setRange(0).setLabel('Start distance (mm)', 'The distance between the skirt and the first layer.\nThis is the minimal distance, multiple skirt lines will be put outwards from this distance.')
-setting('skirt_minimal_length',    150.0, float, 'expert', 'Skirt').setRange(0).setLabel('Minimal length (mm)', 'The minimal length of the skirt, if this minimal length is not reached it will add more skirt lines to reach this minimal lenght.\nNote: If the line count is set to 0 this is ignored.')
+setting('overlap_dual',              0.2, float, 'advanced', 'Quality').setLabel(_("Dual extrusion overlap (mm)"), _("Add a certain amount of overlapping extrusion on dual-extrusion prints. This bonds the different colors better together."))
+setting('travel_speed',            150.0, float, 'advanced', 'Speed').setRange(0.1).setLabel(_("Travel speed (mm/s)"), _("Speed at which travel moves are done, a high quality build Ultimaker can reach speeds of 250mm/s. But some machines might miss steps then."))
+setting('bottom_layer_speed',         20, float, 'advanced', 'Speed').setRange(0.1).setLabel(_("Bottom layer speed (mm/s)"), _("Print speed for the bottom layer, you want to print the first layer slower so it sticks better to the printer bed."))
+setting('infill_speed',              0.0, float, 'advanced', 'Speed').setRange(0.0).setLabel(_("Infill speed (mm/s)"), _("Speed at which infill parts are printed. If set to 0 then the print speed is used for the infill. Printing the infill faster can greatly reduce printing, but this can negatively effect print quality.."))
+setting('cool_min_layer_time',         5, float, 'advanced', 'Cool').setRange(0).setLabel(_("Minimal layer time (sec)"), _("Minimum time spend in a layer, gives the layer time to cool down before the next layer is put on top. If the layer will be placed down too fast the printer will slow down to make sure it has spend at least this amount of seconds printing this layer."))
+setting('fan_enabled',              True, bool,  'advanced', 'Cool').setLabel(_("Enable cooling fan"), _("Enable the cooling fan during the print. The extra cooling from the cooling fan is essential during faster prints."))
+
+setting('skirt_line_count',            1, int,   'expert', 'Skirt').setRange(0).setLabel(_("Line count"), _("The skirt is a line drawn around the object at the first layer. This helps to prime your extruder, and to see if the object fits on your platform.\nSetting this to 0 will disable the skirt. Multiple skirt lines can help priming your extruder better for small objects."))
+setting('skirt_gap',                 3.0, float, 'expert', 'Skirt').setRange(0).setLabel(_("Start distance (mm)"), _("The distance between the skirt and the first layer.\nThis is the minimal distance, multiple skirt lines will be put outwards from this distance."))
+setting('skirt_minimal_length',    150.0, float, 'expert', 'Skirt').setRange(0).setLabel(_("Minimal length (mm)"), _("The minimal length of the skirt, if this minimal length is not reached it will add more skirt lines to reach this minimal lenght.\nNote: If the line count is set to 0 this is ignored."))
 #setting('max_z_speed',               3.0, float, 'expert',   'Speed').setRange(0.1).setLabel('Max Z speed (mm/s)', 'Speed at which Z moves are done. When you Z axis is properly lubricated you can increase this for less Z blob.')
 #setting('retract_on_jumps_only',    True, bool,  'expert',   'Retraction').setLabel('Retract on jumps only', 'Only retract when we are making a move that is over a hole in the model, else retract on every move. This effects print quality in different ways.')
-setting('fan_layer',                   1, int,   'expert',   'Cool').setRange(0).setLabel('Fan on layer number', 'The layer at which the fan is turned on. The first layer is layer 0. The first layer can stick better if you turn on the fan on, on the 2nd layer.')
-setting('fan_speed',                 100, int,   'expert',   'Cool').setRange(0,100).setLabel('Fan speed min (%)', 'When the fan is turned on, it is enabled at this speed setting. If cool slows down the layer, the fan is adjusted between the min and max speed. Minimal fan speed is used if the layer is not slowed down due to cooling.')
-setting('fan_speed_max',             100, int,   'expert',   'Cool').setRange(0,100).setLabel('Fan speed max (%)', 'When the fan is turned on, it is enabled at this speed setting. If cool slows down the layer, the fan is adjusted between the min and max speed. Maximal fan speed is used if the layer is slowed down due to cooling by more than 200%.')
-setting('cool_min_feedrate',          10, float, 'expert',   'Cool').setRange(0).setLabel('Minimum speed (mm/s)', 'The minimal layer time can cause the print to slow down so much it starts to ooze. The minimal feedrate protects against this. Even if a print gets slown down it will never be slower than this minimal speed.')
-setting('cool_head_lift',          False, bool,  'expert',   'Cool').setLabel('Cool head lift', 'Lift the head if the minimal speed is hit because of cool slowdown, and wait the extra time so the minimal layer time is always hit.')
+setting('fan_layer',                   1, int,   'expert',   'Cool').setRange(0).setLabel(_("Fan on layer number"), _("The layer at which the fan is turned on. The first layer is layer 0. The first layer can stick better if you turn on the fan on, on the 2nd layer."))
+setting('fan_speed',                 100, int,   'expert',   'Cool').setRange(0,100).setLabel(_("Fan speed min (%)"), _("When the fan is turned on, it is enabled at this speed setting. If cool slows down the layer, the fan is adjusted between the min and max speed. Minimal fan speed is used if the layer is not slowed down due to cooling."))
+setting('fan_speed_max',             100, int,   'expert',   'Cool').setRange(0,100).setLabel(_("Fan speed max (%)"), _("When the fan is turned on, it is enabled at this speed setting. If cool slows down the layer, the fan is adjusted between the min and max speed. Maximal fan speed is used if the layer is slowed down due to cooling by more than 200%."))
+setting('cool_min_feedrate',          10, float, 'expert',   'Cool').setRange(0).setLabel(_("Minimum speed (mm/s)"), _("The minimal layer time can cause the print to slow down so much it starts to ooze. The minimal feedrate protects against this. Even if a print gets slown down it will never be slower than this minimal speed."))
+setting('cool_head_lift',          False, bool,  'expert',   'Cool').setLabel(_("Cool head lift"), _("Lift the head if the minimal speed is hit because of cool slowdown, and wait the extra time so the minimal layer time is always hit."))
 #setting('extra_base_wall_thickness', 0.0, float, 'expert',   'Accuracy').setRange(0).setLabel('Extra Wall thickness for bottom/top (mm)', 'Additional wall thickness of the bottom and top layers.')
 #setting('sequence', 'Loops > Perimeter > Infill', ['Loops > Perimeter > Infill', 'Loops > Infill > Perimeter', 'Infill > Loops > Perimeter', 'Infill > Perimeter > Loops', 'Perimeter > Infill > Loops', 'Perimeter > Loops > Infill'], 'expert', 'Sequence')
 #setting('force_first_layer_sequence', True, bool, 'expert', 'Sequence').setLabel('Force first layer sequence', 'This setting forces the order of the first layer to be \'Perimeter > Loops > Infill\'')
 #setting('infill_type', 'Line', ['Line', 'Grid Circular', 'Grid Hexagonal', 'Grid Rectangular'], 'expert', 'Infill').setLabel('Infill pattern', 'Pattern of the none-solid infill. Line is default, but grids can provide a strong print.')
-setting('solid_top', True, bool, 'expert', 'Infill').setLabel('Solid infill top', 'Create a solid top surface, if set to false the top is filled with the fill percentage. Useful for cups/vases.')
-setting('solid_bottom', True, bool, 'expert', 'Infill').setLabel('Solid infill bottom', 'Create a solid bottom surface, if set to false the bottom is filled with the fill percentage. Useful for buildings.')
-setting('fill_overlap', 15, int, 'expert', 'Infill').setRange(0,100).setLabel('Infill overlap (%)', 'Amount of overlap between the infill and the walls. There is a slight overlap with the walls and the infill so the walls connect firmly to the infill.')
-setting('support_fill_rate', 20, int, 'expert', 'Support').setRange(0,100).setLabel('Fill amount (%)', 'Amount of infill structure in the support material, less material gives weaker support which is easier to remove. 20% seems to be a good average.')
-setting('support_xy_distance', 0.7, float, 'expert', 'Support').setRange(0,10).setLabel('Distance X/Y (mm)', 'Distance of the support material from the print, in the X/Y directions.\n0.7mm gives a nice distance from the print so the support does not stick to the print.')
-setting('support_z_distance', 0.15, float, 'expert', 'Support').setRange(0,10).setLabel('Distance Z (mm)', 'Distance from the top/bottom of the support to the print. A small gap here makes it easier to remove the support but makes the print a bit uglier.\n0.15mm gives a good seperation of the support material.')
+setting('solid_top', True, bool, 'expert', 'Infill').setLabel(_("Solid infill top"), _("Create a solid top surface, if set to false the top is filled with the fill percentage. Useful for cups/vases."))
+setting('solid_bottom', True, bool, 'expert', 'Infill').setLabel(_("Solid infill bottom"), _("Create a solid bottom surface, if set to false the bottom is filled with the fill percentage. Useful for buildings."))
+setting('fill_overlap', 15, int, 'expert', 'Infill').setRange(0,100).setLabel(_("Infill overlap (%)"), _("Amount of overlap between the infill and the walls. There is a slight overlap with the walls and the infill so the walls connect firmly to the infill."))
+setting('support_fill_rate', 20, int, 'expert', 'Support').setRange(0,100).setLabel(_("Fill amount (%)"), _("Amount of infill structure in the support material, less material gives weaker support which is easier to remove. 20% seems to be a good average."))
+setting('support_xy_distance', 0.7, float, 'expert', 'Support').setRange(0,10).setLabel(_("Distance X/Y (mm)"), _("Distance of the support material from the print, in the X/Y directions.\n0.7mm gives a nice distance from the print so the support does not stick to the print."))
+setting('support_z_distance', 0.15, float, 'expert', 'Support').setRange(0,10).setLabel(_("Distance Z (mm)"), _("Distance from the top/bottom of the support to the print. A small gap here makes it easier to remove the support but makes the print a bit uglier.\n0.15mm gives a good seperation of the support material."))
 #setting('support_distance',  0.5, float, 'expert', 'Support').setRange(0).setLabel('Distance from object (mm)', 'Distance between the support structure and the object. Empty gap in which no support structure is printed.')
 #setting('joris', False, bool, 'expert', 'Joris').setLabel('Spiralize the outer contour', '[Joris] is a code name for smoothing out the Z move of the outer edge. This will create a steady Z increase over the whole print. It is intended to be used with a single walled wall thickness to make cups/vases.')
 #setting('bridge_speed', 100, int, 'expert', 'Bridge').setRange(0,100).setLabel('Bridge speed (%)', 'Speed at which layers with bridges are printed, compared to normal printing speed.')
-setting('brim_line_count', 20, int, 'expert', 'Brim').setRange(1,100).setLabel('Brim line amount', 'The amount of lines used for a brim, more lines means a larger brim which sticks better, but this also makes your effective print area smaller.')
-setting('raft_margin', 5, float, 'expert', 'Raft').setRange(0).setLabel('Extra margin (mm)', 'If the raft is enabled, this is the extra raft area around the object which is also rafted. Increasing this margin will create a stronger raft while using more material and leaving less are for your print.')
-setting('raft_line_spacing', 1.0, float, 'expert', 'Raft').setRange(0).setLabel('Line spacing (mm)', 'When you are using the raft this is the distance between the centerlines of the raft line.')
-setting('raft_base_thickness', 0.3, float, 'expert', 'Raft').setRange(0).setLabel('Base thickness (mm)', 'When you are using the raft this is the thickness of the base layer which is put down.')
-setting('raft_base_linewidth', 0.7, float, 'expert', 'Raft').setRange(0).setLabel('Base line width (mm)', 'When you are using the raft this is the width of the base layer lines which are put down.')
-setting('raft_interface_thickness', 0.2, float, 'expert', 'Raft').setRange(0).setLabel('Interface thickness (mm)', 'When you are using the raft this is the thickness of the interface layer which is put down.')
-setting('raft_interface_linewidth', 0.2, float, 'expert', 'Raft').setRange(0).setLabel('Interface line width (mm)', 'When you are using the raft this is the width of the interface layer lines which are put down.')
+setting('brim_line_count', 20, int, 'expert', 'Brim').setRange(1,100).setLabel(_("Brim line amount"), _("The amount of lines used for a brim, more lines means a larger brim which sticks better, but this also makes your effective print area smaller."))
+setting('raft_margin', 5, float, 'expert', 'Raft').setRange(0).setLabel(_("Extra margin (mm)"), _("If the raft is enabled, this is the extra raft area around the object which is also rafted. Increasing this margin will create a stronger raft while using more material and leaving less are for your print."))
+setting('raft_line_spacing', 1.0, float, 'expert', 'Raft').setRange(0).setLabel(_("Line spacing (mm)"), _("When you are using the raft this is the distance between the centerlines of the raft line."))
+setting('raft_base_thickness', 0.3, float, 'expert', 'Raft').setRange(0).setLabel(_("Base thickness (mm)"), _("When you are using the raft this is the thickness of the base layer which is put down."))
+setting('raft_base_linewidth', 0.7, float, 'expert', 'Raft').setRange(0).setLabel(_("Base line width (mm)"), _("When you are using the raft this is the width of the base layer lines which are put down."))
+setting('raft_interface_thickness', 0.2, float, 'expert', 'Raft').setRange(0).setLabel(_("Interface thickness (mm)"), _("When you are using the raft this is the thickness of the interface layer which is put down."))
+setting('raft_interface_linewidth', 0.2, float, 'expert', 'Raft').setRange(0).setLabel(_("Interface line width (mm)"), _("When you are using the raft this is the width of the interface layer lines which are put down."))
 #setting('hop_on_move', False, bool, 'expert', 'Hop').setLabel('Enable hop on move', 'When moving from print position to print position, raise the printer head 0.2mm so it does not knock off the print (experimental).')
-setting('fix_horrible_union_all_type_a', False, bool, 'expert', 'Fix horrible').setLabel('Combine everything (Type-A)', 'This expert option adds all parts of the model together. The result is usually that internal cavities disappear. Depending on the model this can be intended or not. Enabling this option is at your own risk. Type-A is depended on the model normals and tries to keep some internal holes intact. Type-B ignores all internal holes and only keeps the outside shape per layer.')
-setting('fix_horrible_union_all_type_b', False, bool, 'expert', 'Fix horrible').setLabel('Combine everything (Type-B)', 'This expert option adds all parts of the model together. The result is usually that internal cavities disappear. Depending on the model this can be intended or not. Enabling this option is at your own risk. Type-A is depended on the model normals and tries to keep some internal holes intact. Type-B ignores all internal holes and only keeps the outside shape per layer.')
-setting('fix_horrible_use_open_bits', False, bool, 'expert', 'Fix horrible').setLabel('Keep open faces', 'This expert option keeps all the open bits of the model intact. Normally Cura tries to stitch up small holes and remove everything with big holes, but this option keeps bits that are not properly part of anything and just goes with whatever it is left. This option is usually not what you want, but it might enable you to slice models otherwise failing to produce proper paths.\nAs with all "Fix horrible" options, results may vary and use at your own risk.')
-setting('fix_horrible_extensive_stitching', False, bool, 'expert', 'Fix horrible').setLabel('Extensive stitching', 'Extrensive stitching tries to fix up open holes in the model by closing the hole with touching polygons. This algorthm is quite expensive and could introduce a lot of processing time.\nAs with all "Fix horrible" options, results may vary and use at your own risk.')
+setting('fix_horrible_union_all_type_a', False, bool, 'expert', 'Fix horrible').setLabel(_("Combine everything (Type-A)"), _("This expert option adds all parts of the model together. The result is usually that internal cavities disappear. Depending on the model this can be intended or not. Enabling this option is at your own risk. Type-A is depended on the model normals and tries to keep some internal holes intact. Type-B ignores all internal holes and only keeps the outside shape per layer."))
+setting('fix_horrible_union_all_type_b', False, bool, 'expert', 'Fix horrible').setLabel(_("Combine everything (Type-B)"), _("This expert option adds all parts of the model together. The result is usually that internal cavities disappear. Depending on the model this can be intended or not. Enabling this option is at your own risk. Type-A is depended on the model normals and tries to keep some internal holes intact. Type-B ignores all internal holes and only keeps the outside shape per layer."))
+setting('fix_horrible_use_open_bits', False, bool, 'expert', 'Fix horrible').setLabel(_("Keep open faces"), _("This expert option keeps all the open bits of the model intact. Normally Cura tries to stitch up small holes and remove everything with big holes, but this option keeps bits that are not properly part of anything and just goes with whatever it is left. This option is usually not what you want, but it might enable you to slice models otherwise failing to produce proper paths.\nAs with all \"Fix horrible\" options, results may vary and use at your own risk."))
+setting('fix_horrible_extensive_stitching', False, bool, 'expert', 'Fix horrible').setLabel(_("Extensive stitching"), _("Extrensive stitching tries to fix up open holes in the model by closing the hole with touching polygons. This algorthm is quite expensive and could introduce a lot of processing time.\nAs with all \"Fix horrible\" options, results may vary and use at your own risk."))
 
 setting('plugin_config', '', str, 'hidden', 'hidden')
 setting('object_center_x', -1, float, 'hidden', 'hidden')
@@ -780,7 +780,7 @@ def getAlterationFileContents(filename, extruderCount = 1):
                bedTemp = 0
                if getPreference('has_heated_bed') == 'True':
                        bedTemp = getProfileSettingFloat('print_bed_temperature')
-               
+
                if bedTemp > 0 and not '{print_bed_temperature}' in alterationContents:
                        prefix += 'M140 S%f\n' % (bedTemp)
                if temp > 0 and not '{print_temperature}' in alterationContents:
@@ -873,7 +873,7 @@ def runPostProcessingPlugins(gcodefilename):
                                plugin = pluginTest
                if plugin is None:
                        continue
-               
+
                pythonFile = None
                for basePath in getPluginBasePaths():
                        testFilename = os.path.join(basePath, pluginConfig['filename'])
@@ -881,19 +881,19 @@ def runPostProcessingPlugins(gcodefilename):
                                pythonFile = testFilename
                if pythonFile is None:
                        continue
-               
+
                locals = {'filename': gcodefilename}
                for param in plugin['params']:
                        value = param['default']
                        if param['name'] in pluginConfig['params']:
                                value = pluginConfig['params'][param['name']]
-                       
+
                        if param['type'] == 'float':
                                try:
                                        value = float(value)
                                except:
                                        value = float(param['default'])
-                       
+
                        locals[param['name']] = value
                try:
                        execfile(pythonFile, locals)
index ad1e5ebc2364ee1719e5dc79a9ea45f0a853e694..473f496459e09e1ea212a23261164e00bbf7bcd9 100644 (file)
@@ -4,14 +4,19 @@ __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AG
 import os
 import sys
 
-__all__ = ['getPathForResource', 'getPathForImage', 'getPathForMesh']
+import wx
+import gettext
 
+if sys.platform.startswith('darwin'):
+       try:
+               #Foundation import can crash on some MacOS installs
+               from Foundation import *
+       except:
+               pass
 
 if sys.platform.startswith('darwin'):
        if hasattr(sys, 'frozen'):
                try:
-                       #Foundation import can crash on some MacOS installs
-                       from Foundation import *
                        resourceBasePath = NSBundle.mainBundle().resourcePath()
                except:
                        resourceBasePath = os.path.join(os.path.dirname(__file__), "../../../../../")
@@ -37,3 +42,16 @@ def getPathForMesh(name):
 
 def getPathForFirmware(name):
        return getPathForResource(resourceBasePath, 'firmware', name)
+
+def setupLocalization():
+       try:
+               if sys.platform.startswith('darwin'):
+                       languages = NSLocale.preferredLanguages()
+               else:
+                       languages = [wx.Locale(wx.LANGUAGE_DEFAULT).GetCanonicalName()]
+       except Exception as e:
+               languages = ['en']
+
+       locale_path = os.path.normpath(os.path.join(resourceBasePath, 'locale'))
+       translation = gettext.translation('Cura', locale_path, languages, fallback=True)
+       translation.install(unicode=True)